Facebook catalog match rate: two numbers called match
One measures whether Meta can find the person. The other measures whether it can find the product. Fixing the first does nothing for the second.
Catalog match rate joins two lists of strings: the content IDs your events send, and the retailer IDs your catalog holds. It is not event match quality, which joins people. The connector's event-source health tool returns the current rate, per-date and per-event-type history over the past 28 days, and setup issues with severities. What it omits is the count Meta's own node keeps for IDs that matched a different catalog — the number separating “my IDs are wrong” from “my IDs are fine and pointed elsewhere”.
Catalog delivery thins out. You ask Claude to check the pixel and the answer is reassuring: events are arriving, the dataset is active, the match quality score is respectable. Then someone opens Commerce Manager and reads a catalog match rate low enough to explain the whole month. Both readings are right. They answer different questions, and the word they share is doing the damage.
Two joins wearing one word
Event match quality is about people. Meta takes the identifiers in your payload — email, phone, the browser cookie, an external ID — and tries to resolve them to a person. That score is read through the dataset quality tools, and a hashed email moves it.
Catalog match rate is about strings. The health tool defines itself without ambiguity:
“‘Match rate’ is the percentage of conversion events (e.g. Purchase, AddToCart) whose content IDs matched a product in the catalog.”
No person is involved. Your site fires an event carrying a content ID, Meta looks for an item whose retailer ID is that same string, and it either finds one or it does not. Adding email to your payload does nothing to this number — which is why the fix that raised one score left the other where it was.
The tool returns the latest overall rate, per-date and per-event-type history for the past 28 days, and setup issues carrying a type, a description and a severity. Its schema places that output precisely: “the same measurement-layer data Commerce Manager surfaces in its ‘Events’ tab”.
The underlying node carries total_content_ids_matched_other_catalogs: content IDs
“that matched to an item in another catalog”
(Marketing
API reference, read 2026-09-07). A big number there means your IDs are correct and the events are
landing on the wrong catalog — a connection problem, fixed in a minute. A near-zero one means
the IDs do not exist anywhere, which is a feed job. The health tool declares a rate and issues; it
does not declare this.
Two measurements share a name and only one of them answers your question. The Claude Ads Operator course spends its diagnostic modules on that distinction.
| Event match quality | Catalog match rate | |
|---|---|---|
| What is being matched | A person | A string |
| Against what | Meta's user graph | Retailer IDs in one catalog |
| Moved by | More and better identifiers in the payload | Making event IDs equal catalog IDs |
| Broken by | Consent loss, missing email or phone | Variant vs parent IDs, prefixes, wrong catalog |
| Where it lives | Dataset quality | Event-source health |
| Fixing one fixes the other | No. They share nothing but the word. | |
The pixel does not send one kind of ID
The reason this breaks in practice is that the ID your site sends is chosen by whatever wrote the tracking code, and stores frequently run two writers at once. A Shopify Community thread from 15 December 2023 describes it exactly: the poster reports that “Meta Pixel is fetching the SKU while CAPI is fetching the Item group ID” through the native Facebook and Instagram app, producing a low catalogue match rate they had no way to correct. The thread has no resolution posted.
Now read that against how the connector models sources. Every one of these tools labels a source
PIXEL, APP or OFFLINE_CONVERSION_DATA_SET, and each adds the
same clarification: the Conversions API “is an enhancement that augments PIXEL or APP data, not
a standalone source type”. Browser and server are one source. So when the two send different ID
conventions, the rate you get back blends a working join with a failing one, and no breakdown in the
tool or in Meta's node separates them — there is nothing to split on. The per-event-type
history is the closest lever: a convention that breaks on one event shows up as one series diverging
from the rest.
The convention itself is the other half. Feedoptimise, a feed vendor, published guidance on 17 November 2023 that the content type must agree with the IDs sent — parent IDs declared as a product group, variant IDs as products. It names no acceptable rate, and neither does Meta.
What to ask, in order
-
Ask the pixel which catalogs it feeds START HERE
Everyone asks the catalog which pixels it has. Ask it the other way and you find the second catalog nobody remembered, which is where the missing events have been landing. The trade: it takes an event source ID and nothing else. Hand it a catalog or ad account ID and the schema says it returns a not-found error naming the ID — which reads exactly like a permissions failure and is not one.
-
Look up one real content ID as a retailer ID
The schema spells out the workflow rather than leaving you to invent it: take the content ID from an actual event, list the catalog's products filtered on
retailer_idequal to that string, and see whether anything returns. That is the join, executed by hand, and it converts an argument about percentages into a yes or a no. The trade: it proves one ID. A store whose parent products match and whose variants do not will pass on the first ID you happen to pick. -
Read the history, not the headline
The per-date series tells you whether this is how it has always been or something that stepped down on a Tuesday, and the second has a cause you can find in a deploy log. The trade: the window is 28 days. A convention that broke last quarter looks like a permanent property of your account, because within everything you can see, it is one.
A percentage with no denominator is a mood, not a measurement.
- Connecting another pixel to raise the rate. A tool recommends sources for catalogs with weak coverage, and that is the right call when a catalog has none. It is the wrong call when the source is fine and its IDs are not — you have added a second set of events to the same failing join.
- Trying to connect the Conversions API. It is not a thing you connect — it writes into the pixel already there, and asking for it by name sends an assistant hunting an object that does not exist.
- Disconnecting a source to tidy up. The schema calls it destructive, warns it can reduce matching for dynamic and Advantage+ catalog ads, and says it is blocked outright while the catalog has active ad spend.
- Assuming a connection is required. The schema notes an event is not matched against an unconnected catalog unless the catalog ID is specified in the event. Events carrying their own catalog ID bypass the connection list, so the connected sources are not the whole story.
Try this tonight Add something to your own cart and read the content ID the event sends — the browser's network tab is enough. Then ask Claude to list that catalog's products filtered to that exact string as the retailer ID. If a product returns, the join works and the low rate belongs to another event type or a second source, so read the per-event-type history next. If nothing returns, you have found it in five minutes, and tonight's job is deciding which side moves: the feed's IDs or the site's.
What is a good catalog match rate?
Nobody publishes one, Meta included; any threshold you see quoted is somebody's house rule. The useful comparison is your own history — same event type, same source, last week against this.
Will improving my Conversions API setup fix a low match rate?
Only if it changes which ID you send. Better identifiers raise event match quality, a different measurement entirely. If your server events carry a different ID convention than the browser events, the Conversions API is part of the problem.
Can Claude connect a pixel to my catalog?
Yes, and connecting is idempotent — running it on an already-connected source succeeds and reports that nothing changed. Both objects have to belong to the same business. Disconnecting is the one that is guarded.
Is this the same as the dynamic ads health check?
No. That check reports pass or fail on match rate as one of several preconditions, and it is a different tool with different defaults. Event-source health is where the actual figure and its history live. The catalog half of the connector maps which tool answers what, and the setup guide covers getting connected in the first place.
One caveat. The connector surface described here is read from the tool schemas it ships, on
2026-09-07, alongside Meta's published node for event statistics — not from a payload watched
coming back. A field catalogue lookup the same day returned match_rate,
retailer_id and catalog_id as unknown fields, so none of this is queryable
as ad-account reporting. It is a catalog question asked of catalog tools, and the answer never
appears next to your spend.
Two numbers, one word, and the month it costs
Ten modules on running Meta ads through Claude, built around exactly this: which reading answers your question, and which one only looks like it does.
See what's inside — $67 founding pricePre-sale: the modules are still being recorded and founding members get the checkout link first. No charge today. Public price $97.