Your ROAS is 4.3. Your mate down the pub runs a similar business and he's doing 2.1. You're winning.
Except you're not.
You're running a forty-per-cent-margin DTC brand. He's running a sixty-per-cent-margin subscription service. At the same spend, the same ROAS, his business generates twice the actual profit per new customer. Your dashboard looks better. His bank balance is better. The metric is lying to you.
This is the trap Perpetual Traffic flagged last week, and it's more common than most operators will admit. The industry has spent fifteen years building worship around a single number, and that number was never the point.
The Metric That Became a Religion
ROAS (return on ad spend) became the default language of digital marketing because it was easy to calculate and easy to benchmark. Four dollars back for every one in? That's a four ROAS. Sounds good. Compare it to your mate's 2.1 and you're winning.
The problem is that ROAS ignores everything downstream of the click. It doesn't care about your margin. It doesn't care about your retention. It doesn't care whether the customer who clicked spends £40 once or £400 over twelve months. It just counts the gross revenue attributable to the channel.
In a world where acquisition costs are low and margins are fat, this doesn't matter much. You're probably fine. But that world is gone. CPMs have climbed. Margins have compressed. Retention has become the differentiator. And in that world, a business optimised for ROAS is a business optimised for the wrong variable entirely.
What Good Actually Looks Like
The operators who understand this have moved to contribution margin per acquisition, or CMPA. Not what comes back from the channel: what actually drops to the bottom of the business after the cost of fulfilling that sale, the cost of acquiring that customer, and the expected lifetime value of that relationship.
That number changes everything. A campaign with a 2.1 ROAS on a sixty-per-cent-margin subscription product is far more valuable than a campaign with a 4.3 ROAS on a forty-per-cent-margin one-shot purchase. But a ROAS-only dashboard shows you the 4.3 and tells you to scale it.
This is also why the obsession with "optimising to profit" inside an ad account can quietly destroy a business. Every tweak that improves your click-to-conversion rate improves your ROAS. But if that optimisation reduces qualified traffic volume, you've made the channel more efficient while making the business smaller. That's not winning. That's rearranging deckchairs.
The Real Discipline Is Strategic Patience
The counterintuitive move: is to keep scaling a channel even as its ROAS softens, if the absolute contribution is still growing. Diminishing returns aren't automatically failure. They're a natural curve. The question is whether you're still on the upward part of the total contribution slope, not whether you've hit peak efficiency on the curve.
The other move most operators won't make: accept a lower ROAS in exchange for higher customer lifetime value. Subscription, membership, retention mechanics. These almost always look worse on ROAS than one-shot purchases. They get deprioritised, underinvested, dismissed. And they are almost always the right answer in a world where CAC keeps rising.
What You Should Do This Week
Pull three numbers for every campaign you run. Not just ROAS.
- Gross margin on sales attributed to that campaign
- Fully loaded cost to fulfil each order (product, shipping, handling, retries, refunds)
- Expected first-year value of a customer from that campaign
You may find that the campaign you're about to cut because its ROAS softened is actually your most profitable channel. And the one you're about to double because it has a beautiful ROAS is quietly burning the business.
The Close
ROAS became the metric because it was easy. The businesses that win know that easy metrics measure easy things. The discipline isn't in your ad account. It's in understanding what your marketing actually does to the whole economics of your business. That requires numbers most dashboards don't show you by default.