What is marginal return?
Marginal return — also called marginal ROAS — is the return on the next euro, not the average euro: the extra contribution margin the model expects if a channel's spend rose slightly from where it is now. Average metrics — true ROAS, MER, MMM contribution — describe money already spent; marginal return is the one built for the question budgets actually ask, which is where to put the next increment.
The wording matters, which is why the column is not called marginal ROAS in the
app. This figure is measured against contribution margin, not revenue, so it
breaks even at 1.0× for every merchant: a euro in, a euro of margin back. A
revenue-based marginal ROAS breaks even at 1 ÷ margin rate instead — 4.55× on
a 22%-margin catalogue — so a channel reported at "marginal ROAS 3.0" by a tool
with no cost data can be losing 34 cents on every euro while its dashboards
point up and to the right.
Formula
marginal return = d(contribution margin) / d(spend), at the channel's recent spend level
Worked example
A channel's true ROAS reads a comfortable 2.4×, but the MMM puts its marginal return at 0.7× — the channel is deep into diminishing returns, and the next €1,000 would bring back about €700 of margin. Meanwhile a smaller channel shows 1.1× average but 1.6× marginal. Shifting budget from the first to the second lowers the blended average and raises total margin — the two figures pointing in opposite directions is the normal case, not a contradiction.
How Saldo Metrics computes it
Each MMM run fits a response curve per channel: weekly spend passes through
adstock (carry-over; the ridge method picks the decay from a grid by fit quality,
the PyMC method uses a fixed decay) and a Hill saturation curve before entering
the regression. The regression is fitted against contribution margin, not
revenue, so its slope is already net of COGS, shipping and any marketplace fees.
The Marginal return column reads that curve's slope at the channel's recent
spend — its mean weekly spend over the last few complete weeks (four by default),
taken to its steady-state adstocked level — times the adstock multiplier
1/(1−θ) (a euro spent today keeps working in later weeks, and the slope credits
that tail). v_mmm_channel_contribution computes this from the latest run per
method and flags a spend level outside the range the fit learned from. When
there is no recent week of spend to read, the column falls back to the slope at
the fitted window's average spend, which each run stores in
fact_mmm_channel_contribution; the ridge-vs-PyMC comparison shows that stored
figure for both methods.
A marginal return below 1× means the model expects the next euro on that channel to come back as less than a euro of margin. That is not a weak result — it is spend that destroys money at the margin, and it can sit underneath a channel whose average return still looks healthy. 1.0× is the break-even line, and it is 1.0× for a 60%-margin catalogue and a 12%-margin one alike.
How sure is the number?
Each figure comes with a 90% range, from refitting the model 200 times on resampled weeks. A channel's figure counts as a decision number only when that whole range — widened for revenue without a product cost — sits on one side of 1.00×. Otherwise it is shown as an estimate, marked "can't tell from break-even".
Why it matters
Every average-return metric overrates saturated channels: a channel's first thousand euros can be spectacular while its fifty-first is worthless, and the average blends the two. Marginal return ranks channels by what the next increment earns, which is the only ranking that budget reallocation should follow.
Common mistakes
- Reallocating on averages when marginal figures exist. A high true ROAS with a low marginal return is precisely the "stop scaling this" signal.
- Comparing it against a revenue ROAS target. A 2× hurdle borrowed from a revenue-based tool is the wrong bar here; on margin, the bar is 1×.
- Reading marginal return as valid far from current spend. It is a local slope; doubling a channel's budget moves it to a different point on the curve where the slope is lower. Scale in steps, refit, re-read.
- Overtrusting the point estimate. It inherits every fit limitation — thin spend variation, collinear channels — and the ridge and PyMC methods can disagree; check the method comparison before a big move.
Where you see this in the app
Marketing → MMM, as the Marginal return column of the channel table and in the ridge-vs-PyMC method comparison.