Measurement & Method
How to Measure AI Visibility Without Fooling Yourself
An experimental design for AI visibility: fixed prompt sets, control groups, the sample sizes actually required, and the first-party signals nobody sells you.
Quick answer
You cannot measure your AI visibility. You can measure whether a specific, deliberate change moved a specific, well-defined quantity — which requires a fixed prompt set you wrote, enough repetitions per prompt to distinguish signal from sampling noise, a control group of prompts you did not touch, and an annotated timeline recording every model release. That is an experiment, not a dashboard. Anyone who cannot state the sample size behind their number is reporting a coin flip with a decimal point.
I have written elsewhere about why the tools in this category disagree with each other. This is the constructive half: if the vendor numbers are unreliable, what does a defensible measurement programme actually look like?
The answer borrows nothing from SEO reporting and everything from experimental design. That is an unwelcome answer because it is more work and produces smaller claims. It is also the only one that survives contact with a statistician.
Start by abandoning the question you want answered
The question everyone asks is “what is our AI visibility?” It has no answer, and it is worth being precise about why rather than treating this as pessimism.
Visibility would be your appearance rate across the population of relevant queries, weighted by how often each is asked. Two of those three terms are unobservable. Providers do not publish query logs. No panel captures private chat sessions at scale. You cannot enumerate the population and you cannot weight the sample.
What you can answer:
- Given this specific set of prompts, at this cadence, on this model, what proportion of responses mention us — and with what uncertainty?
- Did that proportion change after we made a specific change, by more than sampling noise would explain?
- Did it change on prompts we targeted but not on prompts we did not?
Narrower, defensible, and sufficient to make decisions. The third question is the one that separates measurement from storytelling, and almost nobody asks it.
Designing the prompt set
Everything downstream depends on this and it is where most programmes go wrong by trying to be comprehensive.
- Small and fixed. Twenty to forty prompts you wrote and can justify individually. A prompt set that grows over time makes every historical comparison invalid, and vendors add prompts constantly.
- Stratified by intent, not by keyword. Group by what the person is trying to do — evaluate options, solve a problem, check a fact, compare two named things. Different intents behave differently at the retrieval gate and averaging across them hides everything.
- Include prompts you expect to lose. A set containing only queries you might win is not a measurement instrument, it is a highlight reel. Deliberate inclusion of hard cases is what lets you detect genuine improvement.
- Hold out a control group. Reserve a third of prompts you will never optimise for. Movement in the treated group that also appears in the control is not yours — it is the platform changing.
- Version the set. If you must change it, start a new series. Never edit prompts in a running experiment.
My position
The control group is the single highest-value element and I have never seen a commercial tool offer one. Without it you cannot distinguish your content improvements from a vendor deploying a new retrieval threshold on a Thursday, and I would estimate that a substantial share of celebrated AI visibility wins are platform changes claimed as strategy. A control group costs you nothing but discipline and it is the difference between a result and an anecdote.
How many runs you actually need
This is arithmetic, not judgement, and it is the part that makes people uncomfortable because the numbers are large.
Mention is a Bernoulli trial. To DETECT A CHANGE you need
enough samples in both periods.
Approximate n per group for two-proportion comparison,
80% power, 95% confidence:
detect 30% → 40% (10 pts) ≈ 360 runs per group
detect 30% → 35% (5 pts) ≈ 1,400 runs per group
detect 30% → 32% (2 pts) ≈ 8,700 runs per group
Read that again. To reliably detect a five-point move
you need roughly 1,400 observations before and after.
With 30 prompts that is ~47 runs per prompt per period.
Anything less and you are not measuring a change.
You are observing variance and narrating it.
Two honest consequences. First, weekly reporting on small prompt sets is statistically meaningless — you do not accumulate enough observations in a week. Monthly or quarterly is the realistic cadence for claims about change. Second, you should design for large effects. If your intervention cannot plausibly move appearance rate by ten points on the prompts you targeted, you will not be able to prove it worked, and you should decide whether it is worth doing on other grounds.
What to record for every single run
Aggregates are where evidence goes to die. Store the raw observation.
timestamp UTC, to the second
prompt_id stable reference into your versioned set
prompt_text the exact string sent
surface api | consumer app | which one
model_id exact identifier, including version if exposed
temperature and any other sampling parameters
response_text the complete raw response, stored
mentioned boolean, by your stated rule
mention_position ordinal within the response
sentiment your classification, plus who or what classified it
cited_urls[] every URL, in order
search_performed did the system retrieve at all, if observable
run_index which repetition of this prompt this is
Without response_text you cannot re-analyse when your
definition of "mention" changes. And it will change.
That last note is from experience of the general pattern: every measurement programme revises its definitions in the first quarter. If you only stored booleans, your entire history becomes incomparable the moment you improve your rules.
Define “mention” before you count anything
Write it down, in advance, with edge cases resolved. Otherwise the definition drifts toward whatever produces a nicer number.
| Case | Counts as? | Why the decision matters |
|---|---|---|
| Named in prose, no link | Brand mention, not citation | Different value. Track separately |
| Linked in footnote, unnamed in text | Citation, not brand mention | User may never see the name |
| Named as what to avoid | Mention, negative | Counting this as a win inverts the truth |
| Position nine of eleven | Mention, low prominence | Record ordinal or you cannot see quality change |
| Product named, brand not | Decide in advance | Common and genuinely ambiguous |
| Competitor comparison where you lose | Mention, negative context | Sentiment classifier must handle this |
And if you use a model to classify sentiment, measure the classifier. Hand-label two hundred responses, compare, and report its accuracy alongside your results. An unvalidated classifier is an unknown error term applied to every number you publish.
The annotation log
A time series without annotations is decoration. Maintain a dated log of everything that could plausibly affect the numbers, whether or not you caused it.
- Model version announcements from every provider you query
- Your own content publications and material edits, with URLs
- Technical changes: robots.txt, structured data, site architecture, hosting
- Competitor launches and notable coverage you become aware of
- Anything you notice behaving differently, even without explanation
When a discontinuity appears — and it will — the log is the only thing standing between you and a fabricated causal story. Discontinuities in this data are usually the platform. Assuming otherwise is how teams take credit for a deployment and then cannot repeat it.
First-party signals, which nobody sells you
The uncomfortable part
The most reliable AI visibility data available to you is in your own server logs, it is free, and almost nobody uses it — because there is no product to buy and therefore nobody marketing it. AI crawler user agents tell you who is fetching your content and how often. Referral traffic from assistant surfaces tells you which citations produced actual visits. Both are first-party, unambiguous and immune to every sampling problem described above. An entire industry is selling estimates of something you can partially observe directly.
What to instrument:
- Crawler hits by user agent, by URL, over time. Which pages are being fetched by which AI systems, and whether that is rising or falling. A page that stops being crawled will stop being cited.
- Referral traffic from assistant domains. Separate this from organic search in your analytics. It is the only direct evidence of citation converting to a visit.
- Landing page distribution of that referral traffic. Which of your pages assistants actually send people to is frequently not the pages you expected, and it is the strongest signal about what is working.
- Whether your robots.txt permits the crawlers you want. Worth verifying rather than assuming, and worth deciding deliberately rather than by default.
A programme that fits in a working week per quarter
- Write 30 prompts. Stratified by intent, a third held as control, versioned, documented.
- Define mention and sentiment in writing, with the edge cases from the table above resolved.
- Run each prompt 40+ times per quarter, spread across days and times rather than in one burst.
- Store every raw response. Not aggregates.
- Report proportions with confidence intervals, treated and control side by side.
- Maintain the annotation log continuously, not retrospectively.
- Read your server logs monthly for crawler and referral patterns.
- Claim nothing the control group does not support.
What this costs you politically
I should be honest that this approach is harder to sell internally than a dashboard.
You will report ranges where colleagues want points. You will say “no detectable change” where a vendor tool would have shown a reassuring upward line. You will occasionally have to explain that a large apparent gain was a model update and belongs to nobody. None of that is what people want from a quarterly review.
What you get in exchange is that when you do report a real effect, it is real — and you can repeat it. In a field this noisy, being the person whose numbers hold up under questioning is worth considerably more than being the person with the nicest chart. It just takes a few quarters for that to become obvious to everyone else.
Why the commercial tools cannot do this for you is covered in why AI visibility tools disagree, and what you are attempting to measure is set out in how retrieval actually selects your page.
Frequently asked questions
Can you actually measure AI visibility?
Not in the sense usually meant. True visibility would be appearance rate across all relevant queries weighted by frequency, and query frequency is unobservable because providers do not publish logs and no panel captures private chats at scale. What you can measure is whether a specific change moved a specific well-defined quantity on a fixed prompt set.
How many times should each prompt be run?
More than most people expect. For a two-proportion comparison at 80% power and 95% confidence, detecting a ten-point change needs roughly 360 observations per group, and a five-point change around 1,400. With thirty prompts that is about 47 runs per prompt per period. Below that you are observing variance rather than measuring change.
Why do I need a control group for AI visibility?
To separate your work from platform changes. Reserve about a third of your prompts and never optimise for them. If movement appears in both treated and control groups, it was a vendor deploying something, not your content. It is the highest-value element of the design and no commercial tool offers it.
Is weekly AI visibility reporting meaningful?
Statistically, no. You cannot accumulate enough observations in a week to distinguish a real change from sampling noise on a normal prompt set. Monthly or quarterly is the realistic cadence for claims about change. Weekly charts in this category are mostly rendering variance as narrative.
What should I record for each measurement run?
Timestamp, prompt ID and exact text, surface and model identifier, sampling parameters, the complete raw response text, your mention boolean and its position, sentiment plus what classified it, all cited URLs in order, whether search was performed, and the repetition index. Storing raw responses matters because your definition of mention will change.
How should I define a brand mention?
In writing, before counting, with edge cases resolved: named in prose without a link, linked without being named, named as something to avoid, named ninth in a list, product named without brand, and comparisons where you lose. Each decision changes the headline number, and settling them in advance stops the metric drifting toward flattery.
What first-party AI visibility data do I already have?
Your server logs. AI crawler user agents show which of your pages are being fetched by which systems and how often, and a page that stops being crawled will stop being cited. Referral traffic from assistant domains shows which citations produced actual visits. Both are free, unambiguous and immune to every sampling problem in vendor tooling.
What if my numbers jump suddenly with no explanation?
Assume the platform first. Discontinuities in this data are usually model releases, routing changes or retrieval threshold adjustments, none of which are announced. This is exactly why a dated annotation log matters — it is the only thing standing between a discontinuity and a fabricated causal story you cannot reproduce next quarter.