GEO analysis is opt-in. Nothing assessed it, so it scores null rather than 100.
Citation tracking runs against the answer engines people actually ask
A dimension nobody looked at scores nothing, not 100.
Most tools average whatever they happened to measure and hand you a grade. botAEO records what it assessed and what it did not, so a clean report means the checks ran, not that they were skipped. A competitor crawl that came back mostly rate limited is refused outright rather than published with a caveat, because people read the number and skip the caveat.
Blocking a training crawler is a policy choice. Blocking a citation crawler is a visibility cost.
botAEO reads your robots.txt and grades the two decisions separately, because allowing one is not the same as allowing the other.
Citation crawlers
Block these and your pages stop appearing in AI answers at all.
OAI-SearchBotAllowedOpenAI
Claude-SearchBotAllowedAnthropic
PerplexityBotBlockedPerplexity
DuckAssistBotAllowedDuckDuckGo
xAI-BotAllowedxAI
Training crawlers
Block these and you give up nothing you can measure in answers.
GPTBotBlockedOpenAI
ClaudeBotBlockedAnthropic
Google-ExtendedBlockedGoogle
CCBotAllowedCommon Crawl
BytespiderBlockedByteDance
The roster follows the operators' published crawler docs, not folklore. ClaudeBot is training only; Claude-SearchBot is the crawler that feeds citations. Google-Extended is a robots.txt token layered on Googlebot's data, so honouring it does not affect Search or AI Overviews.
Seven dimensions, scored the same way every run.
Findings carry stable fingerprints, so two audits of the same site can be diffed and your verdicts replayed instead of re-litigated.
geo
AI crawler access, llms.txt and whether a page can be quoted.
Checks whether your claims sit near a citation, whether an answer engine can lift a self-contained passage, and which crawlers your robots.txt lets through. Opt in per crawl; it costs about seven extra fetches.
technical
Status codes, redirect chains, canonical conflicts and click depth from the link graph.
content
Thin and duplicate pages, heading structure, and word counts measured after JavaScript renders.
onpage
Titles, descriptions and headings, checked against what actually shipped rather than what the CMS intended.
schema
JSON-LD validated against type, not merely detected. A malformed block scores worse than none.
performance
PageSpeed Insights plus CrUX field data, so lab scores never stand in for real visitors.
images
Missing alt text, bytes shipped against bytes needed, and formats a decade past their replacement.
JPEG 46%PNG 29%WebP 17%SVG 8%
This is the thing you are optimising for.
Ask an answer engine a buying question and a handful of sources get quoted. Everyone else is invisible. botAEO runs your prompts on a cadence and records which answers you turn up in, and which sentence earned the citation.
best waterproof panniers for bike commutingSample answer
1wrenfield.co.uk/guides/waterproof-panniersYour site
2pannierlab.com/reviews/roll-top-2026
3thecommutefiles.co.uk/best-panniers
0 of 5 engines cited you this weekPerplexityGeminiOpenAIClaudeAI Overviews
Did the work move anything?
A scheduler re-crawls on a cadence and aligns your traffic, conversions and CrUX field data to audit scores by ISO week. Every correlation travels with its sample size and an explicit reliability flag.
Sample data
Audit scoreOrganic sessions
n = 14 weeksr = 0.81reliableBelow ten paired weeks the same panel reports the correlation as unreliable and says so.
One install. A workspace for every client.
You see all of them. Each client signs in to exactly one, read only, with no route to anyone else's crawls, findings or API keys. Registration closes in production and accounts are created from the command line.
YouAll workspaces
Wrenfield CyclesRead only
Halloran & DeyRead only
Meridian Lab SupplyRead only
Taking on a small number of agencies.
botAEO is in private beta. We onboard a few agencies at a time so the crawler gets tuned against real client sites, on real schedules, before it opens up.
Thanks. You are on the list, and we will write when a slot opens.