← What is AEO Tracking?
Methodology September 27, 2026 10 min read

How the AI Visibility Score Is Calculated

Every number AEOTrack shows you links here. This page describes the score exactly as the code computes it: which engines are asked, how many times, what counts as a mention, how one answer becomes a number, how 25 answers become one score, what the ± means, and what has changed and when.

Scoring version 5 in force since 22 September 2026. When the formula changes, the version number changes, every stored score keeps the version it was computed under, and every chart marks the step. The past is never quietly rescored.

The AI visibility score is a 0 to 100 index of how your brand appears in AI answers to the questions you track. It is not a percentage of anything. A 0 means no answer in your latest check named you. A 100 would mean every engine named you first, cited your site as a source and described you well, on every question. The AEO score (buying questions) and the GEO score (broader topic phrases) share every step below; only the prompt set differs.

Engines and weights

Every tracked question is sent, word for word and with no template around it, to each engine on your plan. Every engine runs with its live web search on, so the answer reflects what a person asking today would see, not what the model memorised in training. The engine that answered, the exact provider model, whether the answer was search-grounded and whether it hit the token cap are stored with every answer.

EngineProvider and modelWeightAvailability
ChatGPTOpenAI gpt-5-search-api with web search1.3every plan
GeminiGoogle gemini-pro-latest with Google Search grounding1.1every plan
ClaudeAnthropic claude-sonnet-5 with web search0.9every plan
Perplexitysonar-pro0.9every plan
GrokxAI grok-4.20 with web search0.7every plan
Google AI ModeSerpApi google_ai_mode1.1Pro and above, add-on on Starter
Microsoft CopilotSerpApi bing_copilot0.8Pro and above, when switched on
Meta AIMeta muse-spark-1.3 with web search0.7Pro and above, when switched on

The weights stand in for each engine's share of the people who ask AI assistants questions, so a mention where most people are looking counts for more. They are the code defaults; a change is annotated on the trend chart and followed by a rescore of the stored answers. An engine that is not on your plan, or that is switched off, is not in your score at all: it is neither counted nor treated as missing.

Sampling policy: one answer per engine per check

Each check asks each engine once, at temperature 0.2 (the engines that reject a temperature setting are asked at their default). A scheduled check runs weekly by default; a manual re-check is limited to once a day per question.

We used to take three samples per engine per check and we stopped, for a measured reason. Asked the same question three times in the same second at temperature 0.2, ChatGPT returned three byte-identical answers (same hash, same token count), and Gemini's three differed in wording but scored the same. Same-second resampling of a near-deterministic model measures nothing; it tripled the cost and the wall-clock time of every check for no extra signal, and it made the confidence interval dishonest, because three copies of one answer were being counted as three observations. Dropping to one sample left the score unchanged and widened the interval to what the real sample size supports.

The variation that matters to you happens over days, not seconds: the engines re-search the live web and rank a different list next week. That is what the weekly trend measures, and it is why a single check is a reading and the trend is the measurement. The post on why scores change covers how much of that variation is normal.

Which answers count

An answer counts only if the engine returned text and did not cut it off at the token cap. Errored calls (a provider outage, a rate limit) and cut-off answers are excluded whether or not they named you. Until version 5, a cut-off answer that named you was kept and a cut-off answer that did not was dropped, which favoured the engines that cut off most; that is fixed. Cut-off answers are reported as inconclusive in the engine coverage strip, so you can see how much of an engine's output the score could not use. Below three usable answers no score is shown at all: "not enough data yet" is more honest than a number whose interval spans half the scale.

What counts as a mention

An answer names you when one of your brand terms appears as a whole word or whole phrase in its text. The terms are the label of your registrable domain (example for example.com and for shop.example.com), the brand name you set, and every alias you add. Formatting is stripped and accents are folded first, so **ID**fy, Id-fy and Alvéole match as a reader would read them.

  • Plain words need to be written as a name. A brand that is also an ordinary word (Profound, Notion, Scale) only counts when the answer capitalises it somewhere or writes it in domain form (profound.com). "A profound impact" is not a mention of Profound.
  • Scripts without capitals are self-evidently names. A brand written in Devanagari, Chinese, Japanese, Korean, Arabic or Thai is matched as a name without a capital-letter test, since none exists (from 27 September 2026; before that these brands could not be matched at all).
  • One-letter garbles are tolerated for longer names. A single-word term of six or more characters also matches at one edit ("Idfy" written "Idfi"), never onto a common English word.
  • Aliases are the sanctioned way to catch other spellings. If engines write "AEO Track" for "aeotrack", add the alias; stored answers are re-read against it immediately.

Competitors are matched with the same rules over their name, their name without its legal suffix ("Henan Lutine Industry" for "Henan Lutine Industry Co.,Ltd"), their website label and their distinctive first word, so a rival is never found by a looser test than you are.

Scoring one answer

Each usable answer gets a 0 to 100 score. Not named is 0. Named earns a presence floor of 25 points, plus up to 75 for how you were named: how high in the answer's list, whether the engine used your own site as a source, and how it described you.

score = 0                                              if not named
score = F + (100 - F) x ( 0.45 x prominence
                        + 0.30 x citation
                        + 0.25 x sentiment )           if named
F = 25 (presence floor)
prominence = 1 / log2(position + 1) in the list that names you
             (#1 = 1.00, #2 = 0.63, #3 = 0.50, #4 = 0.43, #9 = 0.30);
             0.5 when you are named outside a ranked list
citation   = 1.0 if one of the answer's sources is on your own domain,
             0.5 if your bare domain appears in the prose, else 0
sentiment  = (s + 100) / 200, where s is -100 to 100, rated by a model on
             the passage that names you; unrated = 0.5

Rank is read from the list in the answer that names you: bullets, numbered items, bold or heading items and table rows. An answer that names you in prose with no list gives the unranked 0.5. Sentiment is a model's judgement of tone, not a count, and the app says so wherever it shows it.

From answers to a score

  1. Per question: the engine-weighted mean of the per-answer scores from the newest check of that question, over the engines that gave a usable answer. Only the newest check per question and engine is used.
  2. Per website: a recency-weighted mean of the question scores. A question's weight halves every 30 days from its newest usable answer and reaches zero at 90 days, so the score is your visibility lately rather than a mixture of vintages.
  3. Gate: fewer than three usable answers and the score is withheld.

The per-question step is what the Visibility Tracker's Score column and the prompt drawer's ring show, and the drawer's "How this score was built" panel lists every engine's line of it. The per-website step is the number on the Dashboard.

Worked example: 25 answers, two mentions, a score of 5

Acme tracks 5 questions on 5 engines: 25 answers, one per engine per question. Two answers name Acme, both as a bare name-drop (not in a ranked list, no citation of acme.com, tone unrated). Every other answer names other brands.

  1. Each of the two mentions scores 25 + 75 x (0.45 x 0.5 + 0.30 x 0 + 0.25 x 0.5) = 25 + 75 x 0.35 = 51.25. The other 23 answers score 0.
  2. Question A was named by ChatGPT (weight 1.3). Its question score is (1.3 x 51.25) / (1.3 + 1.1 + 0.9 + 0.9 + 0.7) = 66.6 / 4.9 = 13.6.
  3. Question B was named by Perplexity (weight 0.9): (0.9 x 51.25) / 4.9 = 9.4.
  4. Questions C, D and E score 0.
  5. All five were checked this week, so their recency weights are equal: (13.6 + 9.4 + 0 + 0 + 0) / 5 = 4.6, shown as 5 / 100. Named in 2 of 25 answers: mention rate 8%.

The same 25 answers with Acme cited as a source and ranked #1 in those two answers would score 25 + 75 x (0.45 x 1.0 + 0.30 x 1.0 + 0.25 x 0.5) = 91.25 each, and the website score would be about 8. Getting named on a third question is worth more than perfecting the two you have: that is why the improvement plan puts "get onto the sources" above every other task.

The other numbers beside the score

  • Mention rate: usable answers that named you, divided by all usable answers, from the same newest checks the score reads.
  • Citation rate: answers with one of your own URLs among their sources, divided by all usable answers.
  • Where any brand is named: answers that named you, divided by answers that named you or any competitor you track. Blank, not 0, when no answer named any tracked brand.
  • Non-branded score: the same composite over the questions that do not contain your brand name or a near-spelling of it. Branded and near-brand questions are marked with a badge and stay in the headline score; the non-branded score is the one that measures discovery.
  • Demand-weighted score: the same composite with each question's weight multiplied by 1 to 3 on a log curve of related Search Console demand. A second number, never the headline in disguise.
  • Share of voice: your share of mentions among the brands you track, prompt-weighted, over every check in the last 30 days. Tracking more competitors pushes it down without your visibility changing.

The confidence interval (the ±)

Every score carries a 95% interval on the score itself. Three estimates are computed and the widest is shown:

  1. A question-level bootstrap. The tracked questions are resampled with replacement 2,000 times with their engine answers intact, and the score recomputed each time. This measures how much the number depends on which questions happen to be in the set.
  2. A within-answer bootstrap. The answers inside each question and engine cell are resampled. With one answer per cell, which is every check since the sampling policy above, this band is zero wide; it is kept for accounts with older multi-sample checks.
  3. A floor from the mention rate. A Wilson interval on how often you were named, rescaled onto the score. At zero mentions the floor uses what a first mention would earn, so a 0 is never shown as "0 ±0".

The band is re-centred on the score and clamped to 0 to 100. The bootstrap has a fixed seed, so the same stored answers always produce the same band. The interval describes the sample you have; it does not predict next week's answers, which is what the trend and the "within noise" label are for. Score-change alerts fire only when a move is at least your threshold and the two intervals no longer overlap, and never across a check where engines were dark.

Which window each card uses

Different cards answer different questions, so they read different windows. Each card says which, in the same words:

WhereRowsWindow
AI visibility score, mention rate, "Your result at a glance"latest check per question and enginerecency-weighted, nothing older than 90 days
Engine by engine cardall checkslast 90 days
Share of voice, competitors page, share-of-voice rankall checkslast 30 days
Prompt drawer (share of voice, citations, responses)all checks30 days by default, selectable
"Named by AI" badgeall checkslast 30 days
Trend chartone point per checklast 90 days; change measured only between points with the same scoring version, a full engine panel and the same question set

What is not measured

  • Google AI Overviews and AI Mode, unless the Google AI Mode engine is on your plan.
  • Locale, persona, device or conversation memory: every call is an API call with no history and no location.
  • Question volume, in the headline score. Only the demand-weighted score weights questions, and only from Search Console.
  • The free audit's 0 to 100 number is a homepage readiness checklist, not this score. Its AI check is one question on two engines.

Version history

VersionDateWhat changed
1before August 2026mentioned / total, unweighted, no window
2August 2026the composite above; a Wilson interval on the mention rate
3August 2026same score; the interval became a bootstrap on the composite itself
46 September 2026inputs: plain-word brands need capital or domain-form evidence, bold and numbered rankings are read, sentiment rated per engine; every stored answer re-flagged and every website rescored once
522 September 2026inputs: cut-off answers excluded whether or not they named you, sentiment rated on the passage that names you and blank when unrated, up to 50 sources stored per answer; interval: question-level bootstrap added, non-zero floor at a score of 0

Two later changes did not move the version because they change matching, not the formula: brand terms come from the registrable domain rather than the first label of a subdomain, and names in scripts without capitals are matched (both 27 September 2026, with stored answers re-read).

Related reading: What the ± on a score means · The near-brand badge and the non-branded score · What an AI visibility score should measure · Why your score changes · How to track AEO

See the arithmetic on your own brand

Start your 14-day free trial: every answer stored and readable, every score with its sample and its interval, no credit card required.

Start Free Trial →