“How much traffic am I getting from ChatGPT?” is a harder question than “how much traffic am I getting from Google,” and the reason isn’t your analytics setup. It’s that ChatGPT traffic isn’t one thing. It’s at least three different mechanisms, each visible to a different kind of tool, and most people trying to answer the question only have a tool for one of the three.
This is a practical guide to all three layers: what each one shows you, what it structurally can’t show you, and which questions to actually ask once you have the right instrumentation.
The three layers of ChatGPT traffic
- Referrers and UTMs. A human is in a ChatGPT conversation, clicks a link to your site, and their browser sends a
Refererheader (or the link carries a UTM parameter). This is the only layer classic web analytics (GA4, Plausible, anyone doing referrer-based attribution) can see at all. - Agent-mediated fetches with no referrer. ChatGPT, on a user’s behalf, fetches your page directly — no browser navigation, no
Refererheader, because there’s no browser in the loop at that moment. This traffic is real (a live conversation is using your content to answer a live question) and completely invisible to referrer-based tools. - Crawl activity. OpenAI’s indexing crawler visits your pages ahead of any specific conversation, building the index ChatGPT Search draws citations from later. No user is present at all, but it’s the leading indicator that layer 1 and layer 2 traffic might show up soon.
Each layer needs a different measurement approach, and layer 2 is the one almost everyone misses because their tooling doesn’t have a way to even represent it.
Layer 1: referrers and UTMs
This is the layer GA4 and most web analytics tools already handle, with real caveats.
Referrer hosts to watch for: chatgpt.com is the current consumer domain; chat.openai.com is a legacy domain still live for some sessions and embeds. If you’re building a regex-based channel definition, catch both.
UTM tagging: ChatGPT Search reportedly appends utm_source=chatgpt.com on some outbound links — multiple marketing-attribution write-ups describe this consistently, but as “some, not all, click-throughs,” and we couldn’t find OpenAI documentation confirming it as a guaranteed behavior. Treat it as a helpful bonus signal, not something to build a strict filter on.
GA4’s built-in bot exclusion doesn’t help here. GA4 automatically excludes “known bots and spiders” using a combination of Google’s own research and the IAB/ABC International Spiders and Bots List — always on, can’t be disabled, and Google’s own support docs are explicit that you get no per-bot breakdown of what was excluded. That list exists to filter crawlers, not to detect or categorize AI-assisted human traffic. It’s the wrong tool for this question even though it sounds adjacent.
GA4’s newer “AI Assistant” channel is closer, but narrower than it sounds. Google added AI Assistant as a Default Channel Group entry, with detection logic rolled out in stages through mid-2026 per secondary reporting on Google’s own changelog. When GA4 recognizes a referrer as one of the covered assistants, it sets medium = ai-assistant and buckets the session accordingly. The catch: the covered list has churned since launch rather than simply growing — Claude, named in the May launch list, is absent from the current published definition, which names ChatGPT, Gemini, Copilot, Grok, and Deepseek — and Google doesn’t publish a complete, stable list. Perplexity, notably, still falls into generic Referral traffic unless you build a custom channel or regex for it yourself.
The undercount is real and probably large. Multiple sources report that ChatGPT’s in-app browsers — the mobile apps and the Atlas browsing feature — strip or fail to pass the Referer header, so those visits land as Direct/(none) in any referrer-based tool. One attribution vendor’s proprietary analysis (a single dataset, not independently replicated) found 70.6% of AI-referred sessions in its sample landing as “direct.” We can’t vouch for that exact figure holding for your site, but the direction — referrer-only tools meaningfully undercount AI-driven clicks — is consistent across everything we read.
Perplexity, Claude, and Gemini each have their own referrer quirks (Perplexity passes a referrer inconsistently depending on how the citation was clicked; Claude is reported to use claude.ai/referral, though we found no Anthropic documentation confirming it). The pattern is the same everywhere: when a referrer is passed, it shows up as ordinary Referral traffic, subject to the same stripping and undercounting above.
Layer 2: the visits that carry no referrer at all
Here’s the part that referrer-based tools can’t fix with a better regex, because it isn’t a tagging problem. It’s architectural.
When you ask ChatGPT “what does this pricing page say” and paste a URL, or when it decides mid-conversation that it needs to check your site to answer accurately, the fetch happens server-side, at OpenAI’s backend, not in the user’s browser. There’s no navigation event to attach a Referer header to, because no browser navigated anywhere. What hits your server is a direct HTTP request from an agent user agent — OpenAI’s own bot documentation is the canonical source for what these agents are called and are for — carrying little more than a user agent string and, typically, no Referer and minimal Accept-Language.
This is why “just show agent-fetch traffic in GA4” has no good answer: GA4, and any tool that fundamentally works off the Referer header and JavaScript pageview beacons, can only ever count the subset of AI-driven traffic where a human clicked a link, the client passed a referrer, and your tool recognized that referrer host. Agent-mediated fetches fail all three conditions at once, by construction, not by misconfiguration.
This is the traffic mcp-analytics classifies as ai_user_action — live AI browsing on behalf of a human, distinct from training crawlers and distinct from search indexers, and counted as real attention rather than discarded as bot noise. It’s identified server-side, from the request itself, because there’s nothing else to identify it from — which also dictates the setup: these fetches never execute JavaScript, so the default JS snippet can’t count them. Capturing layers 2 and 3 takes the server-side ingest (a Rack middleware that isn’t on RubyGems yet as we publish this; the install steps already sit on your settings page, waiting on the gem’s public release) running alongside the snippet. See what is OAI-SearchBot for how we tell a genuine agent fetch from a spoofed one; the same UA-plus-verification approach applies to the user-action agents.
Layer 3: crawl activity as a leading indicator
Before ChatGPT Search can cite your page in a conversation, something has to have indexed it. That’s OAI-SearchBot, OpenAI’s dedicated crawler for ChatGPT Search — separate from GPTBot, which crawls for model training and tells you nothing about search visibility. Perplexity runs the equivalent with PerplexityBot.
Crawl activity is not traffic in the usual sense — nobody read anything, no conversation happened — but it’s the leading indicator that layers 1 and 2 might show up soon. A page OAI-SearchBot has never fetched is far less likely to surface as a ChatGPT Search citation — not impossible, since ChatGPT Search reportedly leans heavily on Bing’s index too, but you’re fighting with one hand tied. If your robots.txt blocks it (a common leftover from blocking “AI crawlers” indiscriminately to protest training use), you’ve made yourself invisible in ChatGPT Search regardless of how good your content is.
Cloudflare’s own numbers here are worth citing with a caveat on vintage: a blog post covering an early-August 2025 snapshot put Anthropic’s crawlers at roughly 50,000 pages crawled per referral click sent back, OpenAI’s crawlers at roughly 887:1, Perplexity’s at roughly 118:1 — company-level ratios, not per-bot. Older Cloudflare snapshots show different (sometimes much lower) ratios, so don’t treat any single number as fixed — treat the pattern as fixed: crawl volume vastly exceeds referral volume for every operator, and the gap is structural, not a tracking bug.
Putting it together: the questions to actually ask
Once you have server-side classification instead of only referrer-based analytics, the three layers map cleanly onto queries you can run directly, in plain language, through an MCP client like Claude:
"Show me top_referrers for the last 30 days" -> Layer 1: direct clicks with a
passed referrer. This is the ceiling of what GA4-style tools can ever see.
"Run traffic_class_breakdown for this month" -> Layers 2 and 3 together:
ai_user_action (agent fetches on a human's behalf) vs ai_search (indexing
crawls) vs ai_training, side by side.
"What does top_user_agents show for ai_user_action requests this week?" ->
Which specific assistant (ChatGPT-User, Claude-User, Perplexity-User) is
actually fetching your pages.
"Compare ai_search crawl volume this month vs last month" -> compare_periods,
watching for a crawl-volume increase as a leading indicator before any
referral traffic shows up.
top_referrers gives you the honest ceiling on layer 1. traffic_class_breakdown plus top_user_agents give you layers 2 and 3, which no referrer-based tool has a slot for in the first place. For the full mechanics of the classification itself — UA patterns, IP verification, spoofing detection — see AI traffic analytics.
What you still can’t know
Even with all three layers instrumented, be honest about the remaining gap: you cannot see the conversations where ChatGPT mentioned your site or a fact from your page without fetching it at all — grounded in a cached index entry from an earlier crawl, or synthesized from training data. No operator publishes a way to measure “mentioned but never fetched,” and getting cited in the first place is a different problem from measuring the traffic that results afterward — see LLM SEO if that’s the question you’re actually after.
The three-layer model isn’t perfect attribution — nothing is, for this channel, yet. It’s an honest accounting of three separate things happening under one label, “ChatGPT traffic,” instead of one referrer-shaped keyhole pretending to be the whole picture.
If you want traffic_class_breakdown and top_user_agents running against your own logs instead of ours: mcp-analytics is free up to 100,000 hits a month, EU-hosted, no dashboard — you ask Claude or ChatGPT directly.