Features · Measure
Roughly seven in ten visits that arrive from an AI assistant land in Google Analytics' "direct" bucket, because Gemini, Perplexity and Copilot mostly send no campaign tag. Vitrus classifies them from the referrer host instead, and keeps AI crawlers strictly apart from the humans they send you.
ChatGPT, Claude, Perplexity, Gemini, Copilot, Grok, DeepSeek, Kagi and more are matched by host, so a visit counts as AI even when there is no utm_source at all.
GPTBot fetching your page is not a visitor. Crawler reads are labelled and stored, never summed into your visitor count — and never silently discarded either, because "which of my pages is ChatGPT reading" is the only real feedback loop for GEO work.
Crawler reads per page sit next to AI referral sessions per landing page. The gap between what gets read and what gets clicked is the whole of your AI visibility strategy.
Classification is a deterministic table with a version stamp, measured by a golden-set eval that has to stay at 100% for CI to go green. New assistant appears, table version changes, and every row records which version labelled it.
The evidence
SELECT COUNT(DISTINCT session_id) AS value FROM events WHERE site_id = ? AND ts >= ? AND ts < ? AND bot_kind = '' AND channel = 'ai'
bot_kind = '' is what keeps crawlers out. Click any number in the dashboard and this is what you get, with the parameters that ran.