Visibility
Competitors
How competitors are discovered, what tracking one changes, and what the comparison shows.

How a competitor is discovered
Every collected answer is checked for brand names, the same mention
extraction that decides whether an answer named you (see Key
terms for mention versus citation). A name that
does not yet match one of your tracked brands surfaces on this page, under
"Brands appearing in your answers": grouped by name, with how many answers
named it, how many times, and when it was first seen, over the page's
window: the 7, 28 or 90 days ending yesterday set in the
filter bar,
narrowed to one engine when the bar has one
(api/routers/untracked_brands.py#list_untracked_brands,
api/routers/untracked_brands.py#_query_untracked). That list is ranked by
how often a name comes up and kept to the top 100; a brand mentioned less
often than that cutoff can still be out there without showing up here. An
"Add as competitor" button on each row prefills the add form with that
name.
Nothing on that list is tracked yet. An untracked brand's mentions are excluded from every metric that counts brand mentions, including the ones described below, until you add it as a competitor.
Two more dropdown pickers sit beside "Add as competitor", for an owner or
editor; a viewer does not see either one at all, rather than seeing it
disabled. Add as alias of… moves the name onto an existing top-level
brand, your own brand or a competitor, as another name for it, available on
every plan and on a paused competitor too
(frontend/src/routes/(app)/competitors/+page.svelte#topLevelBrands).
Add as sub-brand of…, shown when
sub-brands are available on the
project owner's plan, nests the name one level under an active brand of
your own or an active tracked competitor instead of tracking it as a
separate competitor. Either action moves any of the project's own past
untracked mentions that used exactly that name onto the brand it now
belongs to. Neither picker lists a removed competitor: one kept only to
anchor its own past history has nothing left to take a new name.
Tracked versus untracked
Adding a competitor (api/routers/competitors.py#add_competitor) records
its domain against your project. The next time mention extraction runs, a
matching brand entity is created for it
(api/services/brand_mentions.py#sync_brand_entities_for_project), so an
answer naming that brand resolves to a tracked entity instead of landing
back on the untracked list. From then on its citations, its domain
visibility, and its mentions all count against you by name, not only by
domain.
Tracked is not the same as active. Pausing a competitor keeps its card and
its visibility history, but drops it out of the share-of-voice chart and
the head-to-head comparison below, and out of the roster handed to future
mention extraction: an answer naming a paused competitor after that point
is recorded unresolved rather than credited to it, the same as a brand you
never tracked at all. It drops out of the total those shares divide by as
well, not only out of the picture: the set of domains the bar chart sums
over is built from active competitor rows alone
(api/routers/pages.py#competitors_page), so pausing one takes its
citations out of the denominator instead of leaving them folded into it.
Tracking a competitor also uses one of your plan's competitor slots; see
Pricing for what each plan includes
(api/services/limits.py#check_competitor_limit).
What the head-to-head view compares
The Head-to-Head tab compares you against every active tracked competitor,
prompt by prompt: up to 20 of your active prompts, unsorted and with no
guarantee the same 20 come back on a later load. Each score is the share of
that prompt's completed answers in the page's window (the filter bar's
days ending yesterday, and its engine when one is chosen) that cited the
domain,
so a domain cited in one of a prompt's four answers scores 25%, and a
prompt that ran without citing either of you scores a real 0% for both
(api/routers/pages.py#_head_to_head, #_prompt_run_counts). A prompt
with no completed answer in that window has no score: its cells show an
en dash with no bar, and it is left out of the wins, ties and losses and
of the count of prompts compared
(frontend/src/routes/(app)/competitors/+page.svelte#measuredPromptCount).
A competitor's own detail page has a narrower version, "Prompts that cite
you both": just the two of you, scored the same way, kept to the prompts
where at least one of you was actually cited, sorted so the biggest gaps
surface first, and kept to the 20 rows with the largest gap
(api/routers/pages.py#_shared_prompts).
The two views answer different questions: the tab is a scoreboard across
your whole field, shared prompts is where you and one rival actually
collide.
The detail page also breaks the comparison down per engine, listing every
engine that completed at least one of your prompts in the same window
(only the chosen engine when the bar has one), and charts every day of the
window with both visibility scores side by side. A day
on which none of your prompts completed an answer shows an en dash for
both and no bar, not 0%. Each score, per engine or overall, is the share
of your project's completed answers that cited that domain, counting every
day the engine ran, so an engine that ran and cited neither of you shows a
real 0% for both. With no completed answer at all in that window,
your score, the competitor's and the gap between them all show an en dash,
and the page says nothing has run yet
(api/routers/pages.py#competitor_detail_page,
api/services/snapshots.py#daily_runs_by_domain). Its most cited pages and
its list of citations cover the same window and engine. A competitor's change
from the previous period (the same number of days just before the window) is left blank when
that period had no completed runs, rather than counting its whole visibility
as a gain (api/routers/pages.py#competitor_detail_page). An engine
counts as measured in a period only when it ran (an answer, or a Google run that showed no AI answer) on at least
80% of that period's answered days, the days on which any engine has an
answer (6 of 7 when every day was answered)
(api/services/collection_health.py#WINDOW_PRESENCE_MIN_PERCENT). With no engine
chosen, when some engine that answered in either period was not measured
in both (one started or stopped answering, as an app engine such as
ChatGPT (app) or Gemini (app) does in the window it is added, or it ran on
only a few of the days), that
change, here and on each competitor's card on the list, compares only the
engines measured in both periods, while the score beside it still counts
every engine, and the list says "Changes compare only the engines measured
in both periods." above the cards (api/routers/pages.py#_trend_engines,
#_change_over).
These scores count citations of each domain. The brand ranking on
Overview is a different measure: it ranks you and every active tracked
competitor by brand visibility, the share of analysed answers that name
each brand family, over the same kind of window, ending yesterday. The two
screens answer different questions, so their numbers are not expected to
match (api/services/overview.py#_ranking). A competitor's row in that
ranking opens this detail page.
Only the filter bar's date range and engine apply on Competitors and on a
competitor's own page; the tag, country, persona and language chips stay
disabled there. The visibility scores and the domain share come from a
daily snapshot kept per engine and day, not per prompt, so those four
cannot narrow them (api/routers/pages.py#COMPETITORS_ACCEPTS,
api/routers/untracked_brands.py#ACCEPTS).
Share of voice
Two different numbers on this page are both called share of voice. The
hero figure and the bar chart beneath it size a bar for you and every
active tracked competitor by how many times that domain was cited in the
page's window. When no domain was cited at all in that window there
is nothing to divide, so the hero figure shows an en dash rather than 0%.
The share is rounded to one decimal, so when competitors were cited and
your share shows 0% you were cited rarely (under 0.05% of those citations)
or not at all; the sentence under it says your share rounds to 0% rather
than claiming you were never cited
(api/routers/pages.py#competitors_page). "By
brand mentioned", the list underneath it, is the same brand-mention
analysis behind the product's single share-of-voice figure
(api/services/brand_metrics.py#brand_share_of_voice,
api/services/brand_metrics.py#share_of_voice_by_entity), broken out one
row per tracked brand family instead of one number for you; a brand with no
mentions in the window is simply absent from that list, not shown at
zero. A brand family, a brand plus its own sub-brands,
counts once per answer here even when several of its names appear
together. Where a family has an active sub-brand named at least once in the
window, that sub-brand gets its own indented row underneath, with how many
answers named it and what share those are of the family's own answers; a
note under the list says these sub-brand figures overlap each other and the
family row rather than adding up to it. The two figures still divide by
different populations, so a single answer can move one and not the other,
but they now agree about what an inactive competitor means: neither counts
one, whether it was paused or removed. See
Domain-citation share of voice
for what the bar chart's numbers count, and
Share of voice
for what "By brand mentioned" counts, including all four pause and remove
cases.
Social accounts
A competitor's own detail page carries a Social accounts card: the
Reddit, YouTube, LinkedIn, review-site and other social accounts your team
has recorded for that competitor. Owners and editors can add one, up to ten
per competitor, and remove one; a submitted URL that does not parse to a
recognised account is refused, and the same account cannot be added twice,
whether it would duplicate another competitor's account or one of the
project's own (api/services/social_sources/profiles.py#add_profile). Only
an active competitor's accounts label anything; pausing a competitor stops
them being labelled. These accounts exist to label that competitor's
citations on Social sources, which is a
separate screen: nothing here is compared against your own visibility.
If nothing shows up yet
A competitor's visibility, citations, and top pages all fill in from the same daily runs that populate the rest of the product. See Troubleshooting: No citations yet for what an empty comparison does and does not mean before you conclude a competitor was never cited.
Related
- Brands and sub-brands: what an alias is, how a sub-brand rolls up into its family, and where "Add as alias of…" and "Add as sub-brand of…" send an untracked name
- Citations: how a citation is attributed to a domain, yours or a competitor's
- Key terms: what separates a mention from a citation
- Metrics defined: the mention-based share of voice formula, and domain-citation share of voice for the other figure on this screen
- Troubleshooting: No citations yet: what to check before expecting a comparison to appear
- Social sources: where a competitor's saved social accounts are used, and how they are labelled against yours
Last verified 2026-09-28