When GA4 says the traffic came from somewhere else
Campaign parameters go missing between the click and the hit more often than anyone checks. The six places they disappear, and how to read the hit that carried the wrong source.
The report says direct. The campaign says otherwise. Arguing about the report is pointless, because the report is downstream of a request that either carried the campaign or did not — and that request is readable.
Where campaign data actually lives
dl— the document location on the GA4 hit, query string included. Yourutm_sourceand friends are in here or they are nowhere.dr— the referrer, which is what GA4 falls back on when there are no UTMs.gclidorwbraidin the landing URL for Google Ads, and the_gcl_awcookie the tag writes from it.cidandsid— because attribution belongs to a session, and a session that restarts mid-journey gets attributed again.
Six places it goes missing
- A redirect drops the query string. A marketing short link, an http-to-https hop, a
www-to-apex rule, a locale redirect. Each is one server rule away from forwarding the path and discarding
everything after the question mark. Compare the URL you clicked with
dlon the first hit. - The page rewrites its own URL first. Some sites tidy UTMs away with
history.replaceStateon load. If that runs before the tag, the tag reads the clean URL and the campaign is gone. Order decides this, and order is not something a report can show you. - A cross-domain hop with no linker. Moving from the site to a booking or checkout
domain without the linker parameter starts a new client ID, a new session and a self-referral. Watch
cidacross the hop: if it changes, one person just became two. - A missing referral exclusion. The payment provider bounces the user back and GA4
credits the conversion to the bank's domain. The hit after the return carries the provider in
dr, which is how you find it in seconds. - A gclid with no cookie behind it. The URL has
gclid, but no_gcl_awwas written, so the conversion has nothing to link back to. Usually consent denied at the moment of landing, or the tag not running on that page at all. - Re-attribution inside the session. The visitor clicks a second campaign before converting, and the later source takes the credit. Nothing is broken; the number is simply not the one being argued about.
Tag Master shows the pages walked in one journey with the client ID beside each, flags a client ID that changes mid-journey and a domain hop with no linker, and follows the click ID into the linker cookie and on to the conversion.
A routine that ends the argument
- Click the real campaign link, from outside the site, in a fresh profile.
- Read
dlon the first hit. If the UTMs are not there, the loss happened before any tag ran — look at redirects, not at GTM. - Note
cid. Walk to the conversion and check it never changed. - At each domain boundary, check the outgoing link carried the linker parameter.
- On the conversion hit, check the click ID chain: the URL had it, the cookie has it, the conversion sends it.
What the browser cannot settle
Attribution models, lookback windows and data-driven credit all happen after Google has the data, and no request tells you what a model did with it. What the browser settles is the input: whether the campaign reached the hit at all. Get that right first — a model cannot recover a source that never arrived.
Related guides
- Tracking inside an embedded widget
- How to debug server-side GTM
- Debugging Consent Mode V2: gcs, gcd and the violations nobody catches
Try it on your own site
Tag Master is free, needs no account, and collects no data.
Add to Chrome — Free