Lock in $67
Method

Why sorting by ROAS picks the wrong winning ads

The column that looks most like the answer is the one that will cost you three hundred dollars finding out otherwise.

Espen Opdahl Published 6 min read
Four identical folded cards standing in a row, all of them casting one single shared shadow.
The short answer

Sort your ads by ROAS and the top of the list will be mostly noise. High ROAS on small spend is a rounding error with a crown on — an ad that spent a little and got lucky outranks the ad that absorbed real budget and held. Two fixes, both cheap: rank by purchase volume and how much spend the ad absorbed while holding its efficiency, and de-duplicate by creative_id first, because the same creative running in four ad sets looks like four winners and is one.

Everyone sorts by ROAS. It is the column that looks most like the answer, it is right there in Ads Manager, and it is the first thing an AI will hand you if you ask which ads are working.

Then you scale the winner and it stops working, and the honest conclusion — that it was never a winner — arrives about three hundred dollars later.

Why the sort lies

What the ROAS sort rewardsWhat you actually want
Small spend, lucky windowEnough spend that the number means something
A single creative counted several timesOne row per creative, deduplicated
Efficiency at the moment it was cheapEfficiency that survived the budget going up
Whatever the attribution window flattersThe same window applied to everything
worth knowing The same creative in four ad sets reads as four separate winners.

This is the one that costs people the most and gets noticed the least. Duplicate a creative across ad sets — which everyone does when testing audiences — and every performance table treats each instance as its own ad. Your "top five" can be two creatives. De-duplicating by creative_id before you rank anything is the single highest-value line of the whole analysis.

What the report shows Ad — audience Asame creative Ad — audience Bsame creative Ad — audience Csame creative Ad — audience Dsame creative de-dupe by creative_id One creative spend and purchases summed Why it matters Ranked as ads: four "winners" Ranked as creatives: one, with the real totals
The same creative reused across ad sets is counted once per ad by every performance report. De-duplicating by creative_id before ranking is the difference between a top five that is two creatives and one that is five.

The ranking that holds up

  1. De-duplicate by creative_id first DO THIS FIRST

    Collapse every ad down to the creative behind it and sum the spend and purchases across instances. Everything downstream is wrong if you skip this, and the connector will not do it for you — the field is ad-level only and cannot be sorted or filtered on. The trade: you lose the ability to see which audience each instance ran against — do that as a second pass, not as the ranking.

  2. Rank by purchases, not ratio

    Volume first. An ad with many purchases has told you something; an ad with two purchases and a flattering ratio has told you almost nothing. The trade: this under-rates a genuinely efficient new ad that has not spent yet — which is why it is a ranking, not a verdict.

  3. Then check spend-handling

    Look at what happened to efficiency as budget went in. An ad that held its cost per purchase while absorbing real spend is the thing you want more of. An ad that was efficient only while it was small is a different animal reported under the same number. The trade: this needs a time series, not a single-window total.

  4. Use ROAS last, as a filter

    Once you have volume and spend-handling, ROAS is useful for cutting the bottom rather than picking the top. Nothing is wrong with the metric — it was only ever wrong as a sort order.

This ordering is the Wednesday half of the weekly routine — find the real winners, then build from them. See how the week runs →

Asking for it properly

The wording matters, because the default answer is the ROAS sort:

For ad account <ID>, window <YYYY-MM-DD> to <YYYY-MM-DD> inclusive:
De-duplicate ads by creative_id first — the same creative in several
ad sets is ONE creative, so sum its spend and purchases together.
Then rank creatives by purchases.
For each, show: purchases, spend, share of total purchases,
share of total spend, and cost per purchase.
Echo the exact window back before the numbers.

The share columns are the point, and they are worth more than any ratio. A creative taking a larger share of purchases than it takes of spend is carrying the account. One taking a larger share of spend than of purchases is where your money is quietly going.

Illustration — not a real account
CreativeShare of spendShare of purchasesRead
A12%31%Carrying the account. Make more like this.
B24%26%Pulling its weight. Leave it.
C9%11%Fine, and too small to tell you much.
D38%19%Where the money is going. This is the row people miss.
E17%13%Mild drag. Watch it.

Sorted by ROAS, D might well sit near the top — it has volume, so its ratio looks respectable. Sorted this way, D is the most expensive row in the account and A is the answer to what you should make next. Same data, opposite conclusion.

You do not need a threshold for this. You need the two columns next to each other.

You are not looking for the best ratio. You are looking for the creative that absorbed budget without getting worse — that is the only kind you can actually scale.

Where this still goes wrong

  • Trusting the numbers without checking two. The window, the attribution setting, or a partial week can all move these figures quietly. Verify before you act — this ranking is only as good as its inputs.
  • Ranking without looking at the creative. A winner brief needs the hook, the visual world and the offer, not just a row. The connector will show you the ad, which most guides still say it cannot.
  • Treating the ranking as a decision. It narrows the field. What to do about it is still yours, and deliberately so.

If you would rather run this as one pass over the whole account than as a single question, it is the second of the four questions in the audit.

Try this tonight Run the prompt above on your last 90 days, then run a plain ROAS sort on the same window and put them side by side. The gap between the two lists is the money you have been misreading.

Not connected yet? The setup takes about three minutes.

Frequently asked questions

How much spend before a ROAS number means anything?

There is no universal threshold and anyone quoting one for your account is guessing — it depends on your price point and conversion rate. The practical test is whether the ad has enough purchases that one more or one fewer would not move the ratio much.

Does this apply to campaigns and ad sets too?

The de-duplication problem is specific to creatives, but the volume-before-ratio principle applies at every level. A campaign with a great ratio and no volume is not a strategy.

What if my best creative is genuinely new?

Then it will be under-ranked by this method, which is why it is a ranking rather than a verdict. Keep a separate look at recent creatives with early signal — just do not let them into the scale-up list yet.

Why not just use Meta's own recommendations?

Use them as well. They optimise for delivery inside the system; this is about what you choose to make more of, which is a different question and still yours. Just know that the score attached to them counts how many you adopted, not how they worked out.

The Wednesday half of the routine

The Claude Ads Operator is the weekly system this ranking belongs to — find the real winners, brief them properly, draft the next batch paused, and decide on Friday. No ROAS promises anywhere in it.

See what's inside — $67 founding price

Pre-sale: the modules are still being recorded and founding members get the checkout link first. No charge today. Public price $97.

Espen Opdahl Writes The Claude Ads Operator. I run Meta ad accounts through Claude and Meta's official ads connector, and I write down what actually happens — including the parts that don't work. Not affiliated with Meta or Anthropic.