Found in AI answers?Hire Theory Road
Theory Road.

Too Much Direct or (not set) in GA4? Causes and Fixes in Order.

Inflated Direct, (not set) landing pages and a growing Unassigned row are not three problems. They are the same problem: GA4 lost the source of the session somewhere between the click and the first event. Here is the order we use to find where.

By October 18, 202610 min read

When GA4 shows too much Direct traffic, (not set) source or landing page, or a large Unassigned channel, the cause is almost always one of eight things: a redirect stripped the UTM or gclid parameters before the tag loaded, UTMs are missing or use values the channel rules do not recognize, your own domain or a payment gateway is appearing as a referrer, cross-domain measurement is not configured, sessions are starting without a page_view event, consent mode is implemented with the wrong command, the click came from an app, email client or messenger that sends no referrer, or an HTTPS page linked to an HTTP page and the browser dropped the referrer. You confirm which one with Tag Assistant, DebugView and a Traffic acquisition report broken out by source, medium and landing page, then fix it at the URL, the tag or the stream settings.

GA4 decides where a session came from when the session starts. The Google tag reads the page URL (utm_source, utm_medium, utm_campaign, gclid) and the browser's referrer, attaches them to the first event of the session, and GA4 maps that source and medium to a channel using the default channel group. Per Google's channel definitions, Direct means the source exactly matches (direct) and the medium is (none) or (not set). Unassigned means the source and medium matched no channel rule at all. (not set) means a value was expected and none arrived. All three are symptoms of the same thing: the information was lost, malformed or never collected.

The eight causes we find most often.

We run these audits on our own sites and on accounts we take over. The list rarely changes.

  • UTMs stripped by redirects: a vanity URL, a link shortener, an HTTP to HTTPS hop, a www redirect or a country redirect drops the query string, so the landing page loads clean and the session is Direct
  • Missing or malformed UTMs: utm_medium is absent or uses a value like blast or newsletter_oct that matches no default channel rule, so the session lands in Unassigned or shows (not set)
  • Self-referrals and payment gateways: the visitor leaves for PayPal, Stripe Checkout, a booking tool or a login provider and returns, and that domain becomes the referrer that gets credit
  • Cross-domain measurement not configured: the visitor moves between your own domains, the second domain sets a new client ID, and the journey splits into a referral or a direct session
  • Sessions starting without a page_view: the Google tag fires late, the GA4 tag in Tag Manager is not on the Initialization trigger, or an event fires after the session timed out, leaving landing page (not set)
  • Consent mode implemented with the wrong command: the default command is used where update belongs, or events are sent with consent denied, and Google notes this can lose the session_start parameters
  • Clicks with no referrer: links opened from email clients, messaging apps, social apps, PDFs and documents often send no referrer, so without UTMs they are Direct by definition
  • HTTPS to HTTP referrer loss: the browser default referrer policy, strict-origin-when-cross-origin, sends no referrer when a secure page links to a non-secure one

Google Ads adds a ninth on some accounts: an unlinked Ads account or auto-tagging switched off produces (not set) in the Google Ads dimensions. That one is covered in our piece on Google Ads conversion tracking that stops working.

How to verify where the source was lost.

Do not start in the reports. Start with a real click and watch what the tag sees. Three tools, in this order.

Tag Assistant. Open tagassistant.google.com, connect your site with a full tagged URL (for example your landing page with utm_source=test&utm_medium=cpc&utm_campaign=audit), and follow the click. Check the first page in the debug window. If the page URL there no longer carries the UTM parameters, a redirect ate them. If the first GA4 hit is a custom event instead of page_view, you have found your (not set) landing page.

DebugView. In GA4, go to Admin, then Data display, then DebugView, while the Tag Assistant session is open. Click the first event of the session and read its parameters: page_location should still hold the UTMs and page_referrer should hold the referring site. Confirm page_view arrives before any other event.

The Traffic acquisition report with a secondary dimension. In Reports, open Acquisition, then Traffic acquisition. Switch the primary dimension to Session source / medium and add Landing page + query string as a secondary dimension. Filter to the Direct and Unassigned channels. The landing pages show which link is leaking.

Diagnose top to bottom.

Each step isolates one layer. Stop at the first one that fails, fix it, and re-test before moving on.

Follow one tagged link through every redirect.
Paste a fully tagged ad URL into the browser and watch the address bar, or check each hop in the Network tab with Preserve log on. Every 301 or 302 must carry the query string forward. Fix the redirect to pass the full query string, or point the ad at the final URL so no redirect runs.
Audit UTM values against the channel rules.
Export Session source / medium for the Unassigned channel. Compare each medium to the default channel group: Email needs source or medium of email, Paid Social needs a social source and a medium matching cp, ppc, retargeting or paid, Affiliates needs medium affiliate, SMS needs source or medium sms. Rewrite your UTM templates to those values. Channel rules are not case sensitive, but source and medium values are, so Facebook and facebook still report as two rows.
Check for your own domain and gateways as referrers.
Filter Session source / medium to referral and look for your own domain, your subdomains, and payment, booking or login providers. Add each third-party domain under Admin, Data streams, your web stream, Configure tag settings, Show all, List unwanted referrals. Google allows up to 50 per stream. The setting is not retroactive.
Configure cross-domain measurement for every domain you own.
If the journey crosses your own domains (a marketing site and a separate store or app domain), open Configure tag settings, then Configure your domains, and add each one. Use the same Google tag ID on all of them. Click a link from domain A to domain B and confirm the _gl parameter appears in the URL. If it does not, a redirect or a script on the link is stripping it.
Make page_view the first event of every session.
In Tag Manager, set the Google tag to the Initialization - All Pages trigger, which is the fix Google gives for a (not set) session source. Confirm no event tag fires before it. On single-page apps, send page_view on each route change so a visitor returning after the 30 minute default session timeout starts the new session with a page_view and not a click or scroll event.
Review the consent mode commands.
Read the consent code. The default command should set the initial state once, before the Google tag. When the visitor makes a choice, the code should call update, not default again. Load the page with consent denied in Tag Assistant and confirm the first event still carries page_location and page_referrer.
Tag every link you control that cannot send a referrer.
Email campaigns, SMS, push notifications, QR codes, PDFs, app links and links you post in messengers send little or no referrer. Put full UTMs on all of them. Then check that your site serves HTTPS everywhere, so a link from your own secure pages or a partner's secure pages never downgrades to HTTP.
GA4 Direct, (not set) and Unassigned: symptom, likely cause, fix
SymptomLikely causeFix
Paid campaign sessions show as DirectRedirect dropped UTMs or gclidPass the query string through every redirect, or link to the final URL
Large Unassigned channelCustom utm_medium values no rule matchesUse mediums the default channel group recognizes
Your own domain listed as a referralCross-domain or subdomain setup missingConfigure your domains; use one tag ID everywhere
paypal.com or a checkout domain gets purchase creditGateway not in unwanted referralsAdd the domain to List unwanted referrals
Landing page (not set)Session started without page_viewFire page_view first; Initialization trigger in Tag Manager
Session source / medium (not set)Google tag not on Initialization trigger, or consent default misusedMove the tag to Initialization - All Pages; use update for consent changes
Email or SMS traffic counted as DirectLinks without UTMs and no referrerTag every email, SMS and QR link
Partner link traffic shows as DirectHTTPS page linking to HTTPServe HTTPS everywhere and fix the partner link
Google Ads dimensions show (not set)Unlinked Ads account or auto-tagging offLink the account and enable auto-tagging

What is normal and what is a red flag.

Some Direct traffic is real. People type your URL, use bookmarks, and open links from apps that send no referrer. Google publishes no benchmark for a correct Direct share. Look for change and concentration.

  • Normal: Direct concentrated on the home page and on pages people bookmark, such as login or account pages
  • Red flag: Direct concentrated on a deep landing page that only exists as an ad or email destination, which means tagged traffic arrived without its tags
  • Red flag: Direct or Unassigned that jumps on the day a campaign, redirect rule, site migration or consent banner went live
  • Red flag: your own domain, a subdomain or a payment provider in the top ten referrals
  • Normal: yesterday's numbers moving for a day or two, because Google says data processing can take 24 to 48 hours
  • Normal: a returning visitor starting a new session after 30 minutes of inactivity, the default timeout, which you can raise up to 7 hours and 55 minutes in the stream's tag settings

If you are also missing key events, the same tag order problems usually explain both, and our guide to GA4 conversions not showing picks up from here. If the Google tag itself is not firing, start with Tag Manager tags that do not fire. Phone calls tracked through a call tracking tool have their own source handoff, covered in our CallRail and GA4 setup.

Server-side and Measurement Protocol events.

Events you send from a server through the Measurement Protocol carry no browser referrer and no page URL. If they do not include the client_id and the session_id from the visitor's browser, GA4 cannot attach them to the session that holds the traffic source, and they show up as (not set) or Unassigned. Capture both values at form submit or checkout, store them with the order or lead, and send them with the server event. This is the same discipline we apply in the conversion tracking audit checklist.

Why is my direct traffic so high in GA4?

Usually because the source was lost, not because people typed your URL. Check whether tagged ad and email links survive every redirect, whether email, SMS and app links carry UTMs, whether any HTTPS page links to an HTTP version of your site, and whether the first event of each session is page_view. Look at Direct by landing page: deep campaign pages in Direct are the giveaway.

What does Unassigned mean in GA4?

Unassigned is the channel GA4 uses when the session's source and medium match none of the default channel group rules. It almost always comes from custom UTM mediums such as newsletter or blast, or from server-side events without session information. Rename your mediums to values the rules recognize, such as email, cpc, paid_social, affiliate or sms.

Why is landing page (not set) in GA4?

Google states that landing page shows (not set) when a session has no page_view event. Common causes are an event tag firing before the Google tag, the Google tag not on the Initialization trigger in Tag Manager, and a visitor returning to an open tab after the session timed out and triggering a click or scroll before any page_view.

How do I stop PayPal or Stripe showing as a referral in GA4?

Go to Admin, Data streams, select your web stream, Configure tag settings, Show all, then List unwanted referrals, and add the gateway's domain. GA4 then marks those events with ignore_referrer so the gateway is not credited. You can list up to 50 domains per stream, and the change does not rewrite past data.

Does consent mode cause (not set) in GA4?

It can when it is implemented wrong. Google notes that using the default command where the update command belongs can lose the session_start parameters, and that sending extra events with consent denied can create sessions without a session_start. Set the default once before the tag loads and call update when the visitor chooses.

Work with us

Let’s talk about what’s next.

A short note on where the business is and where it needs to go. A senior partner replies within one business day.

t@theoryroad.com

Step 1 of 2

How can we help you get found?

What do you need help with?

Next: name, email and budget. That’s it.