Lock in $67
Troubleshooting

Dynamic ads not working: what the health check misses

A default that hides the passes, a scope rule that switches the question, and the one catalog failure none of the health tools reports.

Espen Opdahl Published 6 min read
The short answer

The connector has a dynamic-ads health check, and by default it only reports what failed. Its own schema says the issues-only switch is on unless you turn it off, so a healthy catalog and a check that found nothing to say come back looking identical. It also branches silently: a catalog ID runs pixel, match-rate and eligibility checks, while a product set ID runs creative-quality checks instead. Pass both and the product set wins.

Your Advantage+ catalog campaign is live and delivery is a trickle. The products exist. The feed uploaded. You ask Claude whether the catalog is healthy, it runs a check, and it says nothing looks wrong.

That reply is doing less work than it looks. The tool behind it answers a narrow question with a default that suppresses most of its own output, and two sibling tools answer the neighbouring ones.

The default hides the passes

The health tool takes a parameter called with_issue_only, and its description is unambiguous about the default:

“When true (default), only return checks that have issues (failed). When false, return all checks including passed ones.”

So the ordinary case — you ask, the model calls the tool, nobody names a parameter — returns failures only, and when there are none the reply is empty. That is a good result, but it is indistinguishable from a suite that had nothing to run against. Same shape as the two silences the anomaly tool returns, which read alike and mean opposite things.

The fix is one clause in the prompt: ask for all checks including the ones that passed. Then you can count them, and a check you expected and cannot find is itself information.

Knowing which switch to name is most of the skill here, and the Claude Ads Operator course is largely a catalogue of these defaults — the ones that quietly decide what a confident answer was built from.

worth knowing Give the health tool both a catalog ID and a product set ID and it silently ignores the catalog.

The schema says it plainly: the product set ID “takes precedence over catalog_id when both are supplied (catalog_id is ignored in that case)”. The scopes run different families of check. Catalog scope covers pixel and event-source setup, match rate and eligible product count; product-set scope runs creative-quality checks such as slideshow and video suitability. Ask about delivery while naming a set and you get an answer about creative. The tool anticipates this: it echoes a scope field back “so you can confirm which checks ran”.

Three tools, and the names do not tell you which

Every guide describes this cluster the same way. A vendor write-up at Admetrics, published 13 May 2026 by Silvana Chirita:

“For catalog-based e-commerce sellers, it can identify specific SKUs with feed errors and explain exactly why they aren't being displayed.”

True — and that is a different tool from the one named after dynamic ads. Feed errors, broken images and policy violations come from diagnostics. Match rate and its history come from event-source health, which describes its output as the measurement data Commerce Manager shows under Events. The dynamic-ads tool sits between them and checks setup rather than items. All three carry a “when NOT to use” section pointing at the other two, which is a fair signal the names do not route you.

Your questionThe toolWhat it returns
Is this catalog set up to run dynamic ads at all? Dynamic-ads health, catalog scope Pass/fail on pixel setup, match rate, eligible product count
Which items are blocked, and on which surface? Catalog diagnostics Issues by severity, with affected channels
Are events matching my products, and since when? Event-source health Current match rate plus per-date history
Is this product set good enough to render as video? Dynamic-ads health, product-set scope Creative-quality checks only — no setup checks
Did my store stop syncing? None of the above Partner integrations — see below

The failure none of the health tools sees

This is the part worth the read. The diagnostics tool rules out, in writing, the most common way a catalog goes wrong for a store owner:

“Do NOT call this tool to diagnose a store sync that is stale or failing (products missing or outdated since a Shopify/WooCommerce/Magento sync) — that is a connection failure, not an item-quality issue, and does not surface here.”

A broken sync produces no feed errors, because no bad data arrived. It produces correct data that is old — last month's prices and stock, delisted products still advertisable, new ones invisible. Item quality is fine, match rate can be fine, the health check passes, and you are paying to advertise a catalog that stopped being true.

What catches it is the partner-integrations listing, which returns each connected platform with its connection health, sync timeline and errors. It is not a health tool by name, which is exactly why it gets skipped.

Your reporting side does not know the catalog exists

Handed the names catalog_id, product_set_id, match_rate, image_fetch_status, pixel_id, event_source and catalog_segment_actions, the connector's field-metadata tool returned every one as unknown_fields (checked 2026-09-03). One name resolved: promoted_object, described as the ad set's promoted-object settings — pixel ID, custom event type, pixel rule, product set ID and omnichannel object. It exists at ad set level only, it is a structure rather than a value, and the catalogue reports it as neither filterable nor sortable.

So you cannot ask for spend by product set, or filter ad sets down to the ones promoting a given catalog. You can pull ad sets and read the structure on each, which works, but it is fetch-then-sift rather than a query. Catalog health sits on one side of that wall and money on the other, and the catalog half of the connector is, in reporting terms, a separate product.

What to ask, in order

  1. Ask when the store last synced START HERE

    Before any health check, get the partner-integration list with its sync timeline. If the last successful sync predates the problem, stop — no amount of feed diagnosis will show it to you. The trade: a catalog fed by a file URL or the Batch API has no partner integration at all, so this returns nothing useful and you go to the feed upload history instead.

  2. Run the health check with the passes turned on

    Name it: all checks including passed ones, catalog scope. Read the scope value before the findings. The check keys are readable English — catalog_has_feed_upload_errors, pixel_has_low_event_source_match_rate — and worth quoting back in a follow-up. The trade: the schema publishes those as examples rather than a full list, so you cannot filter to a specific check unless you already know its key.

  3. Take the match rate as a trend, not a verdict

    Event-source health returns per-date, per-event-type history alongside the current figure. A number that stepped down on a particular date tells you to look at what you deployed that week. Same reasoning as pixel and dataset quality, where the snapshot is the least informative view available.

  • Reading an empty reply as a clean bill of health. With the default in place, empty means “no failures returned” — not “every check ran and passed”.
  • Naming a product set when you mean the catalog. The set wins, the catalog is dropped without comment, and you get a creative answer to a delivery question.
  • Diagnosing the feed when the platform stopped talking. Old-but-valid data passes every item-quality check there is.

Try this tonight Ask for the partner integrations on your catalog and read one thing: the date of the last successful sync. Older than your last product change, and you have tonight's job — reconnect the platform app, re-run the sync, check tomorrow that the product count moved. Synced this morning, and you have ruled out the expensive failure in under a minute.

Does the health check tell me why delivery is low?

It tells you whether the setup dynamic ads depend on is intact — pixel and event source connected, match rate acceptable, enough eligible products. That is a precondition check, not a delivery diagnosis. A catalog can pass every check while the campaign underdelivers for ordinary reasons of budget or auction pressure.

Can Claude fix any of this for me?

It can find it. Reconnecting a store integration, editing a feed file and repairing pixel parameters happen in Commerce Manager or on your site. The connector reads this surface far more than it writes to it, which for anything touching your whole product catalogue is the right way round.

Why does the product-set scope only check creative?

The setup questions — pixel, event source, match rate — are properties of the catalog, and a set inherits all of them. What is genuinely per-set is whether its items have enough usable imagery to render as a slideshow or a video.

Is any of this documented by Meta?

Not as connector behaviour. Meta documents the catalog objects and match rate in its own references, but the surface described here — the default, the scope precedence, the check keys — is read from the schemas the connector ships, on 2026-09-03. Treat it as observed rather than published.

One default, one silent precedence rule, one failure mode living outside the tools named after health. If the catalog side is not connected yet, start with connecting Claude to Meta Ads.

The defaults are the whole job

Ten modules on running Meta ads through Claude, built around the switches that decide what an answer was actually made of — and a weekly routine that checks the catalog side before it checks performance.

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.