2026-07-22
(not set) in GA4 Reports: What It Means Per Report and How to Fix It
You pull a GA4 report to see which landing pages or campaigns are driving conversions, and a chunk of your traffic — sometimes a huge chunk — is sitting under a single row labeled (not set). It's not broken tracking in the way you think, and it's not the same problem in every report. The fix depends entirely on which report you're looking at.
Why this happens
(not set) means GA4 had a dimension slot to fill and got no value for it. The cause is different per report type, ranked here by how often you'll actually hit it:
- Source/medium (not set) — almost always direct traffic, app traffic without attribution, or a redirect chain that strips UTM parameters or the referrer header. This is the most common (not set) you'll see and it's largely structural.
- Landing page (not set) — usually a page_view event fired without a page_location parameter, often from a custom implementation, a tag that fires before the page URL resolves, or a Measurement Protocol hit sent without the parameter.
- Campaign (not set) — traffic arrived with a source and medium but no utm_campaign, or it's Google Ads/organic traffic where GA4 mapped source/medium but had nothing to bucket as a campaign name.
- Cross-channel/default channel group (not set) — rare, but happens when the source/medium combination doesn't match any rule in the channel grouping definition.
- Sampling or property migration artifacts — old data from before a tagging change, or a Universal Analytics to GA4 migration gap. This bucket is not fixable retroactively.
The key distinction: (not set) caused by missing UTMs, broken redirects, or misconfigured tags is fixable going forward. (not set) caused by direct traffic, dark social, or historical data is structural — you can reduce it, but you can't eliminate it, because some traffic genuinely arrives with no referrer information to capture.
Fix, step by step
- Identify which report shows (not set) first — check Traffic acquisition (source/medium), Pages and screens (landing page), and any report using Session campaign or First user campaign as the dimension. The report tells you which cause bucket to check.
- For source/medium (not set): pull a sample of the affected sessions and check the Session default channel group dimension alongside them. If they cluster under Direct, this is expected — no fix needed beyond reducing genuinely missing UTMs on your own campaign links.
- For landing page (not set): open Configure > DebugView in GA4 and fire a test page_view on the pages in question. Confirm the page_location parameter is populated. If it's blank, check your Google Tag or GTM trigger — it's likely firing before the DOM/URL is ready, or a custom page_view override is dropping the parameter.
- For campaign (not set): audit your ad platform links and email/social links for missing utm_campaign values. Use Google's Campaign URL Builder conventions consistently — utm_source, utm_medium, and utm_campaign should always travel together, never just one or two.
- Check for redirect chains: if links pass through a URL shortener, a landing page tool (e.g., a bio link tool), or an internal redirect, confirm the redirect preserves query parameters. Test with a browser network tab — the final landed URL should still contain the full UTM string.
- Check for cross-domain tracking gaps if traffic moves between domains (e.g., a checkout on a different domain). Missing cross-domain configuration in Admin > Data streams > Configure tag settings commonly re-tags second-domain sessions as new direct sessions.
- For the default channel group showing (not set), review Admin > Data display > Channel groups and confirm the source/medium combinations you actually use are covered by a rule, especially any nonstandard mediums.
- Re-tag your own campaign links going forward. You cannot retroactively fix historical (not set) rows — only reduce the rate for new sessions.
Copy-paste diagnostic checklist
GA4 (NOT SET) DIAGNOSTIC ORDER — run top to bottom, stop when found
[ ] 1. Which report? (source/medium / landing page / campaign / channel group)
[ ] 2. Source/medium (not set):
- Sample sessions -> check Session default channel group
- If "Direct" dominates -> structural, not a bug
[ ] 3. Landing page (not set):
- Open DebugView, fire test page_view
- Confirm page_location parameter is present
- Check tag firing order (before vs after URL resolves)
[ ] 4. Campaign (not set):
- Pull 10 sample referral URLs
- Confirm utm_source + utm_medium + utm_campaign all present
- Missing utm_campaign only -> fixable, re-tag links
[ ] 5. Redirect check:
- Network tab on final landed URL
- Confirm UTM string survives redirect/shortener
[ ] 6. Cross-domain check:
- Admin > Data streams > Configure tag settings
- Confirm both domains listed under cross-domain measurement
[ ] 7. Channel group rules:
- Admin > Data display > Channel groups
- Confirm nonstandard source/medium pairs have a matching rule
[ ] 8. Historical (not set):
- Accept as non-fixable, exclude from trend comparisons pre-fix date
How to verify it worked
Re-tag one campaign or fix one redirect, then wait 24–48 hours for data to populate. Filter the relevant report to just that campaign or landing page and confirm the source/medium, campaign, or page dimension now populates with a real value instead of (not set). Compare the (not set) percentage in Traffic acquisition week-over-week — a downward trend confirms the fix is working; a flat line means the structural (direct/dark social) portion is what remains.
Once your GA4 data is clean, the harder part is turning "which campaign underperformed" into "what do I do about it today." That's the gap Next Action Analyst closes — it takes your campaign exports, including the newly-fixed source/medium and campaign data, and turns them into a ranked list of next actions instead of another report to stare at.
Next Action Analyst turns your campaign export into a prioritized list of changes to make tomorrow — with the numbers that justify each one.