Skip to main content
In January 2026, Rand Fishkin published the only independent study of this question we can find: 2,961 human-run prompt executions across ChatGPT, Claude and Google AI, on SparkToro. Its findings are inconvenient for this entire product category:
there’s a <1 in 100 chance that ChatGPT or Google’s AI, if asked 100X, will give you the same list of brands in any two responses
it’s more like 1 in 1,000 runs before you’d see two lists in the same order
any tool that gives a “ranking position in AI” is full of baloney
And a piece of advice to buyers that we are going to take literally:
stop throwing money at AI tracking products that don’t provide stats-backed, publicly-reviewable research. Before you spend a dime tracking AI visibility, make sure your provider answers the questions we’ve surfaced here and shows their math.
This page is rekkal showing its math.

What the research means for a tracking tool

If any single answer is close to a coin flip, then:
  1. One sample is not a measurement. A number from one run of one prompt tells you what the engine said once. It does not tell you what the engine says.
  2. A day-over-day chart is a noise chart. Most of the movement in a daily line is resampling, not the world changing.
  3. A rank position is not a fact. Order is less stable than membership, so a “position in AI” figure is the least trustworthy thing such a tool can print.
Fishkin’s own conclusion points at the one thing that does work:
I now believe visibility % across dozens to hundreds of prompts run multiple times is a reasonable metric

What rekkal does about it

1

Repeat the same prompts on a fixed schedule

Every prompt is re-run on every covered engine, every week. Your sample grows every week whether or not anything changed, and the comparison is always like-for-like: the same prompts, the same engines, the same slot length.The unit rekkal records — and bills — is one prompt × one engine × one daily slot. That is not an implementation detail we happen to mention; it is the number every figure on your dashboard is divided by, and it is printed on screen.
2

Count answers, not name-drops

An answer that mentions your brand five times is one observation. Counting each mention separately would inflate the sample and make every confidence interval narrower than the evidence justifies — which is how a tool ends up confidently reporting a movement that is not there.
3

Put an exact confidence interval on every estimate

Clopper–Pearson exact binomial intervals, on the headline cards, on every per-engine bar, on every row of the competitor ranking, and as a band on the charts. Small sample, wide band — visibly.
4

Only claim a change when the intervals are disjoint

A direction and a colour are shown only when this period’s interval and the previous period’s interval do not overlap. Everything else reads No measurable change, with the point movement stated so you can see what was suppressed and why.This rule lives in one function, and the components that draw the arrows take their colour from its verdict. A component cannot draw an arrow on noise even by mistake.
5

Give average position no direction at all

Because the research is clearest here, and because the arithmetic agrees: rekkal stores no variance for a mean, so there is no interval to test with. Both periods are shown side by side and the verdict is Change not testable. rekkal will not print a “your rank improved” claim, on any plan, at any sample size.
6

Render absence as absence

A week that did not run has no point on the chart and nothing is interpolated across it. A missing comparison names which half is missing. There is no zero-filling anywhere in the read path — with one deliberate exception, below.

The one place rekkal writes a zero

Honesty about a rule includes its exception. If a week ran, and a brand in your tracked set was named in none of that week’s answers, that brand’s figure for that week is 0% — not “missing”. It was measured against a real denominator and went unmentioned, which is an observation. Everything else absent stays absent. A week with no runs contributes nothing at all: no zero, no point, no interpolation.

What rekkal is measuring, precisely

  • The consumer interfaces, signed out — the ChatGPT web app, the AI Overview on a signed-out Google results page, and the Copilot web app. This is what a person without an account is shown. Which of them your plan covers is on Plans and limits.
  • No account, anywhere. rekkal holds no login on any of these platforms, so no answer it reads is personalised to a profile or shaped by a chat history — and there is no credential for a provider to suspend. Two of the three are read in a real browser session driven by rekkal; the Google surface is retrieved through SerpApi, a vendor that sells search-results retrieval and carries the legal indemnity for it.
  • One fresh session per answer. Cookies, storage and the exit address are all rotated. That is a statistical requirement rather than a nicety: answers drawn through one warm session are correlated, and correlated draws make a confidence interval narrower than the data supports — which is the exact failure the rest of this page exists to avoid.
  • No challenge is ever solved or bypassed. Where a bot-defence check stands between rekkal and an answer, that run is recorded as a failure. It is not retried until it works, and the week’s sample is smaller and says so.
  • One market and language per workspace, derived from your domain at setup. rekkal does not currently run the same prompt across several countries or languages in parallel.

Known limits of this approach

We would rather you read these here than discover them later.
A daily slot means a genuine change takes days rather than weeks to become statistically visible. That is the honest cost of not reporting noise. If you need to know within 24 hours that something moved, no sampling-based tool can honestly give you that — including this one.
Your n is prompts × engines × days. On a smaller plan, intervals stay wide for longer, and rekkal will keep telling you so rather than pretending otherwise.
This is the honest cost of reading the consumer interface rather than an API. The platform decides which model serves a signed-out session and publishes nothing about the choice, so there is no model version to record. Every answer on the evidence page says “Not disclosed” in those words, and names whose limitation it is. Nothing anywhere in rekkal fills that gap with a family name or a guess.A consequence worth stating: a week-over-week move can be a routing change rather than a visibility change, and rekkal cannot tell you which. It is a real limit of measuring a surface that routes.
rekkal used to turn grounding on and could therefore assert it. On a consumer interface the platform decides, so rekkal records what it saw: whether that answer cited sources. Each answer carries that observation, and each slice reports the fraction of its answers that searched.Where a surface gives no way to tell, it is recorded as undetermined — never as “did not search”, which would be an assertion nobody established.
On an API these were request parameters. On a consumer interface they are properties of the exit address and the interface locale, which is a weaker claim, and the evidence page words it that way rather than keeping the stronger one.
These interfaces are rewritten often, and when one changes in a way rekkal cannot read, that engine stops producing answers until it is fixed. What you will see is a gap — no point on the chart, no figure, and a note naming the engine. You will never see a zero standing in for an engine that failed, and no line is drawn across the gap.Where a week’s answers were collected but too many attempts were blocked to trust the survivors, that slice is reported as unmeasured rather than measured on what got through. Blocking is not random: it clusters by address, by hour and plausibly by question, so a sample that survived it is not a sample of the same thing.
rekkal stores every answer and the exact position of every mention in it, and the visibility card links straight to the answers it was counted from. Share of voice and average position do not have that link yet — they are counted over the same stored answers, but there is no screen that walks you through those two one answer at a time.

Reproducing our numbers

The rules on this page are enforced in code and covered by tests, not by editorial discipline: the suppression rule has one implementation, the read layer contains no zero-filling, and the plan figures in these docs are checked against the values the product enforces. If you want a specific figure explained, ask — showing the math is the point.