# Meta match quality and catalog and event ID drift | Máximo

> Your match quality scores are dropping and you don't know why. Odds are your catalog is fed by one tool and your conversion events by another, and they don't agree on what a SKU is.

Canonical: https://getmaximo.ai/blog/meta-match-quality/

---

[← All field notes](/blog/)

Tracking & attribution April 15, 2026 9 min read

# the silent killer of Meta match quality: catalog and event ID drift .

Your match quality scores are dropping and you don't know why. Odds are your catalog is fed by one tool and your conversion events by another, and they don't agree on what a SKU is.

Same product. Two tools. Two different IDs. Meta sees them as unrelated.

Match quality is Meta’s score for how reliably your conversion events line up with the people who saw your ads, the products in your catalog, and the offline data you ship back. It’s graded as Excellent, Good, Fair, or Poor on a per-event basis, and it has a direct, measured effect on bidding efficiency.

Most teams treat it as a customer-data problem: make sure to send hashed email, hashed phone, IP, user-agent, click ID. That helps. But for ecommerce, the dimension that quietly tanks match quality more often is product identity: does the SKU you sent in the `Purchase` event match the SKU in your Commerce Catalog?

Half the stores we onboard have this broken without realizing it.

## How the drift happens

Picture the typical Shopify stack. You have:

*   a **catalog feed** sent to Meta Commerce Manager, built by Shopify’s native Facebook channel, by an app like Flexify, or by a feed manager.
*   a **conversion event source:** Shopify’s native pixel/CAPI integration, or a server-side wrapper like Stape or Elevar.

Each of these tools has its own opinion about what the canonical “product ID” is. And Shopify products carry no fewer than five candidate identifiers any of them could pick:

1.  The Shopify `product_id` (a numeric like `8472619038`)
2.  The Shopify `variant_id` (also numeric)
3.  The merchant SKU (`SW-MERINO-CHAR-M`)
4.  The variant `handle`
5.  The GTIN, if set

Your catalog tool might use the merchant SKU. Your pixel/CAPI tool might use the variant\_id. Meta receives both and has no way to know they’re the same product. Match quality drops, and Advantage+ campaigns optimize against an incomplete picture of what actually sold.

Catalog feed SW-MERINO-CHAR-M → used as `retailer_id` in Commerce

Pixel event 8472619038::44719281 → sent as `content_ids` on Purchase

CAPI event 8472619038 → sent as `content_ids` on Purchase

Result 3 different "products" for what is, in your store, one SKU. Catalog match rate: 0%.

## How to find it (in 90 seconds)

1.  Open **Commerce Manager → Catalog → Events**.
2.  Look at “Content matched to catalog” for the last 7 days. If it’s below 80%, you have drift. Below 50% is critical.
3.  Open **Events Manager → your dataset → Diagnostics**. Filter for _“Content IDs not found in catalog”_. Expand a sample event. Compare the `content_ids` value to what’s in your catalog feed.

If they don’t match, you’ve found it. Now the question is which tool is wrong.

The two-IDs convention

Shopify’s pixel sometimes emits `content_ids` in the form `shopify_PRODUCTID_VARIANTID`. If your catalog uses raw `variant_id`, this format won’t match. Always normalize to one canonical format across both feed and events.

## The fix

Pick one canonical product identifier and use it everywhere. Our recommended order of preference:

1.  **GTIN**, if every product has one. Cross-retailer compatible, future-proof, recognized by every ad platform’s catalog.
2.  **Merchant SKU**, if every product has a unique one. Human-readable, stable across Shopify migrations, easy to debug.
3.  **Shopify variant\_id** as a last resort. Works, but breaks if you ever migrate platforms or rebuild a product.

Whichever you pick, both your catalog feed’s `id` field _and_ your conversion event’s `content_ids` field need to use the same value. That’s the entire fix. It’s just hard to enforce when those two fields are produced by two different apps that don’t talk to each other.

## Why a unified pipeline matters

This is, candidly, why we built Máximo as a single product covering both the catalog and the tracking. The typical Shopify stack solves them with two separate apps that have no knowledge of each other: one ships the catalog, the other ships events, and the merchant is left to manually verify they agree on identifiers.

When the same system generates both, ID consistency is enforced by construction. We use the same canonical identifier (you choose: GTIN or SKU) across the catalog feed sent to every channel and the conversion events sent server-side. Match quality stops being something you have to audit; it’s a property of the pipeline.

~60%

of new Máximo customers arrive with sub-80% Meta catalog match rate.

10–25%

CPA improvement we typically see after fixing ID drift, within 14 days.

0

manual reconciliation steps, when one system owns both feed and events.

Stats are aggregated across Máximo merchants, fall 2025 – spring 2026.

### audit your match quality.

connect Shopify; we'll show you exactly where your catalog and events disagree.

[get started →](/get-started/)

#### Keep reading

[

PMAX & Google · 14 min

##### how to win Performance Max in 2026: every attribute, every score, no shortcuts.

](/blog/pmax/)[

Tracking & attribution · 10 min

##### Safari ITP, three years on: what 7-day attribution actually does to your numbers.

](/blog/itp/)
