You built the link, added the tracking, launched the campaign — and now Google Analytics 4 shows the traffic sitting in “(Unassigned)”, lumped into (direct) / (none), or simply not there at all. The problem isn’t usually that GA4 is broken. It’s that one small thing between the click and the report is quietly dropping or mangling your UTM parameters, and GA4 has no way to recover what it never received.
The frustrating part is that you can’t prove the campaign worked. Spend, sends and clicks all happened, but the attribution that justifies them is missing. The good news: almost every case comes down to one of five things, and they fall in a predictable order of likelihood. Work through them top to bottom and you’ll find the cause faster than by guessing. This guide is the likelihood-ranked checklist — each cause opens with the symptom so you can self-diagnose, then gives the exact fix and the GA4 path to confirm it.
First, where UTM data should appear in GA4
Before declaring anything broken, know where correct campaign tracking is supposed to surface. In GA4, open Reports → Acquisition → Traffic acquisition. The default dimension there is Session default channel group; switch the dimension dropdown to Session source / medium (or Session campaign) to see the values your utm_source, utm_medium and utm_campaign tags produced. For granular, campaign-level breakdowns — by content or term — build a free-form report in Explore using the Session-scoped source, medium and campaign dimensions.
A correctly tagged visit shows your real source and medium here, for example newsletter / email. If instead you see (direct) / (none) or the visit rolled into an “(Unassigned)” channel, the UTM data either never arrived or didn’t map to a known channel. That distinction — arrived-but-unmapped versus never-arrived — is what the rest of this checklist separates out.
Cause 1 — It’s just reporting lag (check this first)
Symptom: you launched the campaign within the last day or two, and standard reports show nothing.
The single most common false alarm is impatience. GA4 standard reports run on a processing delay: Google documents that data can take 24–48 hours to fully appear in Traffic acquisition and other standard reports, with conversions and some dimensions on the longer end of that window. If you tagged a link an hour ago and the report looks empty, that is expected behaviour, not a tagging fault.
Verify before you panic. Open Reports → Realtime and click your tagged link yourself; within a minute or two your session should appear with the correct source/medium. For event-level confirmation, use DebugView (enable debug mode via the GA Debugger extension or Google Tag Manager preview) and watch the page_view event carry your campaign parameters live. If Realtime and DebugView show the right data, the campaign tracking is working — the standard report just hasn’t caught up. As Google’s own teams put it about analytics data lag, reporting delays happen across the stack; wait out the window before changing anything.
Cause 2 — A typo or missing parameter
Symptom: data shows in Realtime but a value is wrong, blank, or split across near-identical rows.
GA4 only reads the exact query parameters it expects. A single character off and the value is silently ignored. The usual offenders:
- Misspelled keys —
utm_sources,utm_souce, or a hyphen instead of an underscore (utm-source). GA4 reads onlyutm_source,utm_medium,utm_campaign,utm_contentandutm_term; anything else is dropped. - Missing required parameters — a link with a campaign but no medium can’t be classified into a channel and tends to fall into “(Unassigned)”.
- Case sensitivity — UTM values are case-sensitive.
Email,emailandEMAILbecome three separate rows, fragmenting one campaign into several. The cause and source are split, so totals look wrong even though every click was tracked.
The fix is discipline at the point of creation: lowercase everything, never invent custom utm_ keys, and check each link before it ships. If you’re unsure which parameter does what — particularly how source differs from medium — see our breakdown of the source-vs-medium rule before you tag the next batch.
Cause 3 — Wrong source/medium maps to “(Unassigned)” or the wrong channel
Symptom: the data is present and spelled correctly, but it lands in the wrong row of the channel report.
GA4 sorts every session into a default channel group using rules that read your medium (and sometimes source). The medium value is what does the heavy lifting in that channel grouping. Use a medium GA4 recognises — email, cpc, social, affiliate, referral — and the session maps cleanly. Use an unrecognised one like newsletter, e-mail, or paidsocial and GA4 can’t match a rule, so the traffic drops into “(Unassigned)” even though the tag was technically captured.
This is a classification problem, not a data-loss problem — the campaign is in GA4, just filed under the wrong label. The fix is to standardise medium values against GA4’s channel definitions, then keep them stable with a consistent naming convention so the same medium never appears two ways. For the underlying logic of which field drives the channel, the same source-vs-medium rule applies.
Cause 4 — A redirect or link shortener is stripping your parameters
Symptom: the link is tagged perfectly, but landing visits still show as (direct) / (none) — even in Realtime.
This is the most under-documented cause and a genuinely common one. UTM parameters live in the URL’s query string. Anything that rebuilds the URL between the click and the page load can drop them:
- Redirects that don’t preserve the query string — a server-side
301/302to a “clean” canonical URL, an HTTP→HTTPS or non-www→www rewrite, or a marketing redirect that forwards to the bare path and discards everything after the?. - Link shorteners that strip or fail to forward UTMs on the final hop.
- In-app browsers — links opened from inside apps (some email clients, social and messaging apps) occasionally mangle or re-encode query parameters before handing off to the browser.
- Internal links carrying UTMs: when a user clicks an internal link that itself has
utm_tags, GA4 may overwrite the original campaign attribution with the internal one — never put UTMs on links between your own pages.
How to test: paste your full tagged URL into a browser and watch the address bar after the page settles. If the ?utm_... string vanishes, a redirect ate it. Reproduce the exact path your audience takes — click from the real email or shortened link, not just the destination — and confirm in Realtime that the source/medium arrives. Fix by configuring redirects to pass the query string through, or by pointing campaigns at the final URL directly so there’s no hop to lose.
Cause 5 — GA4 configuration or attribution settings
Symptom: Realtime looks right, but standard reports still under-count or mis-attribute the campaign.
A few GA4-side settings can mask working tags. First, remember the gap between Realtime and standard reports: Realtime shows the raw session, while standard reports apply attribution and processing. Your attribution model and lookback window (Admin → Attribution settings) decide how credit is assigned across touchpoints — a data-driven model can credit a later channel, so the campaign that drove the click isn’t always the one that gets the conversion. That’s attribution working as designed, not a lost UTM.
Second, consent mode and cookieless contexts can suppress or model campaign capture: when a user declines consent, GA4 may withhold or estimate the session, thinning out campaign rows. Third, check Admin → Data Settings and any report-level filters — an internal-traffic filter, a developer/test filter, or a referral exclusion can quietly remove sessions you expected to see. None of these are tagging faults; they’re reasons the tags you sent don’t show up the way you assumed in GA4’s reporting layer. For where these features now sit, see our overview of GA4’s reporting layer.
How to verify your fix
Whatever you changed, confirm it with a controlled test rather than waiting and hoping. Run all three checks:
- Realtime — click your corrected tagged link, then open Reports → Realtime and confirm the session appears with the exact source / medium / campaign you intended.
- DebugView — with debug mode on, watch the
page_viewevent and inspect its parameters to see the campaign values attach at the event level. - Standard reports, later — after the 24–48h processing delay, re-open Traffic acquisition with the Session source / medium dimension and confirm the value sits in the right channel, with no duplicate-case rows and nothing in “(Unassigned)”.
“Working” looks like one clean row per campaign, correctly classified, matching what you tagged. If Realtime is right but standard reports are off, the answer is in Cause 1 or Cause 5, not your link.
Prevent it: generate clean, correctly-tagged links
Most of the failures above — typos, hyphens, mixed case, mismatched mediums, missing parameters — are tagging mistakes, and they’re the easiest category to eliminate entirely. Stop hand-typing UTMs. Build every link with our UTM Builder, which enforces the right parameter keys and consistent casing so the data lands clean in GA4 the first time and you never have to run this checklist again.
Frequently Asked Questions
Why is my UTM traffic showing as “(direct)/(none)”?
(direct) / (none) means GA4 received no source or medium for the session. Either the link had no UTM parameters, or — most often — a redirect, link shortener or in-app browser stripped the query parameters before the page loaded. Paste the full URL into a browser and watch whether the ?utm_... string survives to the landing page.
How long until UTM data appears in GA4?
In Realtime, within a minute or two of the click. In standard reports such as Traffic acquisition, allow 24–48 hours for the processing delay. Always confirm in Realtime or DebugView before assuming a campaign is untracked.
Do redirects break UTM parameters?
They can. Any redirect that doesn’t forward the query string drops your UTMs, so the visit arrives as (direct) / (none). Configure redirects to preserve query parameters, or point campaigns at the final destination URL so there’s no hop to lose them on.
Why is my campaign in “(Unassigned)”?
“(Unassigned)” means GA4 captured the session but couldn’t match it to a default channel group — usually a missing utm_medium or a medium value GA4 doesn’t recognise (like newsletter instead of email). Use a recognised medium and generate correctly-tagged links to keep values consistent.
Conclusion
When UTMs aren’t showing in GA4, resist the urge to rebuild everything. Work the five causes in order — reporting lag, then tagging typos, then a wrong source/medium, then redirect stripping, then GA4 configuration — verifying each fix in Realtime and DebugView. Most problems resolve at one of the first three. And once you’ve found the culprit, prevent the next round by generating every campaign link with the UTM Builder so the data arrives clean from the start.