Advisors
Weekly report
A dated report for each week, built from your own numbers with no model in the loop, readable on screen, by email, and on paper.

What this is
Weekly report is a dated report built
once a week for every project it runs for: one hero number, the prompts that
moved, where you stand against competitors, and a short list of what to do
next, assembled automatically rather than something you have to go generate
yourself (api/services/weekly_report.py#generate_weekly_report). It is
gated on your plan; see Pricing. A project on a plan the report is not
included in sees a locked screen instead, with no report and no history to
browse (api/routers/insights.py#get_latest_insight).
No model in the loop
The generator never calls a language model. It reads the same numbers the
rest of the product already computes, by calling the dashboard, AI referral
traffic, and Search Console handlers directly, then formats the results in
plain Python: build_headline writes the one-sentence summary from rounded
deltas, build_scorecard reshapes the dashboard's own hero metrics into the
stored scorecard, and _movers sorts prompts into risen or fallen by the
sign of their change
(api/services/weekly_report.py#generate_weekly_report, #build_headline,
#build_scorecard, #_movers). Neither that call graph nor the task that
runs it imports the platform's LLM gateway anywhere.
The week, and when it runs
A report's week is exactly seven calendar days: week_start is seven days
before the day the generator runs, and week_end, six days after
week_start, is the day immediately before that run
(api/services/weekly_report.py#week_bounds). There is exactly one path
that builds a report: a systemd timer fires every Monday at 06:30 UTC, which
enqueues one generation job for every paid, active project without a report
for that week yet, and each job runs the generator for its one project
(discoveredby-cli@enqueue-weekly-report.timer,
api/tasks.py#_enqueue_weekly_report_for_eligible_projects,
#generate_weekly_report_task). There is no on-demand trigger: nothing in
the app, and nothing in the internal admin panel, builds a report outside
that weekly run. A project with no AI-search snapshot recorded since the
week began is skipped rather than shown an empty or partial week
(api/services/weekly_report.py#_enough_data).
What's on the screen
The hero is brand visibility when the report carries a real reading for it;
a report generated before that metric existed, or a week that happens to
read as entirely zero on it, falls back to citation rate instead, each with
its own one-line definition and a note of how it moved from the week before
(frontend/src/routes/(app)/insights/+page.svelte#heroValue,
#hasBrandVisibility). Beneath it sit three tiles, share of voice, average
best position, and prompts tracked, joined by one more tile repeating the
hero's own brand visibility figure once that same guard clears; average
position reads blank for a week where nothing of yours was cited at all
(frontend/src/routes/(app)/insights/+page.svelte#avgRank).
A "Do this next" checklist holds the five highest-impact citation gap
opportunities on file for your project
(api/services/weekly_report.py#select_recommendations). Editors and owners
can check one off as done; a viewer sees each check circle disabled, with a
role notice above the list explaining why, rather than a click that would
be rejected
(api/routers/insights.py#toggle_recommendation,
frontend/src/routes/(app)/insights/+page.svelte#writable). What gets checked off
carries forward: next week's report shows how many of that list got done
(api/services/weekly_report.py#progress_from_prior). Further down: the
prompts that gained or lost ground
(frontend/src/routes/(app)/insights/+page.svelte#rising, #declining),
how you compare engine by engine and against your tracked competitors, each
with its own message when there is nothing to compare yet
(#engines, #hasEngineData, #competitors), and, only when there is
something to show, AI referral traffic from Google Analytics (#revenue),
striking-distance Search Console queries (#quickWins), a sentiment
breakdown (#sentiment, #hasSentiment), and a receipt of articles
published, pages optimized, and prompts added that week
(#receipt, #shipped).
Screen, email, and paper
The same report reaches you three ways. On screen, at the Weekly report
page linked above. By email, sent the moment a report first finishes
generating, built from the same stored numbers and summary sentence
(api/tasks.py#_email_weekly_report,
api/services/email.py#send_weekly_report_email). And on paper: a
"Printable" link opens a second page built for print, reading the same
stored numbers and hiding the app's own navigation chrome behind a print
stylesheet. It is a one-page digest rather than the whole screen: the hero,
which prints citation rate with brand visibility above it when the report
carries a real reading for that
(frontend/src/routes/(app)/insights/report/+page.svelte#hasBrandVisibility),
where you stand engine by engine, what shipped that week if anything did,
and the top three moves from that week's "Do this next" list. The tiles, the
prompts that moved, the competitor comparison, the AI referral traffic and
Search Console sections, and the sentiment breakdown stay on screen. There
is no PDF file the product builds. Turning that printable page into a PDF
means using your browser's own print dialog, the same as printing any other
web page.
History
Past weeks are one click away once more than one exists: a dropdown lists
every week with a generated report
(frontend/src/routes/(app)/insights/+page.svelte#availableWeeks), and
picking one fetches that specific week without changing anything else on
screen (api/routers/insights.py#get_insight_for_week). A project not on a
plan the report is included in cannot reach a past week either, the same
gate as the latest one.
Related
- Metrics defined: the formulas behind brand visibility, citation rate, and the other figures on the scorecard
- Citation gaps: how the opportunities behind "Do this next" are found and scored
- Competitors: the comparison this report's "against competitors" section reuses
- Search performance: where this report's striking-distance queries come from
Last verified 2026-08-11