The short answer
Google Analytics is not broken, and it is not set up badly. It was built to count people in browsers, and it does that. AI crawlers are not people and do not use browsers, so they fall outside what it can see. Three things stack up:
- No script runs. GA4 counts a visit when its JavaScript tag runs. AI crawlers fetch the HTML and leave without running it.
- Known bots are dropped on purpose. GA4 excludes known bot traffic by design, so a bot that did run the tag would still not be counted.
- AI clicks lose their referrer. The people AI sends you do reach GA4, but many arrive without the referrer that says where they came from.
The rest of this note takes each in turn, then shows where the missing traffic is.
How Google Analytics counts a visit
When a person opens your page, their browser loads the HTML, then the files the page asks for, including Google's tag. The tag runs in the browser and sends a small hit to Google: this page, this time, this source. No hit, no visit. Everything GA4 reports is built from those hits.
That design has a clear edge. Whatever happens on your server without a browser running the tag never reaches Google. Your server answered the request, but Google was never told.
Reason 1: AI crawlers never run the tag
An AI crawler wants your text, not your page as a person sees it. GPTBot, ClaudeBot, PerplexityBot and the rest ask your server for the HTML, read it, and move on. They do not run your scripts, so the tag never fires. Here is what your server saw, and GA4 did not (sample data):
203.0.113.24 - - [22/Oct/2026:02:10:07 +0000] "GET /pricing/ HTTP/1.1" 200 18342 "-" "... GPTBot/1.2; +https://openai.com/gptbot)"
192.0.2.61 - - [22/Oct/2026:02:11:40 +0000] "GET /blog/ HTTP/1.1" 200 14210 "-" "... ClaudeBot/1.0; +claudebot@anthropic.com)"
Two page requests, no asset requests after them, no hit to Google. The same is true of the live fetchers. When someone asks ChatGPT a question and it reads your page to answer, the request says ChatGPT-User and behaves the same way: the HTML, then gone. Claude-User and Perplexity-User do the same. These are the most interesting AI requests you get, because a real person was waiting, and they never run a script either.
Reason 2: GA4 drops known bots on purpose
Suppose a crawler did render your page and run the tag. GA4 would still leave it out. Google's own docs say GA4 excludes traffic from known bots and spiders automatically. That is the right choice for a tool that counts people: nobody wants crawlers in their conversion rate.
But it means GA4 is not the place to look for machines, by design. Search engine crawlers are excluded for the same reason. If you want to know what Googlebot, GPTBot or ClaudeBot did on your site, GA4 will not tell you, and is not trying to.
Reason 3: the people AI sends you, half seen
The third kind of AI traffic is people. Someone reads an answer in ChatGPT, Perplexity or Claude, clicks the link, and lands on your page in a normal browser. The tag runs, and GA4 counts them. As Google's docs read in October 2026, GA4's default channels even group visits from AI assistants together, apart from Google's own AI Overviews and AI Mode.
The catch is the referrer. GA4 knows a visit came from ChatGPT only if the browser said so. Many AI apps open links in their own browser and send no referrer, privacy settings strip it, and a site's own Referrer-Policy can drop it. Those people still arrive, but GA4 files them under direct. So the AI figure you see in GA4 is real, and it is low.
Google's AI features are a special case. A click from Google AI Mode whose address carries udm=50 can be told apart in a server log. A click from an AI Overview carries nothing at all and looks exactly like any Google search click, in GA4 and in the log alike. Nobody can count those honestly.
People Google Analytics misses too
The same edge cuts through human traffic. A person whose ad blocker stops Google's tag sends no hit. A person who declines the cookie banner sends nothing at all under basic consent mode, and only cookieless pings under advanced consent mode, which GA4 then models. Google publishes no rate for how many visits ad blockers hide.
None of this is a fault in GA4. It is what any tool built on a script tag can see. Your server log, on the other hand, writes a line for every request whatever the browser blocked or the visitor chose.
One morning, two records
Put a morning's server log beside the same morning in a script-tag tool and the gap is plain. A sample, for a small site:
| What came | Server log | Script-tag analytics |
|---|---|---|
| People who loaded a page | Yes, including those with blockers | Only those whose browser ran the tag |
| People from an AI answer, referrer kept | Yes, as people from that assistant | Yes |
| People from an AI answer, referrer lost | Direct, though the assistant's fetch of that page may sit minutes before it | Direct |
| GPTBot, ClaudeBot and other training crawlers | Yes, page by page | No |
| ChatGPT-User and other live fetches | Yes, page by page | No |
| Fakes using a crawler's name | Yes, and checkable by address | No |
The log is not better at everything. It cannot see what happens inside a page after it loads, it has no link to ad spend, and it records requests, not people, until something turns them into visits. That is why the two work best side by side.
How to see what Google Analytics misses
If you have shell access to your web server, one command gives you a first look. On nginx:
grep -oE "GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|Claude-User|PerplexityBot|Perplexity-User" \
/var/log/nginx/access.log | sort | uniq -c | sort -rn
That counts requests by name. It does not check whether each one is real, and scanners often borrow GPTBot's name. For the full walk-through, with the pages each bot read and how to check an address against the owner's list, read how to see AI bots in server logs. For the difference between OpenAI's names, read GPTBot vs ChatGPT-User.
Keep Google Analytics, add the log beside it
You do not need to give up GA4 to see AI traffic. Keep it for ad spend, the Google Ads link and in-page analysis. Skald sits beside it and reads the record GA4 never receives: your server's access log.
Skald sorts every line into five groups that add up to the log: people, AI assistants, search engines, bots and scanners, and your own traffic. AI traffic is split by reason, so a training crawl, a live fetch and a click-through are never added together. Each crawler is checked against its owner's published addresses, and a fake shows as "claims to be GPTBot", under bots.
For the clicks that lost their referrer, Skald makes an estimate and keeps it apart: a direct visit to a page an assistant fetched minutes before is marked likely from that assistant, never added to any count. People are counted as visits, an upper bound on people, never as requests. Every figure is counted twice by a separate audit, and a day the two counts disagree on is withheld.
See the side-by-side in Skald vs Google Analytics, or how the counting works in server log analytics. The live demo shows the whole dashboard with sample data and no sign-up, and the 30-day free trial needs no card; we set it up within one working day.