ROAS vs contribution margin: why ROAS misleads
“Our ROAS is 3x, so the ads are working.” It is one of the most common sentences in DTC marketing meetings, and one of the least reliable.
ROAS is a useful number for steering campaigns. It is a poor number for deciding whether advertising makes money. This guide explains why, shows a hypothetical campaign where a good ROAS loses money, and covers what to manage to instead.
What is ROAS?
ROAS stands for return on ad spend. It is revenue attributed to ads divided by what you spent on those ads. Spend $1,000, get $3,000 of attributed revenue, and ROAS is 3.0.
The key word is “attributed.” The revenue in a platform’s ROAS is the revenue that platform decided its own ads caused, using its own rules. That is where the problems start.
Why does ROAS mislead? There are three separate problems. Each one alone can turn a profitable-looking campaign into a losing one.
Problem 1: ROAS ignores margin. ROAS compares ad spend with revenue, not with profit. A dollar of revenue from a product with thin margins is worth far less than a dollar from a product with healthy margins. ROAS treats them the same.
Product cost, discounts, pick and pack, shipping, payment fees and returns all come out of that revenue before any of it pays for the ad. ROAS sees none of them.
Problem 2: platforms double count. Each ad platform reports the conversions it can attribute to its own ads, within its own attribution window. A customer might see a Meta ad, click a Google ad a week later, then open an email and buy.
Meta, Google and your email tool may each count that order. Add up the revenue every platform reports and it often comes to more than the store actually took. Each ROAS looks fine on its own. Together they describe sales that never happened.
Problem 3: ROAS rewards easy sales. Campaigns that target existing customers or people searching your brand name often show the highest ROAS. Many of those buyers would have purchased anyway.
So the highest-ROAS campaigns are frequently the ones adding the least new revenue. Cutting your prospecting and moving budget to retargeting can raise reported ROAS while total sales fall.
Every number below is hypothetical, chosen to show the method.
A brand sells a product for $50. It runs a campaign that the ad platform reports at a 2.5 ROAS. Here is what one order looks like.
| Per order | Amount |
|---|---|
| List price | $50.00 |
| Average discount | −$7.50 |
| Net revenue | $42.50 |
| Cost of goods | −$15.00 |
| Pick, pack and shipping | −$9.00 |
| Payment processing | −$1.30 |
| Returns allowance | −$2.20 |
| Contribution before marketing | $15.00 |
| Ad cost per order at 2.5 ROAS ($42.50 ÷ 2.5) | −$17.00 |
| Contribution after marketing | −$2.00 |
The platform credits the $42.50 the customer paid. At a 2.5 ROAS that implies $17 of ad spend per order. But the order only leaves $15 before marketing. The brand loses $2 on every sale the campaign wins.
Now add double counting. If the store’s own data shows only half of those attributed orders were really new, the true ad cost per incremental order is closer to $34. The loss per order grows to about $19.
The break-even point is easy to find. In this example, ads can cost at most $15 per order before the order stops making money. Against $42.50 of revenue, that means the campaign needs a ROAS above roughly 2.8 just to break even. A “good” 2.5 is a loss.
We show how to build the per-order figure for each product in contribution margin for ecommerce: how to calculate it by SKU.
What is blended ROAS, or MER?
Blended ROAS, often called MER (marketing efficiency ratio), takes the platforms out of the calculation. It is total store revenue divided by total marketing spend, over the same period.
It fixes the double counting problem, because the revenue comes from your store, not from the ad platforms. Every order counts once. It also captures the halo effect of ads on organic and direct sales, which platform ROAS can miss.
| Platform ROAS | Blended ROAS (MER) | Contribution after marketing | |
|---|---|---|---|
| Revenue source | Each ad platform | Your store | Your store |
| Double counting | Common | None | None |
| Includes product and delivery costs | No | No | Yes |
| Best used for | Comparing campaigns inside one platform | Checking total marketing efficiency | Deciding whether growth makes money |
MER is better than platform ROAS, but it still ignores margin. A MER of 4 can be healthy for one brand and a loss for another. That is why the last column matters most.
Manage to contribution margin after marketing. It answers the real question: after paying for the product, delivery and the ads, did this order leave money to cover fixed costs and profit?
A practical setup:
- Calculate contribution before marketing per order, per product and per channel. This is the most you can afford to spend to win an order and still break even.
- Set a target cost per order below that ceiling. The gap is the contribution you want each order to leave.
- Translate it into a break-even MER or ROAS for each product or campaign group. This gives the media team a number they can work with every day.
- Measure weekly with blended store data. Total contribution after marketing is the scoreboard. Platform ROAS is just the steering wheel.
- Test incrementality where you can. Holdout tests, pausing a channel in one region, or comparing periods with and without spend show what ads really add.
Returning customers change the picture. A first order that loses a little money can be worth it if buyers come back. Make that case with your own repeat purchase data, not with hope, and decide in advance how long you are willing to wait for payback.
ROAS is fine for comparisons inside one platform, using the same attribution rules. It helps you choose between two ad sets, two creatives or two audiences.
The mistake is using it across platforms, or as proof that marketing is profitable. Those questions need store data and margins.
Paid media is one part of our demand and growth hub. If you want a contribution-based view of your marketing, that is part of the demand work we run.