ROAS gets treated like the one number that matters. It isn't. ROAS is a great scorecard for exactly one kind of campaign, and a misleading one for every other kind. Judge a lead-gen campaign by its ROAS and you'll kill campaigns that quietly print money. The ones you scale instead look great in Ads Manager but lose cash in the bank. The metric you trust has to match the job the campaign was hired to do.
The actual difference
Cost per Result is what you pay for one unit of whatever you told Meta to optimize for: one purchase, one lead, one landing page view. It always exists. Every campaign has a result and a cost.
ROAS (Return on Ad Spend) is revenue divided by ad spend. A ROAS of 3.0 means every ฿1 spent brought back ฿3 in tracked sales. It only exists when Meta knows the baht value of each conversion. That means a Pixel or CAPI purchase event firing with a real value parameter.
That last part is where the confusion starts. If your campaign optimizes for Leads, Meta has no idea whether a lead is worth ฿800 or ฿80,000. So it can't report ROAS. It reports Cost per Lead instead. That's not a bug. There's just no revenue number to divide.
Sales campaigns: ROAS, but never alone
For e-commerce campaigns optimizing for Purchase with a value, ROAS is the right primary metric. But know your breakeven first. Breakeven ROAS = 1 ÷ gross margin. If you keep ฿40 of gross profit on every ฿100 sale, your breakeven is 2.5. Anything under 2.5 loses money, even though the number is "above 1" and feels positive.
Watch Cost per Purchase alongside it. ROAS can hold steady while CPA quietly climbs, because average order value went up, not because your ads got more efficient. Two numbers catch what one number hides.
Lead generation: Cost per Lead, then close the loop
Meta can't see lead value, so it hands you Cost per Lead. On its own, ฿300 per lead means nothing. You have to finish the math.
Say you get 100 leads and close 20% of them. That's 20 customers. At a ฿5,000 average deal, that's ฿100,000 in revenue. You spent ฿30,000. Your real ROAS is 3.3. The campaign that looked like "pure cost" was your best performer all along.
Track close rate and deal size in a simple sheet. That's the only way to turn Cost per Lead into the truth. Founders who skip this step trust Cost per Lead alone. A cheap lead from a bad audience that never closes is the most expensive lead you can buy.
Traffic, engagement, awareness: Cost per Result only
ROAS here is either zero or fiction. A Traffic campaign's job is link clicks — judge it on Cost per Link Click and landing page view rate. An engagement campaign's job is interactions. An awareness campaign's job is reach, so judge it on CPM and frequency. Asking these campaigns for a ROAS number is asking the wrong question entirely.
The trap nobody talks about
In Thailand, a big share of orders are cash on delivery. The Pixel fires a Purchase event the moment a customer confirms the order. But COD orders get cancelled or rejected at the door, often 20–40% of them. So in-platform ROAS counts revenue that never reaches your bank.
A reported 3.0 ROAS with a 30% COD rejection rate is really 2.1. If your breakeven is 2.5, that "winning" campaign is underwater and you'd never know from Ads Manager. Reconcile reported revenue against actually-collected revenue at least once a month.
In-platform vs blended ROAS
Ads Manager shows in-platform ROAS, the revenue Meta credits to itself. Blended ROAS is total revenue from every channel divided by total ad spend. They tell different stories. In-platform ROAS over-credits Meta when it and Google both claim the same buyer, and under-counts when iOS blocks tracking. For a founder running one main channel, blended ROAS is the honest number: take your monthly sales total, divide by ad spend, done. Use in-platform ROAS to compare campaigns against each other; use blended ROAS to answer "is the whole budget working?"
Quick reference
| Campaign type | Primary metric |
|---|---|
| Sales / catalog (Purchase + value) | ROAS + Cost per Purchase |
| Lead generation | Cost per Lead → offline ROAS |
| Traffic | Cost per Link Click |
| Engagement / awareness | CPM / Cost per Result |
| App installs | Cost per Install → in-app ROAS |
What to do next
Before you read another ROAS number, check what the campaign was optimized for. It's right there in the objective column in Ads Manager. Then decide whether ROAS even applies. When you generate a blueprint in AdBlueprint, the success metric is set per objective. You compare the right number from day one, instead of forcing every campaign onto the same scorecard.