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.
| Symptom | Likely cause | Fix |
|---|---|---|
| Paid campaign sessions show as Direct | Redirect dropped UTMs or gclid | Pass the query string through every redirect, or link to the final URL |
| Large Unassigned channel | Custom utm_medium values no rule matches | Use mediums the default channel group recognizes |
| Your own domain listed as a referral | Cross-domain or subdomain setup missing | Configure your domains; use one tag ID everywhere |
| paypal.com or a checkout domain gets purchase credit | Gateway not in unwanted referrals | Add the domain to List unwanted referrals |
| Landing page (not set) | Session started without page_view | Fire page_view first; Initialization trigger in Tag Manager |
| Session source / medium (not set) | Google tag not on Initialization trigger, or consent default misused | Move the tag to Initialization - All Pages; use update for consent changes |
| Email or SMS traffic counted as Direct | Links without UTMs and no referrer | Tag every email, SMS and QR link |
| Partner link traffic shows as Direct | HTTPS page linking to HTTP | Serve HTTPS everywhere and fix the partner link |
| Google Ads dimensions show (not set) | Unlinked Ads account or auto-tagging off | Link 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.