This is a complete media mix modeling example, start to finish, with numbers you can follow: the data that goes in, the outputs the model returns, and the decision that comes out the other end.
To set the stage in one paragraph: a media mix model (MMM) is a statistical model that reads your marketing spend and revenue history across every channel, online and offline, and estimates what each channel actually contributed. Everything below is illustrative, but the shapes are exactly what real models produce. Abstract MMM explanations are everywhere; honest walkthroughs are rare. This is the walkthrough.
The setup: a business and its data
Meet our illustrative company: an online retailer generating 600,000 euro in monthly revenue across four marketing channels:
- Paid search: 40,000 euro per month
- Social media: 25,000 euro per month
- TV advertising: 30,000 euro per month
- Email campaigns: essentially free
No user-level data anywhere in this exercise. What the model gets instead: 104 weeks (two years) of weekly spend per channel, weekly revenue, the promo calendar, and seasonality markers. That’s the whole shopping list, and it’s assembled from finance and marketing records rather than tracking infrastructure. For the fundamentals behind what follows, see what a marketing mix model is.
What the model returns
First, the baseline: the model estimates 300,000 euro of monthly revenue would arrive with no advertising at all: brand strength, repeat customers, organic discovery. That’s half of everything, and knowing it stops channels claiming credit for sales that were coming anyway.
Then the contributions, each arriving as a range rather than a lone number:
- Search: 120,000 euro (range 114 to 126). That’s 3.0 euro back per euro spent.
- TV: 90,000 euro (range 84 to 96). Also 3.0 per euro.
- Social: 50,000 euro (range 45 to 55). About 2.0 per euro.
- Email: 40,000 euro (range 36 to 44). Nearly free to run, so its return per euro is enormous.
Check the arithmetic: 300k baseline + 120k + 90k + 50k + 40k = 600k. The decomposition accounts for every euro of revenue.
Read the ranges honestly: a narrow range like search’s means you can trust the rough magnitude; wider ranges mean the model is less sure and big bets there deserve validation first. These are illustrative numbers, not client results: the point is their shape.

The interesting part: saturation and adstock
The most useful outputs aren’t in the contribution table. They’re the two curves.
The saturation curve gives you marginal return: what the next euro buys, not the average. In our example, search’s average return is 3.0 but its marginal return at current spend is 1.4: the next 10,000 euro there brings roughly 14,000, not 30,000. The cheap audience is already reached. TV’s marginal return is still 2.6: the next 10,000 euro brings roughly 26,000. Room to grow.
The adstock curve shows how long each channel’s effect lasts. TV’s impact spreads over weeks: an ad aired this week is still selling next month. A naive week-by-week read under-credits TV for exactly this reason; the model’s job is to catch the delayed effect and credit it properly.
Averages flatter saturated channels. Marginals tell you where the next euro should go. That’s why these curves, not the contribution chart, are where decisions live.
The decision: what this example business did
Closing the loop, still illustrative: the team moved 8,000 euro a month from search into TV, kept email fully funded, and planned an incrementality test (a controlled experiment) on the TV increase before scaling it further.
The expected gain, straight from the marginals: the moved 8,000 euro earns roughly 20,800 in TV against 11,200 forgone in search: a net gain of about 9,600 euro a month, with no new budget.
Notice what the model actually delivered: not a poster of charts, but one confident reallocation with a number attached, and a plan to verify it experimentally. Sometimes the win isn’t growth; it’s the same budget, working harder.
Running an example on your own data
The walkthrough above used four inputs: weekly spend per channel, weekly revenue, promotion dates, and seasonality. Any finance-and-marketing pair can assemble them; two years of history is the reliable amount.
If you want to learn the mechanics hands-on, spreadsheet and R tutorials are everywhere (search for marketing mix modeling in Excel or R): genuinely good for building intuition. The honest gap: a production MMM needs automated data pipelines, validation and regular refreshes, which is where the open-source engines come in: see Meridian, Robyn and open-source MMM compared.
MarSci runs this entire loop as a service: always-on MMM on Google’s open-source Meridian engine, with the walkthrough above as a weekly reality rather than a one-off exercise: MarSci’s marketing mix modeling solutions.
Frequently Asked Questions
A model reading about two years of weekly spend and revenue across channels, returning a baseline plus per-channel contributions with ranges, saturation and adstock curves, and ending in a budget reallocation: exactly the walkthrough in this article, at whatever scale your business runs.
Yes: a basic regression on weekly data teaches the concepts well. Production MMM needs Bayesian machinery, validation and refresh discipline beyond a spreadsheet: like building a weather forecast in Excel, possible for education, not advised for decisions. Learn in the spreadsheet, decide with the real machinery. Many vendors offer MMM on excel.
Weekly or daily spend per channel, revenue or conversions, promotion dates and seasonality context: about two years’ worth, roughly 104 weekly data points, so the model has seasonality to learn from. No user-level tracking at all. Finance and marketing records together cover the whole list. Depending on the industry there are certain data points that play a more important role.
The revenue that would arrive with no advertising: brand strength, repeat buyers, organic discovery. It’s the reference point that stops channels claiming credit for sales that were coming anyway, and it’s often a bigger share than teams expect. Knowing yours changes how every channel’s numbers read.
