Map where an ad account's money goes on a Claude whiteboard
Builds an account map on a Claude whiteboard from get_account_entities: a Sankey from the account to its campaigns, ad sets and top ads with their pictures, left to right, ribbons as wide as their spend, each card with spend, its share of its parent's spend, results, cost per result and ROAS, against the equal-length previous period. The cost per result is marked against the target in the client's shared memory when there is one. A few short notes say where the money goes and what changed, and the board says what was not read.
Intent One ad account drawn as a flow, account to campaigns to ad sets to its top ads, each ribbon as wide as its spend, with its cost per result against the client's target.
- Steps
- 12
- Tools
- 0
- Rules
- 5
- Failure modes
- 4
When to use it
Use it when
- Someone asks where the money goes in an account, for a map, a tree or an overview of an account's structure on a whiteboard.
- Before a budget review or a client meeting, to see the account's shape and its weight at each level on one board.
Do not use it when
- A ranking of campaigns or ads in the conversation: get_account_entities or the cockpit answer it without a board.
- Several accounts or platforms on one map: draw one map per account, side by side, and never add their figures up.
- Hosts without Claude's whiteboard artifact: answer in the conversation with the same reads.
What it needs first
Optional Meta Ads, Google Ads, TikTok Ads
No single source is required: this one reads across whatever you have connected.
Preconditions
- The account is among the chosen accounts, confirmed via list_accounts.
Evidence every conclusion must carry
- Every figure carries the account, the period and the currency.
- The target comes from the client's shared memory, never from Claude.
| Input | Required | What it is |
|---|---|---|
account | required | One Meta, Google Ads or TikTok ad account and its workspace. |
window | Period of the figures.Default: last 30 days. | |
scope | Campaigns to keep, when the request names them. |
Procedure
In order. Every tool named is one the gateway ships, and links to its reference.
Steps
- Resolve the workspace and the ad account with list_accounts, and read the client's shared memory there (or with get_client_memory): its objective, its target cost per result and its currency, if the fiche gives them.
- Read the campaigns with get_account_entities (level campaign, the period, the same workspace_id), then their ad sets (level adset). Keep the totals the tool returns (totalSpend) for the account card, never a sum of the rows shown.
- Keep at most 8 campaigns and 3 ad sets per campaign, sorted by spend; merge the rest into one card ("N more ad sets · €X"). Read ads (level ad, adset_ids) for the ad sets shown.
- On Meta, get the ads' pictures with get_creative_wall (same period, adset_ids), match each ad id to a group's adList, download its thumbnailUrl and upload it into the board, as the creative wall skill does. Catalog (DPA) ads, ads without a picture, other platforms, or a blocked download get a small clean SVG of a 2×2 tile grid instead.
- Draw the flow as one Sankey. Scale k = 300 / account spend: every ribbon is spend × k wide (2 at least). Columns (x, width): account 0, 380; campaigns 580, 380; ad sets 1160, 380; ads 1740, 440; notes 2300, 420; small bold column headers at y 256 ("Account", "Campaigns · N", "Ad sets · N", "Ads · top by spend, N in all", "What the data says"), the map from y 300.One row per ad set, as tall as the taller of its ad set card and ad card, both centred in it; 40 between rows of a campaign, 72 between campaigns. Each campaign card is centred on its rows, the account card on the whole map. A card is at least its widest ribbon plus 40 tall.
- Put every ribbon in one image with data-look='clean', first in order (behind the cards), from the account card's right edge minus 16 to the ads column plus 16. At a parent's right edge the ribbons stack in their children's order, centred on the parent; each arrives centred on its child. A ribbon is a band of constant width (M x0-14,y0 L x0,y0 C mid,y0 mid,y1 x1,y1 L x1+14,y1, back along the other edge, Z). From an ad set to its ad card, the ribbon is the ad set's whole spend.One hero branch, the campaign the takeaway is about (by default the largest), in %234169FF with everything under it; every other ribbon inside one g with fill %238C8C8C and opacity 0.34. Never green or red for a ribbon.
- Node cards (account, campaign, ad set): a white rounded shape with empty text, then text elements on it with 22 padding: the name small and bold, wrapped to the card; the spend bold in large (title on the account card) with the share of its parent in large on the right (cobalt on the hero branch, #7D7D7D elsewhere); "+N% vs previous 30 days" small; three slots at x 0, 124 and 236 for results, cost per result and ROAS (small label, bold value); then a small budget line ("€4,500 a day", "Budget per ad set", "€2,000 a day, shared by its ad sets", with " · changed <date>" when the journal shows a change).Small text is always ink: no single grey reads on both a light and a dark board. Colour only at 28 and above, or in shapes.
- Ad cards: when one ad has 80 % or more of its ad set's spend, show it alone (a 64 picture or the tile grid, a short readable label such as "Catalog carousel, prospecting" with " · Paused" if paused, its spend in large, its share written >99% or <1% rather than rounded, the three slots, then "N more ads, paused: €X"). Otherwise show "Top 3 of N ads, by spend": three 112 pictures 144 apart, 26 below each for the board's frame, then spend in bold, CPA, ROAS and Paused when it applies, and "N more ads share €X". Every picture links to the ad in the platform's ads manager.
- With a cost per result target in the client's memory, write each CPA green at or under it and terracotta above, on every card and caption (a ROAS target the other way round). Without one, every CPA stays ink and the legend says no target is saved for this client.
- Header: the brand line at y 0 (see the brand step); the title "Where the money goes" at 30; the takeaway in large at 110 (10 words at most); at 180 a legend with a 32×12 cobalt swatch ("<hero>, N% of spend"), a grey one ("Everything else"), "Ribbon width follows spend" and the target sentence. Notes: at most 4 yellow rounded shapes, 420 wide, body size, each level with the row it explains (24 apart at least), ending with its source in italics; the first one alone gets a huge cobalt number just above it that its sentence continues. Footer, 56 below the map, one small line wrapped to 2,720: platform, account ID, currency, period and previous period, what a result is, what was read and how ads were picked, then the brand line.Notes say where most of the money goes, the cards furthest from the target, what grew or shrank, and budget or status changes from the client journal (get_client_memory with since and until set to the period; audience updates are left out). A note on a dip compares it with the same weekday of earlier weeks before calling it unusual.
- 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.
- 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
The observable condition, what it lets you conclude, and what takes the conclusion back.
- When The account has more than 8 campaigns, or a campaign more than 3 ad setsConclude Draw the largest by spend and one card for the rest with their count and spend, its ribbon included; never drop spend from the map silently.
- When get_creative_wall is refused (PLAN_REQUIRED on Free or Pro) or the thumbnail download is blockedConclude Draw the map with the tile grid in place of every picture; the map itself needs no plan beyond the account reads, and a blocked download names mcp.getmcpads.com as the domain to allow.
- When A campaign or ad set has no results in the periodConclude Show its spend and write no results; never a cost per result of zero or infinity.
- When get_account_entities returns capped or partialConclude Say on the board that the level was not read in full and how many rows were read.
- When The budget of an ad set belongs to its campaignConclude Show the budget on the campaign card only, so it is not counted twice.
Where the agent stops
The map changes nothing in the account. Moving a budget from it goes through change_campaigns, its preview and the person's confirmation.
How it goes wrong quietly
The cases where the analysis is wrong and still looks right. Read them before trusting a number.
- Adding up two accounts or two platforms on one map: currencies and attribution differ.
- Calling the results of an ad platform the site's purchases: name them as the tool does (Website purchases on Meta).
- Reading the account's spend from the cards shown: use totalSpend, since small rows can be merged or left out.
- Treating the weekly rhythm (a lower Sunday or Monday) as an anomaly.
What the answer contains
| Section | What it holds |
|---|---|
| Whiteboard | The flow from the account to the top ads, ribbons as wide as their spend, one hero branch, cost per result against the target, and up to four notes. |
| Note | The account, platform, currency and period, and what was not read. |
Manage your ads from your AI assistant
Free with 1 ad account, no card. Pro is free for 7 days.