Saturation curves: why the next dollar is worth less than the last

A saturation curve is how a marketing mix model says that spend has diminishing returns. The family you pick and the range of spend you've actually observed decide more of your budget recommendation than most people realize.

Mike Taylor By Mike Taylor · Updated · 10 min read

A saturation curve shows how the response to a marketing channel flattens as you spend more on it: the first dollars buy the most responsive customers and the cheapest inventory, so every extra dollar adds a little less than the one before. In a marketing mix model it’s the transformation that turns a channel’s spend (usually after adstock) into a contribution with diminishing returns, and it’s what makes it possible to say anything about where the next dollar should go.

In my experience running a growth agency that spent over $10 million a year on Facebook ads, doubling the budget of a channel with a great ROAS rarely doubled its results, because the audience and the auction run out of easy wins. A saturation curve is how a model makes that intuition explicit, and the same idea goes by several names: diminishing returns, response curves, shape effects, or the Hill function, which is the most common curve in today’s open-source tools. I’ll cover the main curve families, how to read marginal against average return, and what happens when you push a curve past the spend you’ve actually observed.

Why the next dollar is worth less than the last one

Diminishing returns is one of the oldest ideas in economics, and I wrote a short introduction to it in the diminishing returns brief. In advertising it shows up for a few overlapping reasons. Platforms show your ads to the people most likely to respond first, so additional budget reaches progressively less interested people. The same people start seeing the ad more often, and the fifth exposure rarely does as much as the first (the reach and frequency page goes into that trade-off). In auction-based channels, bidding for more volume pushes up the price of each impression, and in search there’s a fixed pool of queries you can’t spend your way beyond.

The consequence for modeling is that a straight line is the wrong shape for most channels. A linear model says every dollar returns the same as the average dollar, so it will happily tell you to move the whole budget into whichever channel has the highest coefficient. A saturation curve breaks that, and as I explain in the response curves brief, it’s what makes budget allocation a real optimization problem rather than a ranking.

The Hill function: half-saturation and shape

The Hill function is named after the physiologist A.V. Hill, whose 1910 equation (originally for how haemoglobin binds oxygen) became a standard empirical dose-response model in pharmacology, which is why its midpoint is sometimes called the EC50 (the concentration that gives half the maximum effect). Jin et al. (2017) brought it into media mix modeling in the Google paper that a lot of Bayesian MMM builds on, and it’s now the default in Meridian and Robyn. In its usual form, with xx as the (adstocked) spend:

Hill(x;K,S)=xSxS+KS=11+(x/K)−S\text{Hill}(x; K, S) = \frac{x^S}{x^S + K^S} = \frac{1}{1 + (x/K)^{-S}}

The output runs from 0 towards 1, and the model multiplies it by a coefficient β\beta, which is the channel’s maximum possible contribution. That leaves two parameters with intuitive meanings:

ParameterName in the toolsWhat it controls
KKhalf-saturation; ec in Meridian; set via gamma in RobynThe spend at which the channel delivers half its maximum effect. Bigger K means the channel takes more money to saturate.
SSshape or slope; slope in Meridian; alpha in RobynHow the curve bends. S of 1 or less is concave from the first dollar; S above 1 gives an S-curve with a slow start, a steep middle and a flat top.
β\betachannel coefficientThe ceiling: what the channel would add if spend went to infinity.

Robyn’s version has one twist worth knowing about. Instead of estimating KK directly in dollars, it uses a hyperparameter gamma that places the inflexion point a fraction of the way along the range of the adstocked variable, with recommended bounds of 0.3 to 1, and calls the shape alpha, with recommended bounds of 0.5 to 3. That keeps the search space comparable across channels with very different budgets, but it means a Robyn gamma isn’t a half-saturation spend you can read off directly.

S-curves vs concave curves

The S-shaped version is the one that gets drawn on whiteboards, because it tells a nice story: below some threshold the channel barely registers, then it takes off, then it saturates. That can be true, particularly for awareness media where a campaign below a minimum weight simply doesn’t get noticed. However, the threshold only matters if your data includes spend levels low enough to see it. Most channels in most MMMs have never been run near zero for long, so the bottom of the curve is just as much of an extrapolation as the top.

Jin et al. were candid about the cost of the extra flexibility. They showed that the Hill function’s parameters are often “essentially unidentifiable”: very different combinations of K, S and β can trace nearly the same curve inside the observed range. One of their examples, reproduced below, has two curves whose largest gap anywhere in the observed range is about 0.002, yet by three times the maximum observed spend one is about 20 percent higher than the other. They suggest that a more parsimonious curve with S fixed at 1 is a reasonable alternative when the data can’t support the shape parameter.

Two Hill curves that are almost identical between 0 and 1 and diverge above it
Two Hill curves from Jin et al. (2017) that agree inside the observed spend range (0 to 1) and diverge outside it. Redrawn from the paper's parameters. Source: Jin et al. (2017); Vexpower.

In practice, I’d treat S-curves as something the data needs to earn. If you have periods of genuinely low spend (a channel launch, a dark period, a geo test where some regions got nothing), an S-curve can be estimated. If you don’t, a concave curve is the more honest default, and the choice between them should come with a sensitivity check rather than a shrug.

Logistic, exponential and Michaelis-Menten curves

The Hill function isn’t the only option, and the tools don’t all default to it. These are the families you’ll meet most often:

FamilyFormula (times β)Half-saturationWhere you’ll see it
HillxS/(xS+KS)x^S / (x^S + K^S)KKMeridian, Robyn, Jin et al. (2017), PyMC-Marketing’s HillSaturation
Logistic(1−e−λx)/(1+e−λx)(1 - e^{-\lambda x}) / (1 + e^{-\lambda x})ln⁡3/λ≈1.1/λ\ln 3 / \lambda \approx 1.1/\lambdaPyMC-Marketing’s LogisticSaturation
Exponential1−e−x/k1 - e^{-x/k}kln⁡2k \ln 2Older econometric models and spreadsheets
Michaelis-Mentenx/(K+x)x / (K + x)KKPyMC-Marketing’s MichaelisMentenSaturation; the course’s Northstar case

Despite the name, PyMC-Marketing’s logistic saturation is not an S-curve: it starts at zero and is concave everywhere, and its single parameter λ\lambda is an efficiency rate where larger values saturate faster. Michaelis-Menten is the Hill function with S fixed at 1, and it has the same form as the “reach transformation” Jin et al. borrow from earlier Google work on how reach builds with GRPs. The exponential curve approaches its ceiling faster than either, so at the same half-saturation point it’s flatter at high spend. PyMC-Marketing also ships tanh, log and root saturations, and a log-log model gets diminishing returns a different way, by modeling elasticities rather than a ceiling.

The explorer below lets you compare them on your own numbers. Each family is set by its half-saturation spend so the curves stay roughly comparable when you switch, and the second chart shows the slope of the first, which is the marginal return.

Interactive
Find where the next dollar stops paying

Choose a curve family and tune it, mark the spend range you've actually observed, and set your breakeven marginal ROAS. The second chart is the slope of the first: what the next dollar returns.

Response at current spend
–
Average ROAS at current
–
Marginal ROAS at current
–
Marginal ROAS hits breakeven at
–

Spend and response in $k per week; all numbers are invented defaults for you to replace. Every family is parameterised by its half-saturation spend (the spend that earns half the maximum), so switching family keeps the curve roughly comparable. Logistic is PyMC-Marketing's (1 − e^(−λx)) / (1 + e^(−λx)) with λ = ln 3 ÷ half-saturation. 'Other families' are least-squares fits to your curve inside the observed range only.

Try turning on “Show other families fitted to the observed range”. Each dashed curve is the best fit of another family to your chosen curve, using only the spend you marked as observed. Inside the green band they’re almost indistinguishable. Outside it, and especially at three times the highest observed spend, they can disagree enough to change where the breakeven point lands, which is the whole problem with extrapolating a saturation curve in one picture. With the default Hill curve and an observed range of $20k to $80k, the fitted curves all land within about 2.5 percent of the Hill curve at $50k a week, but at $240k the Hill curve predicts about $267k of response while a Michaelis-Menten curve fitted to the same range predicts about $394k.

Marginal return vs average return

The two numbers people most often confuse come from the same curve. Average return (often reported as ROAS or ROI) divides the channel’s total modeled contribution by its total spend, so it answers “was the money we spent worth it overall?”. Marginal return is the slope of the curve at the current spend, so it answers “what would the next dollar add?”. On any saturating curve the marginal return is below the average, because the average still includes the cheap early dollars.

The course’s lesson on saturation uses a Michaelis-Menten curve with a maximum of £100k and a half-saturation point of £40k (in the invented Northstar case). Moving from £40k to £60k of spend adds £10k of modeled revenue; moving from £160k to £180k adds about £1.82k. The response is still going up in both cases, so earlier spend hasn’t stopped working. What’s changed is how much an extra £20k buys at that level, and that’s why a channel with a strong historical ROAS can still be the wrong place for the next pound.

This is also where the breakeven threshold in the widget comes from. If your contribution margin is 40 percent, a dollar of revenue is worth 40 cents of profit, so a marginal ROAS below 2.5 loses money on the last dollar even if the average ROAS looks healthy. The marginal ROAS page goes deeper on reading the two numbers, and breakeven ROAS covers how to set the threshold from your margins. Meridian reports both ROI and marginal ROI for exactly this reason.

How saturation curves behave outside your data

A response curve can be drawn from zero to infinity, but the data only supports the part you’ve observed. The course lesson on extrapolation uses a Northstar channel that has mostly spent between £20,000 and £80,000 a week, with a planning chart extending the curve to £250,000. The software will draw that line without complaint. Within the observed range, the curve is pinned down by actual weeks of spend and sales; well outside it, the shape comes mostly from the functional form, the priors and the assumption that the audience, prices and creative will stay the same as the budget triples.

That doesn’t mean extrapolation is forbidden, but it does mean the assumptions behind it should be visible. A few habits help. Mark three spend levels on the chart: the historical range, the current level and the proposed level. Ask whether another defensible curve family would give a different answer at the proposed budget (the widget’s “other families” toggle does exactly this). Remember that parameter uncertainty within one model, which a Bayesian posterior will show you, is not the same as uncertainty about the model form or about whether the market changes when you scale. And if the recommendation relies on a region you’ve never spent in, make it a staged move with an incrementality test attached, and agree in advance what result would justify the next step.

Estimating a saturation curve you can defend

The estimation itself is usually done jointly with adstock, since both transform the same variable, and the order matters: Jin et al., Meridian and Robyn all apply adstock first and saturation second by default, so the curve describes accumulated media pressure rather than a single week’s spend (the adstock page covers when the reverse makes sense). In a Bayesian MMM you put priors on the half-saturation point and the shape; in Robyn the hyperparameter search explores alpha and gamma inside their bounds. Either way, the half-saturation point is the parameter most likely to be poorly identified when spend hasn’t varied much, so check how much the posterior moved from the prior.

The most useful single check I know is to vary the curve and see what happens to the decision, rather than to the fit. If a Hill curve, a Michaelis-Menten curve and a logistic curve all fit about equally well but recommend very different budgets, the data hasn’t answered the question yet, and the honest output is a range plus a test. These are the questions I’d ask of any response curve before it goes into a plan:

If you want to practise this on a full case, the Vexpower MMM course has lessons on saturation and extrapolation built around the invented Northstar brand, and the pillar guide to marketing mix modeling shows where the saturation curve fits in the rest of the model. For the planning side, MMM scenario planning covers how to compare budgets once you’ve got curves you trust.

Frequently asked questions

What is a saturation curve in marketing?

A saturation curve describes how the response to a marketing channel flattens as you spend more on it. The first dollars reach the most responsive people and the cheapest inventory, so each additional dollar adds less than the one before. In a marketing mix model the curve is a transformation applied to a channel's spend, usually after adstock, before its contribution is added to sales.

What is the Hill function in marketing mix modeling?

The Hill function is a saturation curve borrowed from pharmacology: response equals x to the power S divided by x to the power S plus K to the power S, multiplied by a maximum effect. K is the half-saturation point, the spend that produces half the maximum, and S is the shape or slope. With S above 1 the curve is S-shaped; with S at or below 1 it is concave from the start. Meridian, Robyn and Google's 2017 MMM paper all use it.

What is the difference between marginal and average return?

Average return divides the total incremental outcome by the total spend, so it describes the whole budget so far. Marginal return is the slope of the response curve at the current spend, so it describes what the next dollar would add. On a saturating curve the marginal return is lower than the average, and it's the marginal number that should drive budget changes.

Is an S-shaped response curve better than a concave one?

Neither is better in general. An S-curve allows a threshold where small budgets do very little, which is plausible for some channels, but it adds a parameter that weekly data often can't pin down. If your spend has never been near zero, the data usually can't tell the two shapes apart, and the choice comes from priors or judgment.

Can you trust a response curve outside the spend you've observed?

Only with care. Inside the observed range the data constrains the curve; outside it, the shape mostly comes from the functional form and the priors. Two curves can agree closely inside your data and disagree substantially at double the spend, so ask for the observed range to be drawn on every planning curve and test large moves in stages.

References

  1. Jin, Wang, Sun, Chan and Koehler (2017), Bayesian Methods for Media Mix Modeling with Carryover and Shape Effects Hill function with half-saturation K and slope S, its origins in pharmacology, the identifiability examples reproduced in the figure, and the adstock-then-shape order.
  2. Meridian documentation: model specification Hill(q, ec, slope) definition and the default Hill-after-adstock order.
  3. Robyn documentation: Features Hill alpha and gamma, recommended bounds alpha 0.5-3 and gamma 0.3-1.
  4. PyMC-Marketing API: logistic_saturation Formula (1 - e^(-lam x)) / (1 + e^(-lam x)) and half saturation at ln(3)/lam.
  5. PyMC-Marketing API: saturation components List of available saturation classes, including Hill, Michaelis-Menten, tanh, log and root.
  6. Meridian documentation: ROI, mROI and response curves Further reading on average vs marginal ROI in Meridian's outputs.
Mike Taylor
Mike Taylor

I've built marketing mix models for Monzo Bank, Booking.com, Time Out, The AA and others, advised Google, Appsflyer and Recast on MMM, and teach marketing mix modeling on LinkedIn Learning. Before that I co-founded a 50-person growth marketing agency. I write the Vexpower MMM course.

Keep reading

Learn MMM by doing itThe Vexpower course walks through thirty lessons on one invented brand, with simulators, Python labs and a decision case you can defend.
See the course