What do contribution, ROAS and scenario results actually mean?

Read each output as a quantity defined by the fitted model, its units and its evaluation window. A contribution table, revenue prediction and allocation comparison answer different questions. None independently establishes a causal media effect.

Is media contribution the same as predicted revenue?

No. In the ordinary additive model, media contribution is the media component of the fitted mean. The full mean also includes the configured intercept, controls, seasonality and other additive terms. Posterior predictive outcome draws additionally include observation uncertainty through the likelihood.

Output What it describes What it does not automatically describe
Historical channel contribution A component evaluated for the observed media path under the fitted model A measured causal increment
Expected media contribution under a scenario The model’s media response to the specified input path Total future revenue or realised sales
Posterior predictive outcome An outcome draw conditional on supplied inputs and the fitted model Uncertainty about every possible future input or structural change
Optimised allocation A solution for the configured objective, budget and constraints An approved business recommendation

Named FE and CRE have their own likelihood and prediction contracts; do not transfer every ordinary-model interpretation without checking those contracts. See Model Overview and Contributions and Decomposition.

When is a reported ratio really ROAS or CPA?

The efficiency accessors use fitted contributions and the supplied channel inputs. They do not look up an independent spend series.

  • Revenue contribution divided by monetary spend in the same currency gives model-conditional return on advertising spend (ROAS).
  • Monetary spend divided by conversion contribution gives model-conditional cost per acquisition/conversion (CPA), with the conversion definition stated.
  • Revenue contribution divided by impressions is revenue per impression, even if an output column is labelled ROAS.

For example, £200 of modelled revenue contribution divided by £100 of spend gives ROAS 2. £200 divided by 1,000 impressions gives £0.20 per impression. Neither calculation is profit: margins and other costs are separate.

Use original-scale contributions and consistent periods and panel aggregation. target_type selects an efficiency accessor and label; it does not validate currencies or convert exposure units. The element-wise accessors return NaN for a zero denominator. Do not replace that undefined ratio with a favourable return. See ROAS and Metrics.

How should I aggregate returns and uncertainty?

Define the aggregate quantity first. For a total-window return, sum contributions within each posterior draw over the intended dates and regions, then divide by the corresponding total spend. Summarise the resulting draw distribution. An unweighted average of weekly or regional ratios generally answers a different question.

For example, spend of £100 and £900 with contributions of £300 and £900 gives individual ROAS values of 3 and 1. Their unweighted mean is 2, but the combined return is £1,200 / £1,000 = 1.2.

Similarly, sum contributions within each draw before calculating an interval for the total. Adding component interval endpoints does not generally give the total’s credible interval because the components are dependent. Inspect the aggregation behaviour of the specific accessor you use; a frequency argument alone does not define the desired ratio estimand. See Summary and Export.

Why might optimisation favour a channel with lower historical ROAS?

Historical average ROAS describes return over the evaluated exposure path. Allocation decisions depend on the change in the objective from feasible changes in spend. With saturation, a channel can have high historical average return but low marginal response at its current spending level.

For the low-level PanelBudgetOptimizerWrapper, the default objective is average posterior total_media_contribution_original_scale. It is not automatically profit, a lower credible bound or a risk-adjusted business utility. The feasible solution also depends on bounds, time allocation and carryover assumptions.

A channel at its upper bound may indicate that the objective would prefer more spend if allowed. It does not establish that the boundary is a validated commercial optimum. Inspect the solver result, constraint satisfaction, supported spending range and sensitivity before interpreting it. See Budget Optimisation.

Is the budget per period or for the whole window?

Check the entry point; the contracts differ.

Entry point Budget or allocation units
PanelBudgetOptimizerWrapper.optimize_budget(budget=...) Total across allocation cells for one model period
ManualAllocationScenarioSpec.allocation Total over the requested spending window for each allocation cell
FixedBudgetOptimizedScenarioSpec.total_budget Total over the requested spending window
Preferred runner optimization.budget block Total-window budget, resolved according to its configured mode
Legacy runner optimization.total_budget Per-period budget

For eight weekly spending periods, a flat £80,000 window budget corresponds to £10,000 per period across all allocation cells. Passing budget=80_000 to the low-level wrapper instead requests £640,000 over those eight periods.

Panel allocations also need the correct region/channel coordinates. See Scenario Specifications and YAML Configuration.

Why do historical and simulated scenarios give different results?

A historical reference uses observed history. A simulated allocation defines a spending path, which may differ in timing even when its channel totals match that history. Adstock and saturation make timing consequential.

Check the requested spending window, evaluated response window, incoming lag history, time distribution and carryover tail. With include_carryover=True, the response window extends beyond the spending window. A default simulated scenario uses include_last_observations=False, so historical carryover is not automatically included.

noise_level controls simulated spend-path variation; it is not the outcome likelihood’s residual uncertainty. Set it to zero when you need a deterministic spend path. Read the resulting metadata rather than inferring the scenario definition from its name.

CurrentScenarioSpec requires overlap with observed dates. It is not a future-only no-change forecast. See Overview and Workflow.

How do I compare two plans and report uncertainty in their difference?

Define a common response quantity and align the plans’ response horizon, initial history, carryover treatment and posterior draws. For a fixed-budget reallocation question, keep total spend the same. An expansion plus reallocation answers a different question and should be labelled accordingly.

The following is illustrative arithmetic, not a fitted Abacus result:

Plan Eight-week spend Mean media contribution over the same response window
Reference allocation replay £80,000 £160,000
Alternative allocation replay £80,000 £176,000

The mean difference is £16,000. That table alone supplies no credible interval for the difference. Compute the alternative minus reference contribution for each matched posterior draw, then summarise those differences. Do not subtract the endpoints of the two marginal intervals or infer the difference’s uncertainty from whether those intervals overlap.

If the alternative instead spends £88,000, report an expansion-plus-reallocation contrast. If the reference is historical attribution with different incoming history, re-evaluate a matching reference path before making the controlled allocation comparison.

ScenarioPlanner.compare(...) concatenates individual scenario summaries; it does not by itself provide a paired difference interval. The pipeline’s matched allocation comparison retains separate paired-difference artefacts. Check the actual output contract in Comparison Outputs and Output Directory Schema.

What is required before recommending a budget change?

Review computation, prior plausibility, predictive checks and relevant holdout evidence. Then assess identification, parameter and specification sensitivity, extrapolation, commercial constraints and the uncertainty in the decision quantity. A solver success flag or narrow posterior interval does not replace these checks.

State the response quantity, units, spending and response windows, assumptions and permitted interpretation with the recommendation. Posterior uncertainty conditions on the fitted model; it does not automatically include omitted confounding, model-choice uncertainty or future structural change. See Causal Identification and Interpreting Optimisation.