Even though people were buying products every day, the Meta match rate in their primary markets was sitting at effectively zero – just 0.3% overall. The results on the surface looked acceptable, but the algorithm was effectively working in total darkness
Here’s what that means: Meta’s catalog match rate is the share of pixel events (ViewContent, AddToCart, Purchase) that Meta can tie back to a specific product in your catalog feed using the content_id sent with each event. When that number is near zero, Meta isn’t failing to see your visitors’ activity. It’s seeing the activity but has no idea which product it relates to.

Only 0.3% of product interactions matched the catalog, with product views and adds to cart both at 0%.
The cost of running blind
A low match rate is a deceptive enemy because it does not stop your ads from running, but it does place a hard ceiling on how much your marketing can actually grow. Even though this regional giant was moving thousands of products daily, Meta’s machine learning was unable to link purchase events back to the actual items in the inventory. This meant that the algorithm was effectively guessing which users to target next instead of learning from real behavior. While the results were “okay” on paper, the brand was leaving an incredible amount of efficiency on the table simply because the machine did not have the sight it needed to optimize the spend.
What usually causes this
In our experience, a low catalog match rate almost always comes down to one (or more) of these:
- Content ID mismatch – the pixel sends a variant ID, the catalog is keyed by product ID (or vice versa).
- Missing or incomplete content_type / content_ids parameters on ViewContent, AddToCart, or Purchase events.
- The catalog feed itself pointing at the wrong pixel in Commerce Manager.
- Currency or value inconsistencies between the pixel and the catalog/CAPI, which get flagged as invalid and dropped rather than counted.
- Consent/opt-out setups that block events from firing at all for a share of visitors.
The technical language barrier
When we performed our deep diagnostic across their measurement stack, we found a classic case of two sophisticated systems trying to communicate in a dark room using different languages. The Content IDs being fired by the website’s pixel did not match the specific formatting required by the product catalogue, which meant the data was being sent but never recorded. These turned out to be two separate issues, showing up in two different markets, but both had the same effect: Meta couldn’t trust the data it was getting, so it threw it away instead of using it.
Furthermore, a subtle currency misalignment meant the pixel was reporting a sale in one currency while the catalogue was set up in another. Rather than trying to reconcile the difference, Meta flagged those events as inconsistent and dropped them. The ads were reaching people, but the data was vanishing into a void before it could ever help the algorithm improve.

Market A, before the fix: 59.4% overall catalog match rate, with only 17.7% of purchases matched to catalog items.
Rewiring the event pipeline
We move beyond simple troubleshooting to completely re-engineer the event pipeline for every market. We did not just patch the holes in this instance; we ensured the plumbing was built for long-term scale by aligning every data point between the webshop and the Meta Catalogue.
1 Synchronizing Content IDs (Market A)
We found that the IDs in the pixel were often missing prefixes or suffixes that the catalogue required for a match. We reformatted the core event structure in Google Tag Manager so that every viewContent, addToCart, and purchase event carried a unique and recognisable twin to the item in the master inventory. Meta’s own Advantage+ catalog ads documentation requires content_ids sent via the pixel to match the IDs in the catalog exactly so this was as much about following their spec as it was about fixing our own setup.

After aligning Content IDs, catalog matching reached 95.1% overall, with 99.5% of purchases linked to catalog items.
2 Global Currency Alignment (Market B)
The second market had a simpler problem: the numbers didn’t line up. The website’s tracking code was sending prices in one currency, while the product catalog was set up in another. To Meta, that looked like an inconsistency it couldn’t trust. So it quietly dropped those purchase events instead of counting them. Once we made sure both sides spoke the same currency, that barrier disappeared, and the sales started showing up where they should.

After correcting the market-specific currency settings, the catalog match rate reached 97.6%, with purchases and adds to cart both matched at 100%.
3 Real-Time Verification
We used a combination of GTM Preview mode and Meta’s Event Testing tools to validate every fix as it went live. We watched the red error flags clear in real time as the system finally recognised the product data it had been ignoring for months.
Restoring catalog matching
The post-fix screenshots show catalog match rates of 95.1% and 97.6%. In the 97.6% snapshot, purchases and adds to cart both matched at 100%, while product views reached 97.4%.
Meta could now connect far more website interactions to the corresponding catalog products and use those matched items in catalog ads. We checked the event parameters alongside the matching results, because a tag can fire successfully while still sending IDs the catalog cannot recognize. For a webshop operating across markets, that validation needs to cover the product ID structure and currency settings in each setup.
If you’re seeing similar gaps in your tracking, see how we approach Martech audits and integrations.


