(Not Set) in GA4: What It Means and How to Fix It
Every GA4 property has (not set) in its reports. Some of it is fixable. Some of it is architectural. The difference matters, because fixing a configuration issue takes 10 minutes, but no amount of configuration fixes data that was never collected. Here is how to tell which is which.
- (not set) means GA4 received an event but has no value for that dimension. It is missing data, not an error message.
- Landing page shows (not set) when sessions start without a page_view event. Session timeouts, consent delays, and GTM misconfiguration are the top causes. A well-configured property stays under 5%.
- Source/medium shows (not set) when GA4 cannot determine where the visitor came from. Consent denial, dark social apps, and in-app browsers are the primary drivers.
- Most fixes are not retroactive. Once GA4 collects data incorrectly, the gap is permanent. Only reporting-layer changes (like the February 2024 Google Signals removal) affect historical data.
- Cookieless analytics tools avoid the consent and attribution gaps entirely because they read referrers directly and do not depend on cookies for session attribution.
In this article
What (not set) actually means
(not set) is GA4's placeholder for "no value was received for this dimension." It is not an error. It means the data was never sent, not that something broke during processing.
GA4 uses five different labels for missing or unclassifiable data, and people confuse them constantly.
The critical distinction: (not set) means the data is genuinely missing. (other) means the data was collected correctly but GA4 is hiding it because the table is full. Unassigned means the data exists but GA4 cannot classify it. These require completely different responses. Filtering out (not set) rows does not fix anything. It hides the symptom.
Why landing page shows (not set)
GA4 populates the landing page dimension from the page_location parameter of the first page_view event in a session. If a session contains zero page_view events, landing page is (not set). Not "unknown." Not "the page they were on." Missing.
Session timeout re-engagement. A visitor opens your pricing page at 2:00 PM. They leave the tab open, go to lunch. At 2:31 PM they return and scroll. GA4's default 30-minute timeout has expired. It starts a new session. The scroll fires a user_engagement event, but no page_view fires because the visitor did not navigate to a new page. The new session has engagement data. It has no landing page. This disproportionately affects media sites, SaaS dashboards, and ecommerce product pages: anywhere users leave tabs open.
GTM tag firing order. If your Google Tag (config tag) fires on "All Pages" instead of the "Initialization" trigger, custom event tags can fire first. The session starts before page_view is sent. Fix: move the Google Tag to the Initialization trigger in GTM.
Consent timing. A visitor scrolls or clicks before accepting the cookie banner. If GA4 runs in Advanced Consent Mode, the scroll triggers a user_engagement event. A session starts. But the page_view may not fire until after consent is granted on a subsequent page. Landing page: (not set).
Benchmarks nobody else publishes. On a well-configured property, (not set) landing pages should be under 5% of sessions. Above 20%, something is broken: check your GTM tag firing order and consent implementation. Data Bloo's GA4 audit tool flags anything above 2% of page views.
Why source/medium shows (not set)
Source/medium attribution requires GA4 to read either the document.referrer or UTM parameters at session start, then tie them to a session via cookies. When any link in that chain breaks, source/medium is (not set).
Consent mode strips session identifiers. In Advanced Consent Mode, when a visitor denies cookies, GA4 sends "cookieless pings" that strip user_pseudo_id and session_id. Each page load becomes an orphaned event with no session context. GA4 cannot tie it to any source. Google's behavioral modeling can recover some of this data, but it requires at least 1,000 daily consenting users for 7 of the past 28 days and 1,000 daily denied events for at least 7 days. Most sites under 2,000 daily visitors never qualify.
Dark social strips referrer headers. 69% of all sharing activity happens through channels that do not pass referrer data: WhatsApp, Slack, email clients, Facebook Messenger, SMS. A link shared in WhatsApp opens in the browser with no referrer. GA4 sees it as direct traffic or (not set). The Groupon experiment proved the scale: when Groupon de-indexed from Google for 6 hours, 60% of their "direct" traffic disappeared. It was organic search all along.
In-app browsers corrupt attribution. When someone clicks a link in the Facebook, Instagram, or TikTok app, it opens in an embedded WebView that frequently strips the referrer header. One fashion brand found only 10% of their mobile ad traffic was visible in Google Analytics because the in-app browser hid the rest.
The benchmarks. Under 5% (not set) for source/medium on a properly tagged site with mostly non-EU traffic. In EU markets with compliant consent banners, consent mode alone can push this above 30%. That is not a configuration problem. It is an architectural one.
The fixes (and what they cannot fix)
Every fix below has one thing in common: it only affects future data. The pattern is critical to understand. Once GA4 collects a session without attribution data, that gap is permanent.
The configuration fixes are real and worth doing. Move the Google Tag to the Initialization trigger. Register your custom dimensions now. Link all Google Ads accounts. Extend your session timeout from 30 minutes toward the maximum (7 hours 55 minutes) if your users leave tabs open.
But none of these fix the structural causes: consent-denied visitors, dark social, in-app browser interference, ad blockers. Those are not configuration problems. They are consequences of how cookie-based, client-side JavaScript analytics works.
What (not set) costs you
(not set) is not just a cosmetic issue. Unattributed data distorts every decision you make from your analytics.
On a typical ecommerce site, 30-40% of conversion data falls into catch-all attribution buckets like Direct and Unassigned. The purchases happened. The revenue is real. But GA4 cannot tell you which campaign, ad, or referrer drove the sale.
This directly affects automated bidding. Google Ads Smart Bidding optimizes based on the conversions GA4 reports. When 30% of conversions are invisible, Smart Bidding thinks campaigns are performing worse than they are and pulls back spend on campaigns that are actually profitable. It shifts budget toward channels where conversions are easier to track, not toward channels that generate the most revenue.
In EU markets, consent mode makes this structurally worse. With up to 60% data loss on legally compliant consent banners, GA4 is missing attribution data for the majority of European visitors. Google's behavioral modeling is supposed to fill the gap, but it requires volume thresholds most small and medium sites never reach. The result: your EU traffic looks like it converts at half the rate of your US traffic, not because it does, but because you cannot see the conversions.
Analytics without (not set)
Clickport captures the referrer from the browser at page load. No cookies, no session reconstruction, no consent dependency. When a visitor arrives from Google, document.referrer says google.com. When they arrive from a link in an email, the referrer is either the email client's domain or empty. There is nothing to reconstruct, nothing to model, nothing to lose to consent rejection.
Unknown source → (not set)
No page_view → (not set) landing page
Unknown country → (not set)
Consent denied → Invisible or modeled
500+ unique values → (other)
Unknown source → Raw hostname shown
Every request → Landing page always captured
Unknown country → Excluded (no false labels)
No consent needed → Every visitor counted
No cardinality bucketing → No (other) row
Every dimension has an explicit value. No placeholder labels. No data hidden behind processing thresholds. No 24-48 hour wait for reports to populate.
The referrer is not always available. Dark social still strips referrer headers regardless of your analytics tool. But the consent gap, the biggest driver of (not set) in EU markets, disappears entirely. No cookies means no consent banner. No consent banner means no 40-60% data loss. Every visitor is counted, attributed to whatever referrer data the browser provides, and visible in your dashboard within 30 seconds.
Start your free 30-day trial. No credit card. One script tag. No (not set).
Frequently asked questions
What does (not set) mean in GA4?
(not set) is a placeholder that means GA4 received an event or session but has no value for a specific dimension. It is not an error message. It means the information was never sent: no landing page URL, no referrer, no campaign parameter. Each dimension has different causes for (not set), and the fixes are different for each.
Can (not set) be completely eliminated from GA4?
No. Analytics Mania puts it clearly: "In some situations, it is possible to fix and remove not set. In other situations, it is possible to reduce how often it appears. And in the rest, it is just something we will need to accept." Session timeouts, consent denial, dark social, and ad blockers all produce (not set) that no configuration change can fix.
Is (not set) the same as direct traffic?
No. Direct traffic shows as (direct) / (none) in source/medium. This is an intentional classification for visitors who typed your URL, used a bookmark, or came from a source GA4 could not identify. (not set) means GA4 could not even attempt classification because the attribution data was missing entirely. Direct is a fallback answer. (not set) is no answer at all.
What is the difference between (not set) and Unassigned?
(not set) means the data is missing. Unassigned means the data exists (source and medium may be populated) but it does not match any of GA4's 18 default channel rules. Common cause: using non-standard utm_medium values like "newsletter" instead of "email" or "partner" instead of "referral." Fix Unassigned by using medium values that GA4's channel rules recognize.
Does BigQuery fix the (not set) problem?
Partially. BigQuery receives the same raw event stream as GA4 but without thresholding, sampling, or row limits. It can recover gclid-based paid search attribution that GA4 misclassifies, and it can surface unregistered custom dimension values. But BigQuery cannot recover data that was never collected. If consent blocked the event, the tracker did not fire, or the page had no title tag, BigQuery has the same gap as GA4.

Comments
Loading comments...
Leave a comment