ROAS and marginal ROAS for econometricians
An AMMM3 ROAS is a model contribution divided by the spend that produced it. It is a conditional model allocation expressed as a ratio, and it inherits every caveat of the contribution in its numerator. This page explains what the number is, why it differs from a platform-reported figure, and which decisions each version of the ratio can support.
Total and marginal return are different quantities
The ROAS that mmm.summary.roas(...) reports is an average over a window:
total contribution divided by total spend,
where is the model’s fitted contribution of channel in period , in original target units, is the observed spend on that channel in that period, and the sums run over the periods in the reporting window.
The quantity a budget decision needs is marginal: the change in outcome per additional unit of spend at the current operating point,
where the derivative is the slope of the fitted response of the channel’s contribution to its own spend, evaluated at the current spend level.
Under a concave saturation curve the marginal return is always below the average, and the gap grows with spend. A channel can show an average ROAS of 3 and a marginal ROAS below 1 at its current level, in which case the last pound spent on it lost money while the summary table still looks strong. Ranking channels by average ROAS therefore rewards channels that were historically cheap at low spend, not channels where the next pound does the most.
AMMM3’s marginal information lives in the fitted response curves. Use
sample_saturation_curve(...) to inspect the curve and its slope around the
observed spend range, and the budget optimiser to act on it; the optimiser
allocates against the fitted response, not against average ROAS. See
Response curves and
Budget optimisation.
The numerator is a conditional allocation
The contribution is what the fitted model assigns to the channel under its assumptions: the additive mean, the transforms, the priors and the control set. It is not a measured incremental outcome. Everything that moves contributions moves ROAS by the same proportion: the baseline and media trade-off, an omitted confounder, a mediator entered as a control, or a prior doing the work where the data are silent.
The division by spend hides none of this and adds a hazard of its own. A channel with little spend variation can carry a prior-shaped contribution and still report a finite, plausible-looking ROAS with an interval. See Always-on and low-variance channels for the mechanism and a worked example in which the same true effect returns a usable ROAS or a prior-shaped one depending only on the spend schedule.
Why it will not match the platform number
A platform-attributed or last-click ROAS and an MMM ROAS are different estimands measured on different populations with different counterfactuals.
| Property | Platform or last-click ROAS | AMMM3 ROAS |
|---|---|---|
| Counterfactual | None, or the platform’s own modelled holdout | The fitted model’s allocation under its assumptions |
| Attribution unit | Tracked conversions touching the channel | Share of the aggregate outcome assigned by the model |
| Cross-channel effects | Claimed by whichever channel touched last | Allocated across channels by the fitted specification |
| Untracked outcomes | Excluded | Included in the aggregate target |
| Carryover | Cookie or click window | Fitted adstock |
Neither is the truth. Do not tune the model until its ROAS matches the platform’s; that replaces one unverified number with a copy of another. When the two must be discussed together, report them as different measurements of different quantities and say which decision each can inform. A genuine reconciliation requires causal evidence, usually a holdout or conversion-lift experiment, which can then enter the model as calibration on supported estimators.
Ranking channels under uncertainty
mmm.data.get_elementwise_roas(original_scale=True) returns posterior
samples, not one number per channel. Two consequences follow.
First, a ranking of posterior means is not a posterior ranking. When intervals overlap, compute the quantity you actually care about from the draws, for example the posterior probability that channel A’s ROAS exceeds channel B’s, and report that probability rather than an ordering of point estimates.
Second, interval width is information. A channel with ROAS 2.5 in [2.1, 2.9] and a channel with ROAS 4.0 in [0.5, 9.0] are not a second-place and a first-place channel. The second interval says the data do not distinguish a poor channel from an excellent one, which is a different finding, and often a more important one, than either point estimate.
What each ratio can support
- Average ROAS with a usable interval: a conditional summary of the historical window, suitable for reporting the model’s allocation with its assumptions stated.
- Marginal ROAS from the response curve: the input a reallocation decision needs, still conditional on the model, and reliable only within the observed spend range.
- Either ratio promoted to “the incremental return of the channel”: a causal claim, which requires the identification argument of Causal identification in MMM, not a division.