All posts

How do I find out which competitors AI recommends instead of me? We logged 336 answers for one brand — the most-named competitor appeared in 140 of them, or 152, depending on how you count names

Almost every conversation about AI visibility starts the same way: someone asked ChatGPT a question about their category, didn't see their own name, and now wants to know what to do about it.

That's a reasonable thing to be alarmed by. It is not a measurement. Ask the same question again tomorrow and the list will probably be different — different names, different order, different length. One answer is one draw from a distribution nobody has shown you.

This post is about the least glamorous part of our own product — asking the same question over and over on purpose — and what it produced on a real brand. Numbers, conditions, and the parts we can't do.


Grading

MarkMeaning
Our own first-party measurement. No peer review, no control group, one brand, and we sell a product in this space. Maximum conflict of interest.
○▲Preprint with a statistical result, author affiliated with a vendor in this space
△▲Industry study, no control group, conducted by people who sell related products — including a method we read but could not independently verify

1. What the thing actually does

The mechanism has three parts and none of them are clever:

  1. You choose the questions, and they should be the questions your buyers would actually type — not the keywords you'd like to rank for. best AI clipping tool for YouTube shorts is a question a buyer asks. AI video SaaS platform is not.
  2. Every question is asked repeatedly, on every engine. Same question, same wording, N separate calls.
  3. Every brand name in every answer gets counted — yours and everyone else's.

The output isn't "you're visible" or "you're not." It's a rate per question per engine, plus a list of who else got named in the same answers.

The second half is the point. Knowing you're absent tells you nothing you can act on. Knowing who is standing where you aren't at least tells you whose pages to go read.

2. 🔴 Why once is not enough — this is the whole argument

If generative engines were deterministic, you'd ask once and be done, and this feature would be a cron job with no reason to exist.

What the numbers say about a single ask. The most useful published treatment we've found is Don't Measure Once (Schulte et al. 2026, arXiv 2604.07585, grade ○▲ — the authors are affiliated with a vendor in this space). It reports the 95% confidence interval on a brand-detection rate at the level of one question × one engine:

Samples per cell95% CI
1±72.4 percentage points
3±36.9 pp
7±15.8 pp

Read the first row literally. A single answer puts your true appearance rate somewhere in a band nearly as wide as the entire 0–100% scale. That is what "I asked ChatGPT and we weren't there" is worth as evidence: it is real — it happened — and it constrains almost nothing.

Someone else measured the instability directly. SparkToro's Rand Fishkin and Gumshoe.ai's Patrick O'Donnell ran 12 prompts through ChatGPT, Claude and Google's AI Overviews — 2,961 runs collected via 600 volunteers, each prompt run 60–100 times (grade △▲; observational, no control, and both authors sell products adjacent to this). Their headline: "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", and roughly 1 in 1,000 before you'd see two lists in the same order. We read their write-up. We did not see their raw data and have not replicated it.

And their study contains something that cuts against the panic, which is why it's worth citing rather than cherry-picking: they report that while individual lists churn, visibility percentages stayed consistent across differently-worded prompts. That is the same conclusion from the other side. The individual answer is noise. The rate is the thing that holds still enough to watch.

What we do about it, including the part we're not happy with. Our stored baseline below used 7 samples per question per engine. Our current default is 3, and we lowered it deliberately ◐. The reason is that 7 and 3 answer different questions: 7 narrows "what is the rate right now", 3 costs less per time point so you can afford more time points, which is what "did anything change" needs. Repeating the same question ten times in one afternoon is not ten independent observations of a changing world — it's ten draws from the same model snapshot and the same web state.

🔴 The honest status: our scheduler is off, so today we have the reduced precision of N=3 and none of the extra time points it was supposed to buy. That's a worse position than either endpoint, and it stays that way until periodic runs exist.

3. What we saw — one brand, 336 answers

Conditions, because the number is meaningless without them ◐:

BrandOne video-editing SaaS. One category.
Questions24, mixed types (see §4)
Engines2 — one OpenAI model, one Google Gemini model, both via API
Samples7 per question per engine
Stored answers336 (24 × 2 × 7)
WindowJuly 2026
🔴 Web searchOff — see §5. This measures what the models had stored, not what AI search retrieves today.

How often each name appeared, across those 336 answers ◐. Two columns, because the count depends on the instrument — see below:

NameNaive string matchVariant-aware matcherΔ
the measured brand168168+0
CapCut140152+12
Opus Clip101109+8

Three more names we tracked — Vrew, Klap and Vidyo.ai — appeared at lower counts. We are not printing those numbers here, because we could not re-derive them from the database in the same pass that produced the table above, and publishing counts from two different parse runs side by side is precisely the mistake this post is about.

🔴 What this table is not. It is not a ranking of which product is better, and we are not qualified to publish one — we did not use, test, benchmark or review any of these tools. Every row means exactly one thing: with web search off, these models produced this name this many times, in answers to these 24 questions. A high count means the name was easy for the model to reach for. That is a fact about the model, not a verdict on the software.

On naming names. We name the brands the models named, because that's the observation and hiding it would make the finding unverifiable — you can ask the same category question yourself and see whether you get a similar cast. We don't name the measured brand: the unflattering half of this table is its data, not ours to publish under its name.

Your name matcher is a measurement instrument, and it has its own error

The two columns above are the same 336 answers, re-parsed. The only thing that changed is whether the matcher treats script and spelling variants as one entity — 캡컷 = CapCut = Cap Cut, including Korean particles stuck to the end of the word.

Look at which rows moved. The measured brand did not move at all, and both competitors did. That is not our matcher being better at competitors; it's a property of the brands ◐. The models don't know this brand's settled Korean name, so they hedge and write it in both scripts every time — which a naive matcher catches for free. CapCut has a settled Korean name, so it turns up in Korean script only, and the naive matcher walked past 12 of them.

The consequence is the uncomfortable part. Improving the instrument moved this brand's share of voice from 30.4% to 29.3% ◐ — down. Nothing changed in the world; we just stopped missing our competitors' mentions. If you have a visibility number that has been quietly improving, check whether your matcher changed.

⚠ And a second-order version of the same problem: the counts are bounded by the list of names you hand the parser. Ours was inferred automatically at onboarding, from the brand's own site. Then, in a single Google AI Overview for this same category, the recommended tools included Vizard — a name that was not on our list at all ◐ (n=1, one query, checked by hand). It therefore could not have been counted, at any sample size, by any matcher. A share-of-voice denominator is an assumption before it is an observation, and ours was wrong in a direction we could not see from inside the data.

⚠ One more honest note on this table: response-level counts are the stable end of this. Sentence-level attribution is worse — 31.4% of the sentences mentioning CapCut were Korean-script only ◐, which does not change whether it was mentioned but does change whether you can locate the sentence to score its position or sentiment.

4. ★ The headline number is an artifact of your question list

Here is the part we'd most want a prospective buyer of any tool in this category to understand.

The brand was named in 168 of 336 answers — 50.0%. That sounds like a brand with a real presence. Now split the same 336 answers by what kind of question was asked ◐:

Question typeBrand appeared
branded — the question contains the brand's own name100%
commercial — buying-intent questions57.1%
unbranded — the question describes the need, not the brand0.0%
weighted total50.0%

The 50% is entirely carried by questions that already said the brand's name. In the questions a stranger would actually ask — someone who doesn't know this company exists yet — the count is zero out of every single one.

Two consequences, and the second is the uncomfortable one:

  • A vendor can move this headline number without anything changing in the world, just by putting more branded questions in the set. If you're evaluating an AI-visibility tool, ask what its question mix is. If it can't tell you, the percentage it shows you doesn't have a fixed meaning.
  • We did not break the competitor counts down the same way. So we cannot tell you which of those five names filled the space in the unbranded questions where this brand scored 0.0%. That's a gap in our own analysis, it is the obvious next thing to compute, and we'd rather say so than let the two tables sit next to each other implying a link we didn't measure.

5. 🔴 What "web search off" means, and why we're leading with it

These 336 answers were produced without the engines retrieving anything. The models answered from what was already in their parameters.

That makes this brand recall — whether the model reaches for your name unprompted — and not a measurement of AI search. They are different surfaces and they can disagree.

This was our own defect, and it is worth stating plainly because it is easy to ship: neither of our connectors attached a search tool to its request, so the field our citation-parsing code read was always empty. We had 340 stored responses and 0 containing a single citation ◐ — every call returned HTTP 200 and nothing logged an error. Switching search on raised our per-response cost roughly 11-fold ◐. If you run your own tracker, count the responses that contain at least one citation before you read any dashboard built on them.

We're keeping the distinction loud for one reason: a number is only comparable to numbers measured the same way. Our own earlier public figures were measured on the ungrounded surface, and they are not comparable with anything we measure now, so we restarted rather than quietly continuing the series.

⚠ Is brand recall worth measuring at all, then? We think yes — "does the model know you exist without being told" is a real question with a real answer, and for a brand at 0.0% on unbranded questions it's arguably the more fundamental one. But it is a different question from "what does AI search cite today", and a dashboard that doesn't tell you which one you're looking at is not measuring anything in particular.

6. "Mentioned" throws away most of what you saw

One more thing this dataset exposed about our own metrics ◐.

Appearance rate50.0%
Average position when it did appear1.28
Mentions with no position at all49 of 168 (29%)
MRR0.362

Average position 1.28 reads like "almost always first." It isn't — it's "first, in the half of the answers where it showed up at all." The average silently drops every answer where the brand was absent. Mean reciprocal rank keeps those in the denominator, which is why the same brand is 1.28 on one metric and 0.362 on the other.

And the 29% matters just as much: models often answer in prose, not lists. "A is great for this, and B also works" has an order of mention but not a rank, and we count those separately rather than pretending sentence order is a ranking. Anyone showing you a clean average position on prose answers has made a decision about that and probably hasn't told you which one.

7. What this cannot do

  • A one-shot snapshot supports no conclusion. See §2. Our own free preview runs one question once; it is a demonstration of the mechanism, not a measurement, and it says so.
  • 🔴 We cannot yet show you "we changed something and the number moved." No before/after with a control exists — not from us, not from anyone whose work we've been able to read. Everything in this post is observation. Anyone selling you a causal claim here should be asked for the control group.
  • One brand, one category, one week, two engines. Nothing here generalises to your category and we're not going to pretend otherwise.
  • Our stored responses record the engine, not the model version. There is no such column ◐. A vendor can swap the model under you and the series would show a step change with no explanation in the data. We're saying it out loud because if you built your own tracker, this is the hole to check for first.
  • Perplexity: zero measurements. The empty cell is information about us, not about Perplexity.

8. Do this by hand, without buying anything

You need a spreadsheet and about an hour.

  1. Write 10 questions your buyer would type. Rule: if the question contains your brand name, it goes in a separate section and doesn't count toward your headline number. And don't substitute the quicker check of asking the model about yourself — we measured that one separately and it returns whatever your phrasing implies: Does ChatGPT know my brand?
  2. Ask each one 5+ times, in a fresh session each time, on each engine you care about. Log out or use a temporary chat — signed-in sessions carry memory and personalisation, and you'll be measuring your own history.
  3. Record, per answer: every brand named, the order they appeared, and whether the answer was a list or prose.
  4. Compute a rate, not a verdict. "3 of 5" is a finding. "It didn't mention us" is a screenshot.
  5. Count the other names too. The names that recur across every run are the ones the model reaches for by default in your category.
  6. Write down whether search was on. In the consumer apps it usually is; through an API it usually isn't unless you enabled it. Never average the two.

If step 5 produces a name you didn't consider a competitor, that on its own was worth the hour.


Method

All figures marked ◐ come from our own database: 336 stored engine responses for one brand, 24 questions × 2 engines × 7 samples, collected in July 2026 with web search off, raw responses retained. Brand counts come from an LLM parser; the two columns in §3 are the same 336 responses parsed twice, once with plain string matching and once with a matcher that resolves script and spelling variants, and the variant-aware column is the one we report as ours. Our stored responses record the engine but not the model version — that hole is listed in §7 rather than hidden. We do not crawl third-party sites. We did not test, review or benchmark any product named in this post, and the counts say nothing about product quality.

We build peekr, which is why this data existed to be counted. The reason we keep every raw response and sample each question repeatedly is in §2 — it's also the least marketable thing about the product, since the honest output of one run is usually a confidence interval rather than a headline.

If you run §8 on your own brand and get something that contradicts anything above, we'd like to see it.