How do I tell AI bot traffic apart from real visitors in my analytics?
Short answer
In GA4 you mostly don't need to, because AI crawlers don't execute JavaScript and therefore never fire the tag. The separation you actually need is between two different data sources: server logs, which see every crawler request, and GA4, which sees only rendered human sessions. Identify crawlers by user agent in your logs, and treat any bot volume appearing in GA4 as a tagging or scraping anomaly worth investigating separately.
Why this question usually has a simpler answer than expected
GA4 fires through a JavaScript tag. A crawler that fetches your HTML and moves on never runs that script, so it never becomes a session.
That means the standard fear, that AI crawlers are inflating your GA4 traffic, is usually unfounded. What crawlers do inflate is your server-side numbers: bandwidth, request counts, origin load, and anything derived from log files or a CDN dashboard.
So the first move is to stop looking in GA4 and start looking at logs, because that's the only place the two populations actually mix.
Where each population is visible
| Data source | Sees AI crawlers | Sees human AI referrals | Use it for |
|---|---|---|---|
| Server logs / CDN | Yes, all of them | Yes | Crawler volume, crawl frequency, which pages get fetched |
| GA4 | Rarely | Yes | Human sessions, engagement, conversions |
| Analytics on rendered pages only | No | Yes | Same as GA4 |
The practical rule: if you want to know whether AI systems are reading your content, that's a log question. If you want to know whether humans arrived from AI systems, that's a GA4 question. Conflating the two is what produces the confused reports.
Identify AI crawlers in your logs
Filter your access logs by user agent. The major AI crawlers identify themselves, and each vendor publishes its own documentation on the agents it operates and the ranges they come from.
Group them into three purposes, because the distinction changes what you'd do about them:
Training crawlers fetch content to build model training corpora. Blocking these has no effect on whether you appear in AI answers today.
Search index crawlers build the retrieval index an assistant queries when answering. Blocking these removes you from that assistant's citations.
Live retrieval fetchers fetch a page in real time while answering a specific user question. Blocking these prevents citation at answer time.
The distinction matters because a blanket block in robots.txt often removes you from the second and third categories while people assume they're only opting out of the first. Google's documentation on AI features and websites covers how its own AI surfaces fetch and use content, and each vendor publishes equivalent guidance. See also Should I block AI crawlers — and will blocking make my brand disappear from AI answers?.
Verify agents against each vendor's published documentation rather than a scraped list, since user agents change and impersonation is common.
If bot traffic does appear in GA4
It happens occasionally, and each cause has a different fix.
Headless browsers. Some scrapers render JavaScript, which fires the tag. These show up with unusual screen resolutions, near-zero engagement time, and a single-page flow.
Your own monitoring. Uptime checkers and synthetic tests can fire tags if they render pages. Exclude them by IP.
Measurement Protocol abuse. If someone has your measurement ID, events can be sent server-side without visiting your site. These often appear as impossible geography or nonsensical event sequences.
GA4 filters known bots and spiders automatically, and that filter is on by default. To confirm, check Admin → Data Streams → your stream → Data filters, and separately check that internal traffic exclusions are configured for your own IPs.
The signature of non-human GA4 traffic to look for: zero engagement time, one page per session, no scroll events, and a flat distribution across hours of the day with no human diurnal pattern.
What crawler data actually tells you
Crawler activity in your logs is a leading indicator, not a vanity metric. A page that AI systems fetch repeatedly is a page in their retrieval path. A page never fetched cannot be cited.
But fetching is not citation, and citation is not traffic. Our own state of AI search research, covering more than 22,000 answers and 115,000 citation events, found citation presence reaches 97.4% on Google AI Mode and 93.2% on Perplexity, while the pages actually cited are a narrow subset of everything crawled.
So treat the chain as three separate measurements: crawled, cited, clicked. Each needs its own data source, and improving one doesn't automatically improve the next.
Measure the middle of the chain, which neither logs nor GA4 cover
Your logs show what was crawled. GA4 shows what was clicked. Neither shows what was cited, and that middle step is where the value of the crawl is decided.
Analyze AI holds that layer directly. Citation Pages returns which of your URLs AI systems actually cite, and Citation Watched Pages tracks a defined set so you can monitor the pages you care about rather than reading a full list each time. Set against your crawl logs, the pairing produces a diagnosis your server data alone can't support.

The three states, and what each one means:
| Crawled | Cited | Diagnosis |
|---|---|---|
| No | No | Technical. Check robots.txt, rendering, and internal linking. |
| Yes | No | Content. The page is reachable and not chosen. |
| Yes | Yes | Working. Track whether clicks follow, and accept that most won't. |
The middle row is the common one and the most misread. Teams see heavy crawler activity, assume AI systems value the page, and never check whether it converts into a citation. Our own state of AI search research, covering more than 115,000 citation events, found the pages actually cited are a narrow subset of everything fetched.
A weekly agent that maintains the three-state view:
Start (schedule, weekly) → Citation Watched Pages (your priority URL set) → citation-magnets recipe → uncited-pages recipe → GA4 AI Traffic Overview → Code (assign each page a crawled, cited, and clicked status from the joined data) → Prompt LLM (list pages in the crawled-but-never-cited state as the content work queue) → Excel export → Send Email to the content lead.
That queue is the output worth having. It converts a log file full of crawler noise into a short list of pages that AI systems can reach and choose not to use.
FAQ
Related answers
- How do AI crawlers distort my traffic and conversion-rate reporting?
- How do I track ChatGPT traffic in GA4?
- Why does AI traffic show up as Direct in Google Analytics?
Want to see which of your crawled pages actually earn AI citations? Start a free Analyze AI trial and track cited and uncited pages side by side.
