Retailers face a recurring strategic dilemma: should growth be pursued through temporary price cuts, or through increased media spend?
Our shock-based marketing mix model (MMM) provides a clear answer. Media spend generates a sustained positive lift that compounds across the typical 0–3 month trading horizon. Price changes, by contrast, act immediately—discounts boost units while hikes suppress them—but the effect fades quickly, rarely lasting beyond the same month. Because discounts also reduce the price per unit, their impact on revenue is usually weaker than holding price and stimulating demand through media campaigns.
| Goal / Lever | Price Cuts (Discounts) | Media Spend |
|---|---|---|
| Units / Penetration | ✅ Strong immediate lift, but short-lived | – Limited direct effect |
| Revenue | ⚠️ Gains often fragile, risk of erosion | ✅ Steady, persistent positive lift |
In practice, discounts are the stronger lever for driving unit growth and penetration, while media spend is the more reliable lever for revenue growth. The risk profiles also differ: discounts almost always raise units but can undermine revenue, whereas media spend consistently produces positive returns with little downside.
To capture genuine demand responses rather than slow-moving trends, we residualise price and media spend. This means working with their innovations—the unexpected components remaining after removing each series’ recent history, seasonality, and fixed effects. An innovation represents a surprise move, which we can interpret directly as:
\[ \text{surprise} \;\;\rightarrow\;\; \text{demand response} \]
This residualised baseline was then extended with a Bayesian partial-pooling model, which stabilises estimates across organisations without erasing meaningful differences. Summing effects over a short horizon (\(H = 0–3\) months) yields cumulative elasticities that can be used directly in planning.
With these elasticities in place, we derive scenario formulas that allow managers to calculate the price discount or media increase required to hit a given revenue target.
Let:
- \(s\) = fractional change in media
spend (e.g., 0.10 for +10%)
- \(d\) = discount fraction (e.g., 0.10
for −10%)
- \(\theta_s = \sum_{h=0}^{H}\gamma_h\)
= cumulative media elasticity
- \(\theta_p = \sum_{h=0}^{H}\phi_h\) =
cumulative price elasticity
The resulting predictions are:
Units (penetration):
\[ \Delta U_{\text{spend}} = (1+s)^{\theta_s} - 1, \qquad \Delta U_{\text{discount}} = (1-d)^{\theta_p} - 1 \]
Revenue:
\[ \Delta R_{\text{spend}} = (1+s)^{\theta_s} - 1, \qquad \Delta R_{\text{discount}} = (1-d)^{\,1+\theta_p} - 1 \]
Combined effect:
\[ \Delta R_{\text{both}} = (1-d)^{\,1+\theta_p}(1+s)^{\theta_s} - 1 \]
Applying this framework reveals a clear trade-off.
A 10% price cut typically outperforms a 10% media
increase for unit growth, but a 10% media
increase usually outperforms a 10% price cut for
revenue growth.
This reversal is intuitive: discounts sell more units but at a lower price. Unless the unit lift is exceptionally large, revenue gains remain smaller than when price is held and demand is stimulated through media.
Managerial implication:
- For revenue growth, bias toward media
increases.
- For unit or penetration growth, bias toward
temporary discounts.
Finally, the method yields a decision tool. For a target revenue change \(\tau\) (e.g., 0.05 for +5%):
\[ 1+\tau = (1-d)^{\,1+\theta_p}(1+s)^{\theta_s} \]
From this, either lever can be solved directly:
Discount required given a media plan \(s\):
\[ d^\star = 1 - \left(\frac{1+\tau}{(1+s)^{\theta_s}}\right)^{\!\tfrac{1}{\,1+\theta_p}} \]
Media increase required given a discount \(d\):
\[ s^\star = \left(\frac{1+\tau}{(1-d)^{\,1+\theta_p}}\right)^{\!\tfrac{1}{\theta_s}} - 1 \]
Using horizon-summed elasticities (\(\theta_p < 0\), \(\theta_s > 0\)), these formulas provide a decision dial for scenario planning at the start of any strategy exercise.
This analysis was based on the Multi-Region Marketing Mix
Modeling (MMM) dataset (publicly available via Figshare).
For this white paper, our attention is restricted to the Apparel
vertical, constructing a monthly organisation × country
panel covering the period 2019-07-21 to
2024-06-02.
Source: Figshare: Multi-Region MMM Dataset
Note: The raw dataset contains observations for 18 countries and 15 verticals. Full details are provided in the Appendix.
From the raw data we construct the following panel variables:
ALL_PURCHASES_UNITSORIGINAL_PRICE - GROSS_DISCOUNTnet revenue / units*_SPEND channelscos(2πm/12),
sin(2πm/12) where m is calendar monthlog(max(price, 1e-9)),
log(max(total_spend, 1e-9))To capture dynamics, lag windows for both price and media spend were created:
Only rows with a complete lag window are retained, ensuring comparability of cumulative responses over the chosen horizon.
Appendix: Country and vertical lists, column dictionary, and full reproducible code for panel construction.
As a starting point, we estimated a naïve lag-stack OLS model of monthly log-units on lagged price and spend:
\[ \log U_{it} = \beta_0 + \sum_{h=0}^{3}\phi_h \,\log p_{i,t-h} + \sum_{h=0}^{3}\gamma_h \,\log s_{i,t-h} + \delta_1 \cos\!\Big(\tfrac{2\pi m_t}{12}\Big) + \delta_2 \sin\!\Big(\tfrac{2\pi m_t}{12}\Big) + \alpha_i + \varepsilon_{it}, \]
where \(U_{it}\) is units sold by organisation \(i\) in month \(t\), \(p_{i,t-h}\) is log-price at lag \(h\), \(s_{i,t-h}\) is log-spend at lag \(h\), \(\alpha_i\) are organisation fixed effects, and the sine/cosine terms capture seasonal cycles.
The baseline model achieved a high overall fit (Residual SE = 0.392;
\(R^2 = 0.961\), adj. \(R^2 = 0.960\); \(F(28,571) = 508.1,\
p<2.2\times10^{-16}\)).
However, the lag patterns were unstable and difficult to
interpret.
Residuals were centred and symmetric (median ≈ 0), with moderate spread (−1.3 to +1.4).
| Term | Estimate | 95% CI | p-value | Sig. |
|---|---|---|---|---|
| p0 (price t) | -0.518 | [-0.668, -0.367] | 3.8e-11 | *** |
| p1 | -0.288 | [-0.446, -0.129] | 0.00039 | *** |
| p2 | -0.129 | [-0.287, 0.029] | 0.112 | |
| p3 | -0.150 | [-0.300, 0.001] | 0.0524 | . |
| s0 (spend t) | 0.497 | [ 0.430, 0.564] | <2e-16 | *** |
| s1 | -0.047 | [-0.136, 0.042] | 0.295 | |
| s2 | -0.083 | [-0.172, 0.007] | 0.0711 | . |
| s3 | -0.022 | [-0.089, 0.044] | 0.514 |
(Organisation fixed effects omitted for brevity. CIs computed as \(\hat\theta \pm 1.96 \,\text{SE}\).)
Despite strong global fit, the model was not decision-ready. The stacked lag structure introduced severe multicollinearity:
The instability, therefore, came not from controls but from the redundancy of stacked lags. This made the coefficients noisy, difficult to interpret, and risky to use in scenario planning.
To overcome these issues, we moved from raw lagged levels to innovation residualisation—working only with the unexpected components of price and spend. This transformation reduces collinearity and produces stable, interpretable “shock → response” elasticities that can be safely aggregated over short horizons.
Other potential remedies exist (structured lag shapes, ridge regularisation, differencing, PCA within lag blocks), but residualisation provided the cleanest and most decision-relevant solution.
Instead of regressing directly on raw levels and lags of price and spend, we remove the predictable components of each series — its own recent lags, seasonality, and organisation fixed effects. What remains are the innovations (or shocks): the unexpected movements in log-price and log-spend that cannot be forecast from past behaviour or seasonal patterns.
These shocks capture the true surprises in the system, and therefore provide a cleaner lens on how demand responds.
The residualisation process has two stages. First, log-price is projected onto its own recent lags, together with seasonal terms and organisation fixed effects; the same is done for log-spend. Second, the residuals from these projections are retained as the price_shock and spend_shock series.
In other words, each shock variable represents a month-to-month surprise in price or spend after controlling for trend and seasonality.
With these shock variables in hand, we then model log-units as a function of their current and lagged values, alongside seasonal controls and fixed effects. This second stage can be read directly as:
\[ \text{unexpected change} \;\;\rightarrow\;\; \text{demand response}. \]
By focusing only on innovations, we reduce collinearity and obtain coefficients that are more stable, interpretable, and decision-ready.
\[ \log U_{it} = f(\mathrm{price\_shock}_{i,t-h}, \; \mathrm{spend\_shock}_{i,t-h}, \; \mathrm{seasonality}, \; \alpha_i) \]
This can be read directly as:
\[ \text{unexpected change} \;\;\rightarrow\;\; \text{demand response}. \]
Residualisation strengthens the model in three important ways.
First, it reduces multicollinearity: the shock
variables are nearly orthogonal to the lag stack that generated them,
producing stable and interpretable coefficients.
Second, it keeps the focus on surprises rather than
trends. By stripping out predictable movements, the model
isolates the effect of truly unanticipated changes in price or spend,
not slow-moving cycles.
Finally, it improves inference. With less redundancy in
the regressors, standard errors tighten and cumulative effects become
more credible for decision-making.
This approach echoes the Frisch–Waugh–Lovell theorem, which shows that controlling for other variables is mathematically equivalent to comparing residuals on residuals. By residualising first, the partial-out step is made explicit, with the added advantage of much lower collinearity.
It is important to note that residualisation removes what is predictable, but it does not guarantee causal identification. If a simultaneous shock affects both demand and price or spend within the same period, endogeneity can still remain.
To mitigate this risk in practice, we rely on cluster-robust errors at the organisation level, and where possible, supplement with instrumental variables or experimental variation.
In the innovation model, the raw lagged regressors were replaced with their residual components — the unexpected movements in log-price and log-spend after removing predictable trends. Monthly log-units were then regressed on current and lagged values of price_shock and spend_shock, with seasonal controls and organisation fixed effects included as before.
The overall fit of the shock model was nearly identical to the naïve lag-stack OLS (Residual SE = 0.392; \(R^2 = 0.962\), adj. \(R^2 = 0.959\); \(F(28,514) = 458.9,\ p<2.2\times10^{-16}\)). Residuals were well-behaved (median ≈ 0, range −1.20 to +1.50).
The key difference is not in global fit, but in how the coefficients behave: the shock model produces much clearer, more interpretable elasticities.
| Term | Estimate | 95% CI | p-value | Sig. |
|---|---|---|---|---|
| price_shock0 | -1.198 | [-1.503, -0.893] | 8.5e-14 | *** |
| price_shock1 | -0.621 | [-0.913, -0.330] | 3.6e-05 | *** |
| price_shock2 | -0.378 | [-0.671, -0.085] | 0.0118 | * |
| price_shock3 | -0.293 | [-0.588, 0.002] | 0.0529 | . |
| spend_shock0 | 0.636 | [ 0.567, 0.705] | <2e-16 | *** |
| spend_shock1 | 0.330 | [ 0.241, 0.419] | 1.5e-12 | *** |
| spend_shock2 | 0.200 | [ 0.111, 0.290] | 1.5e-05 | *** |
| spend_shock3 | 0.025 | [-0.065, 0.115] | 0.587 |
(Notes: CIs are \(\hat\theta \pm 1.96\,\text{SE}\). Seasonality estimates: month_cos = 0.238 [0.191, 0.286], \(p<2\times10^{-16}\); month_sin = −0.064 [−0.111, −0.017], \(p=0.008\).)
Benchmarking the shock model against the naïve OLS reveals three major improvements.
Media effects become stable. Under naïve OLS, spend effects flipped sign: strongly positive in the same month but negative the following month. By contrast, the shock model shows a consistent pattern: spend_shock0–2 are all positive and statistically credible, with spend_shock3 ≈ 0. This means media has an immediate lift that persists for one to two months, without sign reversals.
Price effects become clearer. In the naïve model, price effects were spread across several lags with weaker magnitudes. In the shock model, the same-month effect is sharply negative (−1.198), with smaller but still significant follow-through in the next two months. The cumulative price response is dominated by the immediate reaction, which is both intuitive and easier to plan around.
Multicollinearity collapses. Global fit statistics are unchanged, but corrected GVIF values fall dramatically: from dangerously high levels in the stacked-lag OLS to ~1 under the shock specification. The redundancy introduced by stacked lags is removed, yielding tighter intervals and more reliable inference.
Decision-readiness improves. With stable signs and coherent horizons, the shock coefficients can now be summed over \(H=0–3\) to form cumulative elasticities:
\[ \theta_p = \sum_h \phi_h, \qquad \theta_s = \sum_h \gamma_h \]
These cumulative measures are directly usable in the scenario formulas and quick optimiser described earlier, making the shock model the preferred foundation for decision-making.
See the GVIF plot immediately below for the side-by-side collinearity comparison; it visually documents the substantial reduction in corrected GVIF under the shock specification.
Elasticity summaries for reference
These results support using the shock model as the baseline for cumulative elasticities and subsequent Bayesian partial pooling.
Building on the residualised (shock) framework, we fitted a Bayesian partial-pooling model of monthly log-units on innovations in price and media spend.
Priors were centred on the OLS estimates, with standard deviations inflated threefold to remain weakly informative. Partial pooling across organisations stabilised the estimates without erasing real heterogeneity. Convergence diagnostics were excellent: all \(\hat R \approx 1.00\), effective sample sizes were large, and the residual scale was estimated at \(\sigma \approx 0.40\) \([0.37,\,0.42]\).
The Bayesian results confirm that an unexpected price increase
reduces units primarily in the same month. The immediate effect is large
and precisely estimated:
- \(\phi_0 \approx
-1.19\;[-1.46,\,-0.90]\).
Later lags are smaller and much less certain:
- \(\phi_1 \approx
-0.24\;[-0.53,\,0.06]\),
- \(\phi_2 \approx
-0.17\;[-0.46,\,0.13]\),
- \(\phi_3 \approx
-0.28\;[-0.52,\,-0.03]\).
In short, the same-month effect dominates. Although a naïve horizon-sum would suggest \(\theta_p \approx -1.87\), the credible impact is overwhelmingly concentrated in \(\phi_0\).
Media spend shows the opposite pattern: unexpected increases produce
a strong and persistent lift. The immediate effect is large and
precise:
- \(\gamma_0 \approx
+0.60\;[+0.54,\,+0.67]\).
This lift continues into the following months, though with
diminishing strength:
- \(\gamma_1 \approx
+0.21\;[+0.13,\,+0.30]\),
- \(\gamma_2 \approx
+0.16\;[+0.08,\,+0.25]\),
while \(\gamma_3\) is indistinguishable
from zero.
Taken together, media shocks are reliably positive through months 0–2, yielding a cumulative media elasticity of \(\theta_s \approx +0.97\).
To illustrate the implications, we compare a −10% price cut with a +10% media increase.
This contrast highlights the different risk profiles of the two levers.