The problem every CMO knows
Monday morning, performance meeting. The screen shows three dashboards:
- Meta Ads: 142 conversions this weekend, ROAS of 4.2
- Google Ads: 118 conversions, ROAS of 3.5
- GA4: 87 conversions, ROAS of 2.6
Your Shopify/PrestaShop/WooCommerce back end shows 104 actual orders. No platform matches reality, or any other platform.
It isn't a bug: the gaps are structural. Until you understand why the numbers diverge, every budget decision rests on data you can't interpret correctly.
Average gaps observed
Cross-platform studies (Northbeam 2025, Triple Whale 2025, Measured 2024) converge on orders of magnitude:
| Platform | Gap vs. actual back end | Direction | Main reason |
|---|---|---|---|
| Meta Ads | +20 to +30% | Over-report | View-through attribution + modeling |
| Google Ads | +15 to +20% | Over-report | 30-day click window + assisted conversions |
| GA4 | -18 to -35% | Under-report | Last click, no view-through, consent gaps |
| TikTok Ads | +25 to +40% | Over-report | 7-day click/1-day view window + aggressive modeling |
On average, Meta over-reports by 26% compared with the actual back end. Google Ads by 18%. GA4 under-reports by 25%. These gaps are normal, up to a point.
Why the numbers can't be identical
Three structural mechanisms explain the divergence:
1. Attribution windows are different
Each platform attributes a conversion according to its own rules:
| Setting | Meta Ads | Google Ads | GA4 |
|---|---|---|---|
| Click window | 7 days | 30 days | Current session (default) |
| View window (view-through) | 1 day | No (except YouTube/Display) | No |
| Default model | Last click or view | Last Google click | Cross-channel last click |
| Cross-device | Yes (Facebook login) | Yes (Google login) | Limited (GA4 User-ID) |
| Gap modeling | Yes (missing data estimated) | Yes (Consent Mode) | Yes (Consent Mode) |
A user who sees a Meta ad on Monday, clicks a Google ad on Wednesday and buys on Friday will be counted as one conversion by Meta (1-day view-through: no, but 7-day click if they clicked on Monday), one conversion by Google Ads (30-day click), and one conversion by GA4 (last Google click).
Same transaction, different counts. Neither Meta nor Google is lying: they apply their own rules.
2. iOS 14.5+ widened the gap
Since iOS 14.5 (April 2021), iPhone users can refuse app-to-web tracking. The impact on data:
- Meta lost 40 to 50% of its iOS conversion signal. The platform compensates with statistical modeling, which inflates the numbers
- Google is less affected (Search runs on first-party data) but Display/YouTube campaigns suffer from the same problem
- GA4 depends on browser consent: between cookie refusals and ad blockers, 18 to 35% of conversions are never recorded
On a French e-commerce site where 45% of traffic is iOS mobile, the impact is massive.
3. Structural double counting
Meta and Google can both claim the same conversion. If a user clicks a Meta ad and then a Google ad before buying, both platforms count the sale.
On a €120 basket, Meta shows +€120 of attributed revenue, and so does Google Ads. Total displayed: €240. Actual revenue: €120. Your aggregate ROAS is inflated by 100%.
When gaps become a problem
Gaps of 15-30% between platforms are normal. What isn't normal:
- Meta shows 0 conversions while Google and GA4 count some: the Meta pixel is probably dead
- GA4 shows 70% fewer conversions than usual: a consent or tag problem is blocking events
- Google Ads suddenly doubles its conversion count: a dataLayer bug sends two
purchaseevents per transaction - The three platforms diverge by more than 50%: at least one data source is corrupted
That's the difference between an attribution gap (structural, predictable) and a data gap (technical, costly). The first is handled with reporting conventions. The second requires immediate action.
What Korvus does here
Korvus doesn't do attribution and doesn't tell you whether Meta or Google Ads is "right".
It checks that the data feeding each platform is reliable. If the Meta pixel is dead, Meta shows a ROAS of 0 because it no longer receives data, even if the campaigns still convert.
Four situations Korvus detects that skew your platforms' numbers:
| Situation | Impact on Meta | Impact on Google | Impact on GA4 | Korvus alert |
|---|---|---|---|---|
| Dead Meta pixel | ROAS → 0 | Unchanged | Unchanged | pixel_dead |
| Broken GA4 tag | Unchanged | Unchanged | Conversions → 0 | pixel_dead |
| Blocked checkout | All platforms under-report | checkout_zero | ||
| Duplicate purchase event | Meta +100% | Google +100% | GA4 +100% | checkout_zero |
| Degraded LCP | Unattributed bounces | Unattributed bounces | Bounces counted | perf_drop |
A CMO who sees Meta ROAS in free fall needs to know whether it's a real ad performance problem or a broken pixel. The answer changes the decision completely: cut the Meta budget (real problem) or call the developer (broken pixel).
How to manage gaps day to day
-
Pick a source of truth. Your back end (Shopify, PrestaShop, WooCommerce) is the only reliable source for order count and actual revenue. Measure each platform's gap against it.
-
Document your normal gaps. Calculate each platform's average gap over a rolling 30 days. Meta at +25%, Google at +18%, GA4 at -22%: those are your baselines. If a gap leaves that range, it's a signal to investigate.
-
Watch for breaks, not levels. A Meta ROAS that goes from 4.0 to 0.3 in 24 hours is a technical problem. A ROAS of 3.2 instead of 4.0 is a marketing topic.
-
Check data reliability before every budget decision. Before cutting a channel, check that the pixel works. The most expensive decision is the one based on broken data.
Key points
- Gaps between Meta, Google Ads and GA4 are structural: they come from attribution windows, cross-device tracking and modeling
- Meta over-reports by 26%, Google Ads by 15-20%, GA4 under-reports by 18-35%
- These gaps are normal as long as they stay stable; a sudden break is what signals a technical problem
- Korvus doesn't do attribution: it checks that the data feeding attribution is reliable
- Before any budget decision, check that your pixels work: a collapsing ROAS can be a dead pixel, not a failing campaign