AI traffic · read from access.log
AI traffic tracking: crawls, live fetches and clicks, kept apart
AI traffic tracking starts where your analytics stops. ChatGPT, Claude and Perplexity read your pages without running a script. Your server log saw every one, and Skald sorts them by why they came.
AI traffic tracking means counting what AI does on your website: training crawlers that read it, assistants that fetch a page while answering someone, and people who click a link in an AI answer. Skald reads all three from your server's access log, because none of the machines run a script tag.
30-day free trial · no card · we set it up within one working day · free to self-host
09:14:01 203.0.113.24 "GET /pricing/" "GPTBot/1.2"
- 1 name
- 2 address
- 3 referrer
GPTBot is on the training list. Its address is on OpenAI's published list.
lines read 1=every line in exactly one place
Sample lines, sorted by the same three checks Skald runs on your log.
[01] the blind spot
Your analytics says AI barely visits. Your log disagrees.
AI crawlers and assistants fetch your pages without running a single line of JavaScript. A script tag cannot count what never runs it. Your web server writes a line for every request anyway, and that is the line Skald reads.
Drag the bar across one sample day: the same site, seen by a script tag and by its own log.
- Visits by people412
- Training crawls2,310
- Live fetches for a question186
- Clicks from an AI answer9
- Likely from AI, kept apart+14
- Fake AI crawlers73
Sample day. People are counted either way; the machines only show up in the log.
[02] who is waiting
One question to ChatGPT leaves three different traces in your log
A crawl at 3 a.m. is a company building a model. A fetch at 09:14 is a person waiting for an answer about you. A click is that person arriving. Skald files each by why it came, so demand never hides inside crawling.
A person
The AI company
Your access.log
"GET /pricing/" "GPTBot/1.2" training
nothing yet: the question happens inside ChatGPT
"GET /compare/plausible/" "ChatGPT-User/1.0" live fetch
"GET /compare/plausible/" ref chatgpt.com person · from ChatGPT
Training crawl. GPTBot, ClaudeBot, CCBot and others read to train a model; OAI-SearchBot and PerplexityBot read to build an AI search index. Nobody is waiting. You see what each one read and what it cost you. AI crawler tracking
The question. It happens inside the assistant, so no log records it. What you can see is what the assistant does next on your server. What AI says about you
Live fetch. ChatGPT-User, Claude-User, Perplexity-User and ten more fetch a page while a person waits. That is a reader, one step removed, and the clearest sign of demand an AI leaves. ChatGPT traffic
Click-through. A person, with a normal browser. Skald counts them as people and shows the assistant as their source, read from the referrer's host, so thank-you.com never counts as you.com. AI referral traffic
[03] trust the names
Fake "GPTBots" would inflate your AI numbers. Skald catches them.
A user agent is the name a program sends with each request. Anyone can type one, and scanners wear GPTBot's name to look harmless. Skald checks the address behind each claim the way its owner says to. A fake moves to bots as "claims to be GPTBot".
203.0.113.24 "GET /pricing/" "GPTBot/1.2"
check: Address list
- OpenAI publishes the addresses its crawlers use.
- 203.0.113.24 is inside one of them.
Verified
Counted as AI · training crawl.
Sample addresses. The owners' lists are fetched once a day; DNS answers are kept for 7 days.
[04] the clicks AI apps hide
ChatGPT sent them. Your analytics says "Direct".
Many AI apps strip the referrer, the address a click came from, so a click from an answer lands as a direct visit. But when the person asked, the assistant fetched that same page from your server minutes earlier. Skald lines the two up and marks the visit "likely", apart from every real count.
likely from ChatGPT
- 08:52 ChatGPT-User fetched /pricing/
- 08:57 Claude-User fetched /pricing/
- 09:02 ChatGPT-User fetched /compare/plausible/
- 09:03 ChatGPT-User fetched /pricing/
- 09:08 Perplexity-User fetched /docs/setup/
- 09:14 A visit lands on /pricing/ with no referrer and no campaign tag
what the AI read before it sent this visitor
- 09:03 /pricing/ landed here
- 09:02 /compare/plausible/
ChatGPT-User fetched /pricing/ 11 minutes before, inside the window. The visit is marked likely from ChatGPT.
- Same page only. Perplexity fetched /docs/setup/, not /pricing/, so it never counts for this visit.
- Two assistants, one visit. When both fetched the page, the visit counts once, as "more than one", never twice.
- Never added. Likely visits sit beside the real figures. The window is a setting, 15 minutes by default.
[06] cost and coverage
The crawler that costs you most may never read your best page
Per crawler: every request, the bytes you sent, the 90th-percentile answer time and its errors. Beside your sitemap: which listed pages it fetched, which it never has, and what it keeps fetching that you do not list.
- requests
- 1,184
- bytes sent
- 412 MB
- p90 answer time
- 1,340 ms
- 404s, 5xx, redirects
- 38
your sitemap, 40 pages · 21 of 40 fetched · 57 unlisted paths fetched
fetched never fetched /pricing/
Heavy and slow to serve, and it has never fetched 19 of your 40 listed pages, your pricing page among them.
Sample month. A page is slow when it took a second or more, large at 1 MB or more.
[07] your rules
Keep the AI that answers people. Refuse the AI that only trains.
Choose per AI company: allow, block training only, or block. "Block training" keeps the fetchers that answer a person's question and the crawlers that build AI search, so you stay in the answers without feeding a model.
Skald writes these nginx lines for your server. An nginx map is a lookup table in the web server's settings: it reads each request's user agent and answers refuse or let in. The lines take effect once your server admin has connected them. robots.txt is always answered, so a refused crawler can still read your rules.
try "Block training" on OpenAI
map $http_user_agent $skald_block_agent {
default 0;
}
map $uri $skald_block {
default $skald_block_agent;
/robots.txt 0;
}
# nothing refused
Real crawler names from Skald's list. Google's training opt-out, Google-Extended, is a robots.txt token and never a visitor, so it only appears in the robots.txt lines.
[08] what it cannot see
Where AI traffic tracking stops, said plainly
Every figure is one Skald can prove from the log. These are the edges, so you never read more into a number than it holds. More in Insights
What it does not do
- AI clicks are a floor: an app that strips the referrer sends a direct visit. Likely visits are shown apart, never added.
- Clicks from Google AI Overviews cannot be told apart from other Google clicks. AI Mode can, when the click carries
udm=50. - Google trains on what Googlebot fetches. Google-Extended is a robots.txt rule, not a crawler you can count.
- No server or CDN log (Shopify, Webflow, Squarespace: script tag only) means no crawlers or fetches at all.
- What an assistant said in its answer is not in your log. For that, see AI visibility tracking.
in this section
Go deeper: every part of AI traffic, one page each
keep reading
More on AI traffic tracking
questions
AI traffic tracking FAQ
Straight answers, including what Skald does not do.
How do I track AI traffic on my website?
Read your server's access log. AI crawlers and AI fetchers never run JavaScript, so a script tag never sees them. Skald reads the log your server already writes, names each AI caller, and splits training crawls, live fetches and click-throughs. How server log analytics works.
Is AI traffic counted as people?
No. Crawlers and fetchers are machines and show under AI and bots, in their own units. A person who clicks a link in an AI answer is a person, with the assistant shown as their source.
What does "likely from ChatGPT" mean?
It is an estimate, not a count. A direct visit that lands on a page ChatGPT fetched up to 15 minutes before is marked likely from ChatGPT. Likely visits are shown apart and never added to any figure.
Why do AI clicks look low?
Many AI apps strip the referrer, so the click arrives as a direct visit. Skald counts only clicks that carry the assistant's address, so AI clicks are a floor, not a total. Likely visits fill in part of the gap, kept apart.
Can Skald see Google AI Overviews?
No. A Google click whose address carries udm=50 is Google AI Mode, and Skald shows it as google.com (AI Mode). Clicks from AI Overviews arrive as plain google.com, and Skald never guesses which those were. Google AI Mode traffic.
How do I know a crawler is really GPTBot?
Skald checks each crawler's address against the addresses or DNS its owner publishes. Each one is verified, not verifiable, or spoofed. A crawler using GPTBot's name from the wrong address shows as "claims to be GPTBot", under bots.
$ tail -f access.log | skald
See what AI does with your site. Free for 30 days.
No card. We set up hosted Skald for you within one working day, or you self-host it free. Every line of your log, sorted and added up.