The symptom is always the same: Google Ads dashboard shows conversions, GA4 shows none — or a fraction — attributed to paid search. Your client asks why the numbers don't match. You open both dashboards and see two completely different realities.
The root cause is almost never “GA4 is broken.” It's one of six specific problems, each with a direct fix. Here's how to diagnose which one you're dealing with.
Why GA4 and Google Ads Never Agree Perfectly
Before diagnosing a problem, it's important to understand that GA4 and Google Ads will never show identical conversion numbers — even when everything is configured correctly. The gap has structural causes:
| Factor | Google Ads counts | GA4 counts |
|---|---|---|
| Attribution model | Data-driven (default since 2021) or last-click | Last-click (default), configurable per channel group |
| Attribution window | 30 days click, 1 day view (configurable) | 30 days (configurable in GA4 attribution settings) |
| Cross-device | Includes modeled conversions across devices | Session-scoped, no cross-device modeling by default |
| Consent | Uses modeled conversions for users who declined cookies | No data for users without consent unless Consent Mode v2 active |
A 10–20% discrepancy between GA4 and Google Ads is normal and expected. A 50%+ gap — or zero conversions in GA4 — is a tracking problem, not a methodology difference.
The 6 Causes of Zero (or Near-Zero) GA4 Conversions from Google Ads
1. gclid Is Not Passing Through to the Landing Page
When someone clicks a Google Ad, Google appends a gclid parameter to the landing page URL. GA4 reads this parameter to identify the click as coming from Google Ads. If the gclid is stripped — by a redirect, a CMS setting, or a URL rewrite rule — GA4 cannot connect the session to Google Ads, and the conversion is attributed to direct or organic instead.
?gclid=Cj0K... in the address bar, the parameter is passing. If the URL is clean without gclid, the parameter is being stripped. Also check: does your site use a redirect from a tracking domain before landing on the final URL? Redirects are the most common gclid-stripping culprit.Fix: Enable Auto-tagging in Google Ads (Tools → Account settings → Auto-tagging → On). If auto-tagging is already on, check your server-side redirects and ensure they preserve query parameters. In Apache: RewriteRule with[QSA] flag. In nginx: use $is_args$args in the redirect target.
2. Consent Mode v2 Is Not Configured (EU Traffic)
Since March 2024, Google requires Consent Mode v2 for all advertisers serving ads in the EU/EEA. When a user declines cookies and Consent Mode v2 is not implemented, the GA4 tag fires in a “denied” state — meaning no data is collected for that user at all. In markets with high cookie refusal rates (Germany, France, Netherlands), this can suppress 30–60% of GA4 sessions and conversions from paid channels.
Fix: Implement Consent Mode v2 via your CMP (Cookiebot, Usercentrics, CookieYes) or via GTM using the Consent Mode template. Verify in GA4 DebugView that ad_storage and analytics_storagesignals are firing correctly before and after consent is given.
3. GA4 Conversion Event Is Not Marked as a Conversion
GA4 tracks events. Not every event is a conversion. In GA4, you must explicitly mark an event as a “key event” (previously called a conversion) in Admin → Events. If your purchase or lead event fires but isn't marked as a key event, it will appear in the Events report but nowhere in the conversion attribution reports — including the Google Ads channel attribution.
Fix: Go to GA4 Admin → Events → find your conversion event (e.g. purchase, generate_lead, form_submit) → toggle “Mark as key event” to On. Allow 24–48 hours for data to appear in attribution reports.
4. GA4 Property Is Not Linked to Google Ads
GA4 attribution for Google Ads channels requires an active link between the GA4 property and the Google Ads account. Without this link, GA4 cannot attribute sessions to specific Google Ads campaigns — they appear as generic “google / cpc” without campaign detail, or sometimes fall into Unassigned entirely.
Fix: GA4 Admin → Product Links → Google Ads Links → Add link → select your Google Ads account. After linking, also enable “Enable Google Signals” in Data Settings → Data Collection if cross-device reporting matters.
5. Attribution Window Mismatch
Google Ads default attribution window is 30 days for clicks. GA4 default lookback window is also 30 days — but configured separately in Admin → Attribution Settings. If someone changed the GA4 attribution window to 7 days (a common mistake made while troubleshooting), any conversion happening more than 7 days after a click is attributed to a later touchpoint or direct — not the original Google Ads click.
Fix: GA4 Admin → Attribution Settings → Reporting attribution model and lookback window. For most accounts: Data-Driven attribution with 30-day click window. Check that this matches or is close to your Google Ads attribution window to minimize structural discrepancy.
6. Cross-Domain Tracking Is Not Configured
If your checkout or payment process crosses to a different domain (e.g., from yourstore.com to checkout.yourstore.com or a third-party payment page), GA4 starts a new session on the second domain. The original gclid from the first domain is lost. The conversion on the payment page is attributed to direct — not to the Google Ads click that initiated the journey.
Fix: GA4 Admin → Data Streams → your web stream → Configure tag settings → Configure your domains → add all domains that are part of the user journey. If using GTM, add all domains in the Cross-Domain Measurement setting of the Google Tag configuration.
Diagnosis Checklist: Work Through This in Order
How to Verify Tracking Is Working After a Fix
After making changes, don't wait 48 hours hoping the data will improve. Use GA4 DebugView to verify in real time:
Open GA4 → Admin → DebugView. In Chrome, install the Google Analytics Debugger extension and enable it. Every event you trigger on your site will appear in real time in DebugView.
With DebugView open, click a Google Ad (incognito + DebugView tab side by side, or use a test conversion event). Verify: (a) the session_start event shows source: google andmedium: cpc, (b) your conversion event fires and appears in DebugView, (c) the gclid is visible in the event parameters.
GA4 → Reports → Realtime. After your test session, look forgoogle / cpc in the Traffic by Source panel. If you see direct / (none) instead, the gclid is not passing or auto-tagging is off.
When the Gap Is Normal vs. When It's a Problem
| Gap size | Likely cause | Action |
|---|---|---|
| 5–20% | Structural: model differences, cross-device, attribution window | Normal. No action needed. |
| 20–40% | Consent Mode missing or partial EU coverage | Implement Consent Mode v2. Check CMP coverage rate. |
| 40–70% | gclid stripping, cross-domain issue, or attribution window mismatch | Run full checklist above. DebugView to isolate. |
| 70–100% | GA4 not linked to Google Ads, or conversion events not marked as key events | Check GA4 Product Links and Events settings first — fastest fixes. |
If you've worked through the full checklist and the gap remains above 40%, the next step is a GTM audit — checking that the GA4 configuration tag fires on all pages, that conversion tags aren't duplicating or misfiring, and that no tag is interfering with the dataLayer before GA4 reads it.
We run tracking audits as part of every Google Ads account review. More frameworks in the Sterling Lab blog, or see how we work with accounts that need tracking rebuilt from scratch.