# Lay out an ad set's top ads by production on a Claude whiteboard

> Tier: recipe. Operating recipe: real tool sequence, core rules, known traps.

Builds a creative wall on a Claude whiteboard from get_account_entities (ad level) and get_creative_wall (pictures): the 20 ads with the most spend in one Meta ad set, one panel per production read from the ad names, each panel with its ads, spend, purchases, CPA and ROAS against the ad set, each ad with its picture, label, figures and Ads Manager link. The paused ads that beat the ad set on both cost and return are mounted in cobalt and named in the takeaway.

**Intent.** The 20 ads that spent most in an ad set, grouped by how they were made (AI-generated, studio packshot, key visual, motion, creator video), each against its ad set, with the paused ones that still beat it called out.

## When to use

- Someone asks which kinds of creative work in an ad set, to compare AI-generated, packshot, key visual, motion or creator content, or for the top ads of an ad set by production on a whiteboard.
- A creative review before a new brief or a shoot, to see what to bring back or make more of.

## When not to use

- Ads grouped by identical visual across an account: use creative-wall-on-a-whiteboard.
- Several ad sets compared on one wall: draw one wall per ad set, since each ad is judged against its own ad set.
- Hosts without Claude's whiteboard artifact: answer in the conversation with the same reads.

## Sources

Required: any connected source
Optional: Meta Ads

## Preconditions

- Meta ad accounts only for now; the pictures need Team or Enterprise (get_creative_wall).
- The account is among the chosen accounts, confirmed via list_accounts.

## Inputs

- `ad set` (required): The Meta ad set, by name; without one, the ad set with the most spend in the account.
- `window`: Period of the figures. Default: last 30 days.

## Procedure

1. Resolve the workspace and the Meta account with list_accounts and read the client's memory (a naming convention, a CPA or ROAS target). Read the ad set (get_account_entities, level adset) for its spend, purchases, CPA and ROAS, then its ads (level ad, adset_ids), and keep the 20 with the most spend, leaving out ads with no spend.
2. Get the pictures with get_creative_wall (same period, adset_ids), match each ad id to a group's adList, download each thumbnailUrl and upload it into the board, as the creative wall skill does. Each picture links to its own ad: https://adsmanager.facebook.com/adsmanager/manage/ads?act=<account number>&selected_ad_ids=<ad id>.
3. Find the production in the names. With a naming convention in the client's memory, use the field it gives. Otherwise split each name on _ and look for a known token, usually the 4th field after funnel, format and media: ia-gen, ai or genai is AI-generated; packshot is Studio packshot; kv is Key visual; motion is Motion design; ugc is Creator video; photo or shoot is Photo shoot; 3d is 3D. Use the field when at least 60 % of the ads carry a known token; otherwise group by format and media and say the names carry no production. Ads without a token go in a last panel, Other; never guess from the picture.
   Format: collection is Collection, link-ad is Link ad, carousel is Carousel; media: statique or image is image, video is video. Each card's label is the subject tokens (after the offer tokens, before the date) in sentence-case English, proper names kept.
4. One white rounded panel per production, largest spend first, left to right, wrapping to a new row past the widest panel (24 across, 32 down). In a panel: padding 28, a summary column 300 wide (production name large and bold; "N ads · €X" bold; "N purchases · CPA €X.XX"; "ROAS X.XX" bold, green above the ad set's ROAS and terracotta below, computed as revenue over spend; a 240×6 clean SVG bar in currentColor, track at opacity 0.16, for the share of the top 20 spend; "X% of the top 20 spend · N paused" small), then one ad every 204, by spend.
5. Ad card: the picture 168×168, 44 below the panel top for the tape; 36 below it one small text wrapped to 168 with the **label**, "Format · media" and **Paused** when it applies, reserving two label lines (three if any label needs them) so figures align; then "**€X**" in body, "N purchases" and "CPA €X.XX" small, and "**ROAS X.XX**" small in green above the ad set's ROAS, terracotta below.
6. An ad beats the ad set when its CPA is under the ad set's and its ROAS above it. Mount the paused ones in cobalt: a clean SVG <rect rx='12' fill='%234169FF'/> behind the picture, 16 larger on each side and 6 more at the bottom, at most 5. With none paused, mount the active ones that beat it and say so in the takeaway.
   Cobalt only for what the takeaway is about, the big number and its swatch; green and terracotta only against the ad set or a saved target; everything else ink. Without a CPA target, CPA stays ink and the legend says so.
7. Header: the brand line at y 0 ("**Get MCP Ads** / Creative wall / <account> · Meta · <ad set> · <period>"), the title "The creative wall" at 30, the takeaway in large at 110 (10 words at most, counts in words), a description at 168 wrapped to 1,180 that says how much of the ad set's spend the 20 ads took, then a small legend (a green and a terracotta ROAS sample against the ad set's, the cobalt swatch, the target sentence). Top right, a huge cobalt "N of M" above two yellow notes ending with *From Meta, <period>*: the called-out ads by ROAS, then the productions (the largest one's share against the ad set, the highest CPA among those with 50 purchases or more). Footer: a small source line (account, currency, period, the ad set's totals, the token mapping used, "Click a picture to open the ad in Ads Manager"), then the brand line.
8. Keep every text readable in light and dark: the board picks the ink of a text, and of an SVG's currentColor, from what lies directly under it (a filled card gives the card's ink, anything else, an SVG image included, the board's ink). So never write text over an SVG that lies on a filled card: a large labelled drawing (a timeline, a chart, ribbons with labels) sits on the board background, framed if needed by a hollow rounded shape stroked #8C8C8C, and filled cards hold only text written on them, pictures and small unlabelled marks.
9. Brand the board with the Get MCP Ads mark, twice and nowhere else: an image element 16 by 16 with "by": "claude" and this exact src: data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' data-look='clean'><path d='M4.5 1.5v21M19.5 1.5v21' stroke='currentColor' stroke-width='2.6' stroke-linecap='square' fill='none'/><circle cx='12' cy='12' r='4.2' fill='currentColor'/></svg>. For a small text line at (x, y), put the mark at (x − 2, y + 3) and the small ink text at (x + 20, y). Header, at y 0 above the title: "**Get MCP Ads** / <board name> / <scope>" (account or brand, platform, period, joined by " · "). Footer: 16 below the source line, "Data via [Get MCP Ads](https://getmcpads.com)".
   Never drop data-look='clean' (the bars turn into pen strokes), never upload the mark as a picture (pictures get a polaroid frame), never recolour it: accent colours belong to the data. No mark on cards and never larger than small text.

## Decision rules

- **When** Fewer than 60 % of the ads carry a known production token and the memory gives no convention → **conclude** Group by format and media instead, and say on the board that the names carry no production; ask the person for the token's position if they want production.
- **When** No ad beats the ad set on both cost and return → **conclude** Mount nothing, say so in the takeaway, and point at the production closest to the ad set.
- **When** get_creative_wall is refused (PLAN_REQUIRED) or a download is blocked → **conclude** Build the panels with a tile grid in place of each picture; a blocked download names mcp.getmcpads.com as the domain to allow.
- **When** Several ads share one name → **conclude** Keep the same label: their pictures and figures tell them apart.

## Evidence requirements

- Every figure carries the account, ad set, period and currency.
- Each ad is compared with its own ad set's CPA and ROAS, read at the same time.

## Human approval boundary

- The wall changes nothing in the account. Reactivating a paused ad from it goes through change_campaigns, its preview and the person's confirmation.

## Failure modes

- Averaging the ads' ROAS for a production: a group's ROAS is its revenue over its spend.
- Reading a production's figures as the effect of how it was made alone: audiences, offers and placements differ between ads.
- Guessing a production from the picture when the name carries none.

## Output

- **Whiteboard**: One panel per production with its ads and pictures, figures against the ad set, the paused winners mounted in cobalt, two notes and the brand.
- **Note**: The account, ad set, period and currency, the share of the ad set's spend the 20 ads took, and the token mapping used.

## Related

- Skill: [creative-wall-on-a-whiteboard](https://www.getmcpads.com/skills/creative-wall-on-a-whiteboard.md)
- Skill: [account-map-on-a-whiteboard](https://www.getmcpads.com/skills/account-map-on-a-whiteboard.md)
