Metric Explainers

Contribution-Margin ROAS: The Only ROAS That Survives a CFO Review

By Chinmay Raibagkar·August 28, 2026·11 min read·Some SQL

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 Journey
Stage 1Marketing's number
Revenue 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.

₹34,00,000 ÷ ₹10,00,000 = 3.4x
Stage 2Finance's number
Contribution-margin ROAS

Contribution margin divided by ad spend. Answers whether the campaign generated more gross profit than it consumed in spend.

₹8,84,000 ÷ ₹10,00,000 = 0.88x
Stage 3Not attribution
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.

3.4x looks great. 0.88x loses money.

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 lineTypicallyUsually forgotten?
Cost of goods sold30–60% of revenueNo — everyone includes this
Shipping (outbound, if absorbed)3–8%Sometimes
Payment gateway fees1.5–3%Yes
Discounts and promo codes5–15%Yes — often already netted, or double-counted
Returns and refunds5–20%Yes
Return shipping and restocking1–4%Almost always
Packaging and fulfilment labour2–5%Almost always
Platform / marketplace commission0–20%No, where it applies
Chargebacks and fraud loss0.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

Line by line
Attributed revenue₹34,00,0001,700 orders at ₹2,000 AOV
Ad spend₹10,00,000Revenue ROAS = 3.4x
COGS at 45%−₹15,30,000The only cost most ROAS conversations include
Shipping at ₹90/order−₹1,53,000Free shipping over ₹1,500, so absorbed on most orders
Payment fees at 2.2%−₹74,800Gateway and UPI charges
Returns at 12%−₹4,08,000Revenue reversed on returned orders
Return logistics−₹1,83,600Reverse shipping plus restocking on 204 returns
Packaging and fulfilment−₹1,66,600₹98 per shipped order
Contribution margin₹8,84,00026% of revenue — not the 55% the COGS line implied
Contribution-margin ROAS0.88xThe campaign consumed ₹1,16,000 more than it produced
Nothing here is exotic. Every line is a real cost on a real order, and each one individually looks too small to matter. The campaign would have needed a 3.85x revenue ROAS to break even — it delivered 3.4x, and a dashboard reading 3.4x looks like a success.

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.

Order-Level Contribution Margin, Then Campaign ROAS

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:

90-Day Contribution ROAS Including Repeat Orders

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 Hierarchy
Tier 1
Platform 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.

Platform revenue ÷ platform spend
Tier 2
Revenue ROAS (reconciled)

Your own net revenue over your own spend. Removes platform optimism, keeps the familiar shape of the number.

Net revenue ÷ ad spend
Tier 3
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.

Contribution margin ÷ ad spend

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.
Free tool

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.

CR

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.