← All posts Attribution

Why ROAS holds steady while contribution margin erodes

5 Oct 2026 · 6 min read · Twinslytics
Find the ROAS-vs-Margin Leak01Blended ROASLooks healthy02Margin % TrendCheck for decline03Order-Level JoinRevenue minus all …04Channel/CampaignNot just company avg
A diagnostic path from blended metrics down to the order-level truth, since ROAS alone can mask real profit loss.

Your dashboard says ROAS is holding at 3.2x. Finance says margin dropped two points last quarter. Both are true. ROAS measures revenue against ad spend — it says nothing about discounts, shipping costs, payment fees, returns, or the fully loaded cost of the product you just sold. You can hit your ROAS target every single month while your contribution margin bleeds out, and most teams don't catch it until the P&L forces the conversation.

This happens because ROAS and contribution margin answer different questions. ROAS asks "did this ad spend generate revenue efficiently." Contribution margin asks "did this order actually make money after everything it cost to deliver it." A blended 3.2x ROAS can hide a product mix shift toward low-margin SKUs, a creative strategy that's training customers to wait for discount codes, or a shipping cost structure that's eating every dollar of incremental revenue. Here's how to actually find the leak.

Start with the revenue-to-margin gap

Pull two numbers side by side for the last six months: blended ROAS and blended contribution margin as a percentage of revenue. If ROAS is flat or climbing and margin percentage is declining, you have a structural problem, not a media buying problem. This single chart should be the first slide in every marketing review, and most teams don't build it because ROAS lives in the ad platform and margin lives in finance's spreadsheet. Nobody owns the join.

If you can't produce this breakdown in under a day, that's the first finding. Your data pipeline is optimizing for the metric that's easiest to pull, not the one that matters.

Check what's actually in the cart

Product mix shift is the most common silent margin killer. Marketing optimizes toward whatever converts cheapest, and discounted or low-margin SKUs almost always convert cheaper because the price is lower and the offer is stronger. Your acquisition engine doesn't know or care about gross margin per unit — it cares about click-through rate and conversion rate. Left alone, it will happily scale the SKU that makes you the least money.

If your best-performing campaigns by ROAS are also your highest-discount campaigns, you've found where the leak is hiding. The ad platform calls this efficient. Your margin line calls it expensive.

Audit the cost side nobody's watching

ROAS has exactly one cost input: ad spend. Contribution margin has five or six, and most of them drift upward quietly while attention stays fixed on the ad account. Shipping rates change. Carriers add surcharges. Return rates creep up as you push into new audiences less familiar with the product. Payment processing fees shift with order composition. None of this shows up in Meta or Google's reporting, because none of it is their job to report.

Any one of these drifting half a point is invisible. All of them drifting together over two quarters is exactly how margin disappears while ROAS stays flat.

Separate new customer economics from repeat

Blended ROAS and blended margin both hide a critical split: what you make on the first order versus what you make over the customer's lifetime. A lot of brands are intentionally running first-order contribution margin near zero or negative because they're underwriting acquisition against expected repeat purchases. That's a legitimate strategy. It's also indistinguishable from a broken strategy if you're only looking at blended numbers.

This is where a lot of "ROAS looks fine" situations actually originate. The spend was underwritten against a repeat-purchase assumption built eighteen months ago, the assumption quietly stopped holding, and nobody re-ran the math because the top-line ROAS number never moved.

Fix the reporting, not just the campaigns

The root cause behind most of this isn't bad media buying — it's that contribution margin isn't sitting next to ROAS in the same report, calculated with the same rigor, updated on the same cadence. If margin lives in a monthly finance close and ROAS lives in a real-time ad dashboard, you will always catch the problem a month after it started compounding.

ROAS tells you the ad account is doing its job. It was never built to tell you whether the business is making money. Those are different questions, and if your reporting only answers one of them, you'll keep discovering the gap in finance meetings instead of in your dashboard — three months after it was cheap to fix.

Further reading

283/408 sessions reattributed — Fixed attribution, returned conversions to Google Ads

Want your attribution reconciled like this?

We patch the join between clicks and closed revenue so bidding optimizes on what actually happened, not what the checkout referrer claims.