Reference
Metrics defined
Every number in the product, with its exact formula and denominator, including the run metrics of the two Google engines and how often answers cite any source.
How to read any number here
Three facts are worth knowing before you look at a single number on this page.
A metric with no data reads as no data, never as zero. Every rate-shaped
metric here is built by a shared _rate helper that returns value: None
whenever its denominator is zero, so a quiet project or an empty date range
shows nothing, not a false 0%.
For a metric that reports an observation count, below 30 observations a
number is provisional. The platform-wide floor is
MIN_OBSERVATIONS = 30: a metric built from fewer observations than that is
still shown, but the sample behind it is too small to read as settled.
Two counts labelled observations are not the same denominator.
observations on brand visibility counts every analysed answer; on brand
position it counts only the answers that named you; on share of voice it
counts distinct answers naming a tracked brand family, summed across every
active tracked family, so one answer naming two different families is
counted twice there. Never compare an observations count from one metric
against an observations count from another.
Collected versus analysed answers
Every metric on this page divides by one of two populations of answers.
A collected answer is a completed prompt execution: the engine ran and
returned a result. A run where Google showed no AI answer is not a
collected answer, and so is in neither population (see
Runs and the Google engines). An analysed answer is a completed execution whose
mentions have also been extracted, marked by mentions_extracted_at being
set: the platform has read the answer's text and recorded who it names.
On ChatGPT (app) and Gemini (app), the text it reads has each source link
blanked out whose text is a bare domain and that directly follows the
passage it supports (such as [example.com](https://...) after a full
stop, which both apps write; the passage can also end in the punctuation of
another script, such as 。, । or ؟, a closing bracket or a closing
quotation mark), so a site named only in such links never counts as a
mention of a brand. A domain link at the start of a line, a list item or a
quoted line, right after opening bold, or after an ordinary word, is part
of the sentence and is still read, as is a link whose text is a name, such
as a product or a place. In a language written without sentence
punctuation, such as Thai, a source link after a passage follows a word, so
it is read too. The stored answer is unchanged (api/services/brand_mentions.py#mention_text).
Brand visibility, brand position and share of voice below all count
mentions recorded this way.
Mention extraction is a separate step that runs after collection, so analysis lags behind it. The analysed population for a given window is therefore always a subset of the collected population for that same window, never larger.
Citation and retrieval data do not wait for that later step. The engine's citations and retrieved pages are recorded during collection itself, at the same time the answer's text is saved, before mention extraction ever runs. That is why domain coverage and citation rate below divide by the collected population instead of the analysed one.
The table below places all six metrics against the population each one uses.
| Metric | Numerator | Denominator | Direction |
|---|---|---|---|
| Brand visibility | analysed answers naming your brand | analysed answers | higher is better |
| Brand position | (mean of each answer's earliest self mention order) | answers that named you | lower is better |
| Share of voice | distinct answers naming your brand family | sum, over every active tracked brand family, of its own distinct-answer count | higher is better |
| Domain coverage | collected answers that retrieved your domain | collected answers | higher is better |
| Citation rate | collected answers that cited your domain | collected answers | higher is better |
| Answers citing sources | collected answers that cited at least one source, of any domain | collected answers, except Claude, Grok and pre-Sonar Perplexity answers, and Gemini (app) answers whose only sources are Google product or place links | neither: it describes the engine, not you |
Brand visibility
Brand visibility is analysed answers naming your brand, divided by analysed answers. It is the headline read on how often your brand shows up by name in the answers the platform has actually examined. Because the denominator is the analysed population, not the collected one, brand visibility says nothing about answers still waiting on mention extraction; see Collected versus analysed answers above.
Brand position
Brand position is the mean of each answer's earliest self mention order, so a lower number is better: position 1 beats position 9. It is computed only over the answers that named you; an answer where your brand never appears contributes nothing to the average, which is what makes brand position a different question from brand visibility rather than a variant of it. A brand named once in position 1 and once in position 9 averages 5.
Share of voice
Share of voice is distinct answers naming your brand family, divided by the
sum, over every active tracked brand family, of that family's own
distinct-answer count. A brand family is a top-level brand, yours or a
competitor's, plus its sub-brands;
an answer naming a brand and one of its own sub-brands together still counts
once for that family, never twice (api/services/brand_metrics.py#brand_share_of_voice).
The denominator is a sum, not a count of distinct answers in the window: an
answer naming two different tracked families, yours and a competitor's, adds
to both families' own counts, so the sum across families can be larger than
the number of distinct answers it was built from. For a project with no
sub-brands this is identical to counting mention records directly, because
the platform keeps at most one mention record per brand per answer on both
the paths that can create one: extraction's own dedupe collapses repeated
model output for the same resolved brand into a single row before anything
is saved (api/services/brand_mentions.py#normalize_mentions), and
re-attributing a past untracked mention onto a brand skips a row when that
brand already has a mention record for the same answer
(api/services/brand_families.py#reattribute_untracked). A third path,
promoting a parent's existing alias into a new sub-brand, keeps the
invariant by construction: it moves the parent's own mention rows for that
name onto the sub-brand rather than creating new ones
(api/services/brand_families.py#create_sub_brand). State plainly what
the denominator means: it is relative to the competitors you chose to add to
the project and have not paused, so adding a competitor can lower your share
of voice without anything changing in the answers themselves, and pausing
one can raise it the same way. Untracked brands the platform notices but you
have not added to the roster are excluded entirely, so the roster you build
is what sets this denominator. This is the single most misreadable number in
the product.
Domain-citation share of voice
The Competitors screen shows a second number also called share of voice, built from a different population than the mention-based one above. Competitors covers where it appears on the screen; this section covers what it actually counts.
Domain-citation share of voice is one domain's citation count, divided by
the citation count of every active competitor row tracked on the project,
plus your own (api/routers/pages.py#competitors_page). A competitor row
that is not active contributes to neither side of that division: the list
of domains the sum is built from is filtered to active rows before the
total is taken. That denominator is domain
citation counts, not mention records of tracked brands, so this is a
different figure from Share of voice above even though the product uses
the same name for both. Like the mention-based figure, it is relative
only to the competitors you have chosen to track: adding a competitor
moves every share on the screen, because the set being divided now has
one more member even though no answer changed, and an untracked brand
never enters this denominator either.
Both figures treat an inactive competitor the same way, whether it became inactive by being paused or by being removed: its citations and its mentions stop counting at once, while the rows already recorded for it are kept.
- Domain-citation share, pausing a competitor: corrects itself on the
next load. The row set behind the chart and its total is filtered to
active competitor rows, so a paused competitor's citations leave the
shared total at the same moment its bar does, and the visible shares sum
to 100 percent (
api/routers/pages.py#competitors_page). - Domain-citation share, removing a competitor: the same result by a
different route. Deleting a competitor is a hard delete of its row
(
api/routers/competitors.py#remove_competitor), so the very next load rebuilds the row set and the shared total without it. - Mention-based share, pausing or resuming a competitor: the query
behind it counts only pairs whose family's top-level brand is active
(
api/services/brand_metrics.py#brand_share_of_voice,#share_of_voice_by_entity); a sub-brand's own active flag is not checked here, so an archived sub-brand's past mentions keep counting for as long as its family's top-level brand does. A top-level brand's active flag mirrors its competitor row's, and pausing, resuming or adding a competitor updates that mirror in the same save (api/routers/competitors.py#update_competitor,#add_competitor,#_sync_brands,api/services/brand_mentions.py#sync_brand_entities_for_project), so the next load of any screen, the Explorer and its brand filter included, already leaves the paused family out. The mentions already recorded are kept, just not counted while the competitor is paused. - Mention-based share, removing a competitor: the same, at once.
Deleting a competitor leaves its brand entity with no competitor row to
point back at (
api/models/brand_entity.py), and the same save forces that entity inactive (api/routers/competitors.py#remove_competitor), so its mentions stop counting from the next load. The mention rows themselves are never deleted.
Domain coverage
Domain coverage is collected answers that retrieved your domain, divided by collected answers. Retrieval is not citation: an engine can pull one of your pages into its context while composing an answer without ever linking to it in that answer. Domain coverage counts that retrieval regardless of whether a citation followed, which is why it is a separate number from citation rate below, not a softer read of the same one.
Citation rate
Citation rate is collected answers that explicitly cited your domain, divided by collected answers. Citing means the answer named your domain as a source; an engine reading your page while forming its answer without linking to it is the weaker signal captured by domain coverage above, not by this metric.
Answers citing sources
Answers citing sources is collected answers that cited at least one source,
of any domain, divided by collected answers
(api/services/explorer/metrics.py#METRICS, #_statement). It is not the
citation rate, which counts only your own domain. Claude and Grok answers
and Perplexity answers collected before Sonar have no value: their saved
citations include every search result, not only the sources the answer
cites (for Grok, every URL in xAI's list of the sources its search came
across, api/services/llm.py#run_grok), so they are left out of both
sides of the division, and a query
with this metric says so in a note
(api/services/collection.py#SURFACES_WITHOUT_ANSWER_CITATIONS,
api/services/explorer/metrics.py#_runs). Gemini (app) answers whose
only sources are Google product or Google Maps place links are left out of
both sides too: they list sources, but none is a web page counted as a
citation, so a local answer that listed only places would otherwise read
as an answer citing nothing. They still count as answers that used web
search among the answer features
(api/services/collection.py#SURFACES_WITH_UNCITED_SOURCES). The note
reads: "Answers citing sources leaves out Claude and Grok answers and
Perplexity answers collected before Sonar: their saved citations include
every search result, not only the sources the answer cites. It also leaves
out Gemini (app) answers whose only sources are Google product or Google
Maps place links: they list sources, but none is a web page we count as a
citation." An answer with no sources is one where the engine showed none;
on ChatGPT (app) and Gemini (app) that usually means it did not search,
because the app decides for itself whether to (see
How ChatGPT (app) is collected
and How Gemini (app) is collected).
Answer features
Seven rates say which structured parts engines put inside their answers:
answers using web search, and answers with shopping, local businesses, ads,
video, images or tables. Each is checked answers where the feature was
present, divided by checked answers, counted only on the engines that report
that feature (api/services/explorer/metrics.py#_statement,
api/services/response_features.py#SUPPORTED_FEATURES). An engine that
does not report a feature has no value, never 0%, and an answer not checked
yet, or whose searches were not recorded, is in neither side. Which engine
reports what, and how each is counted, is on
Answer features.
Why two numbers on the same screen disagree
You can see brand visibility read 50 percent and citation rate read 10 percent on the very same screen, for the same window, and both can be correct at once, because they divide by different populations.
Take one concrete window: 100 collected answers, 80 of which have been analysed. Your brand is named in 40 of those 80 analysed answers. Your domain is cited in 10 of the full 100 collected answers.
Brand visibility divides by the analysed population: 40 of 80 is 50 percent. Citation rate divides by the collected population: 10 of 100 is 10 percent. Neither is wrong and neither is a rounding of the other. They are two different questions, over two different denominators, exactly as the table above lists.
Runs and the Google engines
Google AI Overviews and Google AI Mode add an outcome the chat engines,
ChatGPT (app) and Gemini (app) never have: the request succeeded, but Google showed no AI answer (see
When Google shows no AI answer).
Such a run has no text and no citations, and it is not an answer: every
metric above reads completed answers only, so it never enters brand
visibility, brand position, share of voice, domain coverage or citation
rate, on either side of the division
(api/services/explorer/metrics.py#_runs,
api/services/execution_reads.py#completed_execution_scope). A Google
engine whose runs in a window all showed no AI answer has no value for
those metrics there, not 0%.
Three metrics count runs instead, a run being a completed answer or a
run where Google showed no AI answer
(api/services/explorer/metrics.py#METRICS, #RUN_METRICS):
| Metric | Numerator | Denominator | Direction |
|---|---|---|---|
| AI answer shown rate | Google runs that showed an AI answer | Google runs (Google AI Overviews and Google AI Mode) | neither: it describes the engine, not you |
| First-page organic rate | Google AI Overviews runs where the domain appears on the first page of organic results | Google AI Overviews runs | higher is better |
| Organic position | sum, over those ranking runs, of the domain's best organic position in the run | Google AI Overviews runs where the domain appears on that first page | lower is better |
- AI answer shown rate is the shown rate. It counts only the runs of
the two engines that can show no AI answer, Google AI Overviews and
Google AI Mode: ChatGPT (app), Gemini (API), Gemini (app), Perplexity,
Claude and Grok always answer, so they have no value for it, and a query with this metric
carries the note "AI answer shown rate counts only the Google engines'
runs: other engines always answer, so they have no value."
(
api/services/explorer/metrics.py#_statement,api/services/collection.py#NO_ANSWER_SURFACES). - First-page organic rate and organic position read the first
page of organic results kept for every Google AI Overviews run, including runs
where no Overview was shown. They measure your own domain, or each domain
when domain is a breakdown or a filter. A run with no organic result for
the domain still counts in the rate's denominator, so a domain that never
ranks reads a measured 0%; its organic position has no value, because
there is no position to average
(
api/services/explorer/metrics.py#_organic_statement). Google AI Mode has no organic results, so neither metric has a value for it.
Retrieval coverage (domain coverage above) leaves Google, ChatGPT
(app) and Gemini (app) answers out of its denominator: those engines report only the
sources the answer cites, never a list of pages retrieved, so counting them
would read as a measured zero
(api/services/collection.py#SURFACES_WITHOUT_RETRIEVAL). Google AI
Overviews, Google AI Mode, ChatGPT (app) and Gemini (app) have no value
for it.
The same metrics in the Explorer
Brand visibility, brand position, share of voice, domain coverage and
citation rate on this page are computed by the same definition the
Explorer uses, so the formulas above hold there
unchanged (api/services/explorer/metrics.py#compute_raw). The Explorer
calls domain coverage retrieval coverage. It adds the two answer
counts, positive and negative sentiment, a citation rate for any cited
domain, the three run metrics above and the seven answer-feature rates, and
lets you break any of them down or filter them by engine,
model, country, city, persona, language, intent, buying stage, theme,
branding, tag or prompt, and, for the metrics they apply to, brand family
or cited domain (api/services/explorer/dimensions.py#DIMENSIONS).
Related
- Explorer: these metrics broken down and filtered your own way
- Brands and sub-brands: what a brand family is and the once-per-answer rule share of voice, visibility and position follow
- Key terms: what a mention, a citation, and retrieval each mean
- Troubleshooting: what to check when a number reads as no data
- Glossary: plain-language definitions of the terms behind these metrics
Last verified 2026-09-29