Your analytics reports Direct because the visit it counted arrived with no campaign tags and no external referrer — not because someone typed your URL. The most common cause is your own site: when a session restarts partway through a visit, the referrer is your own domain, and most tools read a same-site referrer as no source at all.
The Google click or the ad click happened one page earlier, on a session the report has already closed. The evidence is not gone; it landed on a different row than the one you are looking at.
What does Direct actually mean in an analytics report?
Direct is not a channel. It is the bucket a tool uses when a session arrives with no campaign parameters, no click ID and no external referrer. It means “no evidence on this visit”, not “this person knows your brand” — and reading it as a source is how accounts report a growth channel nobody can buy more of.
Every analytics tool resolves a source in the same order. It checks the URL for utm_source and friends or a click ID like gclid, fbclid or msclkid. Failing that, it falls back to document.referrer — the address the browser volunteers for the previous page — and classifies that host into a channel. With neither, the visit becomes Direct.
Both fallbacks depend on things you do not control: the query string survives only if every redirect preserves it, and the referrer is a courtesy the browser can trim, downgrade to nothing, or never send. So Direct grows for reasons unrelated to how well your brand is known — the first thing to take into a read of your attribution report.
Why does your own website show up as the referrer?
Because a visit and a session are not the same thing. A session is a bookkeeping window a tool opens and closes, and one visit can produce two or three of them. Every session after the first starts on a page inside your site, so the only referrer the browser has to offer is your own domain — and a same-site referrer says nothing about acquisition, so the tool treats it as no referrer at all.
That is self-referral, and it is the single largest manufacturer of fake Direct traffic. The usual triggers:
- Session timeout mid-visit. Most tools close a session after roughly half an hour of inactivity. Someone opens your pricing page, goes to a meeting, comes back and clicks — page two starts a new session referred by page one.
- A hop to another domain and back. Checkout on a separate host, a payment or booking provider, a help centre elsewhere. The return leg is a referral from that host, never from the ad.
- Subdomain and
wwwmismatches. If the cookie is scoped towww.example.com, a visitor onshop.example.comis a stranger arriving from your own site. - A redirect that drops the query string. The landing URL carried
?gclid=…, the redirect to the canonical URL did not, and the first page the tag saw was clean. - A consent banner that gates the tag. The landing hit with the click ID happens before consent is granted, so it is never recorded. The first hit the tag sees is page two.
- In-app browser to real browser. Someone taps a link in Instagram, then reopens the page in Safari. The second browser has no memory of the first.
None of these are tracking bugs. They are a session model meeting a real visit. The repair step has a name — visit-sibling inheritance — matching those fragments on device and timing, then copying the campaign tags forward.

What else strips the source before the visit is counted?
Self-referral explains the visits your own site caused. These are the ones that arrive blank.
Browsers trim referrers by default. Cross-origin navigations typically send the origin only, not the full URL with its query string, and a move from HTTPS to HTTP sends nothing. Any site can tighten this further with a Referrer-Policy header, and plenty do.
Native apps and email clients send nothing. A link opened from Apple Mail, Outlook desktop, Slack, WhatsApp or a PDF has no referring web page to report. That traffic is real and often high-intent, and it lands in Direct unless the link was tagged — the whole reason for attributing email campaign leads without UTMs after a send has gone out.
AI assistants are inconsistent. Some referrals carry chatgpt.com, perplexity.ai or claude.ai and some arrive bare, depending on the client. A growing share of what looks like Direct is really traffic from ChatGPT and other assistants.
Genuinely sourceless visits. QR codes, a podcast mention, a printed URL, a typed domain — these belong in Direct, and in most accounts they are the smallest part of it.
What does an inflated Direct bucket cost you?
It costs you the budget decision, then the landing page decision, then the algorithm. Direct absorbs credit from every channel that loses its referrer, and the channels that lose it most are the paid ones you are actively judging.
Paid social and display suffer worst, because the click happens in an in-app browser and the purchase happens elsewhere. Their cost per acquisition is inflated by exactly the share of credit that leaked into Direct, so they look expensive and get cut — the conversion-side version of the same failure is why ad conversions show as Direct.
Your landing page report degrades with it. When a session restarts on page two, page two is recorded as the landing page — the real one loses a visit, an interior page gains one it never earned, and page-level conversion rates stop being comparable.
Then the feedback loop. Ad platforms optimise on the conversions you report back, and conversions sitting in an unattributed Direct pile never reach the platform that produced them — so targeting gets worse, results get worse, and the original bad measurement looks like it was right.
How do you fix Direct traffic without changing tools?
Five things, cheapest first. Each prevents a specific leak, and each has a limit worth knowing before you count on it.
- Exclude your own hosts from referral classification. Add your apex domain, every subdomain, and any payment, booking or help-desk host visitors bounce through. Limit: it stops a self-referral being logged as a referral, but restores nothing from the earlier session.
- Tag every link you control and turn on auto-tagging. UTMs on email, partner links, social bios and QR destinations; auto-tagging in the ad platforms so the click ID lands in the URL. Limit: nothing covers organic shares, forwarded links or dark social.
- Stop dropping the query string in redirects. Audit the whole chain — vanity domain, shortener,
wwwcanonicalisation, trailing slash, language redirect. Limit: you need control of every hop, and a vendor’s shortener is not yours. - Record the landing URL as early as you can. The first request is the only one carrying the click ID, and anything that defers it — consent gating, lazy loading, a tag manager queued behind other scripts — risks losing it. Limit: consent rules are not optional.
- Diagnose before you fix. Break Direct down by landing page. Homepage-heavy Direct really is partly typed and bookmarked. Direct landing on deep pages — pricing, a checkout step, a blog post — is self-referral, and no branding work reduces it.
All five prevent future loss. None recover a visit already recorded as Direct, because they fix bookkeeping. The structural answer is to stop asking the converting session for its referrer, and ask the person instead.
How does PartialLeads keep the original source on the visit?
By capturing attribution at the landing, storing it against the person rather than the session, and resolving the channel from that record instead of from the referrer of whichever session converts.
The tag reads the landing URL first: UTM parameters, plus the click IDs each platform uses — gclid, gbraid, wbraid, gad_source, fbclid, msclkid, ttclid and epik — falling back to document.referrer when there are no tags, and storing the landing page and referrer alongside them. A click ID is proof of a paid click in a way a referrer is not, which is why Meta builds its _fbc identifier from the fbclid in the landing URL rather than from the referring page (Meta, fbp and fbc parameters). Where the _fbc cookie is missing or malformed, PartialLeads rebuilds it from that fbclid.
The visitor ID tying page one to page two is a first-party cookie set by the server, not written by script. That matters on Safari, where script-written cookies are capped at seven days — so a returning visitor is still the same person rather than a fresh Direct arrival.
Within a visit, sibling inheritance repairs the split: a session with the same client, IP and user agent inside a ±30-minute window inherits the strong attribution — UTMs and click IDs — from its sibling. A narrower ±10-minute rule matches on the Meta fbc cookie with the IP allowed to differ, covering a phone switching from Wi-Fi to cellular mid-checkout. Referrer-only matching exists as an explicit weak tier, not promoted to a source.
Across visits, the six-tier identity cluster unions a person’s sessions by visitor ID, email, phone, IP and user agent, device fingerprint and click ID — the machinery in how visitor identity resolution works. Every matched purchase writes a first-touch and a last-touch attribution row, snapshotting the UTMs, click IDs, referrer and landing page, so the original channel stays attached to the person even when the converting session knows nothing.
You can see the result rather than take it on faith. The Attribution report shows First Touch, Last Touch and PartialLeads Resolved side by side, and the Recovered Attribution panel itemises what the resolved model recovered into three named mechanisms — iOS ad-click rescue, partial-lead revenue, and reclassified by session intelligence: sessions with no utm_source where the classifier resolved a real channel, with per-channel counts. That third bucket is typically the largest, and it is exactly the traffic that would otherwise read as Direct. On the Leads list an unresolved touch renders as a grey dot with no brand glyph — the honest statement is “we don’t know”, not “a channel called Direct”.

Three honest constraints. If the landing hit was never recorded — tag blocked, consent denied, request never fired — there is nothing to inherit, and no vendor recovers it. Referrer-only inheritance stays the weakest tier, because a referrer is a hint and a click ID is evidence. And Direct never goes to zero, nor should it: some visits genuinely have no source, and a tool reporting otherwise is guessing.
| What breaks | The mechanism | Where you see it in the dashboard |
|---|---|---|
| Session restarts mid-visit; page two is referred by your own domain | Sibling inheritance copies UTMs and click IDs from the same-visit session | Journey ribbon on the Leads list |
| Converting session has no source, so the visit reads as Direct | Session classifier resolves the channel from the cluster’s first touch | Recovered Attribution — “reclassified by session intelligence” |
| A redirect or consent gate drops the click ID | Landing URL read on the first request; _fbc rebuilt from fbclid |
Session click-ID columns |
| Safari clears the cookie, so a returning visitor looks new | Visitor ID set as a server-side first-party cookie, not by script | Visitors report, returning flag |
| Phone switches Wi-Fi to cellular and the IP changes | ±10-minute handoff match on the fbc cookie, IP may differ |
Journey ribbon, one stitched visit |
| Page two gets recorded as the landing page | Landing page and referrer snapshotted on the first-touch row | Attribution report, first touch |
Tell us what's broken. We'll fix your tracking — free.
Describe the tracking/attribution problem you're stuck on and we'll map it to a fix: server-side conversions to Meta, Google, TikTok and Pinterest, plus first-party tracking that survives Safari. No code required.
Sources
- Meta — Conversions API,
fbpandfbcparameters (how_fbcis formed from thefbclidin the landing URL): https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc - Meta — Conversions API, customer information parameters: https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters