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.
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.
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.
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.
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.
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.
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.
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.
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.
Full Chromium fork. Can run in agent mode ("go do this for me") with a renderer-process automation layer.
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.
Full Chromium fork with agentic capabilities baked in. The Comet Assistant runs inside the browser and can take actions on the user's behalf.
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.
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.
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.
User's local Claude.app + a Playwright MCP server that gives Claude browser-automation tools. The agent runs locally; the user is the operator.
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.
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.
The channel-group fix is necessary but not sufficient. You will not be able to see the agent share with GA4. Different signal needed.
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.
Scan gratuit · 30 secondes · sans inscription
Collez votre domaine. Serge parcourt votre boutique en environ trente secondes — entièrement déterministe, sans IA dans la boucle de scan — et renvoie un instantané rapide : où les agents peuvent être bloqués, quoi inspecter en premier, et les corrections suggérées que votre équipe peut vérifier. Sans inscription. Transmettez le résultat à votre lead front-end.
Le scan est le point de départ. La vue plus profonde vient de la visibilité des sessions, du replay et du briefing.
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.
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.
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.
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.
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.
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.
Serge uses analytics cookies to understand which pages teams find useful and where the funnel breaks. Essential cookies (login, language) always run. See what each one does →