Case
Retailer Large: Meta dashboard with year-over-year comparison
A dashboard that reads the monthly Meta reports directly in the browser and compares each month with the same month last year, with an AI chat that answers questions about the numbers in plain language.
Fictional case. The client is anonymised, campaign names are replaced and all figures are scaled. The patterns are real. The chat in this demo is pre-recorded.

The challenge
- Retailer Large, a large Swedish retail chain, received a monthly Excel report of its Facebook and Instagram advertising, raw data per campaign and day, but no consolidated view.
- Questions like "are we doing better than last year?", "which campaigns carry the result?" and "is our reach budget worth the money?" required manual pivot work every time.
- The answers got stuck in emails instead of becoming decisions.
Strategy & approach
- Built a dashboard that reads the monthly reports directly from the folder where they are saved and compares each month with the same month last year. No database, no login, no new vendor.
- The marketing team presses "Update data", points to the folder, and every figure is recalculated.
- Next to the numbers sits an AI assistant with the full dataset that answers questions in plain language: "Which campaigns have the worst ROAS?", "What drove the December increase in purchases?", it calculates on the same raw data as the dashboard and shows its work.
- KPIs with year-over-year comparison: spend, purchases, conversion value, ROAS, average order value, cost per purchase, impressions and CPM.
- Filters by objective (sales, awareness, traffic, engagement) and campaign type, so CPM and ROAS are compared between campaigns with the same mission instead of in a lump.
- Daily curve versus last year, spend per campaign objective, ROAS per weekday and marginal ROAS, what each extra krona delivered compared to the same month last year.
- A sortable campaign table with frequency, reach per thousand kronor and average order value per campaign.
Try the dashboard
Explore the filters, switch month and watch the pre-recorded chat demo play out. In the production version you type freely in the chat.
Pre-recorded demo, anonymised and scaled data.
Next steps for the reporting
Layer 1
More columns from Meta
- Clicks, CTR, CPC and funnel steps, without them you cannot see where a weak campaign fails or where purchases leak.
- Purchases from new customers give cost per new customer; placement, ad level and geography show what carries the result.
- Pure click attribution alongside the blended report gives a conservative ROAS to compare against.
Layer 2
Data outside Meta
- Meta's purchases and value are set against total e-commerce revenue, to see how large a share Meta claims.
- With gross margin, ROAS translates into a break-even level per campaign type.
Layer 3
Incrementality test
- The reach campaigns take a quarter of the budget and are where uncertainty is greatest.
- A geo-split or Meta's Conversion Lift answers whether that money drives sales that would not have happened otherwise.
Layer 4
The store
- Today's report only measures web purchases, while many of those who see the ads shop in store.
- In-store purchases via Conversions API enable omnichannel optimisation and two new steering metrics: omni-ROAS and cost per omni-purchase.
Layer 5
Attention
- More and more of the reach is determined by how the content performs, not by the budget.
- Hook rate and engagement rate show whether creator collaborations and UGC work, before the sales show up.
What the analysis showed
+93 %
ROAS vs previous year
+42 %
Average order value
-27 %
Cost per purchase
+54 %
Purchases
The figures are scaled and anonymised. Three things the Excel report never showed: almost half the ROAS lift came from a higher average order value (not more purchases per krona), reach campaigns took a quarter of the budget at a ROAS around 6x versus 24–28x for conversion campaigns, and some purchases were booked to campaigns with no budget, which is why the dashboard also shows "ROAS on active spend" as a more conservative measure.
Learnings
- A single HTML file with no backend: the Excel files are read and parsed directly in the browser, so no client data ever leaves the computer.
- All calculations are made from raw data, which means new KPIs can be added without changing the reports.
- The chat is powered by Claude, which receives the dashboard's summary as context for every question, the question does not need to be phrased as a pivot table, it can be asked the way you would ask a colleague.
- Tools: Meta Ads Manager (export), Excel, HTML/JavaScript and Claude (analysis and chat). Built together with Claude.
Want to talk about this case?
Happy to walk you through the details.