Marketing mix modeling data is a weekly table with one row per period and three kinds of column: the outcome you want to explain (revenue, orders or sign-ups), the spend and ideally exposure for each paid channel, and the non-media drivers of sales such as price, promotions, distribution, seasonality, holidays and competitor activity. The usual minimum is two years of weekly history, but how much each channel’s spend varies, and how independently the channels move, matters more than the raw row count.
I’ve built marketing mix models for companies including Monzo, Breeo and The AA, and in my experience the data takes longer than the modeling. That’s rarely anyone’s fault, because the spend lives in five ad platforms with five definitions of a week, revenue lives in finance with returns booked when they’re processed, and the promotion calendar lives in someone’s head. A model can’t recover information that never made it into the table, so this page covers what to collect, how much is enough, and how to audit what you’ve got before fitting anything.
What data you need for a marketing mix model
Here’s the full list, roughly in order of how much damage leaving it out does. Not every business needs every row, but every row you skip should be a decision rather than an oversight.
| Data | Examples | Why the model needs it |
|---|---|---|
| Outcome | Revenue, orders, new customers, app installs | The thing you’re explaining; one, precisely defined |
| Paid media spend | Weekly cost per channel (search, social, video, TV, audio, OOH) | To calculate ROI and fit the response curves |
| Media exposure | Impressions, GRPs/TRPs, reach | A cleaner measure of what customers saw than cost |
| Price | Average selling price, price index, discount depth | Price moves sales directly and often moves with media |
| Promotions | Promotion flags, depth, free-shipping weeks | The most common confounder of media effects |
| Distribution | Store count, listings, out-of-stock weeks | Sales can’t happen where the product isn’t |
| Seasonality and holidays | Holiday flags, school terms, weather where relevant | Peaks that media budgets usually follow |
| Events | Launches, outages, PR spikes, tracking changes | One-off shocks that otherwise land on a channel |
| Competitors | Competitor spend or share-of-voice estimates | Explains dips your own data can’t |
| Macro | Consumer confidence, category demand, search trends | Slow-moving demand shifts across the market |
| Organic activity | Email sends, social posts, PR mentions | Marketing with no media cost that still moves sales |
The first three rows are the ones people collect; the middle rows are the ones that make the model trustworthy. If promotions always run alongside your biggest media bursts and the promotion isn’t in the data, the model will credit the media for the promotion’s sales, which is the omitted variable problem and the single most common reason an MMM overstates a channel. The MMM model diagnostics page has an interactive example of exactly that.
The outcome, the media and the controls
Choose one outcome and define it precisely. “Revenue” can be gross or net of returns, discounts and tax; it can be booked on order date, shipment date or payment date; it can include or exclude marketplaces. Each choice is defensible, but the model needs one of them applied consistently for the whole history. The course’s “prepare your data” lesson puts it well: an MMM dataset is a business record, not just a matrix, and if finance uses order dates while the media export uses the ad account’s timezone, a tidy-looking join can give each row two different meanings.
For media, collect spend for every channel because that’s what ROI is calculated from, and collect exposure (impressions for digital, GRPs or TRPs for TV and radio) where you can. Robyn’s analyst guide recommends modeling exposure metrics rather than spend where they’re available, avoiding clicks because they miss people who saw an ad and didn’t click, and falling back to spend when exposure data is missing or fits poorly. Whichever you use, be consistent: spend booked in the week ads aired, not the week the invoice arrived, and one definition (gross or net of agency fees and platform credits) throughout.
Controls are everything else that moves sales. Price, promotions and distribution are the most important for retail and consumer brands; for subscription and app businesses it’s usually pricing changes, product launches and app-store features. Add seasonality and holidays, a dummy for each real one-off event, and competitor or macro data if you can get it. The measurement plan page covers choosing these from the business question rather than throwing in everything available, which matters because every column you add costs a parameter.
Weekly or daily, national or geo
Weekly data is the default, and for good reason. It smooths out day-of-week patterns, it matches how most media is planned and bought, and it’s the granularity Robyn’s guidance treats as best practice; daily data can be acceptable but needs extra validation, and the Robyn paper suggests shorter daily datasets can work for direct-response businesses such as DTC brands, apps and games. Monthly data is a last resort: with 12 rows a year you’d need many years of history to fit even a small model, and the business will have changed in the meantime.
Geography is the bigger lever. If you can get the same outcome and media data by region (states, DMAs, countries), a geo-level model multiplies your observations and, more importantly, adds variation, because spend rarely moves identically everywhere. Google’s research on geo-level Bayesian hierarchical models found they generally produce tighter credible intervals than national-only models, and Meridian recommends the geo-level model whenever the data exist. The catch is alignment: regional media and regional sales have to cover the same population, which is harder than it sounds for national TV or for digital channels whose geo reporting is approximate. The geo models brief covers the preparation.
How much data do you need for MMM?
The common rule of thumb is at least two years of weekly data, and both Robyn’s analyst guide and the Robyn paper state it. The reasoning is about seasonality: with two years, the model sees each season twice, so it has some chance of telling a Christmas peak from the TV campaign that ran during it. With one year, every seasonal pattern appears once, perfectly confounded with whatever media ran at the same time. Robyn’s guide suggests collecting four to five years if you only have monthly data.
Rows on their own aren’t the right measure, though; rows per parameter is. Robyn’s analyst guide suggests about 10 observations per independent variable. Meridian’s documentation works through a national example with 12 channels, six controls and eight knots (26 parameters, before it even counts adstock and saturation) on two years of weekly data, and calls the resulting four data points per parameter too low to estimate the model reliably; its suggested fix combines channels, cuts knots and drops a non-confounding control to get to 10 parameters on three years of data, about 15 points each, which it says might allow some directional information. That’s a sobering example, because 12 channels and two years is a pretty typical brief.
Remember too that each channel isn’t one parameter. A coefficient, an adstock rate and one or two saturation parameters make three or four per channel, so eight channels can easily mean 30 parameters before you’ve added a single control. Bayesian priors and ridge regression help by constraining parameters the data can’t pin down, but they help by substituting assumptions for evidence, which is fine only if the assumptions are earned (the Bayesian MMM page goes into this).
Variation matters more than row count
A regression learns a channel’s effect from how sales move when that channel’s spend moves. If you spent $50,000 on paid search every single week for three years, you have 156 rows and no information at all about what search does, because there’s no variation to learn from. The same goes for two channels that always move together: the data can tell you about their combined effect but not how to split it, which is the multicollinearity problem. Meridian’s guidance notes that insufficient variation in media spend adversely impacts national models, and Google’s 2017 geo paper starts from the observation that national data often has small samples and limited spend variation.
Two quick measures capture this. The coefficient of variation (CV, the standard deviation of weekly spend divided by its mean) tells you how much a channel moves; my rough rule is that below about 0.2 a channel barely varies, and the model will lean on priors or regularization to estimate it. The correlation between each pair of channels tells you how independently they move; above about 0.8 the split of credit between them will be unstable. Put your own numbers into the checker below:
The defaults describe a common brief: two years of weekly national data, six channels with adstock and saturation, four controls and six trend and seasonality terms. That’s 29 parameters on 104 rows, about 3.6 rows each, which is in the territory Meridian calls too low. Change geographies to 20 and watch the range jump, then set the lowest CV to 0.08 and see why more rows don’t fix a flat channel. The best data fix is often not more history but more variation: flighting spend on and off, varying it by region, or running a geo-lift test whose result can become a prior.
A real data audit: the Northstar handoff
The Vexpower course’s invented Northstar case includes a deliberately corrupted copy of its 104-week dataset, the kind of file an analyst actually receives. It has 105 rows and four planted problems, and a fictional re-export from the source owners confirms the fix for each. All the numbers are invented for teaching, but every problem is one I’d expect to find in a real handoff.
| Issue | Week | What was received | Confirmed value | Source |
|---|---|---|---|---|
| Missing export | 2024-02-26 | social_spend blank | 1,148 | Social owner re-export |
| Unit mismatch | 2024-04-29 | search_spend 1.827 | 1,827 | Search owner confirms GBP, not thousands |
| Wrong week boundary | 2024-07-30 | a Tuesday date | 2024-07-29 | Finance confirms Monday week start |
| Duplicate export | 2024-03-11 | two identical rows | keep one | Finance confirms duplicate upload |
Paste the messy file into the data template you can download from this page and its Audit sheet flags all four: one duplicate row, one date that isn’t a Monday, one blank social cell, and a smallest search value of 1.827 against a typical week of around 2,400. Two details are worth dwelling on. First, the “missing weeks” check reports zero gaps, because the misdated Tuesday row fills the slot the missing Monday left; a count can pass while the calendar is wrong, which is why you check weekday alignment separately. Second, that single unit error raises search’s coefficient of variation from about 0.18 to about 0.20, nudging it across the low-variation threshold. A data error manufactured variation, and a model would have happily learned from it.
Notice also what the audit can’t tell you. Passing every check doesn’t mean an important variable isn’t missing, that spend wasn’t set in response to expected sales, or that the regions respond the same way. The course asks students to write one substantive missing-data question even after the planted issues are fixed; for Northstar, mine would be whether stock availability was ever constrained, because the absence of a stock column doesn’t mean stock was always available. The full case, with the corrections and an answer key, is in the Northstar decision pack, and the worked marketing mix modeling example walks through it end to end.
Align time and geography before you join anything
Every row is a claim about what belongs together, as the course’s “align time and geography” lesson puts it. Check three joins before you fit. Time: are weeks defined by order date, shipment date or payment date, which timezone closes the week, and is media booked when delivered or when invoiced? Population: do the outcome and the media cover the same geography and customers, or are you comparing online-only media with all-store revenue? Scope: have fees, tax, refunds, discounts and currencies been treated consistently?
These mismatches can do worse than add noise, because they create fake mechanisms. A campaign delivered over a weekend that crosses a reporting boundary puts the spend in week one and much of the response in week two, and the model may read that recording artefact as adstock. Real responses can be delayed too, so fix the recording definitions before assuming every apparent lag describes customer behavior. Keep the raw data, document every transformation, and when a source changes its definition partway through the history, flag the break rather than smoothing it away.
Recognise measurement error
A precise column name doesn’t guarantee a precise measurement. In the Northstar case, search spend is recorded net of credits, social spend is gross and the video export omits agency fees, so the channels’ ROIs aren’t comparable even though the columns look identical. The course’s lesson gives a simple denominator example: a modeled contribution of 40,000 on 20,000 of recorded media spend is a return of 2.0, but if the intended denominator also includes 5,000 of campaign costs, the comparable ratio is 1.6. Nothing about the model changed; the definition of return did.
Measurement problems come in different kinds (a consistent scaling error, a noisy input, a definition change halfway through), and their effects depend on the model and on how the errors relate to other inputs, so be wary of anyone who says measurement error always biases an estimate in one direction. More rows reduce sampling noise but leave a systematic recording problem untouched, and a model can be confidently wrong about a poorly measured channel. The practical fix is unglamorous: reconcile a month of each channel’s spend to the finance definition used in the business decision, and check that definition held for the whole period. The data cleaning brief and the note on interpolating missing data cover the mechanics.
Download the marketing mix modeling data template
The template has a weekly Data sheet with typed columns and validation (dates, non-negative numbers, 0/1 flags), a Data dictionary with yellow cells for the source system, owner and exact definition of every column, and an Audit sheet with live formulas for time coverage, missing and duplicate weeks, non-Monday dates, blanks, zero-spend weeks, CV and spend share per channel, a CORREL correlation matrix and a rows-per-parameter calculator. It comes filled with the course’s invented practice data so you can see the audit working, and it works in Excel and Google Sheets with no macros. If you want more sample data to practise on, the MMM datasets page collects them.
If you’d rather learn this on a dataset that’s already been through the wringer, the Vexpower MMM course starts with exactly this audit before any modeling, and the introduction to marketing mix modeling shows where data preparation fits in the full process.
