Your Paid Search has been sliding for a few weeks while your organic climbs, and nobody can explain why: the Google Ads budget has not moved, campaigns are running, the Ads interface shows the same clicks as before. The temptation is to congratulate the SEO team. Do not, not yet. Chances are part of your paid sessions is being recounted as google / organic, and the cause is not on Google’s side: it is on your own site. Since July 30, 2026, GA4 has shown a new diagnostic, “Campaign data accuracy is affected by missing URL parameters,” that points straight at this problem. This article shows you how to check in ten minutes whether your site is stripping the gad_source and GBRAID parameters, why this is the worst kind of bug for an advertiser, and how to fix the chain.
The symptom, in plain terms
Here is the signature of the problem, exactly as you will read it in your reports. Your Paid Search channel drops with no change in ad delivery. In parallel, your google / organic rises, or you see a growing share of sessions land in (not set) on the source/medium dimension. Nothing changed on the campaign side: same budget, same bids, same click volume in the Google Ads interface. The gap between the clicks Google Ads reports and the Paid Search sessions GA4 records widens, week after week.
What makes this bug especially nasty is that it does not look like an outage. A broken tag, a script that no longer loads, a sudden (not set) spike: everyone spots those and treats them as an emergency. Here it is the opposite. The displaced number swells a channel you are delighted to see grow. Your SEO finally seems to be taking off, your paid ROAS “mysteriously” degrades, and you are about to reallocate budget on the strength of a false number. A bug that looks like good news triggers no mental alarm. That is precisely why you have to hunt for it on purpose.
If you would rather start from a general decision tree before digging into this specific case, I laid it out in GA4 missing data: Google bug or your tracking?. Here, we go straight to the 2026 cause.
Where to find the alert in GA4
The new diagnostic is not a full-screen banner. It is a data quality indicator that appears directly in the affected reports, not in a notification center nobody checks. The exact label to look for is “Campaign data accuracy is affected by missing URL parameters.”
Two operational details matter. First, everyone can see the indicator, but only an Editor role or above can actually act on the property: if a read-only analyst spots the alert, it will have to be escalated. Second, the alert offers a “View URLs” button that lists the offending page paths, meaning the landing pages where parameters arrive stripped. That list is your debugging starting point: those are the URLs to test first.
Last point, and it is a classic trap: after fixing, allow 24 to 48 hours of latency before the indicator updates. Do not conclude your fix failed just because the alert is still there the next morning. Wait a full cycle before you judge again.
GBRAID and gad_source: what these parameters really are
To fix it, you first have to understand what you are fixing. These parameters are not UTMs, and they are not the GCLID you are thinking of either.
GBRAID
GBRAID is a click identifier inherited from the post-ATT iOS ecosystem (App Tracking Transparency, iOS 14+). It was introduced to enable attribution for campaigns touching app-to-web traffic on Apple devices, where the classic GCLID could no longer be used for privacy reasons. The key thing to remember: on a significant share of Safari sessions, the GCLID is already removed on the browser side, but GBRAID stays present. GBRAID therefore becomes the last paid attribution net on those sessions. If you want the detail of what Safari removes today, I documented it in Safari 27: what really breaks in your tracking.
gad_source and gad_campaignid
gad_source (formerly gad) is a parameter that identifies the source of the ad that generated the click. Important point: it is not customizable and it is shared across advertisers, so it is not a per-user unique identifier but a provenance signal. gad_campaignid completes the setup by carrying the campaign identifier. Together, they let GA4 tie a session back to Google Ads even when the individual click identifier is missing.
A nuance worth keeping, because it prevents false diagnoses: Google is rolling gad_source out gradually. Its own documentation states a rollout “in the coming months,” and as I write (September 2026) the generalization is underway but not complete. So the parameter may not yet be added to all your click URLs. More on this in the false positives section.
The key point: aggregate identifiers
Here is the idea that changes everything and that nearly every piece of content on “GA4 Google Ads as organic” misses, because they cover the old problem (auto-tagging disabled, missing Ads-GA4 link, absent GCLID). GBRAID and the gad_* parameters are aggregate identifiers. They act as a fallback, triggered precisely when the GCLID can no longer do its job, that is, when the user denies ad_user_data. This is the mechanism I describe in Consent Mode v2 in GA4: on an ad-consent denial, attribution falls back to these aggregate signals.
The logical and brutal consequence: the segment your aggregate identifiers operate on is exactly the one where the GCLID has already given up. If your site loses the GCLID on the browser side (Safari) and strips the aggregate identifiers on the redirect side, you have no paid attribution signal left on those sessions. They no longer carry anything that says “Google Ads,” so GA4 does what it always does in that case: it files them under organic.
The 10-minute test
Enough theory, here is the concrete procedure. The goal is to verify the parameters survive all the way to the moment the tag loads, not just at the first redirect hop.
Take one of your Google Ads landing pages (ideally one listed by “View URLs”) and craft a test URL with dummy parameters, for example:
https://your-site.com/landing/?gclid=test123&gad_source=1&gad_campaignid=123456
Then open the browser developer tools, Network tab, with “Preserve log” checked so you do not lose the history on each redirect. Paste the URL, hit enter, and follow the chain of requests. What you are looking for: the final URL actually loaded. Check whether gad_source and gad_campaignid are still present, and at what position. Two practical rules: the parameters must stay in the final URL’s query string, and they must sit before the # fragment if there is one, otherwise the tag will not read them.
The most important point, the one most tests miss: do not stop at the first hop. A parameter can survive the http to https redirect, then vanish at the canonicalization redirect that follows. What counts is the state of the parameters at the exact moment your Google tag (gtag or GTM) runs. If the parameter is gone by then, it is lost, no matter that it existed three hops earlier.
The five usual culprits
In the vast majority of cases, the parameter drops because of a link in your own chain. Here are the five suspects, in order of frequency, with the fix:
| Culprit | What happens | The fix |
|---|---|---|
| Canonicalization redirect | The www to non-www redirect (or adding/removing the trailing slash) rebuilds the URL without copying the query string | Configure the rule to preserve and pass the query string ($args on Nginx, QSA on Apache) |
| Language or geo redirect | Routing to /en/ or to a country subdomain rewrites the URL and loses the parameters | Propagate the parameters into the redirect target, or route server-side without a visible redirect |
| CDN or WAF | The CDN or web application firewall filters unknown query strings it deems suspicious | Add gad_source, gad_campaignid, gbraid, wbraid, gclid to the allowed parameter list |
| Cache that normalizes the URL | The cache layer strips parameters to improve hit rate, serving a “clean” version of the page | Exclude ad parameters from cache key normalization |
| CMP or script rewriting the URL | A CMP or front-end script alters the URL (often via history.replaceState) before the tag loads | Check load order: the tag must read the URL before any rewrite, or read parameters from a copy taken as early as possible |
The common thread across these five cases: the problem is almost never at Google, it is in a link you control. That is good news, because it means you can fix it without depending on anyone.
Quantifying the exposure in BigQuery
Detecting the problem is good. Quantifying it is what turns a doubt into a decision. If you have the GA4 export to BigQuery, you can measure precisely what share of your sessions is affected. The idea: spot the page_location values that carry a gclid but where gad_source and gbraid are absent, then cross-reference with the attributed channel to see how many land in organic.
-- Sessions with gclid present but gad_source / gbraid absent from the URL
SELECT
COUNTIF(has_gclid AND NOT has_gad) AS gclid_clicks_without_gad,
COUNTIF(has_gclid) AS total_gclid_clicks,
ROUND(SAFE_DIVIDE(COUNTIF(has_gclid AND NOT has_gad), COUNTIF(has_gclid)) * 100, 1) AS pct_exposed
FROM (
SELECT
(SELECT value.string_value FROM UNNEST(event_params)
WHERE key = 'page_location') AS url
FROM `your_project.analytics_XXXXXX.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260801' AND '20260914'
AND event_name = 'page_view'
), UNNEST([STRUCT(
REGEXP_CONTAINS(url, r'[?&]gclid=') AS has_gclid,
REGEXP_CONTAINS(url, r'[?&](gad_source|gbraid|gad_campaignid)=') AS has_gad
)])
The pct_exposed row gives you the percentage of your Google Ads-identified clicks (via gclid) that arrive without the aggregate net. The higher that number, the greater your risk of reclassification to organic the day the GCLID gives up. To go further on parsing page_location and other useful checks, my selection is in The 10 essential BigQuery queries.
This is the section that sets the article apart from agency pieces that merely describe the alert: a hard number on your own data is what justifies blocking an hour of engineering to fix a redirect.
What it does not fix
Let us be honest all the way, because promising a silver bullet would be dishonest and waste your time.
Fixing your redirect chain does not recover the GCLID that Safari removes on the browser side: that is independent of your site, the browser decides. Nor does it recover the sessions where the user denied consent to the point that no signal is transmitted. And above all, beware the false positive documented by Google itself.
False-positive box. Since
gad_sourceis still in gradual rollout (September 2026), it is possible Google has simply not started adding it to your account’s click URLs yet. In that case, the parameter’s absence is not your doing: it is not your site stripping it, it is that it was never added at the source. Before blaming your redirects, run the ten-minute test: if your dummy parameters survive to the tag, your chain is healthy, and the alert then reflects the rollout in progress on Google’s side, not a fault on yours.
This honesty is not an admission of weakness, it is what builds authority: an audit that separates what you can fix from what is out of your hands is worth a thousand times more than a hollow promise. For the rest of the possible causes of falling conversions this year, see GA4 attribution in 2026: what changed.
The exit checklist
Here is what I would run on an affected account, in order:
- Spot the “missing URL parameters” indicator in your reports and click “View URLs” to grab the list of offending pages.
- Run the ten-minute test on two or three of those pages, following the redirect chain to the final URL.
- Identify the culprit link among the five suspects and apply the matching fix.
- Quantify your exposure in BigQuery to prioritize (a problem on 2% of clicks is not as urgent as one on 40%).
- Rule out the false positive: confirm the parameter is actually supposed to be present on your account before blaming your site.
- Wait 24 to 48 hours after fixing, then check the indicator clears and the Paid Search / organic split recovers.
This case belongs to a family of attribution bugs I am documenting this year: it is the internal twin of Microsoft Ads UTM: your GA4 channels shifted, with one difference: there, traffic left Paid Search for other paid channels, whereas here it leaves paid altogether to swell organic. Add it without hesitation to your GA4 audit, especially heading into Q4: reallocating a Black Friday budget onto an organic that is really misfiled paid is the mistake that costs. Close this check before the peak, in the same spirit as my Black Friday 2026 tracking checklist.