A prototype we built for ads-ops teams. September to December 2025.
The morning ads report, written before anyone logs in
The morning ads report is the same every day: yesterday against the day before, per campaign, what to act on at the top. This prototype builds it from the platform export before anyone logs in; the builder on this page runs the same arithmetic on a sample.
40 minutesof a person's morning, and a spreadsheet, before the prototype
7measures per campaign, from spend to cost per acquisition
A capture of the prototype, sample data.
The situation
The report is the same every morning: yesterday against the day before, per campaign, with the three or four things worth acting on pulled to the top. It takes a person forty minutes and a spreadsheet. We built the prototype to find out how much of that is pure arithmetic a machine can do from the export, and how much still needs a person.
What we built
An import step that accepts the CSV and JSON shapes the ad platforms export, and says which rows it could not read rather than dropping them
Per-campaign aggregation: spend, impressions, clicks, click-through rate, cost per click, conversions and cost per acquisition
A comparison against the previous day in the same export, where the export covers more than one day
A rules pass that pulls out what to look at first: spend with no conversions, cost per acquisition moving against the run rate, click-through rate under the floor
A demo mode with sample rows, so the surface can be shown without anybody's real campaign data on screen
A report builder on this page that runs the same arithmetic on a sample export, entirely in the browser
The screens
Sample data.Captures of the prototype on sample data.
The start screen
Where the morning starts: a drop zone for the platform export, the date range the report covers, and a demo mode that loads sample rows so the surface can be shown without anybody's real campaign data in it. Nothing is generated until an export is handed over.
An export goes in here, or the sample rows do.
The start screen
What changed
Most of the report turned out to be arithmetic the machine does from the export in seconds. What is left for the person is the part that needs judgement: what to do about the three or four lines at the top.
Try it
Sample data.Two invented exports held in this page, with invented campaign names and figures. The report is assembled in your browser; a file you drop is read locally and never uploaded.
The export
Load one of the invented exports, paste your own, or drop a CSV file onto the box. Your own data is fine: it is read in this tab and goes nowhere.
Two days, six campaigns. The ordinary case: yesterday and the day before, in the platform's own column order. It trips all four rules and carries one row that will not parse.
Same day, columns moved. One day only, columns in a different order, a currency symbol in the spend column and a blank row. The report says it cannot compare rather than comparing against nothing.
A header row, then one row per campaign per day. Columns are matched by name: date, campaign, impressions, clicks and spend are required, conversions and channel are used when present.
What decides the flags
Four rules, printed here rather than hidden behind the output. A flag whose rule you cannot see is a flag you cannot argue with, and on a real account at least one of these is always wrong for you.
Spend of $100 or more with no conversions on the day.
Cost per acquisition more than 1.4 times the day before.
Click-through rate under 1 percent.
A campaign that reported the day before and reports nothing now.
The morning report
Sample data.
Nothing built yet. Load an export and press the button; the table, the comparison and the rows it could not read all appear here.
An email becomes order lines against a catalogue, stock moves to reserved, and a quotation drafts itself. 3 quantities per stock item: on hand, available and reserved.
Mailboxes, Mailchimp, paid social, rank tracking and Salesforce, September 2024 to March 2026. 507K search impressions and 4.32K clicks, May to September 2025.