DocsFeature guides

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. /pages is seeded from your sitemap and crawl discovery (each such row is marked sitemap), 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_at is 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 trails executed_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.
  • 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.