Every browser-based analytics tool works the same way: a script in your page, executed by a browser, reporting what it saw. That design assumes whatever fetched your page also ran your JavaScript.
An AI crawler does not. It fetches your HTML without running any script, so your dashboard never sees the request.
Search crawlers vs AI assistants
Search crawlers have always been invisible for the same reason, and nobody minded much: a crawl was a machine indexing you for humans who would show up later and be counted properly.
Assistant traffic breaks that chain. When a model fetches your pricing page to answer somebody's question, the person who asked never arrives on your site at all. The page was read and the question answered, but your analytics recorded nothing.
Any analytics that runs as a script in the page misses it, and that is how most analytics works.
Counting it on your server
These requests only exist on the server that served them, so we count them there. A small middleware records each hit before your page renders:
const { createExpressAICrawlerMiddleware } = require('@spreelytics/ai-crawl');
app.use(createExpressAICrawlerMiddleware({ clientKey: 'YOUR_CLIENT_KEY' }));
It records the request and returns straight away, so a response is never held up.
Three kinds of AI crawler
"Bot traffic" as a single figure is not useful. The middleware separates the ones answering questions about you, the ones indexing you and the ones training on you, because each needs a different response. On the Bots page they are three tabs: AI answers, Indexing and Training. The AI crawler list shows which group each bot falls in, with the robots.txt rule that blocks it.
And none of them are joined to your human sessions. A crawler is not a visitor, and counting it as one would skew your numbers.
See AI crawlers and bots for the setup.