Reference
Metrics defined
Every number in the product, with its exact formula and denominator.
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.
Volatility has no observation count of its own; its floor is a minimum
number of days, covered in its own section below.
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 mention records, not answers at all. 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. 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.
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 | your mention records | mention records of all active tracked brands | 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 |
| Volatility | (sample standard deviation of daily brand visibility, in points) | n/a | lower is steadier |
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 your mention records, divided by mention records of all active tracked brands. State plainly what that 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 now 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, while the rows already recorded for it are kept. The two figures still reach that result by different routes, and only one of the four cases takes effect on the very next load:
- 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 a competitor: the query behind it
counts only mention records belonging to an active brand entity
(
api/services/brand_metrics.py#brand_share_of_voice,#share_of_voice_by_entity), and an entity's active flag mirrors its competitor row's. That mirroring is applied when the project's entity roster is next rebuilt, which happens on the next mention-extraction pass rather than at the moment you press pause (api/services/brand_mentions.py#sync_brand_entities_for_project), so this one lands a run later. The mentions already recorded are kept, just not counted. - Mention-based share, removing a competitor: the same path. Deleting
a competitor leaves its brand entity with no competitor row to point
back at (
api/models/brand_entity.py), and the same roster rebuild forces such an entity inactive, so its mentions stop counting from that rebuild onward. 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.
Volatility
Volatility is the sample standard deviation of the daily brand visibility series, expressed in points, not percent: a volatility of 4 means the daily figure typically swings about 4 points around its average, not four percent of it. Lower is steadier: a brand holding a stable position, not necessarily a higher one. Volatility needs at least five days of data in the window to mean anything; below that, the platform shows no value at all. That five-day floor is separate from the 30-observation threshold above: this one is about how many days a trend line has to move on, not how many answers went into a single count.
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.
Related
- 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-08-11