TL;DR
🧾 Client-side analytics cannot see agents: the crawler study Vercel ran with MERJ found the OpenAI and Anthropic crawlers read raw HTML and skip JavaScript, so the measurement belongs in server logs.
🛰️ The data probably already exists: Cloudflare handles more than 1 trillion requests per day and reports 36% of the top 10,000 sites on its network.
🪪 User agents are self-declared, so verify by reverse DNS or published IP range before counting: even Cloudflare Radar grades its own bot data with 5 confidence levels.
🔀 Split the purposes before summing: indexing, live retrieval, and training collection are separate jobs, and OpenAI's bot documentation names four relevant user agents, which is one vendor running more than one of them.
🚧 A fetch is not a citation, because reachability and being used are separate events: 57% of AI citations point to sources brands do not control.
Your analytics tool is not undercounting AI agents. It cannot count them at all. Google Analytics fires from JavaScript inside a rendering browser, and the crawlers and agents that fetch your pages on behalf of AI assistants mostly do neither.
The crawler study Vercel ran with MERJ found the OpenAI and Anthropic crawlers request raw HTML and skip client-side execution, while Google's indexing pipeline uses the same Web Rendering Service capabilities. Google renders, and the assistant crawlers largely do not. The number you are hunting was never missing from your dashboard. It was never eligible to appear there.
The short answer: agent traffic is a server-side measurement. It lives in web server access logs and CDN request data, it is identified by declared user agent, it is verified by reverse DNS or published IP ranges, and it must be split by purpose before any of it means anything.
Why can't GA4 see the agents fetching your pages?
Because client-side analytics is a browser feature, and a crawler is not a browser. The tag has to download, parse, and execute before a single hit is recorded. A fetch that pulls your HTML and stops never reaches that step, so it produces no session, no pageview, no engagement time, and no row in any report.
This is a different problem from the one most teams have already met. When a person reads an AI answer, clicks a link, and lands on your site, they do render your page, and the visit usually files itself under Direct or an unhelpful referrer. That population is real, it is worth attributing, and we covered the fix in the GA4 attribution guide. It is not this population.
The two get conflated because both are described as AI traffic. They behave nothing alike. Human arrivals are countable in the browser and convert or do not; agent fetches never render, never convert, and never appear in the same system.
Similarweb tracks the human referral side, and 6sense has written about where B2B sites are losing traffic to LLMs. Neither describes the fetch layer, which is where this article lives.
How do you identify an AI agent in a log line?
By its declared user agent string, checked against the vendor's own published bot documentation rather than a blog post listing strings someone copied in 2024. OpenAI's bot documentation names four relevant user agents and publishes address ranges for its crawlers, which is the pattern most vendors now follow.
Those log lines sit in two places you probably already pay for: the access log of whatever serves your HTML, and the request data at your CDN edge. The edge is usually the better instrument because it sees requests your origin never does, including those served from cache and those blocked before they arrive.
Scale is not the constraint. Cloudflare says its network handles more than 1 trillion requests per day, and its investor materials put 36% of the top 10,000 sites on that network, so for a large share of teams the data set already exists, whether or not anyone has queried it. The reporting granularity is documented too: Cloudflare Radar publishes aggregation intervals from 1-day requests down to 15-minute buckets.
Keep seven fields per request and you can answer almost every question later: timestamp, requested path, declared user agent, client IP, response status, bytes served, and referer. Retention is the thing to fix first, because default retention windows are often shorter than the comparison window you will want in three months. Check yours before you need it.
Be honest about what that string is. A user agent is self-declared text in a request header. Anyone can send it, and plenty do, so a raw count of GPTBot lines is a count of requests claiming to be GPTBot.
Verification is the second step: resolve the client IP by reverse DNS and confirm it maps back to the vendor's domain, or match it against the address ranges the vendor publishes. Unverified fetches stay in a separate bucket rather than getting quietly folded into the headline.
Even the vendors grade their own confidence. Cloudflare Radar documents how requests are classified into bot classes and exposes 5 confidence levels alongside 6 normalization states for the underlying data. If the largest observer of this traffic publishes uncertainty grades, a spreadsheet that reports one clean number is hiding something.
Which purpose is behind the fetch?
One of three: search indexing, live retrieval, or training collection. Summing them produces a number that means nothing.
Search indexing builds an index for later. Live retrieval fetches a page right now because a user asked a question this second. Training collection gathers text for a future model. The same vendor runs separate agents for these, which is exactly why the documentation lists more than one.
Live retrieval is the one tied to an answer a buyer is reading. OpenAI's help documentation describes ChatGPT search running one or more targeted queries against the web for a question, so a single buyer prompt can generate more than one fetch, potentially across more than one site, and your log line is a fragment of one answer. The API side documents its own web search behavior, including the 2 main response parts in which results and citations reach the calling application.
Training collection is a separate lineage entirely. OpenAI's model development policy describes 3 primary source classes behind its foundation models, none of which is a live answer to a live question. A spike in training-collection fetches describes a data pipeline.
Report them as three named series. Indexing predicts eligibility; retrieval is the one that tracks live answers, and training is a policy question rather than a demand signal. One chart of all three is a chart of nothing.
What does a fetch prove, and what does it not?
A verified fetch proves one thing: the agent could reach that URL and receive a response. That is worth confirming, because two failure modes are cheap to miss: a 403 to a bot class someone blocked years ago, and a 200 that returns an empty shell. But eligibility is the floor, which is the argument in a crawl is not an audience, and this piece agrees with it.
What a fetch does not prove is that your page was used, quoted, or credited in the answer that followed. Retrieval systems pull more candidates than they cite, and much of what gets cited is not yours to begin with: Profound found 57% of AI citations point at sources the brand does not control. Being fetched and being the answer are separate events with separate causes.
The temptation at this point is to start rewriting pages to lift the fetch count, and the evidence does not support it. C-SEO Bench (NeurIPS 2025) tested conversational-SEO rewrite methods and found only 3 of 54 unilateral conditions produced statistically significant citation-rank gains, with the benchmark code published across two tasks and six domains. Rewriting for the crawler is close to a null intervention.
Structure the measurement instead. The IAB's framework for measuring visibility in the AI era separates Presence, Prominence, Portrayal, and Persuasion for exactly this reason. Fetch data belongs near the bottom of that stack, as a precondition, and it should never be reported as if it were the top.
What should you do with the numbers?
Start with coverage rather than volume. List the twenty pages that carry your strongest evidence and check whether verified agents have fetched each one in the last thirty days, what status they received, and how many bytes came back. A page nobody fetched and a page that returns 200 with 900 bytes of shell are both failures, and both are cheap to fix once you can see them.
Second, watch the error surface separately. Non-200 responses to verified agents are the highest-value rows in the whole data set because they are unambiguous and fixable. Third, set a baseline before you change anything, since a fetch series with no history cannot tell you whether last week was a move or noise.
Then take the access decision on purpose. You can allow, restrict, or charge. Cloudflare shipped pay-per-crawl using HTTP 402 and later an August 2026 AEO launch, and its agent-readiness work across the 200,000 most visited domains shows how much of the web is hard for agents to read at all.
Blocking a retrieval agent removes you from live answers in that ecosystem. Blocking a training crawler does not. Deciding those separately requires the purpose split above, which is the practical payoff of doing this properly.
How does Trovance use agent fetch data?
Trovance treats a fetch as evidence about eligibility and keeps it next to evidence about outcomes. You define the buyer questions that matter, and the platform runs them repeatedly across AI engines, preserving each answer run with the sources that carried it. That record is what a fetch count cannot give you on its own: whether being reachable turned into being used.
The pairing is where the diagnosis lives. A page that agents fetch cleanly and that never appears in an answer run is a proof problem, not a plumbing problem. A page that never gets fetched is plumbing, and the fix is mechanical. Answer coverage across your tracked questions shows which of your claims are being carried by someone else's source, and your Brand Core holds the claims you are entitled to make with the proof behind each one, so a recommended action names the specific asset the record says is missing.
Trovance will not promise that fixing access produces citations, rankings, or recommendations. Nothing honest can, because retrieval is probabilistic, the engines change, and your competitors publish too. There is no single visibility score here either, and drafts are produced from approved claims with a person reviewing before anything publishes.
What the system does instead is close the loop. After you change a page or an access rule, the next analysis cycle reruns the same questions and compares the new snapshots against the old ones, so you can see whether the change moved anything rather than assuming it did.
What should you do this week?
Four steps, in order. First, turn on and retain server or CDN logs with the seven fields above, because everything else depends on having the data next quarter. Second, build a verified-agent list from vendor documentation and reverse DNS instead of a copied string list.
Third, split the series by purpose: indexing, retrieval, training. Fourth, run the coverage check against your twenty most important pages and fix every non-200 you find.
Then resist the fifth step everyone jumps to. Do not rewrite pages to chase fetch counts, and do not report fetches as visibility to anyone who will hear it as demand. Fetch data answers a narrow question well, and reading more into it than that is how a measurement project turns into an expensive content program with no outcome attached.
If you want the fetch layer sitting beside the answers your buyers actually see, start a free Trovance analysis and check whether the pages agents can reach are the pages the engines use.
Measure the right layer
A crawl is not an audience - why a fetch count measures eligibility.
GA4 AI traffic attribution - the other population, the humans who arrive from assistants.
How to measure AI search visibility without one score - what to report when a single number lies.
There is no such thing as an AI visibility score - why composite metrics hide the failing rung.
Fix what the agents find
AI crawlers don't run your JavaScript - the rendering gap underneath the whole measurement.
Your homepage isn't an agent brief - the audit to run once you know agents are arriving.
How to track AI citations - the outcome measurement that sits above fetch data.
Where ChatGPT gets information about your business - which sources feed the answer besides your site.
FAQs
How do I measure AI agent and chatbot traffic on my site?
Read server access logs or CDN request data. Filter requests by declared user agent against vendor bot documentation, verify each one by reverse DNS or published IP ranges, then split the verified fetches into indexing, live retrieval, and training collection before reporting any total to anyone.
Why doesn't Google Analytics show AI crawler traffic?
Because the measurement tag runs in JavaScript inside a browser and crawlers generally do not execute it. Vercel's crawler research with MERJ found the OpenAI and Anthropic crawlers request raw HTML and skip client-side execution, so those fetches never create a session, a pageview, or any row in a GA4 report.
Can I trust the user agent string an AI crawler sends?
Only as a claim. A user agent is self-declared text in a request header that anyone can copy, so a count of GPTBot lines is a count of requests claiming that identity. Confirm each one with reverse DNS or the address ranges the vendor publishes, and bucket unverified hits separately.
What is the difference between a crawler fetch and a visit?
A fetch is a request for your HTML that produces no rendered page and no human on the other end. A visit is a person in a browser. They live in different systems, and mixing them inflates traffic reporting while telling you nothing about whether an answer engine actually used your page.
Should I block AI crawlers from my site?
Decide per purpose. Blocking a live retrieval agent removes you from answers being generated right now in that ecosystem; blocking a training crawler does not. Cloudflare offers paid access through pay-per-crawl using HTTP 402, so allow, restrict, and charge are three separate options rather than one switch.
Does more agent traffic mean more AI citations?
No. A fetch proves reachability only. Profound found 57% of AI citations point to sources brands do not control, so an answer can quote a review site while ignoring the page an agent just fetched from you. Measure answers separately from fetches and never substitute one for the other.
How do I measure AI agent traffic without a CDN?
Read the raw access log from your web server directly. Retain timestamp, path, user agent, client IP, status code, bytes served, and referer for at least ninety days. That is enough to identify agents, verify them, track coverage of key pages, and catch non-200 responses being served to bots.



