A practical, no-fluff guide for performance teams and agencies.
A scheduled report is a promise: the numbers will be there, correct, before anyone asks. Cron is the easy 5% of keeping it. The other 95% is semantics — what "last week" means, in which timezone, when a month is actually closed — and verification: what every run must check before it's allowed to write. This guide covers both.
Each source resolves in its own timezone (AppsFlyer per app, Meta per ad account) and lands in the report's. That sentence is the difference between a trend line and an artifact.
Daily — a pacing pulse: yesterday's spend vs budget by campaign, posted to the team channel before standup. Optimized for glanceability and exception flags; never the place for cohort metrics.
Weekly — the workhorse: last ISO week appended under the current monthly section, KPIs computed, reconciliation refreshed, summary with WoW deltas to each audience's channel.
Monthly — the close: run after restatements settle, roll the weeks into the monthly view (or re-pull the month whole — pick one and write it down), and expect numbers that differ slightly from summed fresh weeklies, for explainable reasons.
The single most important property: no partial writes. A run completes or leaves the report untouched and says why.
API down → retry with backoff → still down → halt + alert with the reason. Drift detected → halt + diff. Metric outside its expected range → write, but flag loudly in the summary. The system's job in every failure mode is to be loud and conservative — silence is the only unacceptable behavior.
The schedule is also a routing table: the growth team's daily to #growth at 8am, client A's weekly to their channel Monday 7am, client B's on Tuesday because they asked — each isolated, each with its own history, pause/resume and a run-now for the day someone calls early.
While the report's structure or definitions still change monthly. A schedule amplifies whatever it runs — stabilize first.
This is scheduled reporting end to end: semantics resolved per source, every run re-validated, no-partial-writes, per-client rhythms with history and alerts.
"Every Monday at 7am, update all client weekly reports and send each its Slack summary."
See this running on your own reports.A 45-minute workflow audit maps your current process and shows exactly what Opera automates — step by step.
Three minutes: a plain-language request, a Sheet schema read, an AppsFlyer pull, a previewed append, a Slack summary — then a paused campaign launch.