Tools
Marketing Mix Modeling Tool (MMM)
Paste weekly spend and sales into this free marketing mix modeling (MMM) tool to estimate each channel's contribution, adstock carryover, saturation point and a better budget split for the same spend. No cookies or user tracking, no code; your data never leaves your browser.
Result
Actual vs model
Channel results
Response curves
Weekly spend from 0 to 2x; the dot is the current average.
Budget allocation
A lightweight, directional model; it does not replace a full Bayesian MMM such as Meridian or Robyn. Validate decisions with an incrementality test.
How to use the marketing mix modeling tool
- Paste or upload your weekly data
Type one row per week into the Weekly data box and make the first row a header. First, you need a date column, your channel spend columns and a target column. Have a file ready? Use Upload CSV. Want to explore first? The Try sample data button loads a synthetic table of 104 weeks and 4 channels and fits the model at once; it is not real customer data.
- Check the column roles
In Columns, the tool guesses a role for every column: Date, Spend, Target (KPI), Control or Ignore. Then fix any wrong guess from the list. Mark columns such as promo weeks or price as Control.
- Set the target type and options
Pick Revenue or Conversions as the target type. The Seasonality and Trend boxes start ticked, and seasonality only takes effect with 52 weeks or more. Untick a box if you do not need it.
- Fit the model
Press Fit model. The tool searches carryover and saturation for each channel on a grid, which can take 2 to 3 seconds. The whole calculation runs in your browser, so your data never reaches a server.
- Read the warnings and the fit
Start with Warnings, then check R², MAPE and the Actual vs model chart. If the two lines drift apart, do not trust the channel results.
- Calculate the budget allocation
Weekly budget starts with your current average, so enter any other test amount if you like. Limit each channel to ±50% starts ticked, so the advice stays close to what you spend today. Then press Optimise split.
Marketing mix modeling formulas
The tool applies two transforms to each channel's spend and adds the results in one linear layer. In the notation below, x is weekly spend, a is spend after carryover (adstock) and y is the target. The tool first divides the target by its own mean and scales the results back afterwards.
a(t) = x(t) + λ × a(t-1); λ is a value from 0 to 0.7 in steps of 0.1h(a) = a / (a + k); k = the channel's average adstocked spend × 0.5, 1, 1.5 or 2.5ŷ(t) = b0 + Σ β(c) × h(a(c,t)) + trend + seasonality + Σ γ(j) × control(j,t)trend = t / (weeks - 1); seasonality = sin and cos (2π × m × t / 52.18), m = 1 and 2min Σ (y(t) - ŷ(t))² + α × Σ β(c)²; β ≥ 0 for every channel, α = 0.01 × weeks; baseline and control coefficients can take either sign and carry no penaltyContribution(c) = Σ(t) β(c) × h(a(c,t))Share(c) = Contribution(c) / Σ(t) ŷ(t) × 100Revenue target: ROI = Contribution / Spend; conversion target: CPA = Spend / ContributionΔContribution / ΔSpend; if weekly spend holds steady, weekly contribution = β × h(w / (1 - λ)); a small step of 1% of spend at the current average w. Marginal CPA = 1 / marginal ROIr = (average weekly spend / (1 - λ)) / k; r < 0.6 room to grow, r < 1.6 moderate, otherwise near saturation1 - Σ (y - ŷ)² / Σ (y - ȳ)²mean(|y - ŷ| / y) × 100; weeks where the target is 0 stay outStarts at the lower bounds (with the box ticked, 0.5 × current and an upper bound of 1.5 × current); splits the remaining budget into 600 equal steps and gives each step to the channel that gains the most contribution at that momentThe Media share card is the share of the model total that comes from channel contributions. Baseline, trend, seasonality and controls stay out of it. The allocation assumes you hold each channel's weekly spend steady.
Worked examples: carryover, saturation, ROI and error
These rows are example calculations, not client data. Try the same numbers by hand and you get the same results.
| Example calculation | Inputs | Method | Result |
|---|---|---|---|
| Carryover, long effect | 1,000 spent in week 1, then 0; carryover rate 0.5 | Each week adds half of the previous effective value | 1,000 / 500 / 250 / 125; total effect 2,000 |
| Carryover, short effect | Same spend; carryover rate 0.3 | Each week keeps 30% of the previous value | 1,000 / 300 / 90 / 27; total effect about 1,429 |
| Saturation (Hill) | Half saturation point 1,000; effective spend 500, 1,000, 2,000, 4,000 | h = a / (a + 1,000) | 0.33 / 0.50 / 0.67 / 0.80 |
| ROI and marginal ROI | Search: spend 10,000, contribution 30,000, marginal ROI 0.9. Video: spend 5,000, contribution 7,500, marginal ROI 1.4 | ROI = contribution / spend; shift = 2,000 × (1.4 - 0.9) | Search ROI 3.0; Video ROI 1.5; first estimate: +1,000 weekly revenue |
| CPA (conversion target) | Spend 20,000, contribution 400 conversions; the next 1,000 of spend buys about 10 conversions | CPA = spend / contribution; marginal CPA = 1,000 / 10 | CPA 50; marginal CPA 100 |
| MAPE | Actual 100, 120, 80; model 90, 126, 84 | Per week |actual - model| / actual, then the mean | 10%, 5%, 5%; MAPE 6.67% |
Row four, in short, shows the key distinction. Search has the highest average return, yet its next dollar earns less than Video's. When you actually shift money, marginal returns change along the way. Therefore the tool works from the curves, and its result can drift a little from this first order estimate.
Meridian vs Robyn vs this tool
The three options answer the same question at different depth. Which one fits depends on your team's skills and on how big the decision is.
| Feature | Meridian | Robyn | This tool |
|---|---|---|---|
| Source and design | Google, open source, Bayesian | Meta Marketing Science, open source, experimental | Lightweight model in your browser |
| Needs code? | Yes (Python) | Yes (R) | No |
| Estimation | Bayesian causal inference | Ridge regression, Prophet, Nevergrad | NNLS, light ridge, grid search |
| Experiment calibration | Experiment results enter as priors | Calibrates with geo and lift style ground truth | None; you validate the result |
| Best for | Large budgets, data science team | Teams that work in R | A fast first look and direction |
The table follows the official descriptions of all three; check the source links for detail.
What is marketing mix modeling, and what does this tool do?
Marketing mix modeling (MMM) compares your weekly spend with your weekly results and estimates, with statistics, how much each channel contributed. In practice, it needs no click-level or user-level records. Total spend and total revenue (or conversions) for each week are enough. This tool is a lightweight take on marketing mix modeling that runs the same logic without any code.
You paste the weekly data, and the tool returns these outputs:
- Channel contribution and share: how much each channel added to the result.
- ROI and marginal ROI: the average return and the return on the next unit of spend.
- Carryover and saturation: how many weeks an effect lasts and how returns fade as spend grows.
- Budget allocation: a better channel balance for the same total budget.
One warning up front: the results point a direction, they do not deliver a verdict. The tool does not replace a full Bayesian model, and you should validate its output with incrementality tests. When you want to turn the direction into campaign settings, our Google Ads management service picks up from there.
Why is marketing mix modeling back in a cookieless, privacy-first world?
As user-level tracking weakens, click-based measurement leaves gaps. As a result, browser restrictions, app tracking prompts and consent banner rejections all thin out attribution data. MMM attacks the problem from another side because it uses no personal data. It asks for a single aggregated weekly table.
The big platforms have moved the same way. Google opened its open source Meridian model to everyone on January 29, 2025. According to the announcement, Meridian uses Bayesian causal inference, accepts incrementality experiment results as priors and accounts for reach and frequency. Meta offers its open source Robyn package, which relies on ridge regression, Prophet and Nevergrad.
Both come with a price: they ask for code, setup and data science skills. If your team lacks those, the first look may never happen. So this tool fills exactly that gap. It gives you a quick first read, and then you decide whether a move to Meridian or Robyn pays off.
Keep the click-based side in view as well. Our attribution model comparison tool shows channel order, while MMM shows total contribution. We also explain attribution windows in our guide to Meta attribution settings.
How do carryover and saturation work in this marketing mix modeling tool?
Ad impact does not stop in the week you spend. For example, someone who watches a video ad today may buy two weeks later. The tool models this with geometric adstock: each week's effective spend equals that week's spend plus the carryover rate times last week's effective spend. It tries carryover rates from 0 to 0.7 in steps of 0.1. A value of 0 means the effect ends at once, while 0.7 means it lingers.
The second transform is the saturation curve. Doubling spend does not double revenue, because the first dollars work hardest. A Hill curve captures that fade through its half saturation point, the spend at which response reaches half its ceiling. We try 0.5, 1, 1.5 or 2.5 times the channel's average adstocked spend. Because the curve is always concave, each extra dollar returns a little less than the last. We skip S-shaped curves on purpose, since on weekly data they tend to fit noise. The Response curves chart then sweeps spend from 0 to twice today's level.
Here is how we find the coefficients:
- Channel coefficients cannot go negative (NNLS). Baseline, trend, seasonality and control terms may still take a negative sign.
- A light ridge penalty on channel coefficients only keeps them from running to extremes when channels move together.
- The tool walks through the channels one at a time, keeps the carryover and saturation pair with the lowest error, and repeats that round up to four times.
- With 40 or more weeks, the tool refits the model 8 times, each time leaving out one block of weeks. The spread of those runs feeds the ROI range and Stability columns, and the optimizer flags any budget increase for an uncertain channel.
This echoes Robyn's ridge regularization. However, there are no Bayesian priors or experiment calibration here, so read the output as a direction rather than a certainty.
How should you prepare weekly data, and how many weeks are enough?
Each row must be one week, and the first row must hold the headers. You need three groups of columns: the week start date, the weekly spend of every channel and the target. Choose Revenue when the target is money and Conversions when it is a count. Add promo weeks, discounts, price changes or stock problems as Control columns. Otherwise the tool credits those effects to advertising.
The rule for length is simple: at least 52 weeks, ideally two years. The tool runs from 12 weeks, but it warns you below 52. Meridian's documentation also ties the amount of data to the number of model parameters, and two years of weekly data gives 104 observations. More channels mean more parameters, so the data need grows with them.
- First, leave no week out; type 0 when a channel had no spend.
- Use one currency and one VAT treatment across all channels.
- Enter spend as money, not as impressions or clicks.
- Do not split channels too finely; merging small ones keeps the model stable.
For clean channel level data, tag your campaign links from the start. Our UTM builder does that in minutes.
How do you read ROI, marginal ROI and saturation?
ROI is the column people misread most often. ROI is an average: the channel's contribution divided by its total spend. Marginal ROI, however, is the return on the next unit. On a saturation curve the two split apart, because the first dollar and the last dollar do not earn the same. With a conversion target you see CPA instead of ROI and Marginal CPA instead of Marginal ROI, and CPA is spend divided by contribution.
Three reading patterns help:
- High ROI, low marginal ROI: the channel is saturated, and extra budget will underperform.
- Middling ROI, marginal ROI close to it: the channel still has room.
- ROI below 1 on a revenue target: spend does not cover contribution. Still, never decide without looking at margin.
The Carryover (adstock) column shows the carryover rate, and the Saturation column labels each channel as room to grow, moderate or near saturation. To cross-check returns with your own numbers, use the ROAS calculator. If returns are falling, follow the diagnosis steps in our guide to ROAS drop causes.
How does the budget allocation work, and how far can you trust it?
In Budget allocation, the Weekly budget box starts with your current average. Also, you can enter another total and press Optimise split. The tool splits that total into small steps and gives each step to the channel that gains the most from it, so the marginal returns of the channels move close together. Shifting money from a low marginal channel to a high one raises total contribution, so the allocation stops once marginal returns level out.
While Limit each channel to ±50% is ticked, no channel drops below half or rises above one and a half times its current spend. That limit matters, because at spend levels the model has never seen, the curve is only a guess. If you untick the box and your data covers 2,000 to 10,000 a week, treat a result that proposes 50,000 with great suspicion.
The output puts current and recommended weekly spend side by side with the expected change. So read that change as a small percentage, not as a promise. Test one small shift in a single channel first, measure it, then continue. To size the total, the Google Ads budget calculator is a good companion. For planning logic, see how to set a Google Ads budget.
What can a lightweight marketing mix model not tell you?
Let us be honest: every MMM that runs on weekly data measures association, not causation. Three limits stand out.
- Multicollinearity: When channels rise and fall together, for example all of them peak in a sale week, the model cannot separate who delivered the result. The tool flags a correlation of 0.85 or higher between two channels under Warnings.
- Too little data: Below 52 weeks, coefficients stay shaky. A channel whose spend never changes does not enter the model at all.
- Missing drivers: A competitor move, press coverage or the weather can end up credited to advertising.
The fix, then, is validation. Run a geo or time-based lift test in the channel the model flags, and measure the incremental effect. Meta's brand lift test is one example of such an experiment. For the statistics, an A/B test calculator helps. The same honesty applies to click-based measurement: no attribution model proves incrementality, so read any attribution comparison together with a lift test.
Meridian, Robyn or this tool: which one fits?
The choice depends on your team's skills and the size of the decision. With a large budget and a data science team, you want a Bayesian model with experiment calibration, and Meridian offers that path. Also, a team that works in R can try Robyn. If your goal is to see direction, show the team a first picture and learn which channel has saturated, a lightweight tool is enough.
Here is a practical path:
- Step one: take the first look with this tool and note the warnings.
- Step two: test the finding with a lift experiment.
- Step three: when the decision grows, move the same weekly data into Meridian or Robyn.
The same table works in all three, so your first effort is not wasted. Finally, the table below puts them side by side.
Common marketing mix modeling mistakes
- ✕MistakeFitting a model on too little data✓Do this insteadUse at least 52 weeks, ideally two years. On short data, seasonality and channel effects blur together.
- ✕MistakeExpecting answers from a channel with flat spend✓Do this insteadA channel whose spend never moves has no separable effect. The tool leaves such a channel out and warns you, so merge it into another one.
- ✕MistakeLeaving promo and sale weeks out of Control✓Do this insteadSales lifted by a discount week end up credited to a channel. So add those weeks as a Control column.
- ✕MistakeMoving all money to the channel with the best average ROI✓Do this insteadCheck marginal ROI first. The next dollar in a saturated channel returns little.
- ✕MistakeTreating the output as a verdict✓Do this insteadRead the result as a hypothesis and confirm it with a lift test.
- ✕MistakeTrusting spend levels the model never saw✓Do this insteadKeep Limit each channel to ±50% ticked. Outside the range you have tested, the curve is only a guess.
Frequently Asked Questions
Let's rebalance your budget with a model and a test.
An MMM result is a hypothesis. We combine measurement setup, incrementality tests and Google Ads management to move budget towards real contribution.





