How to read your Meta Ads Manager CSV export
Ads Manager exports more than a hundred columns. Here is which ones to keep, how to rebuild the numbers that matter, and the traps hidden in the export itself.
The export button in Ads Manager gives you a spreadsheet that is almost unusable by default: a hundred-odd columns, several of which measure the same thing in slightly different ways, and a few that quietly change meaning depending on settings you chose weeks ago.
It is still the best raw material you have. Here is how to turn it into something you can make decisions from.
Export at the right level
Before you click export, set the breakdown to the level you intend to act on. Almost always that is ad set, because ad set is where budget, audience and optimisation event live — it is the object you actually change.
Export at campaign level and you cannot see which audience is carrying the result. Export at ad level and you get a sharper read on creative but the budget numbers stop being actionable, because several ads share one budget.
The practical answer is to export twice: once at ad set level for the money decisions, once at ad level when you are specifically judging creative.
Set the date range deliberately too. Seven days is the shortest window that is not mostly noise; fourteen is better for anything below about 20 purchases a week. Avoid ranges that straddle a budget change — you will be averaging two different campaigns together and the average will describe neither.
The columns worth keeping
Out of everything the export offers, this is the working set:
| Column | Why it is in the list |
|---|---|
| Campaign name, Ad set name, Ad name | Your join keys. Nothing works without them |
| Amount spent | The denominator of almost everything |
| Impressions, Reach, Frequency | Frequency is the fatigue signal, and it is Impressions / Reach |
| CPM (cost per 1,000 impressions) | The price of attention in this audience |
| Link clicks, CTR (link click-through rate) | Not “CTR (all)” — see below |
| Results, Cost per result | Only meaningful once you know what the result is |
| Purchases, Purchase conversion value | Revenue as Meta attributes it |
| Purchase ROAS | Convenient, but derived — recompute it if in doubt |
| Adds to cart, Checkouts initiated | Where the funnel actually breaks |
| Attribution setting | The column everyone ignores. Do not |
Delete the rest in the first pass. You can always export again.
The traps
“Results” is not a fixed quantity. The Results column contains whatever each ad set was optimising for. If one ad set optimises for purchases and another for add-to-cart, the Results column is comparing purchases to add-to-carts and the Cost per result column is comparing two unrelated prices. Sort by it and you will rank your ad sets by an accident of configuration. Always check the optimisation event before you trust either column.
CTR (all) and CTR (link) are different numbers. CTR (all) counts every click, including likes, comments, shares and clicks that expand the image. It is systematically higher and it does not predict traffic. If your export has both and you did not notice, you are probably reading the wrong one — the six metrics that actually decide your results piece explains what each one does and does not tell you.
Rows do not add up the way you expect. Reach is deduplicated within a row, not across rows. Summing the Reach column of five ad sets does not give you the reach of the campaign, because the same person can appear in several. Spend and impressions add up fine; reach and frequency do not.
The attribution window is baked in. Every conversion number in the file reflects the attribution setting at export time — by default 7-day click and 1-day view. Export the same date range with a different setting and the revenue changes without anything having happened. This is also why the file will not reconcile with Shopify.
Currency and time zone come from the ad account. If your account is in a different currency from your store, the spend column is not in the same units as your Shopify revenue. Ad account time zone also decides where the day boundary falls, which matters for short windows.
Rebuild the three numbers that decide things
Most of the work is a few columns you add yourself.
break-even ROAS = 1 / gross margin
contribution per sale = AOV × gross margin − shipping − fees
true CPA ceiling = contribution per sale
Then, per ad set:
verdict input = ROAS ÷ break-even ROAS
Above 1.0 the ad set pays for itself; below 1.0 it does not, regardless of how healthy the ROAS looks in isolation. A 2.4 ROAS is excellent at 70% margin and loss-making at 35%.
Add a column for conversions in the window as well, because everything above is meaningless below roughly 50 events. An ad set with 6 purchases and a 5.0 ROAS has not told you anything yet — and scaling it on that evidence is the most common way to lose a good campaign.
A reading order that works
- Sort by spend, descending. The top three or four rows decide your account.
- For each, check conversions first. Under 50, stop — this row is not evidence yet.
- Compare ROAS to your break-even, not to a number you read somewhere.
- Where ROAS is short, look at CTR and add-to-cart to see where it breaks: weak CTR is a creative problem, healthy CTR with weak add-to-cart is a landing page problem.
- Check frequency last, as the explanation for a row that used to work and no longer does.
Five minutes per export, and you avoid nearly every expensive mistake available in Ads Manager.
AdPilot’s optimizer does this reading for you: you upload the CSV exactly as Ads Manager produces it, and it returns a per-ad-set verdict — keep, scale, reduce or turn off — with the numbers behind each call and your own margin already in the arithmetic.