Control Variables in MMM: The Non-Marketing Stuff That Decides Whether Your Model Works

By Kiran Akkineni · · 11 min read

The most common way an MMM goes wrong isn't bad math. It's confounding — the model attributing to marketing something that's actually being driven by holiday shopping, a back-to-school season, the post-COVID rebound, or a Tuesday-vs-Sunday spending pattern.

Control variables are how you handle this. They're the non-marketing inputs to the model that account for everything driving sales other than your marketing. Get them right and the marketing estimates have a chance. Get them wrong and your "ROAS" numbers are partly measuring November, payday cycles, and the secular growth of e-commerce.

This post covers what controls actually do, the main types, how to think about specifying them, and the failure modes. (If you're new to MMM and want context first, start with our complete guide to marketing mix modeling.)

The confounding problem

Imagine you spent $50K on Meta in November and $30K in February. Sales were 40% higher in November. Your MMM has two ways to explain this:

  1. Meta drove the difference (high ROAS for Meta).
  2. November is a high-sales month and you spent more then because that's when consumers are buying.

Both explanations fit the data equally well from the model's perspective. Without something telling the model that November is structurally different from February, it'll happily credit the lift to Meta.

This is what economists call confounding — when a third variable (in this case, the calendar) is correlated with both your input (spend) and your output (sales), and you mistake the relationship between the third variable and the output for a relationship between the input and the output.

Controls are how the model gets told "this lift was going to happen anyway because of [seasonality / trend / holiday / day-of-week]. Don't credit it to the marketing channels."

Seasonality

Seasonality is any pattern that repeats on a roughly fixed cycle — annual (Christmas), quarterly (back-to-school), monthly (payday), or weekly (Friday vs Monday).

The naive approach is to add a dummy variable for each month or each week. This works but uses lots of degrees of freedom — 11 dummies for monthly seasonality, 51 for weekly. With limited data, that's expensive.

A more efficient approach is Fourier features: a small set of sine and cosine waves at the right frequencies. Two pairs of Fourier features (4 parameters total) can capture annual seasonality with a smooth curve. Two pairs at weekly frequency capture day-of-week patterns. The model fits coefficients on these waves and reconstructs whatever seasonal pattern best fits your data.

The intuition: real seasonality isn't a step function (sales jumping abruptly on the first of December). It's a smooth curve (sales rising through November, peaking in mid-December, dropping after Christmas). Fourier features capture that smoothness with far fewer parameters than dummy variables would need.

In practice, most MMMs use 2-4 pairs of annual Fourier features and 1-2 pairs of weekly features. More than that risks the seasonal terms eating signal that should be attributed to marketing.

Trend

Trend is the gradual change in baseline sales over time, independent of marketing. A growing business has positive trend. A category in secular decline has negative trend. A post-pandemic recovery period has a complicated trend that's neither linear nor smooth.

The simplest control for trend is a linear time variable — a column that just counts weeks (1, 2, 3, ...). The model fits a coefficient on it, capturing average growth or decline per week.

For more complex trends, options include:

  • Polynomial trend (linear, quadratic, cubic) — captures gentle curvature
  • Spline trend — flexible piecewise smooth curves
  • Changepoint trend — explicit handling of structural breaks (a relaunch, a category shift)

The risk with flexible trends is that they can absorb marketing signal. If your trend is allowed to be a wiggly spline, it'll wiggle along with whatever pattern is in your data — including the lift from your marketing. This is bad. The trend variable is supposed to be a baseline, not a free-form curve fitter.

A reasonable default: linear trend if your business is growing or declining steadily, polynomial trend (degree 2 or 3) if there's clear curvature, explicit changepoints only when you know about a structural break.

Holidays

Holidays are spike events that don't follow regular seasonal cycles — Black Friday, Cyber Monday, Memorial Day weekend, Mother's Day, Easter (which moves around the calendar). They're typically much sharper than ordinary seasonality and need their own treatment.

The standard approach is a binary flag for each holiday: a column that's 1 on the holiday week (or day) and 0 otherwise. The model fits a coefficient on each flag, capturing the average lift on that holiday.

A few extensions help in practice:

  • Holiday windows: flagging not just the day but the days around it (Black Friday → flag the Wednesday through Sunday)
  • Per-holiday treatment: not all holidays affect all businesses equally — separate flags let the model learn which ones matter
  • Holiday × channel interactions: if you know a channel behaves differently around holidays (Meta CPMs spike in November), the interaction can capture it, but at a cost in degrees of freedom

For most MMMs, a curated list of 6-12 major holidays for your market, with appropriate windows, is plenty.

Day-of-week

If you're working with daily data, day-of-week effects are often huge. People shop differently on Tuesdays than on Sundays. A 7-channel model that doesn't control for day-of-week will attribute weekend lift to whatever channel had higher weekend spend.

Fourier features at weekly frequency, or six dummy variables (with one day as the reference), both work. Pick whichever gives you stable estimates. With weekly data, day-of-week disappears as an issue (the aggregation handles it).

Other controls worth considering

Beyond the standard four, several other controls show up in real MMMs:

Competitor activity: if you can get a measure of competitor spend or share of voice, controlling for it removes a major source of noise. Hard to get, but valuable when available.

Pricing: if your prices change over time (promotional periods, list price changes), price needs to be a control. Otherwise the model can attribute price-driven sales lifts to marketing.

Distribution: if you opened new retail locations or launched in new geos, distribution growth is a control. Without it, the trend in sales from the rollout looks like marketing impact.

Macro variables: unemployment rate, consumer confidence, weather. Useful for some industries (apparel, travel, home goods), unnecessary for others. Add only if there's a clear mechanism by which the variable affects your sales.

Stock-outs / supply issues: if you ran out of inventory at any point, that's a control. Otherwise the dip in sales gets attributed to marketing being suddenly less effective.

How many controls is too many?

Every control variable uses degrees of freedom. With limited data, that's a real cost. A model with 50 weeks of data and 30 control variables doesn't have much left to estimate marketing effects.

Some rules of thumb:

  • Always include: trend (at least linear), holidays for major events in your category, annual seasonality (Fourier features)
  • Include if relevant: day-of-week (daily data), pricing (if prices vary), competitor activity (if you have it)
  • Include sparingly: macro variables, complex trend forms, holiday × channel interactions

If a control isn't substantially improving the model's fit and you don't have a strong theoretical reason to include it, leave it out. Parsimony serves MMM well.

Validating controls

Once your model is fit, validate the controls before trusting the marketing estimates:

Check the seasonality fit visually. Plot your seasonal terms over a year. Do they look like the seasonality you'd expect for your business? If your annual seasonality term peaks in March, something is wrong (unless March really is your peak month).

Check the holiday coefficients. A Black Friday flag with a 200% lift coefficient is plausible for many DTC brands. A 0.5% lift is suspiciously small. A 5000% lift is suspiciously large and probably means something else is happening.

Look at the residuals. After fitting, plot actual vs predicted sales over time. Are there systematic patterns the model is missing? If predictions are consistently low in summer and high in winter, your seasonality is underspecified. If predictions miss specific spikes, you're missing holiday flags.

Sanity-check with a holdout. Refit the model on the first 80% of your data and predict the last 20%. The errors on the holdout tell you whether your controls (and the rest of the model) are capturing real patterns or overfitting noise.

Common mistakes

Skipping seasonality entirely. This is the most expensive omission. Without seasonal controls, your November-active channels look great and your January-active channels look terrible, regardless of their actual effectiveness.

Letting trend absorb marketing signal. Overly flexible trend specifications (wiggly splines, high-degree polynomials) will fit marketing patterns and rob the marketing variables of signal. Keep trend simple unless you have specific reason to make it complex.

Forgetting holidays for non-US markets. Boxing Day, Singles' Day, Diwali, Lunar New Year — if you sell in international markets, your holiday flags need to reflect the local calendar.

Ignoring promotional periods. If you ran a 30%-off sale for two weeks, those weeks are not normal weeks. Either flag them as a control or risk the lift being attributed to whatever marketing was running concurrently.

Modeling COVID as if it were normal. The 2020-2022 period broke seasonality, broke trend, and introduced bizarre patterns in many categories. If you're using data from this period, you probably need explicit controls for it (or restricted modeling to the post-2022 stable period).

Not including a constant / intercept. A model without a baseline forces all sales to be explained by marketing or seasonality, which biases coefficients. Always include an intercept.

What to look for in a tool

If you're choosing rather than building, look for tools that:

  • Automatically include sensible default controls (trend, seasonality, holidays)
  • Allow custom controls for things specific to your business (promos, pricing, competitor data)
  • Surface the control variable estimates so you can validate them
  • Warn you when controls are absorbing too much variance relative to marketing

CheapMMM includes Fourier seasonality, linear trend, day-of-week effects (when relevant to data granularity), and a default holiday set automatically — you don't have to engineer them. The fitted coefficients on controls are surfaced alongside the marketing estimates so you can validate them. But the broader point is that any MMM you take seriously has to handle controls well, because they determine whether the marketing estimates are real or are picking up other patterns.

For more on the related question of what MMM does well and where it falls short, see our post on MMM vs attribution vs incrementality testing.

Try CheapMMM free — no login required