Client-ready ad reports from two CSV exports

Drop this period's and last period's campaign export (Meta / Google Ads style). We compute spend, leads and cost-per-lead with changes vs. last period — the numbers, never invented explanations. Runs entirely in your browser; client data is never uploaded.

✓ No signup ✓ Client data stays local ✓ Print to PDF

1 · Branding & period

2 · The two exports

Last period CSV

Campaign-level export

Choose file…

This period CSV

Same export settings

Choose file…

Column auto-detection: campaign name · spend ("Amount spent", "Cost") · results ("Results", "Leads", "Conversions") · impressions · clicks. Totals rows are skipped automatically.

Built for freelancers with a handful of clients

How to use — step by step

Built for freelancers who manage a handful of ad accounts and resend the same numbers every month. Two exports in, one branded report out.

  1. Export a campaign-level report from your ad platform for last period, and the identical report for this period. Keep the same columns and currency in both.
  2. Drop last period's file on the left, this period's on the right. The tool detects the campaign-name, spend, results, impressions and clicks columns automatically.
  3. Fill in your agency name, the client's name, and period labels — these brand the report header.
  4. Add your own commentary: what you did, and what you'll do next. The tool deliberately never writes this part for you — explanations belong to the person who ran the account.
  5. Press Build report. Check the KPI cards (spend, leads, cost per lead, CPM, CTR, each with its change vs. last period) and the per-campaign table, where new and ended campaigns are flagged.
  6. Use Print / Save as PDF to produce the client deliverable. The page's interface hides itself in print — only the report shows.

How it works

The tool aggregates campaign rows into period totals, ignoring summary rows like "Total" that platforms append to exports. Totals produce the KPI cards; the per-campaign table aligns this period's campaigns against last period's by name and computes simple period-over-period deltas. Cost per lead is derived as spend ÷ leads; CPM as spend per thousand impressions; CTR as clicks over impressions.

Design principle: arithmetic is the tool's job, attribution is yours. A +12.5% spend change is a fact; whether it was "worth it" depends on context the tool cannot know. That's why the commentary section is typed, not generated — nothing in the report was invented, so nothing needs to be double-checked against the platform before sending.

Client data never leaves the browser: the exports are parsed locally, and the report exists only in this page until you print it.

Reading the deltas is a discipline. A spend increase with flat leads is a warning; a spend increase with proportionally more leads is scaling working; a spend cut with only slightly fewer leads is efficiency found. The per-campaign table exists so those conversations happen per line, not on a blended average — one campaign's efficiency can hide another's bleed, and the (new)/(ended) flags keep a month's churn visible at a glance.

Frequently asked questions

Which platforms are supported?

Any export with one campaign per row and recognizable spend columns works — Meta's 'Amount spent (USD)', Google Ads' 'Cost', and similar. Rename columns in a spreadsheet if your platform uses unusual names.

Does it connect to my ad accounts?

Never. You export the CSVs yourself; the tool only reads the files you drop in.

Can I report in a currency other than USD?

Yes — numbers are formatted as plain amounts with your currency's symbol wherever the export uses it. Just make sure both period files use the same currency.

Why is last period's campaign listed with zero values?

Campaigns that ran last period but not this one appear so you can see they ended — spend shows as the period-over-period change to zero.

The two platforms I use attribute conversions differently. Now what?

Report each platform from its own export, and say so in your commentary. Blending differently-attributed numbers into one total is the fastest way to lose a client's trust.

Should I send weekly or monthly?

Whatever cadence you commit to — the tool just formats it. Weekly suits launch periods; monthly matches most retainers. Change the period labels to match.

The client's name appears in the file names I drop in — is that a problem?

No. File contents are parsed in this browser only, and the report exists on your screen until you print it. Nothing is transmitted.

Related tools