Contribution-Margin ROAS: The Only ROAS That Survives a CFO Review
The 60-second version
Revenue ROAS answers a question finance never asked. Here is how to rebuild it on contribution margin — with the cost lines people forget, and the SQL that computes it.
- What happened, in one line
- What to do about it this week
- What you can safely ignore
Marketing reports a 3.4x ROAS. Finance reports the marketing channel lost money. Both are looking at the same campaign, the same month, the same orders.
The disagreement is not about attribution. It is that revenue ROAS answers a question finance never asked. Revenue is the top line; the business is run on what is left after the costs of producing that revenue. A ratio built on the top line can be excellent while the thing underneath it is unprofitable, and the gap between the two is entirely predictable once you write it down.
The two ratios
Same Campaign, Two Ratios
Data JourneyRevenue ROAS
Attributed revenue divided by ad spend. Easy to compute, available in every dashboard, and blind to every cost between the sale and the bank.
Contribution-margin ROAS
Contribution margin divided by ad spend. Answers whether the campaign generated more gross profit than it consumed in spend.
The gap
Every rupee of COGS, shipping, payment fees, returns and discounts sits between the two. None of it is visible in the first number.
The definition is short:
Contribution-margin ROAS = Contribution Margin ÷ Ad Spend
Contribution Margin = Revenue − All Variable Costs
And the interpretation is sharper than revenue ROAS, because it has a hard threshold. Below 1.0, the campaign consumed more cash than the gross profit it produced. There is no equivalent line on a revenue ROAS: 3.4x is good for one business and catastrophic for another.
Contribution-margin ROAS is breakeven ROAS rearranged. Breakeven ROAS asks "what revenue multiple do I need at this margin?" Contribution-margin ROAS asks "at the revenue I got, did the margin cover the spend?" Same arithmetic, opposite direction. If you already set targets from breakeven ROAS, this is the after-the-fact check on whether you hit them.
The cost lines people leave out
The whole difficulty is in the word variable. Here is the full list, in roughly the order teams forget them.
| Cost line | Typically | Usually forgotten? |
|---|---|---|
| Cost of goods sold | 30–60% of revenue | No — everyone includes this |
| Shipping (outbound, if absorbed) | 3–8% | Sometimes |
| Payment gateway fees | 1.5–3% | Yes |
| Discounts and promo codes | 5–15% | Yes — often already netted, or double-counted |
| Returns and refunds | 5–20% | Yes |
| Return shipping and restocking | 1–4% | Almost always |
| Packaging and fulfilment labour | 2–5% | Almost always |
| Platform / marketplace commission | 0–20% | No, where it applies |
| Chargebacks and fraud loss | 0.2–1% | Yes |
Each line is small. Together they routinely account for 15–25 percentage points of margin beyond COGS — the difference between a campaign that clears its bar and one that does not.
Fixed costs do not belong here. Salaries, rent, software, the agency retainer — none of these change with one more order, so including them turns contribution margin into net margin and makes the ratio useless for a marginal decision. The question contribution margin answers is "should I buy one more customer?", and only costs that vary with that customer belong in it.
The worked example
A 3.4x campaign that lost ₹1.16 lakh
The breakeven check: at a 26% contribution margin, breakeven revenue ROAS is 1 ÷ 0.26 = 3.85x. The campaign delivered 3.4x. The shortfall is 12%, and the entire year's marketing strategy was built on the belief that anything above 3x was profitable.
Computing it from your warehouse
The important structural choice is to compute contribution margin per order, then aggregate. Applying an average margin rate to total revenue is the shortcut, and it goes wrong whenever your product mix moves — which is exactly when you most need the number.
Show query
Ordering by profit_after_ads ascending puts your losses at the top of the result. It is a small thing and it changes what people do with the report: a list sorted by ROAS descending invites admiring the winners, and a list sorted by absolute loss ascending invites fixing something.
Two things that make it more honest still
Blend in the repeat purchase, carefully
A first order at 0.88x contribution ROAS can still be a good acquisition if the customer comes back. The defensible version of this argument uses observed repeat behaviour on a bounded window, not a modelled lifetime:
Show query
Note the maturity filter. Including cohorts younger than the window mixes customers who have had 90 days to repeat with customers who have had nine, and drags the average down for reasons that have nothing to do with the campaign.
Report the three tiers together
Three ROAS Numbers, One Report
Reporting HierarchyPlatform ROAS
What the ad account shows. Used only inside the platform, for bidding. Overstated by double-counting and modeled conversions, and it is fine that it is.
Revenue ROAS (reconciled)
Your own net revenue over your own spend. Removes platform optimism, keeps the familiar shape of the number.
Contribution-margin ROAS
Gross profit over ad spend. The only one with a hard threshold, and the only one finance will accept as an answer.
Showing all three side by side does something a single number cannot: it makes the size of each adjustment visible. When the platform says 4.6x, your books say 3.4x, and contribution says 0.88x, everyone can see where the money went, and the conversation stops being about whose number is right.
Frequently asked questions
Gross margin or contribution margin?
Contribution. Gross margin deducts only COGS, which is the largest cost but rarely more than two-thirds of the total variable cost. The 15–25 points between gross and contribution margin are exactly the points that decide whether a campaign clears its bar.
Should the agency retainer be in there?
Not in contribution margin — it is fixed, not variable. But it should be in the denominator of your channel efficiency numbers, because it is genuinely a cost of running that channel. Keep it out of the per-order margin and in the total marketing spend line.
How do I handle a return that happens next month?
Two conventions, and the only mistake is mixing them. Order-date net restates the original month as returns come in — better for judging a campaign, because the return is charged to the campaign that caused it. Return-date net never restates — better for tying to accounting. Pick one, write it down.
What if I do not have per-order COGS?
Start with a category-level average margin rate, applied per line item, rather than one business-wide rate. It is meaningfully better than a blended rate the moment your campaigns push different product mixes — which is always. Getting true per-SKU cost into the warehouse is worth doing, but do not let its absence stop you computing anything.
Does this apply to lead generation?
Yes, with a substitution: contribution margin per closed deal, multiplied by lead-to-close rate, gives expected contribution per lead. The arithmetic is identical; the uncertainty is larger because the close rate is estimated rather than observed.
The summary
- Revenue ROAS has no threshold. Contribution-margin ROAS has one: 1.0. Below it, the campaign consumed more cash than the gross profit it created.
- The gap between them is not attribution — it is COGS, shipping, payment fees, returns, return logistics, packaging and fulfilment. Individually small, collectively 15–25 points of margin.
- Fixed costs stay out. The question is marginal: should I buy one more customer?
- Compute margin per order and then aggregate, never by applying an average rate to total revenue.
- If you argue for repeat purchase, use an observed bounded window with a maturity filter — not a modelled lifetime.
- Report platform, reconciled-revenue and contribution ROAS together, so the size of each adjustment is visible.
Breakeven ROAS Calculator
Enter your gross margin to find the minimum ROAS at which a campaign stops losing money — and the target ROAS at a chosen profit goal.
Chinmay Raibagkar
About author →Founder of DataLens AI. He helps non-technical teams read their ad and database numbers with confidence — which number to trust, what to do next, and what to ignore.