How Marketing Mix Modeling Actually Works: Adstock, Saturation, Priors

· 13 min read

Marketing mix modeling regresses aggregate sales on aggregate marketing spend, but a plain regression gets advertising wrong. So MMM bolts on four corrections: adstock (ads decay over weeks, not instantly), saturation (the tenth dollar returns less than the first, modeled with a concave Hill curve), a baseline plus seasonality (most sales would happen with zero marketing), and Bayesian priors calibrated from experiments (to pin down an under-identified model). MMM is correlational by construction. It only approaches causal ROI when you calibrate it with lift tests. Meta's Robyn and Google's Meridian put the full build in open source, so a competent team can now do this without a six-figure vendor.

Start with the regression, then fix it four times

Most explanations of marketing mix modeling stop at the concept. MMM is a top-down statistical model that estimates each channel's contribution to sales without touching user-level data. True, and useless if you want to know whether the number is any good. That is the definition, not the mechanism.

Here is the mechanism. MMM is a regression, and everything hard about it is the set of corrections you bolt onto that regression so it resembles how advertising actually behaves.

The naive version is what you would write on a whiteboard in thirty seconds: take weekly revenue, regress it on weekly spend per channel, read off a coefficient for each channel, call that coefficient the channel's effectiveness. It is wrong in four specific ways, and MMM is the accumulated fix for all four.

Google's Jin, Wang, Sun, Chan, and Koehler put the diagnosis plainly in their 2017 paper on Bayesian media mix modeling: advertising usually has lag effects and diminishing returns that are hard to capture with linear regression. So they propose flexible functional forms for the carryover and the shape of the response, and estimate the whole thing with a Bayesian approach that folds in prior knowledge. That paper is the spine of this article. The four corrections below are the same four moves, named.

FIX 1
Adstock
Ads decay over weeks, they don't spend and vanish.
FIX 2
Saturation
The tenth dollar returns less than the first.
FIX 3
Baseline + seasonality
Most sales happen with zero marketing.
FIX 4
Priors + calibration
Experiments pin down an under-identified model.

Fix 1: adstock, because last week's ad still sells this week

A campaign you run this week keeps moving sales next week. Someone sees a connected-TV spot on Monday, thinks about it, buys the following Thursday. A naive regression, which lines up this week's spend against this week's sales, credits that later purchase to whatever happened to be running when the order landed, not to the spot that actually planted it.

Adstock is the operation that fixes this. It takes raw spend and leaks it forward in time on a decay curve, producing an effective exposure the model can regress on. The simplest form is geometric decay with one parameter, the decay rate. Robyn also offers two Weibull forms, the CDF and the PDF, each with two parameters, which let the decay have a flexible shape and even a delayed peak, so the response can build before it fades rather than starting at its maximum.

A WORKED EXAMPLE · ADSTOCK

A DTC brand spends $100k on connected-TV in week 1, then nothing for three weeks. With a geometric decay rate of θ = 0.6, the effective exposure the model sees is not one spike and three zeros. It is $100k in week 1, $60k in week 2, $36k in week 3, and $21.6k in week 4. The tail is real, and it belongs to the CTV spot.

A naive regression would credit week 1 sales to CTV and file weeks 2 through 4 under baseline, so it would understate the channel and mistime when the money worked. The decay parameter is the thing the model is estimating. Get it wrong and every ROI number for that channel is off, both in size and in timing.

Fix 2: saturation, because the tenth dollar does less than the first

A linear coefficient says every dollar in a channel returns the same amount. Advertising does not work that way. Early spend reaches the people most ready to buy. Later spend reaches people who need more convincing, then people who were going to buy anyway, then nobody new. The return per dollar bends down.

You model that bend by passing adstocked spend through a concave or S-shaped curve before it enters the regression. Robyn uses the Hill function, which has two parameters: alpha controls the shape of the curve, anywhere between a plain exponential decline and a full S-shape, and gamma controls where the curve inflects, meaning where the channel starts to bend over. Fit those two on the history and the model has learned each channel's diminishing-returns profile instead of pretending there isn't one.

The single most useful thing this produces is the gap between average and marginal return.

A WORKED EXAMPLE · SATURATION

Question: paid search runs at $50k/week and returns about $4 per $1 spent. Marketing wants to know what happens if we push it to $150k/week.

LINEAR MODEL SAYS
  • ROAS at $50k: 4.0×
  • ROAS at $150k: 4.0×
  • "Still 4.0. Spend away."
HILL CURVE SAYS
1.8×
marginal ROAS on the dollars from $50k to $150k, even though average ROAS still reads about 3.1×. The channel is bending, and the next dollar earns far less than the account average implies.

The dollar you are about to spend is a marginal dollar, so marginal ROAS, not average ROAS, is what should decide the next budget move. Only a saturation curve exposes that gap.

Fix 3: the baseline, because most sales owe marketing nothing

Turn off every campaign and you still sell. Brand equity, distribution, price, repeat buyers, weather, holidays, the macro trend of your category. That floor is the baseline, and it is usually the largest single term in the model. If you do not estimate it, and estimate seasonality on top of it, marketing steals credit for sales it never caused. A model with no baseline will hand your entire Christmas peak to whatever channel happened to be spending in December.

So MMM carries control variables that have nothing to do with your media: seasonal dummies or Fourier terms, price and promotion, distribution, competitor activity where you can get it, and a trend. The media coefficients only get to explain what is left after the baseline and controls have taken their share. This is also where daily data hurts you. Daily sales are noisy, and the noise does not carry marketing signal, which is why the practitioner consensus lands on weekly.

Fix 4: priors and calibration, because the model is under-identified

Here is the uncomfortable part. Feed two or three years of weekly data and a dozen correlated channels into this model and there is no single best answer. Many combinations of adstock rates, saturation curves, and coefficients fit the history about equally well. Practitioners call this equifinality, and it is why Robyn deliberately surfaces a set of candidate models rather than one. The model is really a family, and picking a member of that family is a judgment call.

Bayesian priors are how you pin it down. Instead of letting the data alone choose from infinitely many equally-good fits, you tell the model what you already believe about each channel before it looks at the history, and let the data update that belief. The strongest version of this comes from experiments.

Google's Zhang, Wurm, Li, Wakim, Kelly, Price, and Liu described the formal method in their 2024 paper on calibrating media mix models with Bayesian priors. The trick is to reparameterize the model so that a channel's ROAS is itself a parameter. Once ROAS is a parameter, you can set its prior distribution directly from an incrementality experiment. That is the exact mechanism by which a lift test corrects an MMM.

A WORKED EXAMPLE · CALIBRATION

The problem: an uncalibrated MMM reports Meta at 5.0 ROAS. But Meta spend is flighted alongside the brand's seasonal promo calendar, so the model over-credits Meta for sales the promo drove. This is omitted-variable bias, and no amount of staring at the regression reveals it.

UNCALIBRATED MMM
5.0×
inflated by the promo calendar it can't see
GEO LIFT TEST
2.2×
true incremental ROAS, measured by experiment

Set an informative prior centered near 2.2 on Meta's ROAS parameter and re-fit. The posterior settles around 2.6×, pulled toward the experiment, with a tighter uncertainty band. The experiment is the ground truth. The MMM extends that truth to the channels and periods you could not test. That division of labor is the honest role of each method.

The one honest weakness: multicollinearity versus omitted-variable bias

There is a structural trap under all of this, and a senior reader will trust the rest of the piece more if it is named. MMM's inputs are channels that rise and fall together. Brand campaigns get flighted alongside search. Promotions run across paid social and email at once. That correlation between predictors is multicollinearity, and it has a nasty property: it barely hurts prediction, but it wrecks attribution. The model can still forecast total sales, yet it cannot cleanly say which correlated channel earned the credit.

The obvious fix, dropping one of the two collinear variables, walks you straight into the opposite failure. Now a real driver is missing from the model, so its effect leaks into whatever correlated variable remains. That is omitted-variable bias, it produces endogeneity, and it breaks any causal claim you wanted to make. Aryma Labs calls multicollinearity one of the enemies of MMM and frames the choice as a predict-or-explain dilemma. You are trapped between two failure modes, and the honest response is to report ranges and posteriors rather than single point estimates, and to lean on calibration to break the tie. This is exactly why fix 4 is not optional.

The tooling: what changed in 2020 and again in 2025

The econometrics here is decades old. What changed is that the full build is now open source, so a competent team can run MMM without a six-figure vendor engagement.

Meta open-sourced Robyn in 2020 under an MIT licence. It uses ridge regression, which regularizes to handle the correlated media variables, the three adstock options and the Hill saturation described above, a multi-objective evolutionary optimizer called Nevergrad to tune the hyperparameters, and a downstream gradient optimization for budget allocation. Runge, Skokan, Zhou, and Pauwels documented the approach in their 2024 introduction to Robyn's open-source method.

Google open-sourced Meridian to everyone on 29 January 2025, announced by Harikesh Nair, Senior Director of Data Science and Engineering at Google. Meridian is fully Bayesian, built on TensorFlow, and works on geo-level hierarchical data because, in Google's words, geo data contains more statistical information and improves the media-effect estimates. It builds in adstock and saturation, and it can use reach and frequency rather than only impressions, on the reasoning that ten impressions could mean ten people reached once or one person reached ten times. Meridian supersedes Google's earlier LightweightMMM. Google reports testing it with hundreds of brands, with Finder, an Australian financial-services company, saying the model gave it more confidence in YouTube's contribution. Treat that as illustrative, not a hard adoption statistic.

Open-source MMM libraries, compared

Four mature options. None requires a vendor licence; all require a data scientist.

Robyn
MAINTAINER
Meta Marketing Science
LANGUAGE
R
APPROACH
Ridge regression with multi-objective Pareto optimization
ADSTOCK + SATURATION
Built-in (Geometric, Weibull)
EXPERIMENT CALIBRATION
Native — Conversion Lift and geo experiments
BEST FOR
Practitioners with R fluency who want fast, opinionated MMM with tight Meta-spend integration.
Meridian
MAINTAINER
Google
LANGUAGE
Python (TensorFlow Probability)
APPROACH
Bayesian hierarchical
ADSTOCK + SATURATION
Built-in (Geometric, Hill saturation)
EXPERIMENT CALIBRATION
Native — experimental priors first-class
BEST FOR
Modern Bayesian MMM with strong calibration story. Successor to Google's LightweightMMM.
Orbit
MAINTAINER
Uber AI
LANGUAGE
Python (Stan or PyMC backend)
APPROACH
Bayesian time-series (DLT, KTR), extensible to MMM
ADSTOCK + SATURATION
Custom — bring your own
EXPERIMENT CALIBRATION
Manual via priors
BEST FOR
Teams already using Orbit for forecasting who want to extend into MMM. Less opinionated than the other three.
PyMC-Marketing
MAINTAINER
PyMC Labs + community
LANGUAGE
Python (PyMC)
APPROACH
Bayesian — full PyMC flexibility
ADSTOCK + SATURATION
Built-in (Geometric, Weibull, Delayed)
EXPERIMENT CALIBRATION
Native via Bayesian priors
BEST FOR
Teams with probabilistic-programming background who want maximum customization.

Free to run, expensive to operate. All four libraries are open-source and well-maintained. The cost isn't the licence — it's the data engineering, the 2–3 years of clean weekly history, and the data scientist hours required to calibrate, validate, and re-run quarterly. Self-hosting MMM only makes sense above ~$500K/yr in marketing spend.

Sources: each project's official documentation · Last reviewed by mbuzz: July 2026

The word "open source" carries a trap of its own. Free to run is not free to operate. The real cost of MMM is not the licence. It is the data engineering, the two to three years of clean weekly history, and the data-scientist hours to calibrate, validate, and re-run every quarter. Both Robyn and Meridian assume a competent modeler on the other side of the keyboard.

What MMM can and cannot honestly claim

Keep the hierarchy of measurement methods explicit, because this is where teach separates from pitch. MTA is user-path correlational. MMM is aggregate correlational. Only experiments measure incrementality. MMM's claim to causality is borrowed from the experiments used to calibrate it, never manufactured by the regression. Never write that MTA measures incrementality, and never treat MMM and MTA as interchangeable.

With that fixed, here is the balanced view.

What MMM is good at What MMM cannot do
Seeing all spend in one frame, including offline, brand, and channels you cannot tag Sub-channel granularity: which creative, keyword, audience, or placement worked
Surviving cookie loss, iOS privacy, and consent gaps, since it needs no user-level data In-flight decisions; refreshes are quarterly at best, so it cannot answer "should I change this campaign today"
Approximating portfolio-level incrementality once calibrated with experiments Identifying a channel with too little spend variation in its history
Producing a defensible marginal-ROAS curve for budget allocation Delivering a single certain number; point estimates carry wide uncertainty by construction

The counterargument deserves a straight answer. If MMM is correlational and uncertain, why run it at all? Because it is the only privacy-durable, channel-complete, cookie-independent way to see every dollar of spend in a single frame, and when calibrated with experiments it is the strongest available approximation of incrementality at the portfolio level. That is a real claim with real bounds. It is also why measurement-mature teams run MMM alongside experiments and MTA, each doing the job it is honest about, rather than asking any one of them to be the whole answer.

Sources

Further reading

Key Takeaways

  • MMM is a regression on aggregate sales, plus four corrections that make it resemble how advertising actually behaves.
  • Adstock models the carryover of ads over time; saturation (a Hill curve) models diminishing returns; without both, a linear coefficient mistimes and overstates every channel.
  • The baseline is what would sell with zero marketing. If you don't model it and seasonality, marketing steals credit for sales it never caused.
  • MMM is correlational by construction. It approaches causal ROI only when calibrated with incrementality experiments via Bayesian ROAS priors.
  • Robyn (R, ridge regression) and Meridian (Python, fully Bayesian, geo-level) are free and open source, but both assume a competent modeler.
How much data do I need before MMM is worth doing?
The working consensus among practitioners is roughly two to three years of weekly data, about 100 or more observations, and around ten observations per variable you want to estimate. Weekly, not daily, because daily data adds noise without adding signal. This is convergent practitioner guidance rather than a single authoritative study. If you are under two years old, MMM outputs are unstable and you are better served by experiments and directional multi-touch attribution until you accumulate the history.
Robyn or Meridian, and do I need a data scientist?
Robyn is Meta's, written in R, using ridge regression with an evolutionary hyperparameter search. Meridian is Google's, written in Python on TensorFlow, fully Bayesian, and works at geo level with reach and frequency. Both are open source and free. Both assume a competent modeler. Open source does not mean no expertise required. If nobody on the team can read the model and judge the priors, the output is a number you cannot defend.
Does MMM actually measure incrementality, or is it fancier correlation?
Correlation by default. MMM estimates associations between aggregate spend and aggregate outcomes. It approaches incrementality only when you calibrate it with lift tests, formally by setting the prior on a channel's ROAS from an experiment. The experiment is the ground truth. MMM extends that truth to the channels and periods you could not test. Its claim to causality is borrowed from the experiments used to calibrate it, never a property of the regression itself.
How do I reconcile MMM ROAS with what my ad platforms report?
Platforms over-credit themselves, often 1.5 to 3 times [VERIFY: cite source for 1.5-3x range before publish], from last-touch bias and view-through claims. MMM typically lands lower and is the more defensible portfolio number because it sees all spend in one frame. But MMM also needs experimental calibration before you retire the platform figure. Treat the platform number as a within-platform optimization signal, not a portfolio truth.
What can MMM not tell me?
Sub-channel granularity: which creative, keyword, audience, or placement worked. It sees paid search, not this ad group. It cannot make real-time or in-flight decisions, since refreshes are quarterly at best. And it cannot identify a channel with too little spend variation in its history. Naming these boundaries is part of using MMM honestly.
Why bother with MMM if it is correlational and uncertain?
Because it is the only privacy-durable, channel-complete, cookie-independent way to see all spend, including offline, brand, and channels you cannot tag, in one frame. When calibrated with experiments it is the strongest available approximation of incrementality at the portfolio level. That is a real, bounded claim, and it is why measurement-mature teams run MMM alongside experiments and MTA rather than instead of them.
Holly Mehakovic
Holly Mehakovic

Co-Founder, mbuzz

Holly Mehakovic is Co-Founder of mbuzz. With 10+ years in marketing including roles at Westpac, Avon, and Forebrite, she's obsessed with making measurement actually useful.

Harvard Extension School Forebrite Westpac Avon

How mature is your marketing measurement?

The free Measurement Maturity Assessment shows where you stand, where you're exposed, and what to fix first. 10 questions, 3 minutes.

Take the Assessment

Ready to try server-side attribution?

Set up in 10 minutes. Free up to 30K records/month.