Most MMM projects do not fail because of the model. They fail because the dataset that feeds the model is incomplete, inconsistent, or built once and never refreshed. Before you fit a single Bayesian MMM, the team needs a structured weekly time series with media spend, outcomes, controls, and context aligned in a way the model can actually use. This guide walks through that dataset, end to end.
Why data prep is most of the work
On a typical mid-market brand running an in-house MMM program, data preparation accounts for 60 to 80 percent of the elapsed time on the first build. The model fitting itself is fast: a Bayesian MMM with hundreds of weeks and a dozen channels usually fits in minutes to hours, not days. The data work is what stretches projects from weeks to quarters.
Treat the MMM dataset as a product. It has owners, refresh cadences, schemas, and quality checks. If it does not, your MMM program will not be repeatable.
Step 1: pick the outcome
Decide what the model is explaining before you collect anything else. The outcome shapes every downstream interpretation, especially channel ROI.
- Revenue: most common, ties cleanly to ROI conversations
- Orders or units: useful when price varies a lot or revenue is dominated by mix
- Leads or signups: appropriate for B2B and SaaS marketing
- Profit or contribution margin: technically the most decision-relevant, often hard to source weekly
Step 2: choose the time grain
Weekly is the default for almost every MMM. It is granular enough to capture realistic adstock, but coarse enough that ad platform reporting noise smooths out. Daily can work for high-volume direct response brands but multiplies the data engineering load. Monthly is too coarse for most modern MMM and tends to over-fit external factors.
Pick one week boundary (for example Monday to Sunday) and use it everywhere. Mixed week boundaries between platforms is one of the most common silent data bugs in MMM.
Step 3: standardize media inputs
Media data is the bulk of the dataset and the area with the most platform-specific quirks. The goal is one row per week per channel, with consistent column names, currency, and channel boundaries.
- Aggregate spend and impressions to the same weekly date grain
- Use consistent channel names across markets and brands
- Convert all spend to a single currency at consistent exchange rates
- Separate channels that have materially different response patterns
- Decide whether to include cost vs media value (impressions, GRPs) for each channel
Step 4: design your channel taxonomy
Channel grouping is one of the most consequential decisions in MMM. Group too coarsely and you cannot tell the difference between two media types. Group too finely and the model has too many channels relative to data and starts to overfit.
| Domain | Typical channels | Notes |
|---|---|---|
| Paid digital | Paid search, paid social, display, video, retail media | Split branded vs non-branded search |
| Paid offline | TV, radio, OOH, print | Convert to GRPs or impressions where possible |
| Owned and earned | Email, SMS, organic social, PR | Often controls rather than direct media |
| Affiliate and partnerships | Affiliate networks, influencer | Treat as separate channel |
Step 5: add controls and context
Controls are the variables that drive sales independent of media. Without them, the model will misattribute movement to channels.
- Pricing: average price, price index, or relative price vs competitors
- Promotions: discount depth, promotion calendar dummies, sale events
- Distribution: number of stores, available SKUs, ACV (all commodity volume)
- Seasonality: explicit holiday and event flags
- Macro: weather, consumer confidence index, category demand
Step 6: external factors
External factors are particularly important in unusual periods (pandemic shocks, supply constraints, major macro events). If 2020 to 2022 is in your training window, the model needs structural variables that explain those years, otherwise it will assign the disruption to whichever channel happened to be high or low at the time.
Step 7: data quality checks
Before any model is fit, the dataset should pass a basic quality bar.
- No gaps in the weekly date sequence
- Spend and impressions are non-negative everywhere
- Sum of channel spend matches finance system within a small tolerance
- Outcome variable is consistent with the official source of truth
- All channels have at least some non-zero variation across the window
- Outliers are flagged and either retained, capped, or marked with a dummy
What the final dataset looks like
| Column type | Examples | Format |
|---|---|---|
| Date | week_start | Single ISO week, consistent boundary |
| Outcome | revenue, orders | Numeric, single currency |
| Media spend | tv_spend, paid_search_spend | Weekly currency |
| Media volume | tv_grps, paid_search_impressions | Weekly counts |
| Pricing | avg_price, price_index | Numeric |
| Promotions | promo_flag, discount_depth | Binary or numeric |
| External | weather_index, holiday_flag | Numeric or binary |
From dataset to model
A clean dataset like this is the input to every Bayesian MMM workflow we discuss in our other posts. For more on what happens after the dataset is in place, read Bayesian MMM Explained, or see the marketing mix modeling software page for the SIMBA end-to-end workflow.
If you want a hands-on review of your current MMM dataset, book a data audit call. We will walk through your data sources and what is needed for a production-grade Bayesian MMM.