A practical, no-fluff guide for performance teams and agencies.
Most weekly marketing reports are written for the author: every metric they track, in the order the pulls happened. The reports clients actually read are designed backwards from a Monday-morning skim — headline, deltas, exceptions, one risk — with the detail behind it for whoever wants to dig. This guide is that design, section by section, plus the discipline that keeps it automatable.
A client gives the weekly report fifteen seconds before deciding whether to read on. Those seconds must answer: are we on track, what changed, what needs my attention? Everything else is appendix. Structure the report so the skim is a designed path, not an accident.
1. The summary block (top of the sheet, and the Slack message). Headline numbers with WoW deltas, three callouts, one risk. Written by a human — this is the analysis the rest of the report exists to enable.
2. The weekly rollup. One row per channel: Spend · Results · CAC · ROAS · WoW Δ · a ✓/⚠ flag against per-channel targets. One block per week, stacked under monthly section headers — append, never overwrite.
3. Channel detail. Campaign-level rows per platform, prefix-scoped, for the "why" questions the rollup raises.
4. Reconciliation. Platform-claimed vs MMP-attributed per channel with variance — the trust section. (Why they differ.)
5. Definitions. Events, prefixes, geos, timezone, formulas — the contract. Boring, and the reason week 37 is comparable to week 12.
Per-channel CAC/ROAS targets drive the flags, and the flags drive the meeting. A report without targets makes every number a judgment call in real time; a report with them walks in pre-triaged. Set targets in the definitions section; revise them as announced changes, never silently.
Vanity rows (impressions without a decision attached), per-platform tabs that duplicate the rollup, screenshots, and any metric nobody has acted on in a quarter. Every row is a maintenance cost and a skim tax — the template earns trust by what it omits.
Stable column order across weeks (and across clients, if you're an agency), monthly section headers added on the 1st, date-stamped blocks, ISO weeks in a stated timezone, formulas in dedicated columns that get extended rather than retyped. This structure is exactly what schema-aware automation can maintain; a report that mutates weekly can only ever be hand-fed. (Grab the pre-built version.)
| Channel | Spend | Results | CAC | ROAS | WoW | |
|---|---|---|---|---|---|---|
| Meta | $13,900 | 1,012 | $13.74 | 1.9 | −3% | ✓ |
| $17,800 | 998 | $17.84 | 1.6 | +1% | ✓ | |
| TikTok | $9,400 | 571 | $16.46 | 1.7 | −6% | ✓ |
| Snap | $7,100 | 376 | $18.88 | 1.4 | +9% | ⚠ |
Once the structure holds, the Monday build is mechanical — which is the layer weekly report automation removes: filtered pulls, the appended block, computed deltas and flags, the summary posted. The human keeps section 1.
"Every Monday, update the weekly report and post the summary with anything off-target flagged."
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.
Grab the free template, then let Opera keep it updated automatically — append-only, formulas preserved.