Marketing Mix Modeling

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

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:

  1. Does it move the KPI? If it doesn't, drop it.
  2. 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."
  3. Does your media cause it? Then it is a mediator, and it stays out.
  4. Can you set it yourself? Then Meridian's rule makes it more likely a non-media treatment than a control. Price and promotions qualify.
CandidateUsual roleIn MeridianIn Robyn
SeasonalityConfounderKnots on a time-varying interceptProphet trend and season
HolidaysConfounderDenser knots or a binary controlProphet holidays or event dummies
PriceYour own leverNon-media treatmentContext variable
PromotionsYour own lever, confounder for mediaNon-media treatmentContext variable
DistributionPredictor or mediatorNot named in the pages we readListed as a non-marketing driver, no variable type given
WeatherConfounder or predictorControlContext variable
Macroeconomic demandPredictorControlContext 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.

CandidateMoves salesShapes mediaCaused by mediaWe set itDecision
Weekly temperatureYesYesNoNoControl
Summer curveYesYesNoNoA few knots, fewer once temperature is in
Memorial Day, July 4YesYesNoNoHoliday indicators
Discount depthYesYesNoYesNon-media treatment
Stores stockingYesSometimesPartlyPartlyControl, with a sensitivity check
Consumer confidenceWeaklyNoNoNoLeave out
Site sessionsYesNoYesNoLeave 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

Frequently asked questions

Should promotions be a control variable or a treatment in a marketing mix model?
In Google Meridian, a promotion you can run or withhold is better modeled as a non-media treatment, because Meridian reports incremental outcome and contribution for those and estimates neither for controls. In Meta's Robyn, price and promotional activity enter as context variables. Neither tool applies carryover or saturation transformations to these variables, so code depth of discount instead of a simple on/off flag.
How does Google Meridian handle seasonality and holidays?
Through knots on a time-varying intercept. Meridian's documentation says geo-level models default to one knot per time period and national models to a single knot. You can place knots more densely around a holiday season, add a binary indicator as a control when an event's impact varies by geo, or use periodic functions, which the documentation calls an attractive alternative to knots, especially in national models.
How many control variables can a marketing mix model support?
Robyn's guide recommends a ratio of one independent variable to ten observations, so 104 weekly rows supports about ten variables in total, media channels included. Meridian's documentation cautions against adding variables only to improve predictive accuracy, because that can raise the risk of model misspecification bias. Prioritize confounders, then add a few strong predictors.
What if promotions and media always run in the same weeks?
Then the history cannot separate them, and the split a model reports depends on priors or regularization. Meridian's default data checks fail a pair of variables only at a correlation above 0.999, so ordinary overlap draws no FAIL. Plan a few weeks where one runs without the other, or run a geo holdout on media during a promotion and use the result to calibrate the model.
Should weather be a control variable in an MMM?
Include it when weather moves demand for your category, and treat it as a confounder if media buys also follow the forecast. Meridian's documentation uses temperature as an example of a control variable, one that should not be population scaled, and Robyn's guide says temperature is commonly used where sales shift with the seasons. Once temperature is in, a seasonal curve may need fewer terms.

Free tools for this topic

FREE TOOLAttribution DoctorA media-mix model that runs in your browser.FREE TOOLUTM Campaign BuilderClean tracking links your analytics will thank you for.PLAYBOOKThe First-Party Data PlaybookMeasurement that survives privacy — and gets sharper.

Keep reading

GlossaryWhat Is Incrementality? The Question Attribution Can't AnswerRead →GuidesHow to Run a Quarterly Geo-Holdout Test Your CFO Will Actually TrustRead →DataHow to Actually Analyze an Incrementality Test ResultRead →
CATALIST NEWSLETTER

Monthly dose of growth marketing.

Get marketing tips, narratives, guides, and playbooks delivered to your inbox.

Protected by reCAPTCHA — Google's Privacy Policy and Terms of Service apply.