Skip to content
Methodology · version 1.0 · 30 July 2026 · corrected 31 July 2026

How the measurement works

Written to be argued with. If you are an agency handing our numbers to a client, this is the page you forward, and nothing on it requires an email address.

Changes to this method are versioned. A number produced under version 1.0 stays labelled 1.0 forever.

1. The engines we query, and the two we refuse to

CitedProof queries four surfaces: ChatGPT, Google AI Overview, Google AI Mode, and the Google organic result page. The set is closed in code. Adding one is a versioned change to this page.

Engines measured and engines excluded
SurfaceStatusReason
ChatGPTMeasuredThe most-used assistant surface for buyer questions.
Google AI OverviewMeasuredAppears above organic results and is where a zero-click answer is formed.
Google AI ModeMeasuredA distinct surface with a distinct source mix; overlap with AI Overviews is roughly 10.7% of URLs.
Google organic SERPMeasuredThe control. It separates “not retrievable” from “retrievable but not cited”.
Gemini grounding APIRefusedGoogle’s terms prohibit analysing grounded results. Quoted below.
PerplexityNot measuredIts terms bar scraping the consumer product, and we hold to that. If a route opens that does not, it appears here with the date it was added.

The Gemini exclusion is deliberate and permanent. Google’s Gemini API terms state:

“You will not, and will not allow your end user or any third party to, cache, frame, syndicate, resell, analyze, train on, or otherwise learn from Grounded Results or Search Suggestions… it is a violation of these terms to use Grounding with Google Search to extract or collect one or more of these components for another purpose.”

Source: ai.google.dev/gemini-api/terms. The identical clause appears in the Google Cloud service-specific terms for Grounding with Google Search. Analysing grounded results is exactly what this product does, so the engine is out, permanently, not pending. If you are shown a “Gemini score” by anyone, that clause is the question worth asking about it.

2. How the prompt set is built

Prompts come from what you sell, not from a keyword tool. We crawl your site, extract the offerings, the audience and the category language, then generate buyer questions across six intents: informational, commercial, comparison, transactional, navigational and problem-first.

  • Every prompt is visible and editable before the first run. A prompt you would never hear from a customer is noise you are paying to measure.
  • Prompts are stored with a provenance flag, generated, autocomplete-derived, manual or imported, and that flag appears in the export.
  • The same prompt set is reused for the baseline and the day-30 re-measurement. Changing prompts mid-comparison invalidates the test, so the system refuses it and starts a new baseline instead.
  • Duplicate prompts are rejected at the database level on a normalised hash, so a set of 40 prompts is 40 distinct questions.

3. What counts as a mention, and what counts as a recommendation

A mention is your brand appearing in the answer text. A recommendation is the answer proposing you as an option for the buyer’s stated need. They are recorded separately because they are commercially different: being listed once in a footnote is not being recommended.

Every answer is read against a strict output schema, and every score carries the match method that produced it, so a disputed call is checked against the sentence that produced it rather than argued about:

Match methods recorded with every score
Match methodMeaning
exactThe brand name appeared verbatim.
aliasA registered alias appeared, a legal name, a former name, a common misspelling you confirmed.
domainYour domain was cited as a source even though the name was not written out.
fuzzyA near-match above threshold. Always shows the evidence quote so you can overrule it.
llmThe scorer judged a reference that no string rule would catch.
noneNot mentioned. This is the only value permitted when mentioned = false.

That last row is enforced by a database constraint rather than by convention: a row claiming “not mentioned” while also carrying a match method, or carrying a position, is rejected at write time. Every score also stores the evidence quote it was derived from, so a disputed call can be checked against the sentence that produced it.

4. The denominator rule, where NOT ENOUGH DATA comes from

A run where the engine returned nothing is excluded from the denominator. It is never counted as an absence. This single rule is the reason this company exists.

Each run is stored with an engine status: ok, degraded, no_data or error. Only ok enters the denominator. degraded, no_data and error are counted separately, reported, and excluded, a degraded run is an engine we do not trust on that pass, so it is not evidence either way. A run marked ok must carry something we can re-score: the database itself rejects a “successful” run that carries no response text, no raw payload and no payload reference, because a contentless run scored as a real absence is precisely how a tool ends up reporting 0% while the engine was simply down.

A rate is published only when both of these hold:

  1. at least 2 distinct engines returned a usable answer for the slice; and
  2. at least 8 usable runs exist in it.

The engine condition is what makes the claim a panel claim: one engine agreeing with itself is one vendor’s opinion, not a measurement of how AI answers. A per-engine chart is honestly one engine by definition, so it is allowed to publish on a single engine; the cross-engine rollup, the number we actually sell, and the one the day-30 verdict uses, never gets that relaxation.

If either condition fails, no rate is published at all. The visibility rate, recommendation rate and share of voice are stored as null, a machine-readable reason is stored alongside, and the report prints NOT ENOUGH DATA with that reason, either which engines answered and how many were required, or how many usable runs there were against the floor of 8.

This is enforced in three places, not asked of anybody. A single function decides sufficiency, and a single constructor builds a snapshot, it computes the rates inside the “sufficient” branch, so there is no parameter through which a caller can inject one. Behind that sit a schema validator and a PostgreSQL CHECK, which makes it physically impossible to store a row carrying a rate while insufficient, or one insufficient without a stored reason. The two thresholds above are the values this system runs on, and they are published here so that changing one is visible to you rather than silent. The rule cannot be switched off, and no white-label setting relaxes any part of it.

A genuine zero is still published. If the denominator is full and your brand appeared in none of the answers, the report says 0% and shows the runs. The rule removes fabricated zeros, not real ones.

5. The day-30 verdict, the statistical test

We compare two proportions with a z-test and report Wilson score intervals; we never subtract one percentage from another and call the difference a result.

The reason is measurable. Three independent parses of 9,734 Google AI Mode responses, on the same day, from the same location, agreed on only 9.2% of exact URLs across all three runs. On a surface that noisy, a raw delta reports mostly sampling variation.

  • REAL CHANGE, a pooled two-proportion z-test returns p < 0.05. The test is two-sided, so a significant fall is a REAL CHANGE too, and it is reported as one: the direction is printed with the verdict and a fall is never dressed as a win.
  • NO CHANGE, the test does not reach that bar on a sufficient sample. This is a normal outcome and it is reported as plainly as a win.
  • NOT ENOUGH DATA, either side fails the sufficiency rule in §4. No delta and no p-value are shown, because a delta computed on an insufficient sample is worse than silence.

The headline verdict is pooled across engines, and only the pooled one

Every rate is also reported per engine, because knowing that ChatGPT names you and AI Overview does not is useful. A per-engine verdict is a different thing, and we do not headline one. Four independent tests at p < 0.05 carry roughly a 19% chance that at least one comes back “significant” on nothing at all. Reporting four verdicts and letting the reader pick the good one is how a measurement product becomes a slot machine.

The verdict counts prompts, not runs

A prompt asked three times on four engines is one prompt’s worth of evidence, not twelve. Repeats of the same question are correlated, so counting them as independent observations would tell the test there is three or four times more evidence than exists, and a test told that returns REAL CHANGE on noise. The number behind your verdict is therefore the number of prompts compared, and it is printed next to the verdict.

What this test can and cannot detect, the numbers we would rather you knew

This test is built to be hard to pass, and that is what makes a REAL CHANGE verdict worth having. The threshold that stops us reporting a small move as a win is the same threshold that stops us reporting noise as one, so a verdict you can take to a client is a verdict that had to clear a bar. Here is exactly where that bar sits. Minimum detectable effect, alpha 0.05, 80% power, from a 20% starting visibility rate:

Minimum detectable effect by number of prompts compared
Prompts comparedSmallest change we can honestly detectA real 20% → 25% lift is detected
12+52 points5% of the time
20+43 points7% of the time
40+30 points8% of the time

Read that table before you read a verdict. At 40 prompts, a move from 20% to 25% sits under the bar, so it comes back as NO CHANGE, which is why the copy never says a fix failed: NO CHANGE means we could not detect a change at this sample size, a different claim, and the only one the arithmetic supports. What this test is built for is the move that pays for itself, an unblocked retrieval crawler, a page that finally states its price, and for refusing to dress a small one up as a win you would have to defend later.

These figures are computed, not estimated. They come from the exact binomial power of the same comparison function that decides your verdict, evaluated at each sample size, and they are pinned in our test suite so the page cannot drift away from the code.

We also do not sell repetition as rigour. In a 12,933-response variance study, moving from 5 repeats to 10 reduced variance by 0.00030, while adding languages or engines was about fifteen times more effective per unit of budget. “Daily refresh” is a pricing feature. It is not a statistical one, and we will not charge you for it.

6. Tier 0, the crawler-access check

Before any answer is measured we check whether the engines can reach you at all, because everything else is downstream of that. The registry holds 22 crawler tokens. 20 are probed over HTTP as themselves, and we record what blocked each one: robots.txt, a WAF rule, a CDN rule, an HTTP status, or nothing. The other 2, Google-Extended and Applebot-Extended, are control tokens: their vendors publish no user-agent string for them, so there is nothing to send a request as. They are read from your robots.txt, which is the only place they exist, and the report says so rather than implying we fetched anything as them. A probe we could not complete is recorded as unknown; it is never rendered as “open” and never as “blocked”. The ones that carry a buying consequence:

Crawlers checked and their class
CrawlerClassBlocking it means
OAI-SearchBotRetrievalOpenAI states opted-out sites “will not be shown in ChatGPT search answers”.
ChatGPT-UserRetrievalFetches a page when a user’s request needs it. Per OpenAI, not used to decide search inclusion.
PerplexityBotRetrievalRemoves you from that engine’s retrieval path.
GPTBotTrainingAffects model training, not live retrieval. Blocking it is a legitimate choice.
Google-ExtendedControl, robots.txt onlyGoverns Gemini training use. It does not control AI Overview inclusion. Google publishes no user-agent string for it, so we read your robots.txt and do not pretend to have fetched anything as it.
Claude-SearchBotRetrievalThe token Anthropic uses to build its search index. Blocking it removes you from that path.
Claude-UserRetrievalFetches a page when a user’s request needs it.
ClaudeBotTrainingTraining only. Anthropic now publishes separate retrieval tokens, so we treat the three separately instead of calling one of them hybrid.

Anthropic publishes no user-agent string for any of its three tokens. We construct one to probe with, and the report labels it as our construction rather than passing it off as a vendor string.

The retrieval/training distinction is the part most reports get wrong. Blocking a training crawler is a business decision with no direct effect on whether you are cited today. Blocking a retrieval crawler removes you from the pipeline that produces today’s answer. We never recommend unblocking a training crawler to “improve AI visibility”.

What the evidence supports, stated at its real strength: across 1,058 domains, sites blocking GPTBot showed a citation propensity of 0.003 against 0.417 for non-blockers, and the authors state the data cannot prove causation. A separate study of 4M citations found sites blocking GPTBot still appeared in 88.2% of the prompts examined. So we sell unblocking as removing a handicap, not as a guarantee of citation.

A finding of this type ships with the exact lines to paste and the command that proves it worked:

# robots.txt, allow the crawlers that decide whether you appear in AI answers
User-agent: OAI-SearchBot
Allow: /

User-agent: ChatGPT-User
Allow: /

User-agent: PerplexityBot
Allow: /

# Training crawlers are your call. Blocking these does NOT remove you from AI answers.
# User-agent: GPTBot
# Disallow: /
# verification, expect 200, not 403 or 429
curl -sI -A "OAI-SearchBot" https://example.com/ | head -1
curl -sI -A "PerplexityBot" https://example.com/ | head -1

7. Evidence grades

Every finding carries the grade of the evidence behind it, and a weak grade is printed as a weak grade. An agency should be able to tell a client “this one is a controlled experiment, that one is a correlation” without reading the footnotes.

A Controlled experiment or a first-party statement from the engine operator
Randomised or difference-in-differences designs with a stated sample size, or documentation published by OpenAI or Google about their own systems.
B Large-N correlation
Real, large, and not causal. Reported with the coefficient and the sample size, and never phrased as “doing X causes Y”.
C Vendor-authored or single-source
Published by a party that sells the remedy it measures, or reported secondarily without a reachable primary. Usable as a hypothesis, labelled as such.
D Our own model, not yet validated
Our inference from other people’s data. Marked as ours. Example: our working rule that structure buys retrieval while substance buys citation, which reconciles two studies that appear to contradict each other. It is a hypothesis we test, not a finding we cite.

8. The finding tiers

Findings are grouped by mechanism, not by difficulty, because mechanism predicts how long the fix takes to show up.

Finding tiers, time to effect and owner
TierGovernsTime to effectOwner
0, AccessWhether a retrieval bot can reach the page at all3 to 7 daysDev / DevOps
1, SubstanceWhether a retrieved page gets cited: price stated, specifications, comparisons, evidence, hedging14 to 30 daysWriter
2, RetrievabilityWhether the page is retrieved in the first place: answer-first structure, question coverage14 to 30 daysWriter + Dev
3, Off-siteThe consensus about you across sources the models read30 to 90 daysPR / outreach
X, Do not doThings we tell you to stop paying forn/aNobody, that is the point

Tier 1 is the best-evidenced tier. A 252,000-trial study across six models found four factors behave as gatekeepers, topic mismatch, price not mentioned, stale timestamp and list position, and that hedged language carries an odds ratio between 2.67 and 754 against being cited. The same study found formatting choices had no measurable effect once the document was already in the model’s context, which is why we do not sell formatting as a citation lever.

Tier X entries are never assigned an owner. Our database refuses to store one: an anti-waste finding with a person attached is a task, and a task is what we are trying to remove from your week.

9. What this method cannot tell you

Stated plainly, because a methodology page that lists only strengths is marketing.

  • We do not see real user prompts. Nobody outside OpenAI and Google does. We measure a prompt set built to resemble your buyers’ questions; it is a sample, not a census.
  • We cannot attribute revenue. We measure whether you were named in an answer. Whether that produced a sale is a question your analytics answers, not ours.
  • Answers are personalised and localised. Our runs are non-logged-in and market-scoped. A logged-in user in another country may see a different answer.
  • We measure change, not causation. A day-30 REAL CHANGE tells you the two measurements differ by more than sampling noise. It does not prove your edit was the cause, and no measurement of a live surface can, reliability on a single engine stays near 0.02 even at 20 repeats. So we say “this changed” and never “we caused this”. Anyone claiming the second is selling a certainty these engines do not offer.
  • Engine behaviour changes underneath us. Citation-source mixes have moved dramatically inside weeks, Reddit fell from roughly 60% to roughly 10% of ChatGPT citations in one such window. Any rulebook that hardcodes today’s mix rots, so ours is dated and revised.
  • Our grades describe the published literature. Every grade on this page cites somebody else’s study with its sample size and design, so you can check the source rather than take our word for it. Effect sizes measured on our own customers will be published the same way, with sample sizes and dates, and never merged silently into the grades above.

10. Change log

Version 1.0, 30 July 2026
First published. Four engines; sufficiency requires 2 distinct engines answering and 8 usable runs; two-proportion z-test with Wilson intervals; evidence grades A-D; tiers 0 to 3 plus X.
Correction to this page, 31 July 2026 (the method did not change)
A description was corrected, not a method. As first published, §4 described the sufficiency rule as “60% of scheduled runs” and “20 valid runs”, and attributed both to a database constraint. The shipped rule is, and always has been, 2 distinct engines answering and 8 usable runs, decided in code before anything is written; the database constraint enforces the consequence, no rate may be stored without sufficient data, rather than the two numbers. §4 also described degraded runs as entering the denominator; they never have. The software was already doing what §4 now says it does, so no measurement and no published figure is affected. It is logged here because a methodology page that quietly edits itself is worth nothing.

Last reviewed 31 July 2026.

Sources

  1. Google Gemini API additional terms, grounded-results clause. ai.google.dev/gemini-api/terms
  2. OpenAI crawler documentation, GPTBot, OAI-SearchBot, ChatGPT-User. developers.openai.com/api/docs/bots
  3. Google Search Central, AI features and your website, 15 May 2026. developers.google.com/search/docs/fundamentals/ai-optimization-guide
  4. SE Ranking, Google AI Mode, 10,000 keywords / 9,734 responses, three parses on 2026-06-20; 9.2% exact-URL agreement. seranking.com/blog/ai-mode-research
  5. arXiv 2607.13304, variance decomposition, 12,933 responses; 5→10 repeats reduces variance by 0.00030. arxiv.org/html/2607.13304
  6. Sprinklr, SIGIR ’26, 252,000 trials, 6 models, 18 factors; gatekeepers and hedged language. arxiv.org/html/2605.25517
  7. GEO-SFE, 2,400 cases through six live engines; +17.3% citation rate from structure. arxiv.org/abs/2603.29979
  8. cloro.dev, 1,058 domains; GPTBot blockers 0.003 vs 0.417 citation propensity; authors’ causation caveat. cloro.dev/research/ai-crawler-blocks
  9. BuzzStream, 4M citations, 3,600 prompts; GPTBot blockers still appeared 88.2% of the time. buzzstream.com/blog/news-block-ai-bots-citations
  10. Ahrefs, llms.txt across 137,210 domains; 97% received zero requests in May 2026. ahrefs.com/blog/llmstxt-study
  11. Ahrefs, schema and AI citations, difference-in-differences, 1,885 treated vs ~4,000 control. ahrefs.com/blog/schema-ai-citations
  12. Semrush, 100M+ citations, weekly snapshots; ChatGPT’s Reddit citation share fell from ~60% to ~10% within weeks. semrush.com/blog/most-cited-domains-ai

Found a hole in this?

Email hello@citedproof.com. A correction that changes a number on this page gets the number changed and the change logged in §10. That is the entire process.

Run my first report, $29