Marketing mix modelling: what it is and when it's worth doing
Marketing mix modelling (MMM) is a statistical method that estimates how much of your sales each marketing channel drove, by looking at how sales moved as spend moved over many weeks.
You give it weekly spend per channel and weekly sales, and it fits a model that says, roughly, "each £1 on search returned £3, each £1 on social returned £1.50, and £20,000 a week would have happened anyway."
Why it matters
The decision it changes is budget allocation. Platform dashboards each report their own conversions, and the totals add up to more sales than you actually made. MMM works from the one number you trust, actual sales, and asks what explains its movement. That gives you a return per channel on a common footing.
It also handles things the platforms can't see: offline sales and channels with no click, such as TV or podcasts. If you include a price change or a bank holiday as an input, it will estimate those too.
How it works
The core is a regression. Sales in each week is the thing being explained. Spend per channel in each week is what explains it. The model finds the coefficients that make the two line up as closely as possible across every week in the dataset.
Here is an illustration with made-up numbers. Two channels over six weeks, with no noise. Real data is never this tidy, and a real model needs far more than six weeks; this is only to show the shape.
| Week | Search spend | Social spend | Sales |
|---|---|---|---|
| 1 | 2,000.00 | 1,000.00 | 27,500.00 |
| 2 | 3,000.00 | 1,000.00 | 30,500.00 |
| 3 | 2,000.00 | 2,000.00 | 29,000.00 |
| 4 | 4,000.00 | 2,000.00 | 35,000.00 |
| 5 | 1,000.00 | 3,000.00 | 27,500.00 |
| 6 | 3,000.00 | 3,000.00 | 33,500.00 |
The model that fits every row is:
Sales = 20,000 + 3.0 × search spend + 1.5 × social spend
Check week 4: 20,000 + 3.0 × 4,000 + 1.5 × 2,000 = 20,000 + 12,000 + 3,000 = 35,000. Week 5 comes out at 20,000 + 3,000 + 4,500 = 27,500.
Read it as three claims. About £20,000 of weekly sales happen with no paid activity at all (repeat customers and organic search). Each £1 on search is associated with £3 of sales, and each £1 on social with £1.50. If those held at the margin, you would move money from social to search until they no longer did.
Real models add two things this illustration leaves out. The first is carryover: an ad seen this week still sells something next week, so spend is spread forward before fitting. The second is saturation: the tenth £1,000 in a channel earns less than the first, so the relationship curves rather than running straight. See diminishing returns in advertising for why the curve matters more than the average.
What it can't tell you
It can't work with a short window. The model learns from variation over time, so it needs many weeks in which spend went up and down in ways that didn't all move together. A few months of flat budgets gives it nothing to learn from.
It can't separate channels that always move together. If social and search spend both rise every time you launch a product, the model sees one movement and can't say which channel caused the sales. This is collinearity, and no amount of fitting fixes it. Only varying the channels independently does.
It can't see small budgets. A channel spending £200 a week against £50,000 of weekly sales is noise. The model will produce a coefficient, and it will be meaningless.
It can't tell you why. A coefficient says search spend and sales rose together, not whether the ads did the work or the people searching for your brand anyway did. An incrementality test answers that for one channel at a time.
When to use it
Use it when you spend across several channels, some of them without clicks to track, and you have a long enough history with real variation in spend.
Don't start here if you have two paid channels and a year of data. A holdout test on the channel you're unsure about will answer the question faster, and you'll trust the answer more because you can see the control group. MMM is the right tool once the number of channels makes testing each one impractical.
Tracking it in a spreadsheet
The inputs are weekly spend per channel and weekly revenue, over as many weeks as you have. A scheduled Fresh Sheets report can keep each source current in its own tab: Google Ads cost by week, Meta Ads and TikTok Ads spend by day (summed into weeks on your combined tab), and Shopify orders and revenue by week. Fresh Sheets replaces each tab's contents on every refresh, so build the combined weekly table on a separate tab, with one row per week and one column per channel, and point the model at that.