The Monday morning report that writes itself
How we replace hours of weekly copy-paste reporting with a Python pipeline and an AI summary — architecture, costs and gotchas.
There's a ritual in most marketing teams: someone spends Monday morning logging into five platforms, exporting CSVs, pasting numbers into a deck, and being asked at 2pm why the numbers don't match last week's deck. Let's automate that person's morning back.
The architecture
Every reporting automation we build has the same four layers:
Extract → Store → Transform → Deliver
(APIs) (warehouse) (SQL) (dashboard + AI summary)
Extract. Python jobs pull from each platform's API on a schedule — Google Ads, Meta, GA4, your CRM. No browser exports, no human in the loop.
Store. Raw responses land in a warehouse (BigQuery or Azure SQL) untouched. Storing raw means you can re-derive anything later when definitions change — and they always change.
Transform. Versioned SQL turns raw data into clean daily tables: spend, sessions, conversions, revenue, by channel and campaign, with one shared definition of every metric.
Deliver. Power BI or Looker Studio reads the clean tables. And the part people love: a small LLM step reads the week-over-week changes and drafts the summary.
The AI summary, done responsibly
The trick to AI summaries that don't embarrass you is to never let the model touch raw numbers. We compute every figure and comparison in SQL first, then hand the model a small, factual JSON payload:
summary_input = {
"week": "2026-04-13",
"spend": {"value": 42_310, "wow_change": -0.06},
"revenue": {"value": 187_450, "wow_change": +0.11},
"notable": [
"Meta CPA down 18% after creative refresh",
"Brand search impressions up 24%",
],
}
The model's only job is turning verified facts into readable prose. It cannot hallucinate a number it was never asked to calculate.
What it costs and saves
Typical build: three to six weeks. Typical running cost: single-digit pounds per month in compute and API calls. Typical saving: 8–15 hours of skilled marketer time per week, plus the less measurable benefit that everyone finally argues about decisions instead of whose spreadsheet is right.
The gotchas
- API quotas — Meta's rate limits will hurt you if you request campaign-level data naively. Batch and cache.
- Schema drift — platforms rename fields without warning. Monitor for it; don't discover it in a board meeting.
- The last mile — if the output isn't where people already look (Slack, Teams, email), it won't get read. Deliver to the human, not to a folder.