Why your GA4 and Google Ads conversions don't match
GA4 and Google Ads count different things on different dates with different attribution, so they never match exactly. Here are the six fixable failure modes, each with a detection step and a fix: date attribution, conversion lag, consent gaps, cross-domain loss, import mixing, and duplicate tags. Plus the residual gap that's supposed to be there.

GA4 says 120 conversions, Google Ads says 74, and the agency's answer is "attribution." The two never match exactly, and no setup will make them: they count different things on different dates with different attribution. GA4 counts key events on the event date across all channels; Ads counts conversion actions on the click date, within its own windows. Six causes are fixable: date attribution, conversion lag, consent gaps, cross-domain loss, import mixing, duplicate tags. The rest is a normal residual.
That last line is the one nobody staring at two disagreeing dashboards gets told, usually because the gap surfaces the moment budget decisions are due and trust is already gone. So read this page as triage: confirm what each side counts, find your failure mode, run its detection step before you change anything, and learn when the remaining gap is the system working as designed. Anyone promising a perfect match is selling you something.
#First: confirm what each platform is actually counting
Half of all "discrepancies" dissolve at this step, before any debugging. Four scope checks, two minutes:
- Same business event? A GA4
generate_leadkey event is not the same object as an Ads "Submit lead form" conversion action. List what each side counts. The key-events model is in Google's key events doc, and the seam between the two systems is walked in GA4 conversion tracking: setting up key events. - Same counting method? Ads conversion actions count "one" or "every"; GA4 counts every occurrence (with a once-per-session option per event). A one-vs-every mismatch alone produces a permanent, boring gap; Google's migration-era discrepancy guide walks the alignment settings.
- Same attribution scope? GA4 credits conversions across channels; Ads claims what its clicks (and configured windows) touched. GA4's google/cpc slice is the comparable number, never the property total. The factor list in Google's discrepancy-factors doc is the authoritative inventory.
- Same dates? They can't be: Ads books to click date, GA4 to event date. That's failure mode 1.
#The decision path: which failure mode are you in?
#Failure mode 1: date attribution, same conversions on different days
Ads reports conversions on the click date; GA4 reports them on the event date. A conversion from a Tuesday click that lands Friday sits on Tuesday in Ads and Friday in GA4, so every date-bounded comparison manufactures a discrepancy out of thin air, and recent days always look worse in Ads than they'll end up.
Detection: compare totals over a window much longer than your click-to-convert delay (90 undated days), google/cpc-filtered in GA4. If the gap collapses, this was most of your "problem." Fix: none needed; change how you read reports. Freeze judgments on the trailing few days, and compare like-for-like windows. Expected residual after fix: near zero from this mode alone.
#Failure mode 2: conversion lag, when your cycle outruns your report
If your click-to-conversion delay runs days or weeks (B2B, high-ticket, anything CRM-mediated), this month's report is structurally incomplete: conversions still in flight will land retroactively, on their click dates. Combined with mode 1, it makes "this week's performance" a fiction that rewrites itself nightly.
Detection: pull the days-to-convert distribution (Ads' path metrics or your CRM timestamps). If the tail crosses your reporting cadence, you're reading unfinished data. A typical CRM-mediated shape (illustrative, so pull your own): half of conversions landing within 2 days of the click, ~80% within a week, and the last few percent trickling in past day 30, which means a week's number takes roughly two more weeks to finish printing. Fix: widen windows appropriately, report on cohorts by click date, and mark reports "complete through" the date your lag distribution supports. Expected residual: whatever share of conversions is still in flight on any given read, predictable once you've measured your lag curve.
#Failure mode 3: consent mode gaps, modeled vs observed
Under Consent Mode v2 without losing your signal, consent-denied users send cookieless pings; Ads fills part of the hole with modeled conversions, and GA4 models separately under its own thresholds. The two models don't coordinate, so consent-heavy regions drive a gap neither dashboard can explain in its own UI, and a consent-banner deploy can move the numbers with zero change in actual sales.
Detection: split both sides by geography. A gap concentrated in EEA traffic, or a step change dated to a banner update, is consent, not performance; expect the EEA gap to run a multiple of the non-EEA baseline (illustrative: two to four times), not a few points above it. Fix: verify consent mode is implemented (not just installed), banner in the advanced mode you intend, and accept that modeled conversions are estimates: the fix is correct implementation plus honest labeling. Expected residual: persistent single-digit-to-teens percent in consent-heavy geos; it scales with your consent-denial rate.
#Failure mode 4: cross-domain loss, the checkout-domain trap
When the funnel hops domains (site → hosted checkout, booking widget, or payment page), two things break independently: GA4's session splits unless cross-domain tracking is configured, and the GCLID falls off unless it's carried across, so Ads loses the click linkage, GA4 misattributes to "referral", and both dashboards are wrong differently.
Detection: in GA4, self-referrals from your own checkout domain are the smoking gun. On the Ads side, conversions with no campaign credit climbing after a checkout change points the same way. Fix: configure cross-domain measurement and preserve click IDs across the hop. The full walk-through is Cross-domain tracking: the checkout-domain trap, with the click-ID mechanics in Click IDs: what gclid, fbclid, and wbraid do. Expected residual: near zero once the hop carries session + GCLID.
#Failure mode 5: import delay and source mixing
Any imported source adds processing lag and a second source that can overlap the first. That covers GA4 key events into Ads (Google's import doc), CRM conversions via Offline conversion tracking: send CRM deals back to Google Ads, and enhanced conversions for leads via Enhanced conversions: what they fix, what they leak, how to turn them on. The classic: the GA4 purchase import and the native Ads tag both primary, double-counting every sale; or an import cadence measured in days making "yesterday" permanently underreported. "Enhanced conversions not recording" belongs here too: an import path wired but not delivering.
Detection: Goals → Conversions → Summary, group by source. More than one primary per business event, or an import whose "last received" is stale, closes the case. Fix: one primary source of truth per event, everything else secondary; put imports on a daily schedule and watch their diagnostics. Expected residual: import processing lag (typically a day or two) you can plan around, once sources stop overlapping.
#Failure mode 6: dedup and duplicate tags
Old gtag plus new GTM container, a conversion tag firing on thank-you-page
refreshes, a missing transaction_id, or GA4 events double-firing from
two installs, and each inflates one side until the numbers diverge. Analytics
Mania's
duplicate-events fix guide
covers the GA4 side well; their
key-events troubleshooting post
is the counterpart for events that don't fire at all.
Detection: fire one conversion with Tag Assistant / GTM preview open and count. One business event, one fire per system; anything else is this mode. Fix: remove the redundant install, add transaction IDs, and adopt the re-runnable test discipline of The conversion tracking QA checklist: test it like you'd test code. Expected residual: zero. Duplicates are the one mode with no excuse.
#The error strings, decoded
- "Conversion tracking setup is incomplete": the action exists, but no working tag or import has reported for it. Wiring, not performance.
- "No recent conversions": the pipe worked before and stopped: a deploy, consent change, or import stall. Check "last received" dates before blaming the market.
- "Inactive" / "Needs attention" (tag status): Google hasn't heard from the tag lately or diagnostics found a config issue; open the diagnostics panel and let it name the problem.
#What residual gap is normal, and when to stop
After the six fixes, expect the remaining GA4-vs-Ads gap to sit around 10% to 20%, the range practitioner reconciliations like Ruler Analytics' converge on, and consistent with what Google's own factors doc implies once attribution scope, models, and consent modeling are accounted for.
| Failure mode | Fixable share | Expected residual after fix |
|---|---|---|
| Date attribution | Fully (reading discipline) | ~0 |
| Conversion lag | Predictable, not removable | in-flight share, per your lag curve |
| Consent gaps | Implementation errors only | scales with denial rate |
| Cross-domain loss | Fully | ~0 |
| Import delay / mixing | Overlaps fully; lag remains | ≤ import cadence |
| Duplicate tags | Fully | 0 |
Stop chasing the gap when three things are true: totals reconcile within the residual band over undated 90-day windows, no failure-mode detection step fires, and the gap is stable. Here's the reframe worth keeping once this report is closed. A stable gap is a property of the system, so it isn't the number to watch; a moving gap is a new failure mode arriving, and that is. The same logic reconciles Ads against your backend, or any two tools that count the same event differently. You didn't fix a GA4 problem. You learned to read a whole class of them.
Which turns reconciliation from a monthly fire drill into one number you glance at, and the only hard part is remembering to look. That's the part worth handing off. Buron's coverage datasets watch the GA4-vs-Ads shape per account continuously, so when the band shifts you get a finding naming the failure mode and the date it started, instead of a mystery and a morning of dashboard archaeology.
Frequently asked questions
Why don't my GA4 and Google Ads conversions match?
Because they count different things: GA4 counts key events on the event date under cross-channel attribution; Google Ads counts conversion actions on the click date under its own model and windows. Six fixable causes widen the gap (date attribution, conversion lag, consent gaps, cross-domain loss, import mixing, duplicate tags), but a residual difference is structural and normal.
Why is Google Ads showing fewer conversions than GA4?
Most often scope: GA4 counts conversions from all channels while Ads only claims those its clicks touched. Next most often: consent gaps or lost click IDs (cross-domain checkouts, stripped GCLIDs) stopping Ads from matching conversions to clicks. Compare undated, channel-filtered totals before concluding anything is broken.
How long does Google Ads take to record a conversion?
Tag-based conversions usually appear within hours, but they're booked against the click date, not the conversion date, so recent days keep filling in retroactively for as long as your conversion window runs. Imported conversions add processing lag on top. Never judge the last few days of a conversion report.
What does 'conversion tracking setup is incomplete' mean in Google Ads?
The conversion action was created but Google hasn't seen a working tag or import for it: the snippet isn't installed, isn't firing, or the linked import has never delivered. It's a wiring status, not a performance verdict: fix the tag or import path and the status clears after the first recorded conversions.
Related
- Consent Mode v2 without losing your signal
- Cross-domain tracking: the checkout-domain trap
- Offline conversion tracking: send CRM deals back to Google Ads
- Click IDs: what gclid, fbclid, and wbraid do
- The conversion tracking QA checklist: test it like you'd test code
- Every platform claims the same conversion: why ad platforms overreport