Skip to main content
TACAVAR
•AI Ops

How to Tell AI Agents From People in Your Analytics

Most AI browser agents look human in analytics, and ChatGPT or Claude fetches never run your scripts. How to spot agents and count AI reads in server logs.

There are two kinds of AI traffic. Browser agents that click through your site mostly look like a person in Chrome — in Privatrak's test of 23 agents, the one tell that held was the pointer jumping 200–840 px straight onto the button. Chatbot fetches from ChatGPT, Claude, Mistral and Perplexity never run your JavaScript, so they never appear; count them in server logs by user agent.

Two kinds of AI traffic, and why analytics misses both

When someone asks ChatGPT to compare your pricing page with a competitor's, or pastes your article into Claude for a summary, one of two things happens on your side:

  1. A browser agent drives a real browser. It opens pages, clicks, scrolls, and triggers every analytics tag you run. It is counted — as a person.
  2. A chatbot fetches the page. No browser opens, no script runs. Your JavaScript analytics never sees the visit. Only your server log knows it happened.

Neither is the crawling you already know about from robots.txt. This is AI acting for a user, right now — which is also why it matters for GEO (generative engine optimization): a user-triggered fetch usually means someone asked an AI about your page, and whether that fetch happens at all decides whether you can be cited.

  • Browser agents (ChatGPT's agent, Claude in Chrome, Comet, Grok): run your JavaScript, so GA and other JS analytics count them, as a normal Chrome visitor. They also appear in your server log, but the user agent looks like plain Chrome. Most say nothing about what they are; a few name themselves.
  • Chatbot fetchers (ChatGPT-User, Claude-User, MistralAI-User, Perplexity-User): don't run your JavaScript, so JS analytics never sees them. They appear in your server log under a user agent the vendor documents. In Privatrak's test, Perplexity and Meta AI fetched pages for a user under their indexing crawlers' names, PerplexityBot and meta-webindexer.
  • Fetchers that run a browser anyway (Jina Reader and DeepSeek, in Privatrak's test): run your JavaScript, so analytics counts them as a one-page "bounce". The user agent often looks like plain Chrome or Firefox, and nothing names the bot.

What AI browser agents look like in your analytics

The clearest picture so far comes from Privatrak's test, published 27 October 2026: 49 runs by 23 AI agents, chatbots and tools, plus 8 human setups, on one test site, over one day, all given the same task on the same three pages. That scope matters — everything below is their one-day, one-site test, not a general rate. (Privatrak sells analytics; we're citing their published data, not recommending their product.)

What they found:

  • Most browser agents look exactly like a person. ChatGPT Work's browser, Claude in Chrome, Perplexity's Comet, Grok and Claude computer use all reported webdriver: false and sent a normal Chrome user agent. Several came from the tester's own home IP address — so IP-based and "data-centre vs residential" filtering misses them too.
  • A few announced themselves. Claude Cowork identified as HeadlessChrome/153 with webdriver: true. Vercel's agent-browser and Chrome DevTools MCP also reported webdriver: true. And Manus went furthest: it appends Manus-User/1.0 to its user agent and signs every page request cryptographically — the only agent in the test that did (more on that below).
  • Some chatbots that "just fetch" actually run your scripts. In the same test, Jina Reader loaded the page in a headless Chrome in a data centre, and DeepSeek opened it in Firefox and left within three seconds. Analytics counts both as a visitor who bounced instantly. A one-page visit from a cloud IP that reads everything and clicks nothing may not be a bounce at all.
  • AI agents are already in your numbers as people. If you've seen short visits that go straight to pricing and trigger your GA tag, some of those may have been agents working for a human.

For context, this isn't the first time agents have behaved differently from crawlers: Simon Willison found in 2025 that ChatGPT's agent signed its requests so sites could verify them — yet in Privatrak's 2026 runs, ChatGPT Work's browser sent no request signature at all.

The one signal that held: how the pointer reaches the button

Across every clicking agent in the test, one signal separated agents from people: where the pointer comes from right before a click.

  • Last move before a click: agents made one jump of 200–840 px straight onto the target; people (mouse or trackpad) made a small final step of 0–2 px.
  • Other pointer movement on the page: agents made 0–2 movements; people made 11–642.

The pattern makes physical sense. A person moves a hand, so the pointer arrives in many small steps — every human click in the test had a final move of 0–2 pixels. An agent has no hand; it places the pointer on the target in a single jump. This held for all 13 kinds of clicking agent, including the ones that otherwise mimic human click timing.

Two caveats. First, the scope caveat: it's one test, one site, one day — and agents change quickly; a future agent that animates the pointer in small steps would defeat it. Second, this is a browser-side signal, so it's useful to analytics vendors — but you can act on the insight today: visits with instant, single-jump interaction patterns are probably not the humans your bounce rate says they are.

Signals that didn't work

Some plausible bot signals failed on the test's own data. Don't build rules on these:

  • Button hold time. Most agents click in a few milliseconds — but Browser Use and Comet held the button as long as people do, and the accessibility tools clicked faster than any agent.
  • Dead-centre clicks. ChatGPT Work usually hit the centre within a pixel, but Claude in Chrome and Claude computer use aimed at text in screenshots and missed wide elements' centres by more than 230 px — and one human hit a link within 2 px of centre.
  • Click pressure. Some agents reported 0 where a mouse reports 0.5; others reported exactly 0.5.
  • Big pointer jumps alone. A fast trackpad swipe moved 701 px in one step. Only a jump that lands on what's clicked next is suspicious.
  • The console trick. Bot-detection scripts that log an error object to catch remote-control listeners noticed nothing in any tested Chrome version.
  • IP checks. Most agents in the test came from the tester's own home connection.

How to count ChatGPT, Claude and Perplexity reading your pages

This is the half your analytics can't see. When a chatbot fetches a page, it identifies itself in the user-agent string, and the major vendors document these names. User-agent strings can be spoofed, so treat UA-based counts as best-effort and use the verification methods below where it matters. The user agents to look for:

  • ChatGPT (user-triggered): Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot. Someone asked ChatGPT, which fetched your page (OpenAI bot docs).
  • Claude (user-triggered): Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +claude-user@anthropic.com), as recorded in Privatrak's test. Someone asked Claude about your page. Anthropic's crawler docs name the Claude-User agent but don't list a full string. Privatrak saw Claude Code fetch as Claude-User (claude-code/2.1.309; +https://support.anthropic.com/).
  • Mistral (user-triggered): Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; MistralAI-User/1.0; +https://docs.mistral.ai/robots). A user-triggered fetch from Mistral's assistant, which Mistral's docs call Vibe and Privatrak's test calls Le Chat (Mistral crawler docs).
  • Perplexity (user actions): Mozilla/5.0 (compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user). Someone asked Perplexity, which fetched your page (Perplexity bot docs; Perplexity notes the version number may change).
  • Perplexity (indexing): Mozilla/5.0 (compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot) per Perplexity's docs. It is the search crawler, not the user-action fetcher. Even so, in Privatrak's test, Perplexity's user-asked fetches arrived as PerplexityBot/1.0.
  • Meta AI (indexing): meta-webindexer/1.1, Meta's crawler for Meta AI search (Meta crawler docs). In Privatrak's test, Meta AI's user-asked fetch arrived under this name.

Keep two families apart:

  • *-User agents (ChatGPT-User, Claude-User, MistralAI-User, Perplexity-User) are user-triggered. These are your GEO signal: "someone asked an AI about this page." OpenAI notes these actions are user-initiated, so robots.txt rules may not apply; Perplexity says the same for Perplexity-User. Privatrak's log even shows the difference in behaviour: Claude checked robots.txt one second before fetching; ChatGPT-User didn't.
  • Crawlers (GPTBot, OAI-SearchBot, PerplexityBot, MistralAI-Index, ClaudeBot, meta-webindexer) are indexing. They obey robots.txt and matter for whether you're in the index, not whether you got cited for a specific question. One exception from Privatrak's test: Perplexity and Meta AI fetched pages for a user under these crawler names.

How to count them, in four steps:

  1. Pull your server or CDN logs (Nginx/Apache access logs, Cloudflare log push, or your host's request logs — whatever sits in front of the site).
  2. Filter by user agent. Match ChatGPT-User, Claude-User, MistralAI-User and Perplexity-User as user-triggered fetches. Count PerplexityBot and meta-webindexer in the crawler bucket, but be aware that, in Privatrak's test, user-asked Perplexity and Meta AI fetches arrived under those names. Keep crawlers and *-User fetchers in separate buckets.
  3. Count by URL and by day. The per-URL trend is the signal: which pages are AIs being asked about, and is that growing?
  4. Compare with the pages you want cited. Fetches on money pages mean AI engines are being asked about your topics — which is exactly what our GEO scan measures and why AI citation ranking behaves like a distribution, not a switch. Where the AI-fetch count fits in a working SEO loop, see how we do SEO in 2026.

Verification, where you need more than best-effort: user-agent strings are trivially spoofable, so cross-check requests against the vendors' published IP ranges (OpenAI, Perplexity and Mistral publish IP address lists; Anthropic documents its crawlers but warns IP blocking may not work reliably) or reverse DNS. For cryptographically verified identity, the Web Bot Auth IETF draft (with Cloudflare's implementation docs) lets agents sign their requests with HTTP message signatures so a server can verify who sent them — in Privatrak's test, Manus was the only agent doing this. We expect adoption to spread, but today, signed traffic is the exception.

One warning for the counting exercise: don't expect the numbers in your server log to reconcile with anything in Google Analytics. They measure disjoint things — the log sees non-JS fetches GA never will, and GA sees browser-agent sessions the log can't attribute. Track them as separate series.

Should you block AI agents?

Mostly no — if you care about AI citations. If a fetcher can't read your page, it can't cite it. Blocking *-User agents is how you opt out of being quoted in the answer; blocking crawlers is how you drop out of the index. Decide per family, per agent, in robots.txt — and know that the two families don't behave identically (see the robots.txt note above; Privatrak observed Claude-User checking robots.txt and ChatGPT-User not doing so).

One rule with no exceptions: never block accessibility tools on bot-like click signals. Privatrak's human baseline included macOS Voice Control and Dwell, and both look more automated than the AI agents on every click-timing signal — button "holds" of a few milliseconds or less, and in Voice Control's case perfectly centred clicks and no mouse movement at all. A detection rule built on click timing doesn't catch bots; it catches disabled users trying to use your site. This is also why analytics "bot filters" deserve skepticism — a filter tuned to instant centred clicks flags real people. (The same discipline applies inside your own stack: dashboards that miss the real signal are a trap in agent observability too.)

Scope note: this article is about visitors — AI acting on behalf of outsiders reaching your site. Blocking decisions about employees using ChatGPT or Claude at work are a different problem; we cover that in our piece on shadow-AI policy.

What to do this week

  • Split your reports into three buckets: humans / suspected browser agents / AI fetches (server log). Today the first two are merged and the third is invisible.
  • Add a server-log AI-fetch count to your weekly GEO report: requests per *-User agent, per key URL, per week. Trend it.
  • Stop trusting bounce rate for one-page visits from cloud IPs. In Privatrak's test, Jina Reader and DeepSeek looked like instant bounces while reading the full page.
  • Review robots.txt for the *-User agents you want to allow — and remember they may not consult it anyway, so enforcement happens at the CDN/WAF layer, with published IP ranges if you restrict anything. Then check your AI search visibility to see what the fetches are worth.

And the mirror-image problem: if AI agents are already visiting your site on your behalf, they need the same governance. Observing your own agents in production is agent telemetry.

Want to know which AI engines read and cite your pages?

Run the Free GEO Scan — we'll show you how AI engines currently read and cite content like yours.

Running agents on your own ops and need them governed? Ask about Governed AI Ops.

FAQ

Do AI agents show up in Google Analytics? Browser agents often do, looking like a normal Chrome visitor. Chatbot fetches like ChatGPT-User and Claude-User don't run JavaScript, so JS analytics never sees them.

How can I tell an AI agent from a person on my site? In Privatrak's 49-run test, the reliable tell was the pointer jumping 200–840 px straight onto the target with almost no other movement. User agent, IP and click timing were not reliable.

How do I count how often ChatGPT or Claude reads my pages? Count requests in your server or CDN logs with user agents such as ChatGPT-User, Claude-User, MistralAI-User and Perplexity-User, per URL per day.

What is Web Bot Auth? An IETF draft that lets an agent cryptographically sign its requests so a site can verify who sent them. In Privatrak's test, only Manus used it.

Should I block AI agents from my website? Usually not if you want AI citations. Never block accessibility tools like Voice Control or Dwell, which can look more bot-like than agents.

Sources