Skip to content

Fix: GA4 vs Google Ads conversions mismatch

finding google ads updated 2026.05.20 7 min read

When GA4-reported Ads conversions and Google Ads native conversions drift apart by more than 20%, you cannot trust either dashboard — and Smart Bidding is almost certainly optimizing against a different signal than the one your team reviews in the Monday standup. Reconcile before you tune budgets or change bid strategies.

Why this matters

Google Ads and GA4 measure the same user with different rulebooks. Google Ads counts a conversion when its own tag fires (or when Enhanced Conversions hashes match a server-side event), attributed by the Ads conversion action's own attribution model and lookback window. GA4 counts a conversion when a configured event fires in the GA4 data stream, attributed by the GA4 reporting identity + attribution settings, and only credits Google Ads when the session's source/medium resolves to google/cpc — which itself depends on auto-tagging, Consent Mode signals, and cross-device stitching.

The Whitead rule fires MEDIUM when the absolute deviance between the two counts exceeds 20% over a stable 14-day window for the same primary conversion goal. That threshold matches the operational rule-of-thumb reported across practitioner write-ups (Analytics Mania, Kissmetrics, Ruler Analytics): under 10% is noise, 10-20% is investigable, above 20% means at least one of the two systems is reporting fiction. Smart Bidding consumes the Google Ads number; your stakeholder dashboard usually shows the GA4 number; if they disagree by 25%, somebody is making decisions on the wrong reality.

How to verify the issue

  1. Open GA4ReportsAcquisitionTraffic acquisition. Set the date range to the trailing 14 days (avoid the last 48h — modeling row not yet final). Filter Session source / medium to google / cpc. Note the Conversions value for your primary conversion event.
  2. Open Google AdsCampaigns for the same 14-day window. Segment by ConversionsConversion action. Sum the rows that correspond to the same business goal (e.g. purchase, qualified_lead).
  3. Compute deviance: |GA4 - Ads| / max(GA4, Ads). Above 0.20 = finding confirmed. Re-check on a stable 14d window; never use a window that includes a tag deploy, attribution-model swap, or Consent Mode change.
  4. Open Google AdsToolsConversions → for each conversion action inspect Attribution model, Click-through conversion window, Engaged-view conversion window, and the Goal type setting (Primary / Secondary). Cross-check against GA4AdminAttribution settings (Reporting attribution model + Acquisition conversion lookback window).

If steps 1-3 show >20% deviance and step 4 reveals any mismatch in attribution model OR lookback window OR a stacked GA4-import alongside a native Ads action for the same goal, the rule is confirmed.

How to fix it

Plan a 60-90 minute working session with the analytics + paid-media owners in the same call. Most fixes touch both consoles; one-side-only changes regenerate the drift within a week.

  1. Pick a single source of truth per goal. For each business conversion (purchase, lead, signup), decide: native Google Ads conversion action OR imported GA4 conversion OR offline (CRM upload). Never two. Document the choice. See GA4 → Google Ads import for the canonical decision tree.

  2. Align attribution models on both sides. Set the Google Ads conversion action's Attribution model to Data-driven under ToolsConversions → action → Edit settings. In GA4, set AdminAttribution settings → Reporting attribution model to Data-driven. Mismatched models alone can produce material deviance — fix this first before chasing other causes.

  3. Align lookback windows. Set the Google Ads click-through window and the GA4 acquisition conversion lookback to the same value (default both to 30 days for lead-gen, 90 days for considered B2B SaaS). GA4's lookback is at AdminAttribution settingsAcquisition conversion lookback window.

    # Recommended starting point
    Google Ads click-through window:     30 days
    Google Ads engaged-view window:       3 days
    GA4 acquisition lookback:            30 days
    GA4 other-events lookback:           30 days
    
  4. Confirm Consent Mode v2 is applied symmetrically. Both gtag (web container) and the GA4 measurement endpoint must receive the same ad_storage + analytics_storage signals. If Consent Mode is Advanced for GA4 but Basic for Ads (common after partial CMP migrations), Ads will see fewer raw conversions and lean on modeling, while GA4 reports the modeled-row total. See Enhanced Conversions for the API-mode payload that closes most consent gaps.

  5. Disable double-counting. In Google AdsToolsConversions, set Goal type to Secondary for every non-canonical action covering the same goal (only Primary actions are counted in the Conversions column and used by Smart Bidding). Getting this classification right is non-negotiable.

  6. Re-baseline 14 days. After changes, do not judge results until 14 full days post-deploy. Attribution-model swaps re-enter the Smart Bidding learning phase-style recalibration; comparing partial-window data will mislead.

"Differences between Google Ads and Analytics conversions are expected. Common causes include attribution model differences, conversion windows, and how each product handles cross-device, modeled, and consent-impacted conversions."
Google Ads Help, Differences between Google Ads and Google Analytics conversions (accessed 2026-05-20)

How to confirm the fix worked

Diagnostic checklist — run all five 14 days post-deploy

  • Deviance under 15% between GA4 google/cpc conversions and Google Ads Conversions column for the primary goal over a trailing 14-day window.
  • Attribution models match — both consoles set to data-driven (or both explicitly set to last-click if the account is in the DDA exclusion list).
  • Lookback windows match — Google Ads click-through window == GA4 acquisition lookback window, documented in the measurement runbook.
  • No double-counting — for each business goal, exactly one conversion action is set to Goal type = Primary in Google Ads.
  • Consent Mode symmetryad_storage + analytics_storage flow to both gtag and the GA4 endpoint; modeled-conversion row in GA4 within ±10% of Ads modeled total.

If all five pass, re-run the audit — ga_vs_ads_conversions moves from failedpassed. If deviance remains >15% after fixes 1-5 land, escalate to a server-side measurement review (see related playbook below).

Methodology note. Whitead's ga_vs_ads_conversions rule is an account-scope, measurement-category check evaluated against the trailing 14-day window. The check ingests the Google Ads conversions queryset (action name, category, status, 30-day count, attribution model — capped at 20 actions per account to keep the AI-review prompt under context budget) and routes to the check_ga_vs_ads_gap prompt. The output mapping returns passed when severity_score is under 1, low at >=1, medium at >=2 — calibrated against the <10% / 10-20% / >20% deviance bands reported across Analytics Mania, Kissmetrics, and Ruler Analytics case studies. The rule is currently held in a tombstone state (is_active: false) because the v1 audit pipeline only sees the Ads side; the GA4 OAuth + GA4 Reporting API integration that would close the data-comparison loop is tracked as an Epic 8 candidate. Until that integration ships, the rule is exposed in the wiki for operator self-service and surfaces in the audit narrative as a "verify manually" callout rather than an automated finding.

Sources

// was this useful?
// anonymous · no personal data stored