Page tracker
A persistent roster of your own pages — the sitemap and crawl universe plus any manually tracked URL — each carrying its citation record, all-time totals, Search Console measurements, and a page-role category.
The page tracker is a persistent roster of your brand's own pages: the sitemap and crawl universe plus any URL you track by hand, each carrying its citation record over your window, its incrementally-refreshed all-time totals, its Google Search Console measurements when connected, and a page-role category. Nothing here disappears when you refresh — the roster lives in the database, not the URL bar.
What it does
Where Sources tells you which third-party domains the engines cite, the page tracker turns the lens on your own site: for every page in the roster it shows how often AI answers cite it — both inside your selected window and as an all-time total — so you can see which of your pages are actually earning citations and which aren't.
How to use it
- Build the roster.
/pagesis seeded from your sitemap and crawl discovery (each such row is markedsitemap), and you can add any URL by hand with Track this page — a manually tracked page persists just like a discovered one. - Filter and search. Narrow by the category heuristic (
?cat=) or search the roster (?q=);?all=widens the view beyond the default slice. - Refresh. A nightly hook folds new citations into every page's all-time totals; the Refresh button runs the same fold on demand.
- Read Search Console columns. When a GSC property is connected, the roster gains clicks, impressions, and position columns beside the citation record.
- Open one page.
?url=opens a single page's detail; any URL can still be analysed ad hoc and tracked from there.
How it's computed
The window numbers are computed live from your citations. The all-time totals are refreshed incrementally against a commit-safe watermark, not the newest run's timestamp:
- A run's
executed_atis stamped when the engine answers, but the row and its citations only commit after extraction and the engine pass's save loop — so commit order routinely trailsexecuted_at. Advancing the cursor to the newest seen timestamp would skip runs still in flight, forever. - Instead, each refresh folds only runs older than
now − SNAPSHOT_LAG_MS(one hour) and advances every page's cursor exactly to that watermark. The freshest slice (younger than an hour) folds on the next pass by design; the dashboard's live window top-up renders that slice in the meantime, so nothing is invisible.
The category is a deterministic, read-time heuristic from URL structure alone — home, docs, blog, legal, company, product, landing — with no model or fetch, so improving a rule re-labels history consistently. A page with no recognisable signal is unclassified (an em-dash), and the column is labelled a heuristic.
Honesty rules: a page that has never been refreshed shows an em-dash for its all-time totals — "unknown", not zero. After a refresh, a 0 is real ("scanned the whole history, found none"). See data honesty.
Limits
- The Search Console columns require a connected GSC property; without one, the roster shows citation columns only.
- The category is a heuristic on URL structure, not a content read.
Related
- Sources — the third-party domains and threads engines cite.
- Crawlers — AI crawler visits to your pages.
- Google Search Console — the connection behind the clicks / impressions / position columns.