Guides · 2026-08-28 · By VSNARY | Emmanuel Orta
How to measure AI visibility without trusting a vendor's score
Three measurements, in order, each of which you can reproduce yourself. Two of them are free, and the one people buy first is the one that depends on the other two being clean.
A single audit measures the day it ran. The 110-hour hold and the four returns exist only because something was already watching — a dated series cannot be produced retroactively at any budget.
Most of this category sells a percentage. A percentage is fine if you can say what would make it wrong; the problem is that most of them cannot, and a number you cannot falsify is a label rather than a measurement.
Here is the version you can run and check, in the order that makes each step meaningful.
Measurement 1: can the retrieval layer read you
Free, reproducible, and the only one where the answer is unambiguous. Fetch as a non-browser client, from outside your own network, on the bare URL.
| What to record | Pass | Fails on |
|---|---|---|
| robots.txt content type | text/plain | 3.9% |
| Bare URL vs cache-busted | identical | 30.9% |
| Crawler UA vs browser UA | same status and size | 3.4% |
| Nonexistent path | 404, unlike homepage | 1.3% |
| Visible text share of payload | 20% and up | 13.7% |
Record the raw values, not a grade. A status code and a byte count are things you can argue with; a score out of a hundred is not. Re-run on a schedule, because this drifts with every deploy — across 48 sites measured daily for fifteen days, 68.8% carried a defect on the final day and 93.8% carried one at least once.
Measurement 2: which crawlers actually arrive
This one needs your server logs, and it is the measurement no external tool can produce for you. It is also the one most often done wrong, because the obvious method — counting log lines by user-agent — answers a different question than people think.
Across 2,510 checkable claims in this dataset, 37% came from an address outside the range the operator publishes. Forgery rates by identity: ChatGPT-User 90.1%, OAI-SearchBot 57.7%, PerplexityBot 51.9%, GPTBot 47%, Applebot 37.9%, ClaudeBot 16.4%, Googlebot 9.5%. Four retired or training-specific identities came back at 100%.
So the method is: for each request claiming a crawler identity, check the source address against the operator's published range. OpenAI, Anthropic, Google, Microsoft, Perplexity and Apple all publish one. Count only what verifies. Operators with no published feed — Meta-ExternalAgent, Amazonbot, AhrefsBot, SemrushBot, DataForSeoBot — are unverifiable rather than fake, and should be reported as a separate bucket instead of folded into either.
What that gives you: which engines genuinely fetch you, how often, which paths, and whether that changed after you fixed something. It is the only causal link available between work you did and attention you received.
Measurement 3: presence in answers
This is what the category sells, and it is worth doing — after the first two, because it measures an outcome the first two make possible.
Four rules make it a measurement rather than a label.
Name the surface. An API is not the app. ChatGPT performs retrieval, calls tools and carries personalisation the raw API does not reproduce; AI Overviews is a different system again. There is no public API for the consumer surfaces, so every vendor queries what it can reach. That is acceptable as long as the label says so.
Name the model, mode and date. Grounded retrieval and generation from weights are different systems and averaging them produces a number about neither.
Record presence or absence, not a rank. There is no position three in a generated answer. A binary you can verify beats a percentage you cannot.
Publish the churn. Ask the same question twice and answers differ; ask next week, after a model update, and they differ more. The stability across dated repetitions is the actual signal, and it is the part most tools omit because it makes the headline look unsteady.
Why the order is not negotiable
The temptation is to start at measurement three because it sounds like the outcome. It is, and that is exactly why it is uninterpretable on its own.
If you are absent from answers and your machine layer is broken, you have learned nothing about your content, your authority or your market — you have measured a cache. Across 1,038 scans here, 30.9% serve crawlers a stale object, 13.7% deliver a page that is overwhelmingly code, and 3.4% refuse at least one answer engine outright. Any of those makes a share-of-voice figure a measurement of the obstruction rather than of you.
Run in order, and each step makes the next one interpretable. Run in reverse, and you will spend months on content while the actual cause sits in a header nobody read.
What to put in the report
Three columns and a date, per repetition: what was asked, what surface answered, whether you appeared. Plus the machine-layer status on the same date, so a change in one can be read against the other.
Then apply the test to your own report before anyone else does: what would have to be true for this number to be wrong, and how would I find out? Measurement one fails that test loudly, which is what makes it worth the least attention and the most trust. Measurement three usually cannot answer it at all — which does not make it useless, but does mean it should never be the number on the front page.
Every figure above came out of this scanner.
Point it at your own domain and see the same measurements, free.
Questions this post answers
How do you measure AI visibility?
In three steps: verify that crawlers can fetch and parse your site, verify from your server logs which crawlers actually arrive by checking source addresses against published IP ranges, then record presence or absence in answers with the model, mode and date attached. The first two are free and reproducible.
Can I just count crawler hits in my server logs?
Not reliably. A user-agent is a claim, not an identity. Of 2,510 checkable claims here, 37% came from outside the operator's published range, including 47% of traffic naming itself GPTBot and 90.1% naming itself ChatGPT-User.
What makes an AI visibility number trustworthy?
That you can say what would make it wrong and how you would find out. Naming the surface queried, the model and mode, the date, and reporting presence rather than a rank, with the variation across repeated runs published rather than smoothed away.