All documentation

Visibility

Competitors

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

Competitors screen showing share of voice as a bar chart and donut chart across tracked competitors

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.

Last verified 2026-09-28

Start monitoring your AI visibility.

See how AI search engines talk about your brand.

Free to start. No credit card required.