Suppose you ran two ad channels, Meta and Google, and you spent exactly the same amount on each every week for the past year. Sales went up. Which channel drove the lift?
Trick question. Statistically, there's no way to tell. The two channels are perfectly correlated — they always moved together — and any model can fit the data equally well by giving Meta all the credit, giving Google all the credit, or anything in between. The math doesn't have a unique answer because the data doesn't have a unique answer.
This is multicollinearity, and it's the single most underrated problem in MMM. It's the reason your model gives you a Meta ROAS of 4.2 one week and 1.8 the next when you re-run with slightly different data. It's the reason your "high-confidence" channel attribution swings wildly when you add or drop a channel. And it's the reason MMM can't replace incrementality testing for the hardest decisions.
This post covers what multicollinearity is, why it's so destructive in MMM specifically, how to detect it, what to do about it, and when to give up on MMM for a particular question and run an experiment instead.
The fundamental identification problem
Multicollinearity is just a fancy term for "your input variables are correlated with each other." In a regression, the model assumes it can vary each input independently to learn the effect of each one. When inputs always move together, that assumption fails.
In MMM, multicollinearity arises naturally. Marketers don't randomize their spend — they ramp campaigns up together for product launches, scale back together during slow seasons, and reallocate budget in patterns that create correlation across channels. Most marketing programs have at least some multicollinearity. Many have a lot.
The model doesn't fail loudly when this happens. It still fits the data, still produces estimates, still reports ROAS numbers. But those numbers are unstable in ways that aren't obvious from any single output. The same data, fit with slightly different specifications, will produce wildly different attributions — because the data genuinely cannot distinguish them.
Why this is worse in MMM than in other regressions
Standard regression handles mild multicollinearity OK. The estimates get a bit noisier, the confidence intervals widen, and you carry on.
MMM has properties that make multicollinearity especially painful:
Limited data. With 50-100 observations and 30+ parameters, you have very little statistical power to disentangle correlated channels. The same correlation that's manageable in a 10,000-row dataset is fatal in a 75-row one.
Adstock + saturation amplify the problem. After applying adstock (carryover) and saturation curves, channels that look somewhat different on the raw spend data can look almost identical on the transformed data. Two channels with similar decay rates and similar saturation will produce nearly indistinguishable adstocked-saturated time series. The model has even less to work with after the transformations.
Channel groups are systematically correlated. Paid social channels move together because their CPMs are driven by the same auction dynamics. Brand and performance digital are correlated because brand spend often supports performance campaigns. Traditional and digital are correlated because most marketers scale them together. The structure of marketing programs creates correlation in ways that aren't fixable just by collecting more data.
The result: MMM is uniquely vulnerable to multicollinearity, and the standard "just collect more data" answer doesn't fully solve it.
How to detect it
You can detect multicollinearity before fitting the model. Three diagnostics matter:
Pairwise correlations. Compute the correlation matrix of your channel spend (after adstock and saturation, if you can). Any pair with correlation above 0.85 is in trouble. Above 0.95 is essentially indistinguishable.
Variance Inflation Factor (VIF). For each channel, regress it against all the other channels and compute the R². VIF = 1 / (1 - R²). A VIF above 5 is a warning sign; above 10 is severe. VIF measures how much the variance of a channel's estimated coefficient is inflated by collinearity with other channels.
Condition number of the design matrix. This is the ratio of the largest to smallest singular value of the matrix of inputs. Above 30 is concerning; above 100 is severe. Condition number captures multicollinearity that involves combinations of three or more channels, which pairwise correlations and VIF can miss.
Most MMM tools should run these diagnostics automatically and surface warnings. If yours doesn't, run them yourself before trusting any output.
Why ridge regression helps but doesn't solve it
A common response to multicollinearity is to use ridge regression — adding a penalty on coefficient size to the optimization. This stabilizes estimates by pulling them toward zero when the data doesn't have strong evidence for non-zero values.
Ridge does help. With perfectly collinear channels and ordinary regression, the coefficients are mathematically undefined. With ridge, they get stable values — typically split between the channels in proportion to the data the model does have. The estimates won't swing wildly across runs.
But ridge doesn't actually solve the underlying problem. The data still doesn't contain the information needed to distinguish the channels. Ridge gives you a stable answer; it doesn't give you the right answer. If two channels are perfectly correlated and you want to know which drove the lift, ridge will give you a 50/50 split that won't change across runs — but the truth could be 80/20 or 20/80, and ridge has no way to tell.
Ridge plus Bayesian priors (which CheapMMM and most modern MMMs use) is better than ridge alone. The priors push toward plausible values rather than just toward zero, so you get more reasonable estimates. But the same caveat applies: the estimate is now driven mostly by the prior rather than the data, and you should know that's what's happening.
(More on the role of priors in our post on Bayesian priors in MMM.)
Practical strategies
When you detect multicollinearity, you have several options before giving up on MMM for that decision:
Aggregate correlated channels. If Meta prospecting and Meta retargeting always move together, model them as a single "Meta" line item rather than trying to separate them. You lose the ability to optimize within Meta, but you gain stable estimates for the aggregate. This is often the right tradeoff.
Find or create variation. If you have any historical periods where the channels moved differently — a campaign where Meta scaled but Google didn't, a period when one was paused — those periods carry disproportionate signal. Make sure they're in your dataset. Going forward, deliberately introducing some variation (running an A/B period where you scale one channel and hold the other flat) gives the next model run something to work with.
Use longer time horizons. Not because more data dissolves correlation (it usually doesn't), but because longer horizons sometimes include enough natural variation to break correlations that look perfect over shorter windows.
Strengthen priors. If you have prior information about the relative effectiveness of the correlated channels (from incrementality tests, from industry benchmarks), encoding that as a prior can produce more sensible estimates than letting the model split credit arbitrarily.
Drop redundant channels. If two channels are essentially the same thing measurement-wise, ask whether you actually need them as separate line items. Combining "Meta + Instagram" might be conceptually fine if you treat them as one buy operationally.
When to give up and run an experiment
Sometimes MMM cannot answer the question. If two channels are highly correlated, your priors are weak, and the decision has high stakes, no amount of model tuning will get you a confident answer.
This is where incrementality testing earns its place. A geo holdout — running a channel in some markets and not others, then comparing — gives you direct experimental evidence on the channel's incrementality, independent of any other channel's behavior. It's slow, expensive, and operationally complex. But it answers the question MMM can't when the data is collinear.
The recommended pattern: use MMM for the 80% of decisions where multicollinearity is moderate and the credible intervals are usable. Reserve incrementality testing for the high-stakes channel reallocations where MMM credible intervals overlap heavily, indicating the model can't distinguish the alternatives. (For more on this dynamic, see our post on MMM vs attribution vs incrementality testing.)
Common mistakes
Trusting point estimates from collinear models. This is the cardinal sin. When channels are correlated, point estimates can be wildly off the truth even when they look reasonable. Always look at uncertainty (see our post on credible intervals).
Adding more channels to an unstable model. When the model is already struggling with collinearity, adding a fourth correlated channel doesn't fix it — it makes things worse. Each added channel increases the chances of new collinearity issues.
Concluding "the model is wrong" when it's actually being honest about uncertainty. A model that gives you wide credible intervals on collinear channels is being correct about the limits of what the data can tell you. That's a feature, not a bug.
Re-running the model with different specifications until you get the answer you want. This is called specification search and it's a form of self-deception. If small changes to the model produce big changes to the estimates, the underlying problem is collinearity, not specification — and picking the version that confirms your priors doesn't fix it.
Ignoring the warnings. Most modern MMM tools will flag high correlations or high VIFs. If your tool warns you, take the warning seriously. The estimates for those channels are not as reliable as they look.
What to look for in a tool
If you're choosing rather than building, look for tools that:
- Run multicollinearity diagnostics automatically (correlation, VIF, condition number)
- Surface warnings when channels are highly correlated
- Use ridge regularization or other stabilization for the linear part of the model
- Use Bayesian priors that prevent absurd splits between correlated channels
- Provide credible intervals so you can see when the data isn't informative
CheapMMM detects high pairwise correlations (r > 0.85), reports them as warnings in the output, applies ridge regularization with adaptive alpha based on the observation-to-parameter ratio, and uses Bayesian priors to keep estimates plausible. But the most important thing isn't the specific implementation — it's that the tool tells you when collinearity is a problem rather than silently producing unstable estimates and presenting them as confident.
For more on the data side of the multicollinearity problem, see our post on how much data you need for MMM and how to prepare your data for MMM.