You open a GA4 report and "Direct / (none)" is 30% or 40% of total traffic. Something feels off. You know direct URL entry can't be that common; bookmarks alone can't explain that volume. Yet the "unknown traffic" row keeps growing.
In most cases this is not a user-behavior story — it's a measurement-loss story. This article maps the five causes of inflated Direct / (none), derived from Google Analytics' classification logic and the W3C Referrer Policy spec, with diagnostics and fix priority for each.
TL;DR#
-
Direct / (none) is the "source unknown" flag
Sessions where GA4 captured neither UTM parameters nor a referrer land here
-
80% of causes are fixable in-house
UTM loss, protocol downgrades, redirects, and referrer policy are mostly resolved by your own configuration
-
Above 20%, watch. Above 40%, ad analysis has collapsed
Ad-driven traffic sneaks in, and ROAS gets overstated
1. What "Direct / (none)" actually means — GA4's rule#
GA4's help docs are explicit[1]: a session lands in Direct / (none) when both conditions are true.
- The landing URL has no campaign parameters (
utm_source,utm_medium, etc.) - The browser's
Refererheader (GA4'sreferrerdimension) is empty, or matches your own domain
In short: sessions with no surviving clue about the source — neither ad, nor search, nor social — collect here. In principle this should be limited to bookmarks, direct URL entry, and email-client clicks. In practice, ad-driven and social-driven sessions keep sneaking in.
Threshold for Direct / (none) share#

- Under 20% — Healthy. Within tolerance
- 20–30% — Yellow light. Start identifying causes
- 30–40% — Needs improvement. Ad reports need an "approximate" caveat
- Over 40% — Analysis collapsed. You can't talk about ROAS without decomposing Direct / (none)
At 40%+, writing "Paid Search ROAS is 400%" in a report doesn't mean what it says — some of Paid Search's real traffic hides in Direct / (none), skewing the number high. When ad-budget decisions depend on this number, you cannot cede precision here.
2. The five causes of inflated Direct / (none)#
At the root, causes collapse into two families: "no campaign parameters arrived" OR "referrer disappeared." Listed in descending order of real-ops frequency.

Cause 1: Missing utm_source — delivery-side omission#
The most common. Meta Ads, Google Ads, LINE Ads, Yahoo! Ads, email newsletters, LINE official accounts, X post links. Forget utm_source / utm_medium on any of these, and if referrer is also lost (cookie-consent dialog etc.), the session falls into Direct.
Especially common: newsletters, messaging-app links, QR code links. Channels without an agency running alongside tend to have operators pasting URLs manually — which is where UTM drops off.
Cause 2: referrer lost on https → http transition#
A transition from HTTPS to HTTP makes the browser intentionally not send the Referer header. This is the W3C Referrer Policy spec's default behavior, designed to prevent "downgrades"[2].
Even with "our site is https so we're fine," an http intermediate domain on the path nukes the referrer at delivery time.
Cause 3: In-app browser taps — a structural constraint#
When users tap URLs inside the LINE / Instagram / Facebook / X in-app browsers, the Referer header may not be set by the app, or may be a proprietary value (e.g., com.facebook.katana). GA4 doesn't match these against its social-sites list, so they land in Direct.
D2C and B2C ecommerce with high mobile-traffic shares are hit hardest — reliably attaching UTM is essentially the only prevention.
Cause 4: Redirects dropping the referrer#
Shortlinks (bit.ly, lin.ee, t.co) and redirects through intermediate domains generally don't pass source information to the final landing page. Server redirects (HTTP 301/302) behave differently across browsers, and JavaScript redirects almost always nuke the referrer.
"We use shortlinks for ad tracking" paradoxically ends up inflating Direct / (none) in GA4. Whether UTM parameters survive the redirect chain needs separate verification.
Cause 5: Deliberate restriction via referrer policy#
The W3C Referrer Policy spec lets sites control how much referrer info is sent on outbound transitions, via <meta name="referrer"> or HTTP response headers[2]. Most modern browsers default to strict-origin-when-cross-origin, which only sends the host name on cross-origin transitions.
Sites running stricter no-referrer policy send an empty referrer — which does land in Direct / (none). The referring site controls this, so it can't be fixed on your end.
3. Diagnosis and fix order#
Diagnosis — decompose with GA4 Explorations#
"Direct / (none) is 30%" isn't actionable without knowing whether it's UTM loss, redirects, or in-app browsers. Combine these dimensions in GA4 Explorations:
| Breakdown axis | Dimension | Causes it isolates |
|---|---|---|
| Device category | Device category | Mobile skew → likely Cause 3 (in-app browsers) |
| Landing page | Landing page + query string | Concentrated on specific LP → Causes 1 / 2 / 4 |
| Hour of day | Date + Hour | Matching ad-delivery windows → Cause 1 |
| Country | Country | High overseas share → Cause 5 |

Fix order — small effort, high impact first#
| Priority | Cause | Fix | Effort |
|---|---|---|---|
| High | 1. UTM loss | Unify and template URL generation at delivery side | Small |
| High | 4. Redirects | Ensure UTM survives every redirect stage | Small |
| Medium | 2. https → http transition | Move intermediate domains to https | Medium |
| Medium | 3. In-app browsers | Cover via UTM (browser behavior can't be changed) | Small |
| Low | 5. Referrer policy | Not your domain — replace with UTM | — |
Start with Cause 1 (UTM loss) and Cause 4 (UTM loss through redirects). Both are solved by the same two operational disciplines: "reliably attach UTM" and "verify UTM survives each path." One intervention, two causes fixed.
The single highest-leverage fix: unify your URL builder at the delivery platform layer. If utm_source varies across Meta Ads / Google Ads / LINE Ads as facebook / Facebook / meta, you'll fix Direct / (none) only to hit a different problem (broken channel classification) next. UTM casing-drift: The utm_source you should NOT use for Meta Ads.
4. Living with residual Direct / (none)#
Even after fixing all five causes, Direct / (none) will not drop to 0%. Real bookmarks, real URL typing, and browsers that suppress referrers all exist. Realistic targets:
- Ad-driven ecommerce : Under 15%
- Media-driven sites : 20–25% is an acceptable ceiling
- B2B SaaS : Around 20% is a realistic equilibrium
Reaching these floors gets Paid / Organic / Social channel reports back to a level where they drive decisions. If you're still above 40% after cleanup, that's a signal to revisit foundational measurement — tag implementation, consent management tooling.
RevenueScope solution
A lot of Direct/(none) means "revenue you can't trace the source of" is piling up. Visits that ads or search actually brought in have lost their referrer and slipped into Direct. With that, you can't correctly judge which channel is working.
RevenueScope preserves the referrer with its own tracking, reassigns traffic that tends to fall into Direct back to its real channel, and shows revenue by channel on one screen. It doesn't leave Direct/(none) sitting as an "unknown box."

RevenueScope's dashboard (demo data shown). It lines up real revenue by channel, including Direct.
Take the screen above. Direct accounts for ¥900K — 16% of the total. If most of that is really visits from ads or search, that revenue should be credited to another channel. Split out what's inside Direct and return it to its true source, and you start to see which channels truly create revenue. Reduce Direct/(none), and route the rest correctly. That's the next step toward not misjudging ad performance because of a measurement gap.
5. FAQ#
Q1. Are Direct / (none) and Direct / Direct different?#
Yes. Direct / (none) means "source unknown." Direct / Direct doesn't exist as a GA4 standard classification. You may see "(direct) / (none)" in some reports — same meaning: no UTM, no referrer.
Q2. Even with perfect UTM, Direct / (none) won't drop?#
Referrer-policy cases and true bookmark traffic stay. But ad / newsletter / social leakage drops significantly — share can compress to 15–25%. "Not zero, but low enough not to break decisions" is the realistic goal.
Q3. Can GA4 re-classify what's already in Direct / (none)?#
Not natively. Explorations let you hypothesize, but GA4 has no built-in historical reclassification. Either complement with a tool like RevenueScope or commit to UTM-tagging future traffic reliably.
Wrap-up — Direct / (none) isn't about user behavior, it's about measurement#
When Direct / (none) rises, many operators read it optimistically as "brand awareness is up; more direct visitors." As this article shows, the vast majority is measurement loss. Ad effectiveness becomes invisible, ROAS gets overstated, and ad-budget decisions drift accordingly.
The first move: track the Direct / (none) share monthly and write the 20% / 40% thresholds explicitly into internal reports. Just tracking the ratio gives you a running read on when and how much your ad analysis is drifting.
RevenueScope, on top of automatic UTM-casing normalization, re-classifies sessions composing Direct / (none) back to their likely true source via channel-classification logic. Built as a complement for the situation where "GA4's Direct / (none) is inflated, but the effort to back-fill historical data is prohibitive."
Related Articles#
- ROAS Guide 2026 — Formula, breakeven, and four improvement levers — Directly affected by Direct / (none)
- Why fixing 'Direct / None' alone won't reduce GA4's 'unknown traffic'
- UTM: 4 patterns breaking GA4 channel grouping
- The utm_source you should NOT use for Meta Ads
- GA4 e-commerce setup checklist for Shopify — 30 minutes
- The last-click trap distorting ad-budget decisions
References#
[1] Google Analytics Help "Default channel group" April 2026
[2] W3C "Referrer Policy" April 2026
[3] Google Analytics Help "[GA4] Direct traffic" April 2026
See which ads actually drive revenue, at a glance
Free up to 5,000 sessions/month. No credit card required. Up and running in 5 minutes.
Start measuring for free
