AI Answer Position Ranking: When Being Named First Matters
AI answer position ranking, measured: our brand averaged 1.19 across 280 buyer answers, but 14 of its 21 mentions had no rival. What to report instead.
Kazi Khalid Hasan Tamim · BugViso Team
15 min read
AI answer position ranking is the order in which an AI engine names the brands you track: 1 for the first one named, 2 for the next. It's a useful second metric after mention rate, but average position misleads on its own. Our brand averaged 1.19 across 280 unbranded buyer answers. That looks like a leader's number. In fact 14 of its 21 mentions came in answers that named no tracked rival at all.
By the end of this post you'll know how position is measured, why the average flatters small brands, which two numbers to report beside it, and how much position differs between ChatGPT, Gemini, Perplexity and Claude. There's a script to compute all of it from your own answers.
Data used: 35 unbranded buyer prompts × ChatGPT, Gemini, Perplexity and Claude × 2 runs on 2026-10-20 (280 answers, web search on), collected by BugViso's AI Visibility Tracker for bugviso.com (website-audit software) against five anonymised competitors, A to E. Position is the order of first mention among those six tracked brands.
How AI Answer Position Ranking Is Measured
Position is the rank of a brand's first mention among the tracked brands in one answer. If an answer names Competitor C in paragraph one and your brand in paragraph three, Competitor C is position 1 and you're position 2. Brands you don't track don't count, so a reply that lists eight tools but only two tracked ones gives positions 1 and 2.
Three details change the number more than people expect:
- First mention, not most mentions. A brand named once at the top beats a brand discussed at length further down.
- Tracked brands only. Add a competitor to your list and every position behind it can shift by one. Compare position only across reports with the same competitor set.
- Per answer, then averaged. An answer that doesn't name you contributes nothing to your average position. That is the root of the problem below.
In BugViso's index the position part (P) turns the average into a 0–100 score per engine: 100 × (1 − (avg position − 1) / (brands tracked − 1)). With six tracked brands, an average of 1 scores 100 and an average of 6 scores 0. An engine that never names you scores 0 for P, and P carries 20% of the AI visibility score.
Average Position Flatters Brands Named Alone
A brand that only appears in niche answers, alone, gets a near-perfect average position. That's what happened to us. Here are all six tracked brands across the same 280 unbranded answers:
| Brand | Times named | Avg position | Named first | Named alone | Position when a rival was also named | P score |
|---|---|---|---|---|---|---|
| Competitor A | 71 | 1.66 | 46 | 11 | 1.78 (n = 60) | 89.1 |
| Competitor B | 63 | 2.17 | 20 | 6 | 2.30 (n = 57) | 75.7 |
| Competitor C | 52 | 2.27 | 11 | 3 | 2.35 (n = 49) | 77.5 |
| Competitor D | 41 | 2.56 | 8 | 1 | 2.60 (n = 40) | 73.3 |
| Competitor E | 36 | 1.78 | 20 | 10 | 2.08 (n = 26) | 89.7 |
| Our brand | 21 | 1.19 | 18 | 14 | 1.57 (n = 7) | 72.9 |
Our brand has the best average position in the table and the fewest mentions. Fourteen of its 21 mentions were answers where it was the only tracked brand: narrow questions about scan rollover, React hydration errors and pay-per-report pricing. Being first in a list of one isn't a win over anyone.
Strip those out and the picture changes. In the 7 contested answers that named us next to a rival, we were first 4 times, for an average of 1.57. Competitor A was first in 35 of its 60 contested answers. That's a real lead, earned against rivals, on far more answers.
💡 Rule of thumb: never report average position without the number of answers behind it and the share of those answers that were contested. "1.19 over 21 mentions, 14 alone" tells the truth; "1.19" doesn't.
Why a 1.19 Average Still Scores 72.9
The P score averages over engines, and an engine that never names you pulls it to zero. Our per-engine numbers show the effect:
| Engine | Times we were named | Our avg position | Our P score |
|---|---|---|---|
| ChatGPT | 6 | 1.17 | 96.7 |
| Gemini | 3 | 1.00 | 100.0 |
| Perplexity | 12 | 1.25 | 95.0 |
| Claude | 0 | none | 0.0 |
| Mean | 72.9 |
Claude named us in none of its 70 unbranded answers, so its P is 0, and the mean drops from about 97 to 72.9. This is deliberate. Without it, a brand that one engine ignores would keep a perfect position score, and engine-level gaps would hide. Our post on why Claude names big brands and skips small ones covers that engine's pattern.
The design has a cost: P mixes "how early" with "whether at all" on the engine level. When you explain a P score to a client, show the per-engine rows. A zero on one engine is a visibility problem, not a position problem.
How Each Engine Orders Brands
Engines differ in how many brands they name and how far into the answer the first one appears. That changes what "first" is worth on each.
| Engine | Answers naming a tracked brand | Tracked brands per such answer | Contested answers | Median depth of first tracked mention | Mean answer length |
|---|---|---|---|---|---|
| ChatGPT | 22 of 70 | 1.73 | 12 | 4.6% of the text | 1,369 chars |
| Gemini | 39 of 70 | 2.56 | 26 | 18.3% | 3,452 chars |
| Perplexity | 27 of 70 | 1.78 | 13 | 8.1% | 1,176 chars |
| Claude | 35 of 70 | 2.80 | 27 | 25.7% | 2,332 chars |
"Depth" is the character offset of the first tracked brand as a share of the answer. All four engines answered through their APIs with search on; for ChatGPT that's OpenAI's web search tool, which returns the answer with inline citations. ChatGPT and Perplexity put a named tool near the top of short answers. Gemini and Claude write longer replies, open with a framework or criteria, and name several tools a quarter of the way in.
So position 1 on ChatGPT usually means the first product a reader sees. Position 1 on Claude means the first in a longer shortlist the reader reaches after some explanation. Claude also had the most contested answers (27 of 35 that named anyone), and Competitor A led 14 of them.
The first-named brand overall, across all 123 answers that named anyone:
| Brand | Named first | Share of the 123 answers |
|---|---|---|
| Competitor A | 46 | 37% |
| Competitor B | 20 | 16% |
| Competitor E | 20 | 16% |
| Our brand | 18 | 15% |
| Competitor C | 11 | 9% |
| Competitor D | 8 | 7% |
On Perplexity, our brand was first-named most often (10 of 27). Nine of those 10 were solo answers.
When Being Named First Actually Matters
Position matters most in contested answers where the reader is choosing between named options. It matters little in answers that name one tool, and not at all in answers that don't name you.
There's no published click data for AI answers that would prove buyers pick the first-named product. The reason to care comes from how people read lists. The serial-position effect describes better recall for the first items in a list, and an AI shortlist is a list. That supports tracking position. It doesn't support treating a move from 2nd to 1st as a business result.
Three situations where position is worth acting on:
- You're named often but late. A brand with a high mention rate and an average contested position above 2.5 is on the shortlist but rarely the lead suggestion. Look at what the first-named rival has that you don't: usually a clearer one-line category description on many third-party pages.
- One engine always puts a rival first. Competitor A led 14 of Claude's 27 contested answers. That's a pattern, not noise, and it points to the sources that engine trusts.
- You're named as an afterthought. Phrases like "other options include" at the end of an answer push you to the last position. BugViso's action plan has a play for moving from afterthought to first-named for exactly this case.
Position is the wrong focus when mention rate is low. At 7.5% of answers, our biggest lever was being named at all, not being named earlier.
Report Contested Position and Reciprocal Rank
Report position beside two numbers: the share of mentions that were contested, and a reciprocal-rank score that counts absence as zero. Together they stop a solo-mention average from passing as a lead.
Contested position is the average position in answers that named at least one tracked rival. It answers "when we're compared, where do we land?"
Reciprocal rank (RR) gives each answer 1 if you're first, 1/2 if second, 1/3 if third and 0 if you're absent, then averages over all answers. It's the mean reciprocal rank used to evaluate search results, applied to brands. Because absence scores 0, it combines "named at all" and "named early" in one number:
| Brand | RR × 100 (280 answers) | Avg position |
|---|---|---|
| Competitor A | 19.8 | 1.66 |
| Competitor B | 13.3 | 2.17 |
| Competitor C | 10.0 | 2.27 |
| Competitor E | 9.3 | 1.78 |
| Competitor D | 7.4 | 2.56 |
| Our brand | 6.9 | 1.19 |
On reciprocal rank, our brand drops from first to last, which matches how often buyers would actually see it at the top of an answer. Use average position to explain, and RR or the full index to rank.
Compute Position From Your Own Answers
This standard-library script reads an answer export and prints, per tracked brand, the times named, average position, first-named count, solo count, contested position, the P score as BugViso computes it, and RR. It finds names with word-boundary matching, so add aliases as extra --competitor entries only if you merge them afterwards.
#!/usr/bin/env python3
"""Where are brands named in AI answers? Average position, first-named share, solo share,
position in contested answers, and the 0-100 position score, per engine.
Usage: python3 answer_position.py answers.csv --brand Acme --competitor Globex --competitor Initech
answers.csv columns: engine, answer, branded (1/0; branded rows are skipped).
"""
import argparse, csv, re
from collections import defaultdict
from statistics import mean
def order(text, rx):
"""Tracked brands in order of first appearance."""
hits = [(m.start(), n) for n, r in rx.items() if (m := r.search(text))]
return [n for _, n in sorted(hits)]
def main():
ap = argparse.ArgumentParser()
ap.add_argument("csv"); ap.add_argument("--brand", required=True)
ap.add_argument("--competitor", action="append", default=[])
a = ap.parse_args()
names = [a.brand, *a.competitor]
rx = {n: re.compile(r"(?<![\w-])" + re.escape(n) + r"(?![\w-])", re.I) for n in names}
rows = [r for r in csv.DictReader(open(a.csv, newline="", encoding="utf-8")) if r.get("branded") != "1"]
engines = sorted({r["engine"] for r in rows})
# per engine: brand -> list of (position, brands in that answer)
seen = {e: defaultdict(list) for e in engines}
for r in rows:
o = order(r["answer"], rx)
for i, n in enumerate(o, 1):
seen[r["engine"]][n].append((i, len(o)))
print(f"{'brand':<14}{'named':>6}{'avg pos':>9}{'first':>7}{'solo':>6}{'contested pos':>15}{'P score':>9}{'RR':>7}")
for n in names:
ps = []
for e in engines:
v = seen[e][n]
ps.append(100 * (1 - (mean(p for p, _ in v) - 1) / (len(names) - 1)) if v else 0.0)
allv = [x for e in engines for x in seen[e][n]]
if not allv:
print(f"{n:<14}{0:>6}{'-':>9}{'-':>7}{'-':>6}{'-':>15}{0:>9.1f}{0:>7.1f}"); continue
contested = [p for p, k in allv if k >= 2]
cpos = f"{mean(contested):.2f} (n={len(contested)})" if contested else "-"
print(f"{n:<14}{len(allv):>6}{mean(p for p, _ in allv):>9.2f}{sum(p == 1 for p, _ in allv):>7}"
f"{sum(k == 1 for _, k in allv):>6}{cpos:>15}{mean(ps):>9.1f}"
f"{100 * sum(1 / p for p, _ in allv) / len(rows):>7.1f}")
print("\nP score = mean over engines of 100 x (1 - (avg position - 1) / (brands tracked - 1));"
" an engine that never names the brand scores 0.\n"
"RR = mean reciprocal rank over all answers (1 for first, 1/2 for second, 0 if absent), x 100.")
if __name__ == "__main__":
main()python3 answer_position.py answers.csv --brand BugViso \
--competitor "Competitor A" --competitor "Competitor B" --competitor "Competitor C" \
--competitor "Competitor D" --competitor "Competitor E"On our export it prints the brand table above, line for line, including the 72.9 P score. The := operator needs Python 3.8 or later.
How BugViso Ranks Position in AI Answers
BugViso's AI Visibility Tracker records the order of first mention for every tracked brand in every answer from ChatGPT, Gemini, Perplexity, Claude and Google AI Overviews. Mentions you remove as false matches are dropped and positions are recomputed. Each engine gets its own position part, and the index averages the parts over engines, so an engine that never names the brand shows up as a zero rather than disappearing.
The comparison view lists every tracked brand's average first-mention position and the number of answers behind it, and the prompt table shows, per question and engine, whether you were named, your average position and who appeared instead. The action plan flags afterthought mentions and names the rival that's usually first. The position part and the other four parts are explained on the AI visibility tracker page.
Position Traps to Avoid
Comparing positions across different competitor sets. Adding a sixth rival to the list can move you from 2nd to 3rd without a single answer changing. Freeze the competitor list for the reporting period.
Counting untracked brands as absent. An answer that recommends three tools you don't track and then you puts you at position 1 among tracked brands. If the untracked tools matter, track them.
Reading position from one run. Our contested sample for our own brand was 7 answers. That's enough to say "we're rarely compared", not enough to say "we lead comparisons".
Treating text order as a recommendation. Some answers name a brand first in order to contrast it ("unlike Competitor A, which needs a desktop install…"). Position records order, not endorsement. Sentiment and the quoted evidence carry that part, which is why AI share of voice and sentiment sit next to position in the index.
Frequently Asked Questions
What is position in AI answers?
Position is the order in which an AI answer first names each brand you track. The first tracked brand is position 1. Averaged over the answers that name a brand, it shows whether the brand tends to lead the answer or appear late.
Does being named first in ChatGPT matter?
It matters most when the answer compares several named options, where readers are likely to notice the first one. In our data, ChatGPT named its first tracked brand a median 4.6% into the answer, so position 1 there is usually the first product a reader sees.
Why is my average position good but my visibility score low?
Probably because you're named in few answers, often alone. Our brand averaged 1.19 but was named in only 21 of 280 answers, 14 of them with no rival. Visibility (mention rate) carries 35% of the index and position 20%.
How do I improve my brand's position in AI answers?
First get named more often, then work on contested answers. Find the rival that's usually first on each engine and compare the third-party pages describing it with the ones describing you. A clear one-line category description repeated across sources helps engines lead with you.
What's a better metric than average position?
Mean reciprocal rank. It scores each answer 1, 1/2, 1/3… by position and 0 when you're absent, so a brand named rarely can't post a perfect score. Report it with contested position and mention rate.
Report Position With Its Denominator
Average position is only honest next to the number of answers behind it and how many of those were contested; add reciprocal rank and a 1.19 that hides 14 solo mentions turns into the last place it really is. BugViso's AI visibility tracking shows position per engine beside mention rate, so you can see which of the two is holding a brand back.
Written by
Kazi Khalid Hasan Tamim · BugViso Team
Kazi writes BugViso’s guides on website audits, Core Web Vitals, technical SEO, accessibility and AI search. The data in them comes from audits BugViso runs in a real Chromium browser, including our 219-site study of website health.
Summarise with AI
Open this guide in your assistant.
Follow BugViso
New guides and audit data as we publish them.
See where your site stands
Run a free BugViso audit for SEO, speed, accessibility and AI search readiness — with fixes you can ship today.