Marketing Mix Model Calculator
Channel spend and attributed revenue turned into marginal return, then a split that equalises it, with the saturation you assume stated on every projection.
Spend, the month $57,000.00
Attributed revenue $172,000.00
Blended return 3.02× on spend
Saturation assumed 60% of the ceiling already bought, except where a row gave its own
What each channel is doing
Paid search
spend $18,000.00, 31.6% of the budget
revenue $74,000.00 at 4.11× average
next unit buys $1.05 of revenue
saturation 90% from the row
ceiling implied $82,222.22
Meta ads
spend $24,000.00, 42.1% of the budget
revenue $62,000.00 at 2.58× average
next unit buys $1.46 of revenue
saturation 65% from the row
ceiling implied $95,384.62
YouTube
spend $9,000.00, 15.8% of the budget
revenue $15,000.00 at 1.67× average
next unit buys $1.09 of revenue
saturation 55% from the row
ceiling implied $27,272.73
Affiliates
spend $6,000.00, 10.5% of the budget
revenue $21,000.00 at 3.50× average
next unit buys $2.68 of revenue
saturation 40% from the row
ceiling implied $52,500.00
Ranked by what the next unit buys
1. Affiliates 2.68× marginal, 3.50× average
2. Meta ads 1.46× marginal, 2.58× average
3. YouTube 1.09× marginal, 1.67× average
4. Paid search 1.05× marginal, 4.11× average
note Paid search has the best average return and Affiliates has the best marginal one, which is the disagreement that decides where money moves
Same budget, split to equalise the margin
Paid search $15,250.37 -$2,749.63
Meta ads $23,461.03 -$538.97
YouTube $5,426.03 -$3,573.97
Affiliates $12,862.57 +$6,862.57
revenue modelled $177,096.52
against now $172,000.00, which is the attributed revenue: the curves are anchored on it
lift $5,096.52, 3%, for no extra spend
every channel then at 1.50× on its next unit
If the budget changed
70% of now $39,900.00 → $146,989.10, last unit at 2.06×
85% of now $48,450.00 → $163,238.80, last unit at 1.75×
100% of now $57,000.00 → $177,096.52, last unit at 1.50× ← now
115% of now $65,550.00 → $188,914.34, last unit at 1.28×
130% of now $74,100.00 → $198,992.56, last unit at 1.09×
Carryover
half-life 2.0 months
decay a period 70.7%
total effect 3.41× the immediate one, spread over about 9 months
what it means a period of spend keeps working after the period ends, so this period's revenue is partly last period's advertising and the split above understates anything with a long tail
The reallocation moves money until every channel's next unit buys the
same 1.50×. That rule holds whatever the curve shape: if a unit moved
from one channel to another buys more revenue, the current split is not
the best one. The size of the lift does depend on the curve, and the
curve is an assumption.
Marginal return, not average. Affiliates buys 2.68× on its next unit and
Paid search buys 1.05×, and a channel can have the best average return
while being the worst place for the next pound. That is what saturation
means.
Attributed revenue is not caused revenue. Platform-reported conversions
count people who would have bought anyway, and every platform counts the
same sale. Adding up what the dashboards claim usually exceeds actual
revenue, sometimes by a lot, and this arithmetic inherits whatever that
error is.
The honest test is a holdout. Turn a channel off in some regions and not
others, or halve it for a month, and measure the difference. One geo
experiment tells you more about incrementality than a year of attributed
conversions, and it is the only input here that cannot be argued with.
Brand search is the usual place this goes wrong. It shows a spectacular
return because it captures demand created elsewhere, which makes it look
like the best marginal channel when much of it would convert
organically.
With a 2.0 month half-life, roughly 70.7% of a period's effect lands
after the period. Channels differ: search is nearly immediate, brand
advertising has a tail of months, and treating them the same overstates
the fast ones.
A real mix model regresses years of weekly data, with seasonality,
price, distribution and a baseline for the sales that happen without
advertising. This has none of that. It is the reallocation argument made
explicit, which is useful for deciding what to test next and not a
substitute for measuring.
The saturation figures in the rows are doing the work. A channel
described as nearly flat gets money taken out of it whatever its average
return, so those numbers deserve more argument than the spend does: the
honest source for them is a spend test, not a feeling.
Diminishing returns are not the only constraint. Audience size, creative
fatigue, minimum viable budgets and the time it takes to learn a new
channel all bite before the curve does, so a suggestion to triple one
channel is a direction rather than an instruction.
Output is valid and updates as you type.
Fix the highlighted fields to update the output.
The channel with the best return is usually the worst place for the next pound, and a table of ROAS cannot show you that. Return is an average over everything you already spent. What you need before moving budget is the marginal figure: what one more pound buys, which falls as a channel approaches the size of its audience.
This takes the spend, the attributed revenue and how saturated you think each channel is, and prints what the next pound buys on each. Then it splits the same budget so that the last pound spent on every channel buys the same amount, which is the one conclusion here that does not depend on the curve: if moving money from one channel to another buys more revenue, the split you have is not the best one.
What is measured is your spend and your attributed revenue. What is assumed is the saturation. The output says which is which every time it prints a projection.
How to use
- Paste one channel a line: name, spend, attributed revenue.
- Add a fourth number, the percentage of that channel’s ceiling you think today’s spend already buys. Paid search on brand terms is usually high, a channel you started last month is low.
- Set the fallback saturation for rows that did not say.
- Leave the budget at zero to split what you already spend, or put in a different figure to see that split too.
- Set a carryover half-life if some channels keep working after the period ends.
The fourth number is the one worth arguing about. Without it, every channel shares one saturation figure, the marginal ranking comes out identical to the ROAS ranking, and the tool says nothing you did not already know.
Example
Four channels, $57,000 a month, with paid search near its ceiling:
Spend, the month $57,000.00
Attributed revenue $172,000.00
Blended return 3.02× on spend
What each channel is doing
Paid search
revenue $74,000.00 at 4.11× average
next unit buys $1.05 of revenue
saturation 90% from the row
Affiliates
revenue $21,000.00 at 3.50× average
next unit buys $2.68 of revenue
saturation 40% from the row
Ranked by what the next unit buys
1. Affiliates 2.68× marginal, 3.50× average
2. Meta ads 1.46× marginal, 2.58× average
3. YouTube 1.09× marginal, 1.67× average
4. Paid search 1.05× marginal, 4.11× average
note Paid search has the best average return and
Affiliates has the best marginal one
Same budget, split to equalise the margin
Paid search $15,250.37 -$2,749.63
Meta ads $23,461.03 -$538.97
YouTube $5,426.03 -$3,573.97
Affiliates $12,862.57 +$6,862.57
revenue modelled $177,096.52
lift $5,096.52, 3%, for no extra spend
every channel then at 1.50× on its next unit
Paid search has the best return on the report and the worst claim on the next dollar. That inversion is the entire point, and it only appears because somebody said paid search was at 90 percent.
Pitfalls
Average return tells you about the past, marginal return about the next decision. A channel at 4× that is saturated and a channel at 2× that is not are ranked in the opposite order for the question “where should the next thousand go”.
Attributed revenue is not caused revenue. Every platform counts the same sale, and platform-reported conversions include people who would have bought anyway. Add up what the dashboards claim and the total usually exceeds actual revenue. This arithmetic inherits whatever that error is: the split it suggests is only as good as the attribution feeding it.
Brand search is the standard trap. It shows a spectacular return because it captures demand created elsewhere, so it looks like the strongest channel while much of it would have converted organically. If one channel’s saturation figure deserves to be 95 percent, it is that one.
The saturation figures are assumptions, and the lift depends on them. The direction of the recommendation is robust; the size is not. Get the numbers from a spend test rather than a feeling: hold one channel flat and step another up 30 percent for a month, and see whether revenue follows.
A holdout beats every model here. Turn a channel off in some regions and not others, or halve it for a month. One geography experiment tells you more about incrementality than a year of attributed conversions, and it is the only input in this whole exercise nobody can argue with.
Diminishing returns are not the binding constraint most of the time. Audience size, creative fatigue, minimum viable budgets and the weeks it takes to learn a new channel all bite first. A suggestion to double a small channel is a direction to test, not an instruction to execute on Monday.
There is no baseline here. Some sales happen with no advertising at all, and a real mix model estimates that baseline before attributing anything. Without it, every channel’s contribution is overstated by whatever share of revenue would have arrived anyway.
Carryover is not the same across channels. Search is nearly immediate; brand advertising has a tail of months. One half-life for everything overstates the fast channels, which is the opposite of the error most teams make with attribution windows.
Compatibility
Runs in the browser. Your spend figures are parsed locally, nothing is uploaded and nothing is stored.
The response curve is the saturating exponential, revenue = ceiling × (1 − e^(−spend/scale)). It has exactly the two properties the argument needs and no free shape parameter to invent: revenue rises with spend, and each unit buys less than the one before. Anchoring it on your observed spend and revenue plus the saturation figure fixes both constants, and the curve reproduces your current revenue exactly, which is why the “against now” line matches your input.
The allocation bisects on the common marginal return rather than climbing a hill, because the total spend is monotone in that target: the bracket cannot be wrong and the answer does not depend on a starting guess. The test suite asserts the properties rather than the numbers: every channel ends at the same marginal return, a larger budget earns more at a lower margin, equal steps of spend buy less each time, and the suggested split never earns less than the split you started with.
Carryover is reported rather than modelled. A half-life of h periods means a geometric decay of 2^(−1/h), and the total effect of one period’s spend is 1/(1 − decay) times the immediate one. It is printed as context for the split, not folded into it, because spreading spend across periods properly needs the weekly data this tool does not ask for.