Lock in $67
Method

The copy behind winning Meta ads: a two-step pull in Claude

Ask which words your best ads share and you get an answer either way. Whether any text was fetched to produce it depends on asking in two steps.

Espen Opdahl Published 6 min read
The short answer

On Meta’s official ads connector, performance and ad copy live in different tools. The entity reader that returns spend and results has no copy fields at all — body, title, headline and primary_text all come back unknown from its field catalogue. The words come from the creative reader, keyed by creative_id. So “what do my winning ads say” is a join you ask for in two steps, and three things stay outside it: the description line, multiple text options, and any text Meta rewrote at delivery.

You ask the connected chat for your best ads and the copy they share. Back comes a confident list of hooks — urgency, social proof, a question in the first line. Then you open two of the “winners” in Ads Manager and the text is not what the summary described, because the table it reasoned from never contained any text.

That is not the assistant lying so much as filling a gap. The fix is to know which tool holds which half of the question, and to ask for the halves separately.

Two tools, one join key

ads_get_ad_entities is the tool for spend, results, click-through and every other metric. Asked on 2026-09-15 for body, title, headline, primary_text, message, description, call_to_action and object_story_spec, its field catalogue returned every one of them in unknown_fields. What it does return at ad level is creative_id, described as “the unique identifier of the creative used in the ad” — and marked neither filterable nor sortable.

The copy sits in ads_get_creatives. Its schema lists the readable fields: body, title, link_url, call_to_action_type, child_attachments and a handful of media and identity fields. It also explains the naming: body is what Ads Manager calls primary text, title is the headline.

The trap is in the listing. Called without IDs, the tool states it returns only id, name, account_id and status, and warns the assistant, in capitals, against reading those gaps as empty fields. Copy only arrives when you pass the creative IDs or name the fields. The per-ad alternative is ads_get_ad_preview, which returns body text, headline and CTA button alongside the rendered image — one ad at a time.

Ranking comes first and it has its own trap: several of your top ads can share one creative, so group by creative ID before reading any copy, or one piece of text gets counted as a pattern.

Splitting a question across the tools that hold its halves is a habit the Claude Ads Operator course drills, once the connector is attached properly.

worth knowing You can write a description line through the connector and not read it back.

ads_create_creative accepts description, which its schema maps to link_data.description for image ads. The read tool’s list of supported fields has no top-level description — only the per-card one inside child_attachments for carousels (schema read 2026-09-15). The write side also calls the fields message and headline while the read side calls them body and title, so a prompt that uses one tool’s words against the other tool is asking for a field that does not exist there.

What you wantWhere it livesWhat to watch
Which ads wonads_get_ad_entities, ad levelNo copy fields; group by creative_id
Primary text and headlineads_get_creatives with IDsA plain listing returns names only
Description lineNot on the read field listCheck it in Ads Manager
Which of several text options wonNot in the catalogueSee below
The ad as servedads_get_ad_preview, per adA preview, not a delivery log

Asking for it so the join actually happens

Step one: at ad level, pull amount spent, results, cost per result
and creative_id for last_30d. Group rows that share a creative_id and
sum them. Show me the table and stop.

Step two: for the creative IDs I pick from that table, fetch body,
title and call_to_action_type from the creative tool, by ID. Quote the
text exactly as stored. Do not summarise it or name patterns yet.

The pause between the steps is the point. You choose the winners from real rows — and ideally not by cost per result on tiny spend, which is how the wrong ads get crowned. Only then does text enter the conversation, verbatim, where you can read it before anyone tells you what it has in common.

A vendor guide shows the shape people reach for. Supermetrics’ blog (Andrea Linehan, 28 May 2026) suggests asking Claude to “break the data down by individual ad” and, for each ad, “also pull the headline and primary text”. That prompt is written for Supermetrics’ own connector, and this post has not tested it there. On Meta’s official connector the same sentence is two tools, and “cost per acquisition” is not a field name the catalogue knows — cost_per_result is, which is why a metric can come back as not existing.

Where this breaks

Multiple text options. An ad built with several primary texts or headlines stores them in what Meta’s AdCreative reference calls asset_feed_spec: “an asset feed with multiple images, text and other assets used to generate variations of an ad.” That field is not on the creative reader’s list, and ads_create_creative takes one message and one headline, not a set. What body returns for such an ad is not documented on the tool.

Meta does publish per-text reporting for these ads. Its Insights breakdowns page lists body_asset, title_asset, description_asset and call_to_action_asset among the dynamic creative asset breakdowns, and says they “only support a limited set of metrics”: impressions, clicks, spend, reach, actions and action values. None of those names resolved in the connector’s catalogue on 2026-09-15. Whether the entity tool accepts them as a breakdown anyway was not tested, so treat it as unknown rather than unsupported.

Text Meta changed. ads_create_creative describes its Advantage+ Creative switch as automatic per-impression optimisations including “text improvements”. Where that is on, the stored body is what you wrote, not necessarily what every person saw. A pattern drawn from stored text is a pattern in your drafts.

Video. The AdCreative reference describes body as “not supported for video post creatives”, so an empty body on a video ad can mean the text lives elsewhere, not that the ad had none.

The metrics table never contained the words. Anything said about them before the second call is a guess.

  • Asking for patterns in one breath. The assistant will produce hooks and angles whether or not text was ever fetched. Make it quote the stored copy first.
  • Counting a shared creative as several winners. Five ads on one creative are one piece of copy, not five votes for it.
  • Crediting copy for a creative win. The same text on a different image is a different ad. Look at the preview before deciding the words did the work.
  • Reading a multi-text ad’s body as its copy. Until you have checked Ads Manager, you do not know which option ran.

Try this tonight Run step one for your top ads by spend, then fetch the stored text for the three biggest creative IDs. Open the same three in Ads Manager. If the text matches and none uses multiple text options, the two-step pull is safe for your account and you can keep using it. If any differ, note which ones: those ads need judging from the preview, not from stored copy.

Can Claude see the image as well as the text?

Yes, through the preview tool, which returns the creative image as a separate item. It works per ad, so pick the winners first.

Can I filter ads by the words in their copy?

No. Copy is not in the entity reader’s catalogue, and the creative reader has no filtering parameter. You can filter by ad name, which is a separate string.

Should I let it rewrite the winning copy?

Drafts are fine, and ads the connector creates are created paused. Check every factual claim in a rewrite before it becomes a creative, because the creative tools declare copy immutable once published.

Ask the right tool for each half

The course is the routing: which tool holds which data, which fields the connector actually resolves, and the checks to run before you trust a summary of your own ads.

See what's inside — $67 founding price

Pre-sale: the modules are still being recorded and founding members get the checkout link first. No charge today. Public price $97.

Espen Opdahl Writes The Claude Ads Operator. I run Meta ad accounts through Claude and Meta's official ads connector, and I write down what actually happens — including the parts that don't work. Not affiliated with Meta or Anthropic.