The Situation
A mid-market e-commerce brand was seeing inflated conversion numbers in Meta Ads Manager. Their reported ROAS looked great, but actual revenue didn't match. The media buyer suspected Meta was double-counting conversions but couldn't prove it or fix it.
What We Found
- Meta Pixel (browser) and Conversions API (server) were both sending purchase events, but the
event_idparameter wasn't being passed from the browser to the server — so Meta couldn't deduplicate - Event Match Quality score was at 2.8 out of 10 — Meta was essentially guessing on 70% of event matches
- The server-side implementation was sending events 4-6 hours after the browser pixel, outside Meta's deduplication window
What We Did
- Implemented consistent
event_idgeneration in the data layer, passed through both browser pixel and sGTM to CAPI - Fixed server-side event timing to fire within seconds of browser events via sGTM streaming
- Added proper user data parameters (hashed email, phone, fbp, fbc) to improve Event Match Quality
Before & After
| Metric | Before | After |
|---|---|---|
| Reported conversions (Meta) | 1,847/month (inflated) | 1,122/month (accurate) |
| Event Match Quality | 2.8 / 10 | 8.4 / 10 |
| Actual ROAS | Unknown (data unreliable) | 4.2x (verified against Shopify) |
| Deduplication rate | 0% (no dedup happening) | 98.7% |
Outcome
Reported conversions dropped 39%, which initially alarmed the team — but actual revenue hadn't changed. They were now seeing real performance for the first time. The media buyer reallocated budget from campaigns that looked good on paper to ones that were actually driving revenue, improving true ROAS by 22% over the following month.