Optimize
Domains
What counts as a domain here, what an owned page is, and what each daily snapshot records.

What counts as a domain
A Domain row is the registrable domain a URL resolves to, extracted and
lowercased once and deduplicated across the whole platform, so "example.com"
and "blog.example.com" collapse into the same row, shared by every project
that has ever touched it, not owned by yours alone. The row appears the first
time any URL under it is recorded, wherever that URL came from. Storing a
citation records one (api/services/execution.py#get_or_create_domain). So
does setting up a project or a competitor
(api/services/project_setup.py#get_or_create_domain), so does storing a
search result an engine retrieved whether or not it went on to cite it
(api/services/execution.py#_store_search_result), and so does anything
else that puts a URL into the platform's URL store
(api/services/web_pages.py#record_url). A Domain row can therefore exist
for a domain no engine has ever cited.
See Citations
for exactly how a URL is reduced to that domain and matched against your own.
Domains lists every domain that has
been cited at least once in this project, ranked by how often it was cited
(api/routers/pages.py#domains_page). A tracked competitor that has not been
cited yet in this project does not appear here at all, even though it is
tracked: the query behind this screen only returns a domain reached through
an actual citation row, unlike Competitors,
which lists every tracked competitor whether or not it has been cited.
Yours, a tracked competitor, or everyone else
Every domain on the screen gets exactly one of three labels, decided fresh on
each load: yours, if it is the domain your project was set up against; a
tracked competitor's, if an active Competitor row links your project to
that domain; everyone else's otherwise, carrying an "External" badge. The
three-way decision is made in the API response
(api/routers/pages.py#domains_page); the wording on the badge comes from
the screen's own markup (frontend/src/routes/(app)/domains/+page.svelte).
A paused or removed competitor's domain drops out of the middle group: the
join that supplies the "Competitor" badge and name only matches an active
row, so pausing or removing a competitor makes its domain read here as an
ordinary external domain from then on, the same way it drops out of the
share-of-voice chart on
Competitors.
Citations and pages, counted here
The citation count beside each domain, and the count of distinct pages
beneath it, are both live totals: every citation, and every distinct cited
URL, ever recorded against that domain in this project, across every engine,
with no date window (api/routers/pages.py#domains_page). The column, the
sort control and the hero figure at the top of the screen all read
"Citations" for that reason
(frontend/src/routes/(app)/domains/+page.svelte#discoveredDomains).
That is a different figure from
domain-citation share of voice
on the Competitors screen, which sums a separate daily snapshot over a
trailing 30 days and only for domains you are tracking
(api/routers/pages.py#competitors_page). The two used to share a field
name, total_appearances, and nothing else; this screen's field is now
called total_citations, leaving that name to the stored column on the
snapshot table it always meant
(api/schemas/domains_page.py#total_citations,
api/models/domain_daily_snapshot.py). They answer different questions over
different windows, so a domain's count here and its share on Competitors are
still not meant to match.
The pages under a domain
Expanding a domain's row lists its individual CitedUrl pages, each with how
many times it was cited, and when it was first and most recently seen
(api/routers/pages.py#domains_page). As on
Citations, neither a page
nor its domain is scoped to this project: the same URL cited on a different
one of your projects, or discovered through a citation on someone else's
project entirely, is one shared row, so "first seen" and "last seen" mark
when the platform first recorded that page or domain, not when it first
showed up for you specifically (api/services/execution.py#get_or_create_cited_url).
Owned pages are a different thing
"Owned page" names a different feature, not anything shown on this screen.
On a prompt's own page you can map the pages already on your own site that
should rank for it; see
Inside one prompt. Each mapping
is a PromptOwnedPage, restricted to your project's own domain whichever way
it was added, and it exists whether or not any engine has ever cited it: you
add some yourself (api/services/owned_pages.py#add_owned_page), and
citation gap analysis fills in others on its own, matching a prompt to one
of your own cited pages or a similar one
(api/services/citation_gap.py#_resolve_owned_page).
Optimizations and
Articles both read that list to see what you
already have before recommending or drafting something new. A page under
your own domain on this screen, by contrast, only appears because a citation
already pointed at it: every domain here, yours included, is reached the
same way.
The daily snapshot behind these numbers
DomainDailySnapshot holds one row per project, domain, engine and day,
recording whether the domain is yours, its citation-weighted appearances and
distinct pages for that single day, its response-weighted average and best
rank, and how many of that day's prompt targets it appeared in against how
many ran (api/models/domain_daily_snapshot.py). Each time an execution
against one engine finishes, that whole day's rows for its project and
engine are deleted and rebuilt from the raw citations recorded so far
(api/tasks.py#_resume_completed_execution,
api/services/snapshots.py#rebuild_snapshots_for_execution). A separate job
runs per prompt target and engine (api/tasks.py#_enqueue_for_user), so
that rebuild happens many times across a day, not once at the end of it.
None of that table's numbers show on this screen; it exists to be summed
over a window, which is what
domain-citation share of voice
does with it.
Related
- Citations: what a citation and a cited URL are, and how one gets attributed to a domain
- Competitors: tracking a competitor, and what pausing or removing one changes
- Metrics defined: the daily-snapshot figure this page's counts are not
- Optimizations and Articles: where an owned page actually gets used
Last verified 2026-08-11