Adbuffs

← Blog
Incrementality for D2C

The profit truth behind ROAS

A great ROAS can still lose you money. Here are four real cases from D2C accounts where the reported number said one thing and the bank account said another — and how to measure the gap before it costs you.
Why is my high ROAS still losing money?

Because ROAS counts revenue that landed near your ad. Incrementality counts revenue your ad actually caused. Those are two different numbers — and the gap between them is exactly where your profit leaks out.

Every performance marketer has had the meeting. The dashboard shows a campaign at 3x, 4x, sometimes higher. Everyone nods. Then the P&L closes for the month and the money isn’t there. Nobody can explain it, so the answer becomes “attribution is hard” and the team moves on.
It isn’t that attribution is hard. It’s that ROAS answers a question you didn’t ask. ROAS tells you how much revenue was recorded against an ad. It does not tell you how much of that revenue would have happened anyway — without the ad, without the spend, without you.
That second number is the only one that pays your bills. It’s called incrementality: the revenue that exists because of the marketing and would not exist without it. A platform can report a beautiful ROAS on revenue that was always going to convert. You pay for the click. The customer was already walking to the till.
At Adbuffs, we measure this every day across the D2C and eCommerce accounts we run. Below are four cases where the reported ROAS and the real, caused revenue pulled apart — in both directions. Names are withheld; the mechanics and the measured outcomes are exactly as they happened.
Case 01 — Cannibalisation

The soap that stole its own sales

A personal-care brand, scaling well — around ₹40 lakh of new revenue per day. The hero was a body scrub, sold entirely through their D2C site. They never ran a rupee of ads on Amazon, Flipkart, Meesho, Nykaa, Purplle, Blinkit, Zepto or Instamart for this product. Every marketplace sale came off the back of the D2C demand. That detail matters — keep it in mind.
They launched a sibling product: a body soap from the same line. We turned on soap ads. Soap performed beautifully on the dashboard — a higher reported ROAS than the scrub itself. By every number a normal account watches, it was a winning launch.
Except the scrub started sliding. And as the scrub softened on D2C, its pull into the marketplaces softened with it. The new product was supposed to add revenue. Instead it was swapping revenue — eating its own sibling — while booking a flattering ROAS for the privilege.
Here is the mechanism, because it’s the part most teams never name. On an established account, when you launch a near-identical product, the platform optimises to the cheapest available conversions. The cheapest conversions are the people it has already reached — your existing, warm buyers. So the new ad gets served to demand that already existed, converts it, and reports it as fresh revenue at a low CAC. The CAC looks low because it was stolen from a product already running in the same account.
The trap
A low CAC on a new, similar product is often not new demand. It’s the same demand, re-credited. The dashboard rewards you for cannibalising yourself.
The real damage showed up outside the box. This brand’s normal halo was clean and measurable: every ₹100 of D2C revenue pulled roughly ₹120 across the marketplaces and quick-commerce — a 1 : 1.2 ratio, and because no marketplace ads ran, that ratio was attributable to one thing only, the D2C engine. During the cannibalisation, the halo didn’t just soften. It inverted — down to 1 : 0.9. The D2C product had stopped amplifying the marketplaces and started dragging them down.

The diagnosis, then the fix

First we killed the soap ads. The scrub recovered. That confirmed it — soap wasn’t adding, it was stealing. The harder question was the second one: how do you run the soap and get genuinely incremental revenue from it?
We tried what the platform recommends for exactly this — incremental attribution settings, exclusion of existing buyers, partnership placements. With two products this close in price and positioning, none of it delivered real incrementality. The platform kept finding its way back to the warm pool.
What worked was separation. We built the soap its own world: a separate store with the soap as the single product, a separate ad account, separate Facebook and Instagram pages, separate tracking. The soap could no longer reach into the scrub’s audience because, as far as the platform was concerned, that audience didn’t exist in its account. This is now part of how Adbuffs structures any product launch inside a shared ad account.

How we knew it was real, not just moved

“You just shifted spend to a new site” is the obvious objection. Four things rule it out, and they all moved the right way at once:

Flat spend, more revenue.

If it were a pure swap, total revenue holds and only the attribution moves. Total revenue grew on the same budget. That alone is the incrementality proof.

02

The scrub's marketplace trend recovered.

The sliding halo on the hero product turned back up — within the first seven days — and was fully back by day 30.

03

Brand search rose everywhere.

Branded queries climbed across Amazon, quick-commerce and Google — the brand's Google Trends topic trended up. New demand, not recycled demand.

04

The soap held its own marketplace trend.

It kept its independent traction while adding revenue — not borrowing from the scrub to do it.

What we learned
On an established account, the platform will re-serve a near-identical new product to demand that already exists and call it new. When two products are that close, the platform’s own “incremental” tools won’t fix it. Separation will. This now dictates how we structure product launches inside an ad account before we ever spend a rupee.

Case 02 — Attribution theft

The offer ad that was a measurement parasite

Bottom-of-funnel static offer ads were the favourite creative of 2022–23 — a hard offer, a price, a buy button. One consumer brand ran a strong, genuinely value-packed offer this way, around ₹30k/day on Meta at roughly 2.1x reported ROAS. The naive read: switch it off and you lose ₹60k+ a day off the back end.
We switched it off. For more than three weeks, to be sure we weren’t missing a slow effect. Within seven to ten days it was obvious: nothing was lost. Total revenue stayed flat — including the marketplaces, which actually nudged up about 1% on the same spend.
But it didn’t just fail to add. It was actively harming the rest of the account. The offer ad had been stealing attribution from the genuinely good campaigns running alongside it — sitting at the bottom of the funnel where conversions are easiest to claim, and absorbing credit that belonged to the ads doing the real work of bringing people in.
Once it was gone, those campaigns finally looked as strong as they actually were. So we scaled them. We pocketed the ₹30k saving first, then reinvested it and more — because the account had become measurably more efficient. Revenue rose.
It wasn’t a wasteful ad. It was a measurement parasite — making your best campaigns look worse so it could look good.
Case 03 — Two ROAS numbers

The 1.8x that was really 0.6x

This one isn’t a one-off. We see it daily, on every established account, and it’s written into the Adbuffs standard operating procedure. We read two ROAS numbers side by side, not one:
Reported ROAS — what the platform shows, last-touch, measured inside its own box. And a first-click ROAS — built from properly UTM-tagged campaigns, pulled by first-user attribution in GA4, imported into our own dashboard so both numbers sit next to each other on the same screen.
Here’s the belief that drives why we bother. The job of advertising is to bring net-new traffic into the ecosystem. Every click should be someone who wasn’t already coming. If an ad isn’t bringing net-new people in, it isn’t acquiring — it’s harvesting demand that already existed and charging you for it.
Launch a new ad on an established account and the reported ROAS often looks great early — say 1.8x — because the platform serves it to warm audiences first. But pull its first-click ROAS and you’ll frequently see 0.6x. That gap is the whole story: the ad brought almost no net-new traffic. It recycled people already in your world.
So ROAS distorts in both directions. It over-credits the warm-audience harvest. And it under-credits the ad that’s genuinely starting demand — the creative, hook or offer that’s bringing strangers into your ecosystem, the one last-touch buries because the first click happened too far up the funnel to get the credit.

One truth underneath all four

Four different stories, one mechanism. Reported ROAS counts conversions that would have happened anyway — and misses the ones that wouldn’t.

Soap cannibalisation

ROAS looked great → it was fake. A near-identical product ate its sibling. Caught by the halo collapsing 1.2 → 0.9.

02

The offer ad

2.1x looked solid → it was stealing credit from your real campaigns. Cutting it revealed and freed them.

03

Warm-audience harvest

1.8x reported, 0.6x first-click → almost no net-new traffic. A fatigue trap dressed as a winner.

04

The buried acquirer

The flip side of 03 — first-click reveals the ad genuinely starting demand that last-touch under-credits. The one you should scale.

Where Marketing Mix Modelling comes in

Everything above is incrementality measured one channel, one product, one ad at a time — holdouts, on/off tests, two-number reads, halo tracking. That works, and most brands should start there because it’s cheap and fast.
But once you’re running several channels at once — Meta, Google, Amazon, quick-commerce, influencer, the lot — and they all influence each other, you can’t isolate every effect with on/off tests alone. You’d be switching things off constantly. This is where Marketing Mix Modelling (MMM) earns its place.
MMM is a statistical model that looks at all your spend and all your outcomes over time and estimates how much each channel actually contributed — including the lag, the saturation, and the overlap. It’s how you answer “what would happen to total revenue if I moved ₹10 lakh from Meta to Amazon” without having to run the experiment blind. It doesn’t replace the simple incrementality tests; it sits on top of them, for the questions a single on/off test can’t reach. See the FAQ for when a brand is ready for one.

How to measure what your ads actually caused

You don’t need a data-science team to start. You need the discipline to stop trusting one number. In order of leverage:

Watch the back end, not the dashboard.

Total business revenue — D2C plus every marketplace and quick-commerce SKU — against total spend. If reported ROAS climbs while total revenue stays flat, the ROAS is fiction.

02

Run on/off tests on your "best" campaigns.

Switch off the highest-reported-ROAS campaign for 2–4 weeks (not 3 days). If total revenue doesn't fall, that campaign was harvesting, not acquiring.

03

Read two ROAS numbers, always.

Reported ROAS next to a first-click / first-user ROAS from GA4. The gap tells you whether an ad brought net-new traffic or recycled your existing audience.

04

Track your halo ratio.

If a product's marketplace sales depend on your D2C demand, measure ₹ returned across marketplaces per ₹100 of D2C revenue. A falling halo is an early warning the dashboard can't show you.

05

Separate products that cannibalise.

When two products are close in price and positioning, the platform's "incremental" settings won't stop the overlap. A separate store and account will.

06

Graduate to MMM when channels collide.

Once you have several interacting channels and on/off tests can't isolate effects, a model gives you the trade-offs across the whole mix.

The one line to remember
ROAS is measured inside the box. Incrementality is measured outside it. The money is always outside the box.

When reported ROAS is fine

This isn’t “ignore ROAS.” On a single-product brand with one channel and no marketplace presence, reported ROAS and incremental ROAS are close enough to run on day to day. ROAS is a useful operational signal for pacing and creative comparison. The danger is treating it as the truth about profit — especially the moment you add a second similar product, a second channel, or a marketplace that feeds off your D2C demand. That’s when the two numbers split, and the split is where the money hides.

FAQ

Why is my high ROAS still losing money?
Because ROAS counts revenue recorded against an ad, not revenue the ad caused. A campaign can post a strong ROAS on customers who were already going to buy — through brand search, a sibling product’s demand, or organic intent. You pay for conversions that would have happened anyway. The fix is to measure incrementality: what changes in total revenue when the ad is on versus off.
Three practical methods, cheapest first. Run an on/off test — switch a campaign off for 2–4 weeks and watch total business revenue, not the dashboard. Read a first-click ROAS from GA4 alongside the reported ROAS to see whether the ad brought net-new traffic. And track your halo into marketplaces if your D2C demand feeds them. For multiple interacting channels, use Marketing Mix Modelling on top of these.
MMM is a statistical model that estimates how much each channel actually contributed to total revenue over time — accounting for lag, saturation and overlap between channels. It works well for eCommerce brands running several channels at once, because it answers budget-allocation questions that single-channel on/off tests can’t. It’s not a starting point; it’s what you graduate to once you have multiple channels influencing each other.
When you’re spending meaningfully across several channels that affect one another — typically Meta plus Google plus marketplaces or quick-commerce — and on/off testing each one in isolation has become impractical. Before that, simple incrementality tests give you most of the answer at a fraction of the cost.
On an established account, the platform serves a new ad to warm, already-reached audiences first, producing a flattering early ROAS on demand that already existed. Once that warm pool is exhausted, performance collapses and the ad needs constant creative refresh. A first-click ROAS read at launch tells you whether the ad is actually bringing net-new traffic — the ads that do are far less likely to fatigue.
Yes. When two products are close in price and positioning, the platform optimises the new ads toward your existing buyers — cannibalising the first product while reporting a low CAC. We’ve seen this collapse a brand’s marketplace halo. The platform’s built-in “incremental” settings often don’t fix it; separating the new product into its own store, account and tracking does.
About the author. Abhishek Maity co-founded Adbuffs in 2019. Adbuffs is a performance marketing agency for D2C and eCommerce brands, managing ad spend across 250+ brands in India and internationally. The cases above are drawn from accounts the agency runs, where measuring incrementality — the gap between reported and real ROAS — is part of the daily work.
If your dashboard says you’re winning and your P&L disagrees, that gap is measurable, and it’s usually where the next round of profit is hiding.
Case 01 figures are from a single client account, anonymised by request. Cases 02 and 03 describe patterns we observe repeatedly across accounts; the specific figures are representative, not a single audited result.

Other Posts that you may Like

15 MIN READ

Meta only sees 1% of your customers

The other 99% of your business is dark to its AI: every in-store sale, every phone order, every offline purchase. Here’s what it cost one brand to stop feeding that signal back, and why we treat it as infrastructure, not attribution.

Avatar photo Abhishek Maity, Co-founder, Adbuffs
14 MIN READ

Why a 1.7x ROAS beats a 2x in India

There’s no magic ROAS target. The number you need is one you can calculate — and the brands winning here are profitable at a lower ROAS than the ones quietly going broke at a higher one.

Avatar photo Abhishek Maity, Co-founder, Adbuffs
16 MIN READ

The profit truth behind ROAS

A great ROAS can still lose you money. Here are four real cases from D2C accounts where the reported number said one thing and the bank account said another — and how to measure the gap before it costs you.

Avatar photo Abhishek Maity, Co-founder, Adbuffs
Scroll to Top