Bots & AI crawlers
How classification works, what categories exist, and default filtering.
Because MetrikStack can see traffic beyond the browser (server, edge, log sources), it also sees a lot of what a script-only tool never does: search engine crawlers, uptime monitors, scrapers, and increasingly, AI crawlers and AI assistants fetching pages on a user's behalf. Rather than silently discarding this traffic, MetrikStack classifies it and stores it, so you can see and report on it deliberately.
How classification works
Classification is layered and deterministic:
- Known-bot user-agent list: a maintained list, grouped by category, covering among others GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-Web, anthropic-ai, PerplexityBot, Perplexity-User, Google-Extended, Googlebot, Bingbot, Applebot, Amazonbot, CCBot, Bytespider, Meta-ExternalAgent, DuckAssistBot, YandexBot, AhrefsBot, SemrushBot, and common uptime monitors. New bots are added to the list without any change on your side.
- Heuristics for user agents not on the list: missing
Accept-Language, HEAD requests, no referrer combined with no user agent, or an unusually high request rate from one visitor hash. - Source-aware rule: an event from the
scriptsource is almost certainly not a crawler (crawlers rarely execute JavaScript); the same user agent seen from anedge,serverorlogssource is treated as a bot.
What categories exist
Each event carries is_bot, bot_name and bot_category. Categories
include:
ai_crawler: AI companies' training/answer crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, …)search: traditional search engine crawlers (Googlebot, Bingbot, …)monitor: uptime and synthetic monitoring servicesscraper: SEO tools and generic scrapers (AhrefsBot, SemrushBot, …)unknown: flagged as a bot by heuristics but not matched to a named entry
Storage and default filtering
Bots are stored, never dropped at ingest. Dropping them would make it impossible to report on which AI crawlers read your site and how much referral traffic AI assistants send back.
The dashboard filters bots out by default everywhere except the dedicated
Bots & AI crawlers page, which does the opposite: it defaults to showing
bot traffic and lets you break it down by name and category. The query API
mirrors this: POST /v1/query takes include_bots (default false); set
it to true, or filter by bot_category / bot_name as a dimension in
POST /v1/query, to see it explicitly.
Getting told when it changes
Watching the page is one thing; being told is another. Two of the
alert kinds are built on exactly this data:
ai_crawler_spike fires when AI-crawler traffic jumps against the same
window a week earlier, and ai_referral_spike does the same for visits
arriving from an assistant's answer. Both deliver to a signed webhook or by
email.