How to Choose MMM Control Variables for Seasonality, Price and Promotions
Which MMM control variables a model needs for seasonality, price, promotions, distribution and macro demand, which to leave out, and how to protect media credit.
On this page
- Four questions for every candidate
- What should stay out of the model?
- Where does each one go in Google Meridian?
- How promotions and price changes shift media credit
- Elasticity, collinearity and who gets the credit
- Keeping promotions from absorbing the media coefficient
- A seasonal consumer product, worked through
- Sources
The MMM control variables worth arguing about are the ones that move sales and steer the media plan together: seasonality, holidays, price, promotions, distribution, weather and macroeconomic demand each qualify for some brands and fail for others. What matters is the role each one plays, because a variable in the wrong role either hides a confounder or collects credit that media earned.
Four questions for every candidate
Meridian's control variable guidance on Google for Developers names three types: confounders, which cause both the treatment and the KPI; predictors, which affect only the KPI; and mediators, which sit on the causal path between the two. The page is blunt about the last: "Mediator variables shouldn't be included as control variables, because including them will bias causal inference estimates on the treatment variables."
Add Meridian's separate rule for levers you pull yourself, and every candidate faces four questions:
- Does it move the KPI? If it doesn't, drop it.
- Does it shape when or how much you spend? Then it is a confounder and belongs in the model. Meridian's advice is to "focus on identifying variables that affect marketing decisions or that weigh in the mind of decision makers."
- Does your media cause it? Then it is a mediator, and it stays out.
- Can you set it yourself? Then Meridian's rule makes it more likely a non-media treatment than a control. Price and promotions qualify.
| Candidate | Usual role | In Meridian | In Robyn |
|---|---|---|---|
| Seasonality | Confounder | Knots on a time-varying intercept | Prophet trend and season |
| Holidays | Confounder | Denser knots or a binary control | Prophet holidays or event dummies |
| Price | Your own lever | Non-media treatment | Context variable |
| Promotions | Your own lever, confounder for media | Non-media treatment | Context variable |
| Distribution | Predictor or mediator | Not named in the pages we read | Listed as a non-marketing driver, no variable type given |
| Weather | Confounder or predictor | Control | Context variable |
| Macroeconomic demand | Predictor | Control | Context variable |
Robyn's guide from Meta puts most of that list in one bucket: "The most common examples of context variables include competitor activity, price & promotional activity, macroeconomic factors like unemployment rate, etc." Seasonality and holidays come from Prophet, which Robyn runs to decompose the series into trend, seasonality, holiday and weekday effects.
What should stay out of the model?
By Meridian's definition, site sessions and add-to-carts are mediators: they respond to advertising and then turn into sales, so controlling for them removes credit the media earned. Search query volume is harder to place: Meridian's page calls it a mediator for channels that prompt searching and "certainly a confounder for search ads", and the page leans toward including it.
Variables added only to lift fit come next. The same page warns: "Don't include too many variables with the sole purpose of optimizing predictive accuracy because it can increase the risk of model misspecification bias." Robyn's guide supplies a working limit, a recommended ratio of one independent variable to ten observations, so two years of weekly data (104 rows) supports about ten variables with media included. The guide also says a dataset without sufficient variation and volume is likely better excluded, which rules out a consumer confidence index that barely moves across your window.
Where does each one go in Google Meridian?
In a Google Meridian marketing mix model, controls for seasonality, holidays, weather, distribution, price and promotions don't share one input, and baseline demand is what the model expects once every treatment is set to its baseline value.
Seasonality runs through knots. Per the knots page on Google for Developers, geo-level models default to a knot for every time period and national models to a single knot. Knots can sit more densely around a holiday season, a binary indicator can enter as a control when an event's impact varies by region, and periodic functions may suit a national model. The page also asks whether time is the true confounder or a proxy for something measurable.
Price and promotions are non-media treatments. The documentation on Google for Developers draws the line at intervention: a value you can change yourself is more likely a non-media variable, while broad economic indicators outside the advertiser's control are most likely controls. Reporting follows, since Meridian provides incremental outcome and percent contribution for non-media treatments and estimates neither for controls. The baseline defaults to the variable's minimum, which suits a discount-depth series and needs thought for price.
Weather and macro indicators are ordinary controls (temperature is the documentation's own example), with one trap: a national-only series in a geo model with a knot for every period is perfectly collinear with time.
We found no mention of distribution in the Meridian pages we read, and Robyn's guide names it only as one of the non-marketing activities an MMM accounts for, beside price, promotion and seasonality, without saying how to model it. By the four questions, store count is a predictor when the retailer decides it and a partial mediator when listings follow your ad support, so we enter it as a control and check how far media ROI moves without it.
How promotions and price changes shift media credit
In marketing mix modeling, promotions and price changes distort media attribution in two directions, and the direction depends on how the price and promotion variables are built. Leave the promotion out and its lift lands on whatever media ran those weeks; where ads are flighted to support deals, the promo calendar meets Meridian's definition of a confounder, driving both sales and spend. Code it as one on/off flag spanning a whole campaign and the flag absorbs lift the ads produced.
Use discount depth as a percentage, or the gap between shelf price and regular price, in place of a flag, and keep permanent price changes in a separate series from temporary reductions. Neither tool gives these variables carryover: Robyn's guide says context variables "will not undergo any transformation techniques", and Meridian applies no Adstock or Hill effects to non-media treatments. If you believe a deep deal pulls purchases forward, that needs a lagged term of its own.
Elasticity, collinearity and who gets the credit
In a marketing mix model, promotions, price elasticity and media collinearity all turn on one question about media credit: does the history contain weeks where one moved without the other? The price coefficient is the model's read on elasticity, and it is only as trustworthy as the independent price variation behind it.
The software will not warn you early. Meridian's exploratory data analysis, documented on Google for Developers, computes pairwise correlations and variance inflation factors across scaled treatments and controls, yet the default FAIL thresholds are a correlation above 0.999 and a VIF above 1000, set strict so only the most extreme problems are flagged. A promotion correlated with TV at, say, 0.8 draws no FAIL from the correlation check. Robyn's guide describes ridge regression as its answer to multicollinearity, one that will "reduce variance at the cost of introducing some bias", which we read as a caution: in a correlated promotion and media pair, the penalty decides part of the split.
Keeping promotions from absorbing the media coefficient
To avoid promotions absorbing the media coefficient in an MMM, treat multicollinearity as a planning problem before it becomes a modeling one. Count four kinds of weeks in the history: promotion only, media only, both, neither. When the first two are nearly empty, no specification will separate the effects.
Then create the missing variation. Move one promotion off the flight, or keep the promotion national and hold media out of matched regions, which is a geo holdout by design. The result can go back into the model: Meridian's CalibrationBuilder, per Google for Developers, translates incrementality experiments into calibrated ROI priors, and Robyn accepts a point estimate as calibration input. Our guide to analyzing an incrementality result covers what to check first.
Meridian's EDA page suggests combining highly correlated variables. For a promotion and a channel that surrenders the split you wanted, so we keep it as a last resort.
A seasonal consumer product, worked through
Control variables in a marketing mix model for seasonal consumer products are hard to pick because the season sets demand and the media calendar together. Take a hypothetical sunscreen brand sold through grocery and drug chains, modeled nationally on 156 weeks of data, the three-year minimum that Meridian's data guide on Google for Developers gives for national-level models. Every figure below is an assumption for illustration.
| Candidate | Moves sales | Shapes media | Caused by media | We set it | Decision |
|---|---|---|---|---|---|
| Weekly temperature | Yes | Yes | No | No | Control |
| Summer curve | Yes | Yes | No | No | A few knots, fewer once temperature is in |
| Memorial Day, July 4 | Yes | Yes | No | No | Holiday indicators |
| Discount depth | Yes | Yes | No | Yes | Non-media treatment |
| Stores stocking | Yes | Sometimes | Partly | Partly | Control, with a sensitivity check |
| Consumer confidence | Weakly | No | No | No | Leave out |
| Site sessions | Yes | No | Yes | No | Leave out as a mediator |
Suppose 30 of the 156 weeks carry a promotion and 26 of those also carry heavy media, leaving 4 promotion-only weeks against 14 media-only weeks. Four weeks is all the model has for learning what a discount does alone, so its numbers for the promotion and the overlapping channels lean on priors or the ridge penalty more than on data. The repair lives in next season's plan: two deal windows outside the flight, and one regional media holdout during a promoted week.
A control list is a written claim about what causes sales. The cheapest way we know to improve one is to walk the people who set the promo calendar and the media flights through it and ask what drove each decision. For the reasoning underneath, start with what incrementality means and how it differs from attribution. Our data and analytics practice works on measurement questions like this one, and the Attribution Doctor is a further resource on the attribution side.
Sources
- Google for Developers: Control variables (Meridian)
- Google for Developers: Organic media and non-media treatment variables (Meridian)
- Google for Developers: Set knots (Meridian)
- Google for Developers: Collect and organize your data (Meridian)
- Google for Developers: Perform an exploratory data analysis (Meridian)
- Google for Developers: Calibrate treatment priors (Meridian)
- Meta: An Analyst's Guide to MMM (Robyn)
