GA4 diagnostic

Why ChatGPT traffic shows as direct in GA4 — and the part the channel-group fix can't catch.

70.6% of AI-driven sessions arrive without a referrer. Half is referrer-policy stripping you can fix in GA4. The other half is agents that never had an origin to send — and the channel-group fix can't see them.

If you found this page by Googling "why is my ChatGPT traffic showing as direct," you're staring at the right symptom of two different problems. Most articles solve the first one and stop. The second one is what's actually growing — and it doesn't have a referrer-policy fix.

Step 1

What you're seeing right now in GA4

Acquisition → Traffic acquisition → Default Channel Group. Direct is climbing. You can't tell whether it's people typing your URL, mobile app deep-links, or something else. Your gut says some of it is AI, because you've heard ChatGPT search drives traffic now and you can't see it anywhere.

  • Direct traffic share is up 30–60% year-over-year on most e-commerce sites that have meaningful AI exposure (Loamly's 2026 cross-customer benchmark; Workshop Digital's 181.6M-session AI Referral Gap study).
  • ChatGPT, Claude, Perplexity, Gemini all show up in your data — sometimes — under their domain referrers (chatgpt.com, claude.ai, perplexity.ai, gemini.google.com). Most of it doesn't.
  • GA4's standard channel groups don't separate AI Assistants from anything else. Every blog post you read tells you to add a custom channel group. That's the right first step. It's not enough.
Step 2

The referrer-policy explanation — half the answer

When a user clicks a link inside a ChatGPT answer, the browser sends a Referer header so GA4 can credit ChatGPT. That works on desktop web. It fails in three specific cases that account for a huge share of "direct" misclassifications.

01 / Mobile WebView

ChatGPT mobile app opens links in an in-app browser

Tapping a link in the ChatGPT iOS or Android app opens an SFSafariViewController (iOS) or Custom Tab (Android). Both strip the Referer header by default for privacy. GA4 sees Direct.

02 / Cross-origin policy

Strict-origin-when-cross-origin downgrades referrers

Modern browsers default to `strict-origin-when-cross-origin`. If your site or chatgpt.com sets a tighter referrer policy, the Referer is stripped at the network layer. Common on enterprise CMS deploys with hardened security headers.

03 / Copy-paste

User copies the URL from chat into a new tab

ChatGPT used to surface URLs as plain text alongside hyperlinks. Users who pasted the URL into a fresh tab generated zero Referer. The behavior is rarer with current ChatGPT UI but accumulated in your historical data and still happens on shared links.

The fix for these three cases is the GA4 custom channel group everyone writes about. We have the step-by-step guide with a working regex covering ChatGPT, Claude, Perplexity, Gemini, and Copilot. Set it up. It will catch the referrer-stripping share — roughly half of your AI traffic, give or take.

Step 3 (the part most articles skip)

The other half — agents fetching directly

Loamly's 2026 study of 446,405 AI-driven sessions found 70.6% arrived with no Referer header at all. Mobile WebView + copy-paste + tightened referrer-policy explains some of that. Most of what's left is a different problem: agents.

When ChatGPT "Search" surfaces an answer, it cites sources. If the user clicks, that's a normal browser session and GA4 sees the referrer (or one of the cases above strips it). When the user instead types "go buy this for me," something architecturally different happens — the agent fetches your page directly, the way a server-side script would. There is no Referer to set in the first place. The connection comes from a fresh browser context with no history.

This share is small today and growing fast. Cloudflare's 2026 AI bot traffic data shows AI fetch volume against e-commerce sites is up ~12× year-over-year. Most of it does NOT execute the JavaScript that fires gtag.js. None of it carries a Referer. None of it is in your GA4 data, with or without the channel group.

Step 4

Atlas, Comet, Operator, Claude Desktop — what each actually does

These are the four browser-driving AI agents currently sending the most traffic to commerce sites. They are not the same architecturally. The differences matter for what GA4 can and can't see.

ChatGPT Atlas

OpenAI
What it is

Full Chromium fork. Can run in agent mode ("go do this for me") with a renderer-process automation layer.

GA4 visibility

When the user is browsing manually, Atlas behaves like a normal Chromium browser — gtag.js fires, referrer is preserved. When in agent mode, the agent navigates programmatically and Referer is often missing.

Perplexity Comet

Perplexity
What it is

Full Chromium fork with agentic capabilities baked in. The Comet Assistant runs inside the browser and can take actions on the user's behalf.

GA4 visibility

Same pattern as Atlas — manual browsing fires gtag.js, agent-driven navigation often skips referrer because the agent uses programmatic navigation that originates from the renderer process, not from a click.

Operator

OpenAI
What it is

Cloud-hosted virtual machine running a full browser. The user gives the agent a task; the agent operates a browser inside the VM end-to-end.

GA4 visibility

Fires gtag.js (it's a real browser executing JavaScript). Sends NO Referer because the navigation originates from agent-issued URLs, not from clicks. Lands as Direct in GA4.

Claude Desktop with Playwright MCP

Anthropic + community MCP server
What it is

User's local Claude.app + a Playwright MCP server that gives Claude browser-automation tools. The agent runs locally; the user is the operator.

GA4 visibility

Identical to Operator from your site's perspective — JavaScript executes, gtag.js fires, no Referer, Direct in GA4. Claude.ai adds Claude-User to the user-agent string when it's a live agent fetch.

Sources: OpenAI Atlas + Operator product pages, Perplexity Comet announcement, Anthropic Claude Desktop docs, HUMAN Security architectural breakdown of agentic browsers.

Step 5

Why the GA4 channel-group fix only catches the first half

The custom channel group is a regex on Source. It works because ChatGPT's web UI (when the link click DOES preserve referrer) sends `chatgpt.com` or `chat.openai.com` as the source. Same for Claude, Perplexity, Gemini.

  • If Source is the empty string (no Referer), no regex matches. The session lands in Direct. There's nothing in GA4 to filter on.
  • Atlas in agent mode, Comet in agent mode, Operator, and Claude Desktop with Playwright all produce empty-Source sessions. They will not be classified as AI Assistants no matter what regex you write.
  • Server-side analytics (Plausible, Fathom server module, raw access logs) catches more because the User-Agent header reveals more — `ChatGPT-User`, `Claude-User`, `Perplexity-User`, `OAI-SearchBot`. But even server-side, Atlas/Comet/Operator's user-agents look like generic Chrome strings unless you fingerprint deeper.

The channel-group fix is necessary but not sufficient. You will not be able to see the agent share with GA4. Different signal needed.

Step 6

What to measure instead

The agent traffic you can't see in GA4 is doing something specific on your site — and the question that matters isn't "how much" but "can it complete the task." An agent that finds your product and adds it to cart is revenue. An agent that gives up at your variant selector is revenue you lost without a data point.

  • Run a deterministic scan of your store from an agent's perspective. The score tells you whether your product schema, variant selectors, and add-to-cart semantics are agent-readable. If they aren't, no amount of analytics will help — the agents won't get far enough to be measured.
  • Install a tracking snippet that detects agent sessions client-side via behavioral signals (no mouse, no scroll entropy, programmatic navigation patterns). Different signal than Referer; sees what GA4 can't.
  • Investigate replays — actually run a real Claude Desktop or Operator against your checkout, capture the failure point, ship the fix. The free scanner is the entry; replay is the diagnostic.

Kostenloser Scan · 30 Sekunden · keine Anmeldung

Wollen Sie eine Momentaufnahme Ihrer Lage?Scannen Sie Ihren Store.

Geben Sie Ihre Domain ein. Serge crawlt Ihren Store in etwa dreißig Sekunden — vollständig deterministisch, keine KI in der Scan-Schleife — und liefert eine schnelle Momentaufnahme zurück: wo Agenten möglicherweise blockiert werden, was zuerst zu prüfen ist und vorgeschlagene Korrekturen zur Verifizierung durch Ihr Team. Keine Anmeldung. Leiten Sie das Ergebnis an Ihren Frontend-Lead weiter.

Der Scan ist der Ausgangspunkt. Das tiefere Bild ergibt sich aus Sitzungs-Sichtbarkeit, Replay und Briefing.

Common questions

Common questions about LLM direct traffic

If I add the GA4 custom channel group, won't I see all my AI traffic?

You'll see the share that travels with a Referer header — roughly half of AI-driven sessions per Loamly's 446K-session study. The other half (agent traffic with empty Source) lands as Direct regardless of how clever your regex is. The channel group is necessary; it's not sufficient.

Can I distinguish ChatGPT Atlas from regular Chrome in my data?

Sometimes. Atlas adds an identifier to the user-agent string that you can capture as a custom dimension via GTM. But in agent mode, the navigation is programmatic and your Referer is empty — so even with Atlas detected, you're still missing the journey.

Doesn't a server-side analytics tool fix this?

It catches more than GA4 because user-agents are visible at the request level (GPTBot, ClaudeBot, OAI-SearchBot, anthropic-ai are all there). But agents like Atlas, Comet, Operator, and Claude with Playwright spoof generic Chrome user-agents during execution — server-side gets the bot-class crawlers, not the user-driven agents.

Is this a referrer-policy issue I can fix on my own site?

Partly. Setting `Referrer-Policy: strict-origin-when-cross-origin` on your responses doesn't fix the empty-referrer case (because the agent never had a Referer to begin with). It also doesn't help when ChatGPT's referrer-policy strips it before the request reaches you. The fix is at the layer where the navigation originated — and that's not on your site.

How big is the agent share actually?

Small today, growing fast. Cloudflare's 2026 AI traffic report shows agent fetch volume up 12× YoY against e-commerce sites. Loamly's 70.6% no-referrer figure is the upper bound — most of which is referrer-policy stripping today, agent-driven traffic tomorrow. By Q4 2026 we expect agent share to cross 30% of AI-mediated commerce sessions.

What should I do this week?

Three things, in order. (1) Set up the GA4 channel group — it's a 10-minute change that catches the referrer-bearing share. (2) Run a free agent-readiness scan on your store to see whether the agent share can convert if it does arrive. (3) Decide whether you need the agent-side analytics surface or whether GA4 + server logs is good enough for your stage.