← All posts Marketing analytics

Why ROAS can rise while contribution margin falls

24 Aug 2026 · 6 min read · Twinslytics
ROAS vs Contribution Margin: Why They DivergeWHAT ROAS IGNORESCOGS & shipping costsDiscounts & promo codesReturns & chargebacksFulfillment costsWHAT FIXES ITSplit promo vs full-price revenueNet down returns before reportingTrack contribution margin per ord…Attribute true landed costs
ROAS and contribution margin measure different things, so they can move in opposite directions at the same time.

Your dashboard says ROAS hit 4.2x last month. Your CFO says margin dropped for the third straight quarter. Both numbers are correct. That's the problem.

ROAS measures revenue against ad spend. It says nothing about what it cost you to make, ship, return, or discount that revenue. You can grow ROAS every month while your business quietly bleeds cash, because the metric was never built to catch that. It's an efficiency ratio for one line item in a much bigger cost stack, and treating it like a profit signal is how teams end up optimizing themselves into a margin hole.

ROAS ignores everything but ad spend

ROAS is revenue divided by media spend. That's it. It doesn't know your product costs went up, your carrier raised rates, or that a third of last month's "revenue" came back as returns. It doesn't know you gave away 20% off to close the sale. Every one of those costs hits contribution margin directly. None of them touch the ROAS calculation.

This is why a channel can post a beautiful ROAS while contributing almost nothing to the bottom line. A campaign selling a low-margin SKU at a steep discount can generate revenue efficiently and profit barely at all. If your reporting stops at "revenue over spend," you'll keep feeding budget to the exact channels and campaigns that are hollowing out margin, because on paper they look like your best performers.

Discounts inflate revenue, not profit

Promo codes, site-wide sales, and bundle deals all boost the top of the ROAS equation. Revenue goes up, spend often stays flat or even drops as the discount does the conversion work instead of the ad dollar, and ROAS looks fantastic. Contribution margin sees the opposite: the discount comes straight off the top before you even get to COGS.

Teams that don't split promo revenue from full-price revenue in their reporting end up with a blended ROAS that hides which chunk of the win was profitable and which chunk was margin given away to hit a revenue number. Over time, if promo-driven revenue keeps growing as a share of total revenue, ROAS can climb steadily while contribution margin per order falls just as steadily. It's not a coincidence. It's the same discount showing up as a positive in one metric and a negative in the other.

Returns show up late, if at all

Most attribution and ad platform reporting locks in revenue at the point of purchase. Returns, chargebacks, and refunds happen days or weeks later, often after the reporting window has closed and the campaign has been marked a success. If your data pipeline doesn't reconcile order data against return data on a rolling basis, your ROAS reporting is running on gross revenue that never actually arrived.

Categories with high return rates — apparel with sizing issues, anything ordered in multiple variants "to try," high-consideration purchases people second-guess — are the worst offenders here. A campaign can look like your top performer for three weeks straight and then get quietly gutted by returns that never make it back into the ROAS calculation, but absolutely show up in contribution margin once real costs are booked.

Fulfillment costs move, ROAS doesn't notice

Shipping rates, warehousing fees, pick-and-pack costs, and payment processing fees all shift over time, sometimes month to month. None of these live inside your ad platform's reporting. ROAS treats every dollar of revenue as equally valuable regardless of what it cost to fulfill the order that generated it.

This gets worse at the SKU level. A $60 order for a bulky, heavy item might cost twice as much to ship and fulfill as a $60 order for something small and light. Ad platforms and most attribution tools don't differentiate. They see two $60 conversions and report the same efficiency for both, even though one is dragging down contribution margin and the other is carrying it.

If your data pipeline isn't pulling in real fulfillment and COGS data at the order or SKU level, you literally cannot see this gap. You need a warehouse where order-level revenue joins cleanly with order-level cost — product cost, shipping cost, payment fees, return provisions — so you can calculate contribution margin per order, per campaign, per SKU. Without that join, you're stuck comparing a media efficiency metric against a P&L metric and wondering why they disagree.

Attribution models overcount channels

Last-click and platform-reported attribution routinely take credit for revenue that would have happened anyway, or that another channel actually drove. Retargeting and branded search are the usual suspects — they mop up demand created elsewhere and post huge ROAS numbers for doing very little marginal work. Scaling budget into these "great ROAS" channels can genuinely increase spend without increasing real incremental revenue, let alone profit.

When you layer this on top of everything above, you get a specific and common failure mode: teams shift budget toward channels with the best reported ROAS, those channels are disproportionately retargeting and brand campaigns with high overcounted attribution, the incremental revenue is smaller than reported, the margin on what revenue does show up is thin because of discounting and returns, and the net effect is spend goes up, blended ROAS goes up, and contribution margin goes down. Every individual metric in the chain can be technically accurate and the overall trend can still be actively harmful.

Fix the metric, not the campaign

The instinct when margin drops is to blame creative fatigue, audience saturation, or rising CPMs. Sometimes that's real. But before you touch a single campaign, check whether you're even measuring the right thing. A few fixes matter more than any bid adjustment:

ROAS isn't wrong, it's incomplete. It was designed to answer one question — how efficiently did this dollar of ad spend turn into revenue — and it answers that question fine. The mistake is asking it a different question: is this business making money. Only contribution margin, built from a pipeline that actually connects cost data to revenue data at the order level, can answer that. Until you build that connection, you'll keep hitting your ROAS targets and wondering where the profit went.

Further reading

400% blended ROAS target — Diagnosed a ROAS collapse, mapped the path to 400%

Want to know what your ROAS is actually doing?

We reconcile ad spend, platform conversions, and closed revenue into one number your team can spend against.