
Your UTM links look perfect, but GA4 shows nothing — or everything lands in “(not set)”. Nine causes explain nearly every case, in order of likelihood. Work through them top to bottom and you’ll find yours.
Table of Contents
- First: how GA4 attribution actually works
- Fix 1: You checked too early
- Fix 2: A redirect is stripping your UTMs
- Fix 3: Typos in the parameter names
- Fix 4: The link was never tagged
- Fix 5: The GA4 tag fires too late
- Fix 6: Cross-domain or checkout flows overwrite attribution
- Fix 7: Google Ads auto-tagging is off or the gclid is stripped
- Fix 8: Inconsistent casing splits your data
- Fix 9: Ad blockers or consent mode block the tag
- FAQ
Key Takeaways
- GA4 decides a session’s attribution once, at session start — parameters that arrive later, or get stripped before landing, never count.
- The most common causes in order: checking too early (24–48h processing), redirects stripping UTMs, and typos in parameter names.
- Test every campaign link in an incognito window: if the
utm_parameters vanish from the address bar, a redirect is the culprit. - (not set) almost always means untagged links or a broken session start — not a GA4 bug.
- Verify with Realtime or DebugView before waiting a day for standard reports.
Few things are more frustrating than launching a campaign, opening GA4 the next morning, and finding… nothing. No campaign rows. Or worse, a giant pile of (not set) where your beautiful tags should be.
The good news: the causes are finite and well understood. Work through these nine in order — they’re ranked by how often each one is actually the problem — and you’ll find yours. If you haven’t yet learned where UTM data lives in GA4, read How to Find UTM Campaign Data in GA4 first; this guide is for when the data genuinely isn’t arriving.
First: how GA4 attribution actually works
The 30-second version, because it explains half the symptoms below:
- A visitor clicks your tagged URL and lands on your site.
- GA4 fires a session_start event. This event carries the attribution — the UTM parameters, the gclid if present, the referrer.
- Those values become the session’s source, medium, and campaign.
- After processing (24–48 hours), they appear in your acquisition reports.
The critical detail: attribution is decided at session start. Whatever parameters are on the URL at that exact moment become the session’s attribution, and parameters arriving later in the same session generally don’t replace them. Keep that in mind — it’s the key to fixes 2, 5, and 6.
Fix 1: You checked too early
Symptom: Brand-new campaign, zero data anywhere in standard reports.
Cause: GA4’s standard reports take 24–48 hours to process new data. This is the single most common “problem” and it resolves itself.
How to check: Open Reports > Realtime and click your tagged link in an incognito window. If your visit appears within seconds with the right source and medium, everything works — you were just early. For even more detail, use Configure > DebugView.
Fix: Wait. Check Realtime now for confidence, standard reports tomorrow.
Fix 2: A redirect is stripping your UTMs
Symptom: Parameters work in Realtime never; the tagged URL “looks fine” when you built it.
Cause: Between the click and the final page load, something redirects the URL and drops the query parameters. Common culprits:
- HTTP → HTTPS redirect: your link uses
http://but the site forceshttps://, and the redirect drops the parameters. Always build links withhttps://. - Trailing-slash redirect: your link points to
/pricingbut the site redirects to/pricing/(or vice versa), losing the UTMs mid-redirect. - Link shorteners or tracking redirects: some shorteners don’t pass UTM parameters through. Always test the shortened version, not just the original.
- Site redirects: logins, locale detection, or mobile redirects that rebuild the URL without the query string.
How to check: Paste the full tagged URL into an incognito window. After the page loads, look at the address bar — if the utm_ parameters are gone, a redirect ate them. A redirect-tracing browser extension shows exactly which hop drops them.
Fix: Match the final URL form in your links (https, correct trailing slash), or fix the redirect to preserve query parameters.
Fix 3: Typos in the parameter names
Symptom: Total silence — no error, no data, as if the parameters don’t exist.
Cause: GA4 only recognizes exact parameter names. A misspelling is ignored completely, with no warning. GA4 supports: utm_source, utm_medium, utm_campaign, utm_term, utm_content, utm_id, utm_source_platform.
Common mistakes: utm-source (hyphen instead of underscore), utm_surce (typo), utmsource (missing underscore), UTM_SOURCE (parameter names must be lowercase).
How to check: Compare your link character-by-character against the list above.
Fix: Use a UTM builder instead of hand-typing parameters — it eliminates this entire category of error.
Fix 4: The link was never tagged
Symptom: Traffic shows up, but source, medium or campaign reads (not set).
Cause: Nine times out of ten, (not set) means traffic arrived from a marketing link someone forgot to tag — the social post, the email blast, the influencer link. GA4 can’t invent attribution it was never given.
How to check: In Traffic acquisition, switch the primary dimension to Session source / medium and look at which rows are (not set). Cross-reference with where you promoted the campaign.
Fix: Tag the link. Then make it process, not memory: every campaign link gets built in the UTM builder and tested (Fix 1’s Realtime check) before it ships. Our naming conventions guide keeps the values consistent once you’re tagging everything.
Fix 5: The GA4 tag fires too late
Symptom: Intermittent (not set), especially on fast-loading or script-heavy pages.
Cause: Remember the attribution rule: it’s decided at session_start. If the GA4 tag initializes late — buried behind a slow tag manager container, deferred scripts, or consent banners that delay firing — GA4 can’t establish the session cleanly and acquisition details come through as (not set).
How to check: Open Configure > DebugView, start a fresh session with a tagged link, and confirm session_start fires promptly with the campaign parameters attached.
Fix: Make the Google tag (labeled “GA4 Configuration” in older Tag Manager setups) fire as early as possible — first in the tag manager container, not deferred. Validate in DebugView after the change.
Fix 6: Cross-domain or checkout flows overwrite attribution
Symptom: Campaign data looks right until the user hits checkout or a second domain — then the purchase attributes to referral or direct.
Cause: When the journey spans multiple domains (main site → checkout provider → back), GA4 starts a new session on the new domain unless cross-domain measurement is configured. The new session’s “source” becomes the previous domain — your own checkout stealing credit from the campaign. Payment gateways are the classic case.
How to check: Look for your own domains (or paypal.com, stripe.com) appearing as session sources in Traffic acquisition.
Fix: Configure cross-domain measurement for every domain in the journey, and add payment providers and other intermediaries to the unwanted referrals list so they can’t claim attribution.
Fix 7: Google Ads auto-tagging is off or the gclid is stripped
Symptom: Google Ads traffic shows as (not set) or manual-tag values instead of ad data.
Cause: Auto-tagging appends a gclid parameter on ad click, giving GA4 strong click identity. If auto-tagging is disabled in Google Ads — or the gclid gets stripped by redirects or privacy-focused browsers like Safari — GA4 loses that identity.
How to check: Click one of your own ads (or use Google’s tag diagnostics) and confirm the landing URL carries a gclid that survives the full redirect chain to the final page.
Fix: Enable auto-tagging in Google Ads, and don’t manually tag Google Ads URLs with UTMs — the two systems conflict. Manual UTMs are for everything else.
Fix 8: Inconsistent casing splits your data
Symptom: Not missing data — fragmented data. Two or three rows that should be one campaign.
Cause: GA4 treats values as case-sensitive. Newsletter, newsletter and NEWSLETTER become three separate rows, each with a slice of the traffic. Nobody notices until reporting day.
How to check: Sort the Session campaign or Session source / medium table alphabetically and look for near-duplicate rows differing only in case.
Fix: Standardize on lowercase everything — it’s the simplest convention that eliminates the problem. (This is convention #1 in our UTM naming guide for exactly this reason.) Historical splits can’t be merged retroactively, so fix the convention going forward.
Fix 9: Ad blockers or consent mode block the tag
Symptom: A persistent, unexplained shortfall — campaign clicks (from your email platform’s click tracking) consistently exceed GA4’s sessions.
Cause: A meaningful share of users run ad blockers, and consent-mode implementations may prevent the GA4 tag from firing until consent is granted. In both cases the visit happens but GA4 never hears about it — no tag, no session, no attribution.
How to check: Compare your link-level click counts (email platform, ad platform) against GA4 sessions for the same campaign. A consistent double-digit percentage gap points here.
Fix: There’s no way to recover blocked hits, so calibrate expectations instead: treat GA4 as a consistent sample for comparing campaigns against each other, and use platform click data for absolute volume. Make sure your consent banner doesn’t unnecessarily delay the tag for users who do consent.
Quick diagnosis cheat sheet
- Nothing anywhere, campaign is new → Fix 1 (wait 24–48h, check Realtime).
- Nothing anywhere, campaign isn’t new → Fix 2 (redirect test), then Fix 3 (typos).
- Traffic present but (not set) → Fix 4 (untagged links), then Fix 5 (late tag).
- Good data until checkout → Fix 6 (cross-domain + unwanted referrals).
- Google Ads specifically broken → Fix 7 (auto-tagging / gclid).
- Duplicates, not gaps → Fix 8 (casing).
- Consistent undercount vs click data → Fix 9 (blockers / consent).
FAQ
Why is my campaign showing as (not set) in GA4?
Almost always: the traffic came from a link that was never tagged, a typo broke the parameter, or the GA4 tag fired too late to capture the session start. It’s GA4 telling you attribution data is missing — not a bug in the report. Work through fixes 3, 4 and 5.
How long should I wait before troubleshooting missing UTM data?
Check Realtime immediately — if your tagged visit appears there, the pipeline works and standard reports need 24–48 hours. Only start troubleshooting (from Fix 2 onward) if Realtime shows nothing or the data is still missing after two days.
Can redirects really remove UTM parameters?
Yes — it’s the most common technical cause. HTTP→HTTPS upgrades, trailing-slash normalization, link shorteners and locale/login redirects can all rebuild the URL without the query string. The incognito address-bar test in Fix 2 takes ten seconds and catches it.
Do UTM parameters work on single-page applications?
They can break: client-side routing often strips the query string after the initial load, and if tracking re-reads the URL on route changes, attribution degrades. The initial session_start attribution usually survives — problems arise with setups that re-initialize tracking mid-session. Test the full journey in DebugView.
Should I use UTMs on internal links on my own site?
No — never. UTMs on internal links overwrite the session’s campaign attribution with your own domain as the source — the campaign that actually brought the visitor never gets credit. That’s Fix 6’s problem, self-inflicted. Use internal links plain; save UTMs for inbound traffic only.
Why do my Google Ads show the wrong campaign names in GA4?
You’re likely combining manual UTMs with auto-tagging — they conflict. Turn off the manual tags on Google Ads URLs and let the gclid carry the click identity (Fix 7). Keep manual UTMs for non-Google channels.
Conclusion
Missing UTM data is never mysterious once you know the pipeline: parameters must survive to the landing page, the tag must fire at session start, and the reports need a day or two to process. Nine times out of ten, your answer is in the first four fixes — timing, redirects, typos, or an untagged link.
Build the habit that prevents most of this: every campaign link gets built in a UTM builder, pasted into an incognito window, and confirmed in GA4 Realtime before it ships. Thirty seconds per link, and this guide becomes one you never need again.
Stop hand-typing UTMs
Most tracking failures start as typos. Build every campaign link with our free UTM Builder and test it before it ships.