Google Ads spend that doesn’t show up in GA4 attribution, auto-tagging broken, GCLID stripped by redirect, or cross-domain tracking gap.
At a glance
The percentage of Google Ads click-throughs that GA4 actually attributes to the Paid Search channel. Healthy stores see >70% match. A match rate <30% is the alert and means GCLID auto-tagging is broken, redirects are stripping the click ID, the GA4 ↔ Google Ads property link is misconfigured, or the customer is bouncing between domains and losing the cross-domain context. When this drops, your CPA reporting in Google Ads becomes unreliable until it’s fixed.
| What it counts | (GA4 sessions where sessionSource = 'google' AND sessionMedium = 'cpc') ÷ (Google Ads clicks for the same window), expressed as a percentage. The “did the click survive the journey to GA4?” rate. |
| Sample basis | GA4 side: sessions tagged with the GCLID parameter from runReport filtered to source=google/medium=cpc. Google Ads side: clicks reported by the Ads API for linked customer accounts. Both windows aligned to the property’s timezone. |
| Sampling threshold | None for the 30D window. Google Ads click data is never sampled. GA4 session-source data is sampled only with high-cardinality dimensions; sessionSourceMedium is low-cardinality enough to escape sampling. |
| Bot traffic filter | GA4: built-in IAB Tech Lab filter applied. Google Ads: invalid-click filter applied (Google’s own click-validation pass, removes ~10% of raw clicks before billing). Both sides post-filter. |
| Time zone | The GA4 property’s timezone. Google Ads data converted to the same zone for window alignment. |
| Currency | Both sides converted to the GA4 property’s reporting currency for revenue comparisons. The match-rate itself is unitless. |
| Refunds | Not applicable, this card compares clicks/sessions not revenue. The companion ga4_xc_traffic_to_revenue card handles revenue. |
| Tracking-gap framing | Different from the purchase-event tracking gap. Click-attribution loss is a first-touch tracking failure (GCLID lost in transit), not a last-touch tracking failure (purchase event blocked at confirmation). The two failures compound: a click that’s lost AND a purchase that’s blocked = double invisibility. |
| Time window | 30D vsP (30 days vs the prior 30 days). |
| Alert trigger | <30% GA4-side utm match against Google Ads spend, OR a sustained drop of >15 pp week-over-week. |
| Roles | owner, marketing |
Calculation
Calculated automatically from your Google Analytics 4 data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A US apparel brand running Google Ads at $42,000/month spend. 30-day window ending 02 May 26.| Source | Clicks / Sessions | Match rate | Status |
|---|---|---|---|
| Google Ads (linked customer ID 123-456-7890) | 38,200 reported clicks | 100% (truth side) | Truth |
| GA4 sessions, source=google/medium=cpc | 28,650 sessions | 75.0% | Healthy band (>70%) |
| 30 days prior | 36,100 clicks vs 30,470 GA4 sessions | 84.4% | Higher than current |
- The match rate dropped from 84% to 75% in 30 days. That’s a 9 pp drop, just inside the “watch” zone but not yet at the 30% alert. The cause was traced to an A/B-test platform the brand installed on 14 Apr 26, that platform redirects landing-page hits through its own domain to assign a variant, and the redirect strips the GCLID parameter. Every customer assigned to the test variant lost their click attribution.
- The Google Ads CPA report is now overstated. Before the regression, GA4 attributed 11,400. Google Ads’ own conversion data (uploaded back from GA4 via the property link) inherits the same gap. The CPA figure Google Ads optimises against is now ~25% high, which means the auto-bidding algorithms are working with bad data and may be over-biding because measured ROAS looks artificially low.
- The fix is small but the consequences accumulate. The brand’s engineering team configured the A/B-test platform to preserve URL parameters on redirect (a single config flag). Match rate returned to 84% within 48h. The 18 days of bad data don’t backfill. Google Ads’ learning algorithm carries the bias for ~30 days as it phases out old conversion data.
- What WOULD trip the <30% alert? The most catastrophic case we’ve seen: a merchant migrated their primary domain (from
oldbrand.comtonewbrand.com) without updating Google Ads’ final-URL fields, but configured a 301 redirect. Every Ads click hitoldbrand.com, redirected tonewbrand.com, lost the GCLID at the redirect (because the redirect didn’t preserve query parameters), and became a “Direct” session in GA4. Match rate fell to 8%. The CPA report was effectively useless. - Server-side tagging doesn’t help here. Server-side tagging fixes the last-touch tracking gap (purchase events). This card measures the first-touch tracking gap (the click attribution itself). The two are independent. A merchant can have perfect server-side tagging AND a 20% ad-attribution match rate.
Sibling cards merchants should reference together
| Card | Why pair it with Ad Attribution Consistency |
|---|---|
| GA4 Property Health | The composite measurement-health score. A drop here AND in Property Health = double regression. A drop here AND green Property Health = the click-attribution failure is independent of the purchase-event failure. |
| GA4 Revenue by Channel | A direct downstream impact: when this card alerts, GA4’s “Paid Search” channel revenue understates and “Direct” overstates. The channel mix is corrupted. |
| GA4 Source/Medium | The detail view of source/medium attribution; useful for spotting which redirect or third-party tool is stripping the GCLID. |
| GA4 Campaign Performance | Campaign-level breakdown. If only one campaign’s match rate dropped, the issue is in that campaign’s landing-page configuration. |
| Google Ads Spend | The spend side. Spend × match rate = “spend GA4 actually saw”. |
| Google Ads Clicks | The click side, the truth denominator for this card’s calculation. |
| Cross-channel: Traffic to Revenue Divergence | Companion attribution-health card; this one tracks click attribution, that one tracks purchase attribution. |
| Cross-channel: Revenue at Risk from Incident | When this card alerts during an outage, attributable revenue at risk is calculated using the corrupted channel mix; expect that card to also flicker. |
Reconciling against the vendor’s own dashboard
Where to look in GA4 (this card is a Vortex IQ-only metric): GA4 doesn’t display “match rate vs Google Ads” as a single number. The reconciliation requires both connectors connected. The closest manual rebuild:Reports → Acquisition → Traffic acquisition → Filter to “google / cpc” for the GA4 sessions side, then compare to Google Ads’ Reports → Predefined → Performance → Clicks for the same date range. Admin → Property Settings → Product Links → Google Ads links to verify the link is active and auto-tagging is enabled.Other GA4 views that look like ad attribution but aren’t:
- Acquisition → User acquisition: shows first source/medium per user (cohort-style), not session-level click attribution. A returning customer’s first visit was via “google / organic” but their later purchase via “google / cpc” wouldn’t show in user acquisition.
- Reports → Advertising → All channels: GA4’s data-driven attribution model assigns fractional credit to multiple touchpoints; the headline “Conversions” number per channel can differ from raw session counts.
- Realtime → Traffic source: 30-min lookback only.
| Reason | Direction of divergence |
|---|---|
| Click-to-session timing. A click at 23:58 may produce a session at 00:01 (next day in property timezone). Day-boundary mismatches average out over 30D. | Boundary days only |
| Invalid-click filtering. Google Ads applies invalid-click removal after reporting raw clicks. The “clicks” number can re-state by 1, 5% within 24h. We snapshot at sync time. | Up to 5% noise on most recent 24h |
| Cross-device journeys. A click on mobile that converts to a session on desktop may break GCLID continuity. GA4 sees a Direct session; Ads sees a click. Inflates the gap by ~3, 8% on stores with heavy cross-device traffic. | Persistent ~5% structural gap |
| Auto-tagging vs manual UTM. If the brand has a custom URL-builder that overrides Google Ads’ GCLID auto-tagging with manual UTMs, GA4 still sees the session as “google / cpc” but the GCLID-specific match logic may flag it as a partial match. | Variable |
| Card | Expected match rate (healthy) | Causes of expected gap | What out-of-band signals |
|---|---|---|---|
google_adwords.total_clicks | 70, 90% match | Cross-device journeys (~5%), bot/invalid clicks Google filters but GA4 partially captures, PWA installs that lose query params, A/B-test redirect strippers. | <30% = catastrophic GCLID loss (redirect, broken Ads link, missing auto-tagging). >100% = duplicate session attribution OR landing page firing GA4 twice. |
google_ads.total_clicks | Same | Same | Same |
amazon_ads.total_clicks | Not applicable | Amazon Ads doesn’t share auto-tagging infrastructure with GA4 | Use Amazon Ads’ own attribution. |
klaviyo.email_attributed_revenue | Not applicable to this card | Email attribution is governed by UTM tagging discipline, not GCLID | Use ga4_xc_email_attributed_share. |