2026-08-03
Why Your Marketing Mix Model Results Don't Match GA4 Conversions
You ran a marketing mix model to get a channel-agnostic view of what's actually driving revenue, and now the output says paid social is underperforming while GA4 shows it converting just fine. Or the model credits organic search with far more impact than the platform reports. Now you're staring at a client call in an hour with two "sources of truth" that disagree.
Why this happens
Ranked from most common to least:
- Different measurement philosophies. GA4 (and every ad platform) uses last-touch or data-driven attribution tied to a tracked click or session. MMM uses aggregated spend and outcome data over time to estimate incremental contribution, including channels with no clickable touchpoint (TV, out-of-home, sometimes brand search). They are answering different questions — "who touched the converting session" vs. "what moved the outcome" — so disagreement is the default state, not a bug.
- GA4's own undercounting. Consent mode gaps, iOS/Safari ITP cookie limits, ad blockers, and cross-device journeys all suppress GA4's conversion count relative to reality. If GA4 is already missing 15-30% of conversions, no reconciliation with MMM will look clean.
- Conversion definition mismatch. GA4 "conversions" may include micro-events (form starts, scroll depth marked as key events) that were never part of the revenue metric the MMM was trained on. Check whether the model used revenue, purchases, or leads — and whether GA4's key events map to the same thing.
- Time granularity and lag. MMM typically runs on weekly or monthly aggregates and applies adstock/decay to capture delayed effects (a video ad's impact three weeks later). GA4 reports same-session or same-day conversions by default. A channel can look flat in GA4 this week and still be doing real work in the model two weeks out.
- Media mix coverage gaps. If the MMM only includes digital spend variables but GA4 traffic includes untracked referral, direct, or dark social sessions, the model can't attribute what it never saw as a input variable.
- Platform-reported conversions inflated by overlapping attribution windows. Meta and Google Ads each claim credit under their own attribution window, so their sum often exceeds GA4's total, and MMM (which sees total outcomes, not per-platform claims) will naturally look "smaller" per channel by comparison.
Fix, step by step
- Pull the exact outcome variable used to train the MMM (revenue, orders, leads) and confirm it against the GA4 key event or metric you're comparing — not just the word "conversions."
- Align time windows. Re-aggregate GA4 data to the same weekly or monthly buckets the MMM used, using the same date range and timezone setting in GA4's reporting settings.
- Check GA4's Consent settings (Admin > Data Collection) and confirm whether Consent Mode is modeling gapped data. If yes, GA4's total will run under actual conversions — document this before comparing totals.
- List every channel/variable in the MMM input file and cross-check it against GA4's channel groupings in Traffic acquisition. Flag any channel in GA4 with real spend or sessions that isn't represented as its own variable in the model.
- Separate "attribution disagreement" from "MMM found something new." If a channel's GA4-attributed conversions are flat but MMM shows rising incrementality, check whether that channel has an adstock/decay term — the effect may be lagged, not absent.
- Rebuild a simple bridge table (see template below) that shows GA4 conversions, platform-reported conversions, and MMM-attributed outcome side by side for the same period, with a one-line reason for each gap.
- Present the bridge table, not the raw numbers, in the client conversation. Clients rarely object to a gap they understand; they object to being shown two numbers with no explanation.
Copy-paste template
MMM vs. GA4 RECONCILIATION CHECKLIST — [Client] — [Reporting period] 1. Outcome metric used in MMM: ____________ (revenue / orders / leads) 2. Matching GA4 key event: ____________ 3. Date range aligned (Y/N): ____________ 4. Consent Mode active (Y/N) — modeled gap estimate: ____________% 5. Channels in MMM input but missing from GA4 grouping: ____________ 6. Channels in GA4 but missing from MMM input: ____________ 7. Attribution window used by each ad platform (Meta / Google Ads / etc.): ____________ 8. Adstock/decay applied to lagging channels (list): ____________ BRIDGE TABLE (same period): Channel | GA4 conversions | Platform-reported | MMM-attributed | Gap reason -------------- | ---------------- | ------------------ | --------------- | ----------- Paid Search | | | | Paid Social | | | | Organic Search | | | | Direct | | | | Other/Offline | | | | CLIENT-FACING SUMMARY LINE: "GA4 tracks last-touch sessions in real time; the MMM estimates incremental impact across all spend, including delayed effects GA4 can't see. The two will never match exactly — this table shows where and why they differ."
How to verify it worked
You'll know the reconciliation is solid when every channel in your bridge table has a filled-in "Gap reason" — no blank cells — and the total MMM-attributed outcome is within a defensible range of GA4 plus your documented Consent Mode gap. If a channel's gap still has no explanation after checking definitions, time windows, and coverage, that's a real finding worth investigating, not a reporting error to paper over.
Once the checklist is filled in, turn it into a recurring report instead of a one-off fire drill. Next Action Analyst can take the CSV exports from GA4 and your ad platforms and surface exactly where the gaps sit period over period, so you're building the bridge table once instead of reconstructing it every time a client asks why the numbers don't match.
Next Action Analyst turns your campaign export into a prioritized list of changes to make tomorrow — with the numbers that justify each one.