How to Set Adstock and Saturation Priors Without Lift Tests
No lift tests yet? What Meridian's default priors assume, how Robyn's hyperparameter ranges compare, and a two-fit check showing which channel results the prior produced.
On this page
- What do Meridian's defaults assume when there is no incrementality data?
- Robyn states the same beliefs as hyperparameter ranges
- Which channel facts justify a tighter carryover prior?
- How should the saturation curve be handled with no experiment behind it?
- Without historical lift tests, the ROI prior does most of the work
- The check that shows whether the data or the prior produced each result
- Which channels should be tested first?
- Sources
To set adstock and saturation priors without incrementality tests, keep the carryover and curve priors close to their documented defaults, tighten them only where a fact about the channel supports it, and spend most of your care on the ROI prior, which the result leans on hardest when data is thin. Then fit the model twice. Our position is that a marketing mix model built with no experiments is defensible once every channel result carries a label saying whether the data or the prior produced it, and that the same label shows where the first incrementality test should go. The documentation quoted below is as it read on October 7, 2026.
What do Meridian's defaults assume when there is no incrementality data?
With no incrementality data, the adstock and saturation priors in an MMM built on Meridian are the defaults below, which the default priors page from Google lists with a rationale for each.
| Parameter | Default prior | What it assumes |
|---|---|---|
alpha_m, adstock decay | Uniform(0, 1) | No view on carryover. The stated rationale is "Uninformative to allow data to inform the decay rate." |
ec_m, half-saturation point | TruncatedNormal(0.8, 0.8, 0.1, 10) | A mean near one, where one places half-saturation at the median of the non-zero media units per capita |
slope_m, Hill slope | Deterministic(1) | Concave Hill curves only. The slope is fixed because it is "Difficult to learn because of identifiability reasons." |
roi_m, channel ROI | LogNormal(0.2, 0.9) | A prior mean ROI of 1.83, with 80% of ROIs between 0.5 and 6.0 |
A uniform decay prior commits to nothing. The fixed slope and the shared ROI distribution, whose median is 1.22, commit to a good deal, and the calibration guide from Google describes the defaults as "moderately informative". A model run on defaults has already taken a view on ROI for you.
Robyn states the same beliefs as hyperparameter ranges
In Bayesian media mix modeling with no experiments or incrementality data, Google Meridian expresses adstock and saturation priors as probability distributions, and Robyn expresses the same beliefs as hyperparameter ranges for its optimizer to search. Robyn fits a ridge regression, which its own documentation notes is equivalent to a Bayesian regression with a normal prior.
The features page from Meta offers rule-of-thumb ranges for geometric adstock, drawn from weekly models: "TV has tended to have adstock between 0.3 - 0.8, OOH/Print/Radio has had 0.1-0.4, and Digital has had 0.0 - 0.3." The next sentence matters as much: "This is anecdotal advice so please use your best judgement when building your own models." For the Hill curve, the recommended bounds are c(0.5, 3) for alpha, which moves the curve between C-shape and S-shape, and c(0.3, 1) for gamma, which sets the inflexion point.
We read a range as a flat prior with hard walls: a decay rate outside c(0, 0.3) is never chosen, however strongly the data argues for it. Robyn also holds an implicit belief about effect size. Its business error objective, DECOMP.RSSD, "represents the difference between share of spend and share of effect for paid media variables". The calibration objective, MAPE.LIFT, "is activated when calibrating", so with no experiment the search balances prediction error against a preference for effect shares that resemble spend shares.
Which channel facts justify a tighter carryover prior?
We tighten a decay prior only for a reason that someone outside the modeling team would accept. Three kinds of fact meet that bar.
- Purchase cycle. Robyn's documentation observes that expensive products such as cars or credit are unlikely to be bought directly after an ad, especially through offline channels, and it recommends Weibull PDF adstock for products with a longer conversion window.
- Media format. The Robyn ranges above separate TV from print, radio and out-of-home, and all of those from digital.
- Where the effect lands in the window. The adstock guide from Google recommends binomial decay when a significant proportion of a channel's lagged effects persist into the latter half of the effect window and geometric decay otherwise, with a warning attached: "Misapplication of the binomial decay curve can result in an underestimation of short term effects."
In Meridian the change is a custom prior on alpha. The same guide suggests Beta(1, 3), which puts more mass near zero and encourages faster decay, or Beta(3, 1), which puts more mass near one and encourages slower decay, and it recommends plotting the result with MediaEffects.plot_adstock_decay to confirm it matches your intuition. A platform's attribution window fails our bar, because it is a reporting setting that says little about how long an ad keeps working.
How should the saturation curve be handled with no experiment behind it?
Of the adstock and saturation curve priors in an MMM with no prior incrementality data, the saturation curve deserves the lightest touch, because it is the part aggregate data pins down least. Meridian's defaults already concede the point. The slope is fixed, and on the half-saturation parameter Google writes that when a channel is far under-saturated (ec above 10) or far over-saturated (ec below 0.1), "the data does not really contain information about the half-saturation point anyway."
One channel fact does justify narrowing the curve without an experiment, and it is reach and frequency data. Robyn includes a curve calibrator, robyn_calibrate(), which Meta labels beta. It fits Hill curves to cumulative reach and frequency data, on the hypothesis that the reach 1+ curve "serves as a reasonable lower boundary for gamma" and that a higher-frequency curve, reach 10+ in its sample dataset, marks the upper one. Meta recommends leaving alpha flexible.
Where no such data exists, we leave the curve priors at their defaults and read the fitted response curve only across the spend levels the business has run.
Without historical lift tests, the ROI prior does most of the work
Setting priors in a marketing mix model without historical lift test data is mainly a decision about ROI, because ROI is the number the business acts on. Google's calibration guide treats experiments as one input among several: "When possible, you can and should use domain knowledge to inform your priors." It adds, "In practice, you almost always have some intuition", with the example that a causal ROI of 50 is improbable for most channels, and it accepts honesty about ignorance: "If your intuition about a channel's performance is weak, setting a weak prior (one with a large standard deviation) is acceptable."
Our practice is a single shared ROI prior across channels unless a documented reason sets one apart, such as a result from an earlier model or an industry benchmark you trust. Meridian supplies two helpers for building one, lognormal_dist_from_mean_std and lognormal_dist_from_range, and the guide recommends plotting any prior and examining its percentiles.
An early paper on this kind of model spells out the stakes. Jin and co-authors, in a 2017 paper published by Google Research, reported from simulation studies that "prior distributions have a big impact on the posteriors when the sample size is small and may lead to biased estimates". Three years of weekly national data is 156 rows, and we treat that as small.
The check that shows whether the data or the prior produced each result
Fit the model twice on the same data with only the ROI prior changed, then compare each channel's posterior. Meridian automates a single-fit version. The Prior Posterior Shift for ROI check, described on the health checks page from Google, tests the mean, median and first and third quartiles of every paid channel's ROI and returns a REVIEW status when any channel shows no significant shift from its prior. The page says the check is "only supported when ROI priors are used", and we found no equivalent check there for the decay or half-saturation parameters. The plot behind it reaches further: in the API reference from Google, plot_prior_and_posterior_distribution takes a parameter argument that defaults to roi_m and is described as the "Model parameter name to plot", which we read as covering alpha_m and ec_m.
A second fit adds what one fit cannot show, which is how far each answer travels when the prior moves. In the hypothetical example below, fit 1 uses the default ROI prior, LogNormal(0.2, 0.9), with its median of 1.22. Fit 2 uses LogNormal(0.9, 0.9), an alternative we chose for illustration, with a median of about 2.46. Prior dependence is our own ratio: the change in a channel's posterior median ROI divided by the 1.24 change in the prior median. Every channel figure is invented.
| Channel | Share of spend | Posterior median ROI, fit 1 | Posterior median ROI, fit 2 | Prior dependence | Spend share × dependence |
|---|---|---|---|---|---|
| Paid search | 40% | 2.1 | 2.2 | 0.08 | 0.03 |
| Paid social | 30% | 1.5 | 2.0 | 0.40 | 0.12 |
| TV | 25% | 1.3 | 1.5 | 0.16 | 0.04 |
| Podcast | 5% | 1.3 | 2.4 | 0.89 | 0.04 |
Paid search and TV barely moved, so the data produced those results. Podcast moved almost one for one with the prior, which fits Google's remark about channels with little information in the data: "Channels with low spend are particularly susceptible to this." Paid social is the consequential row, with 30% of spend behind an answer that travelled 40% as far as the prior did. The same two-fit comparison works for carryover, with Beta(1, 3) against Beta(3, 1) on alpha, watching ROI as well as the decay estimate.
Which channels should be tested first?
Rank channels by spend share multiplied by prior dependence. In the example that puts paid social first at 0.12, and a geo holdout test there would replace the largest prior-led number in the budget with a measured one. For a channel like podcast, the health checks page offers a cheaper remedy: "the best practice is often to merge the channel with another related channel to increase its signal".
Meridian produces a ranking of its own. The channel calibration page from Google describes a composite calibration score for each channel, a weighted average of implausible ROI, high variance ROI and potential bias scores at 0.5, 0.25 and 0.25, and it flags channels scoring below 67.5 as candidates for an incrementality experiment. Three of its four criteria are spend-weighted, and the page explains why: "Spend-weighting also prioritizes calibration for higher-spend channels due to their greater business importance." When that score and the two-fit ranking name the same channel, the first test has chosen itself.
Until that test reads out, we report prior-led channels to finance as assumptions with a range, and data-led channels as estimates. Once it does, our guide to analyzing an incrementality test result covers the readout, and the same number can correct platform reporting through the multiplier method. Measurement work of this kind sits with our data and analytics team, and the Attribution Doctor is a further resource on the attribution side.
Sources
- Google, Meridian guide "Default prior distributions", last updated September 5, 2026
- Google, Meridian guide "Calibrate treatment priors", last updated September 24, 2026
- Google, Meridian guide "Set the adstock_decay_spec parameter", last updated September 5, 2026
- Google, Meridian guide "Model health checks", last updated October 2, 2026
- Google, Meridian guide "Channel calibration recommendation and score", last updated September 11, 2026
- Google, Meridian API reference for ModelDiagnostics, last updated September 24, 2026
- Meta, Robyn documentation, "Key Features", updated December 2024 for version 3.12.0
- Google Research, "Bayesian Methods for Media Mix Modeling with Carryover and Shape Effects", Jin, Wang, Sun, Chan and Koehler, 2017
