In short: Marketing Mix Modeling (MMM) was historically only available to enterprises (cost €100k-1M+). The open source release of Google Meridian (2024) and Meta Robyn (2020) has made MMM accessible to SMBs with €500k+ revenue, multi-channel, at least 12 months of weekly data history. Output: ROI per channel, saturation curves, adstock decay, scenario planning. DIY cost: 60-100h data scientist setup. Agency: €15-40k. Decisive in the post-cookie era 2024-2026.
When MMM makes sense for SMBs
Three minimum criteria for positive ROI:
- Revenue > €500k/year. Below this threshold, the setup investment is not repaid by budget reallocation.
- Multi-channel: at least 4-5 active channels (TV, digital display, social, search, email, retail). Single-channel doesn't benefit from MMM.
- 12+ months weekly history. MMM requires sufficient time series to identify effects.
Typical profile: Italian SMB €5-50M revenue with 30-200k€/month marketing spend distributed across 5-8 channels. Unsuitable profile: B2B SaaS with < €500k revenue, TikTok-only single-channel brand, businesses with long cycle > 6 months.
Required data setup
Granularity: weekly, ideally 24-36 months history (minimum 12).
Dependent variable: weekly revenue (or conversions, or leads, depending on primary business KPI).
Independent variables — marketing channels:
- Spend per channel (€): TV, digital display, social ads (Meta, TikTok), search ads (Google, Bing), email volume, influencer, OOH.
- Impressions/reach per channel (if available, better than just spend).
Control variables (external factors):
- Seasonality: month dummy or sin/cos transformation.
- Promotions: dummy promo periods.
- Pricing variation: weekly average price index.
- Competitor activity: estimated competitor spend (if available).
- Events: product launches, macro events (covid, holidays).
- Weather: for weather-sensitive categories.
Output dataset: weekly table with ~25-50 columns, 60-150 rows. Manageable size in Pandas.
Google Meridian: install + Python example
Meridian is Google's open source Bayesian MMM, released in 2024. Repository: github.com/google/meridian.
pip install google-meridian
# In Python
from meridian import constants
from meridian.data import load
from meridian.model import model
from meridian.model import prior_distribution
# Load data (CSV with documented format)
data = load.CsvDataLoader(
csv_path='marketing_data.csv',
kpi_type='revenue',
media_to_channel=channel_mapping,
revenue_column='revenue',
media_columns=media_cols,
control_columns=control_cols,
).load()
# Setup Bayesian priors
priors = prior_distribution.PriorDistribution(
roi_m=tfd.LogNormal(loc=0.2, scale=0.7) # priors for channel ROI
)
# Build model
mmm = model.Meridian(
input_data=data,
model_spec=model.ModelSpec(prior=priors)
)
# Sample posterior (MCMC)
mmm.sample_posterior(n_chains=4, n_adapt=500, n_burnin=500, n_keep=1000)
# Output: ROI per channel, saturation curves, adstock
roi_summary = mmm.get_roi_estimates()
saturation = mmm.get_saturation_curves()
Computation time: 30-60 minutes on a standard laptop for a 100 rows × 30 columns dataset. Cloud cluster (GCP/AWS) for larger datasets.
Bayesian priors: how to set them for SMBs
Priors are a priori probability distributions for key model parameters (channel ROI, adstock decay, saturation). Setting them well increases model robustness, especially with limited datasets typical for SMBs.
Channel ROI prior. Meridian default: LogNormal(0.2, 0.7) — expected average ROI 1.2x with wide uncertainty. For SMBs with known historical ROAS, calibrate prior centered on that value. Example: search ads prior ROI = LogNormal(2.0, 0.4) if historical ROAS 7-8x. TV brand campaign prior lower: LogNormal(0.0, 0.5) (ROI 1x base with high variance).
Adstock decay prior. Measures how long the effect of a spend lasts. Typical ranges per channel:
- Search ads: decay rate 0.1-0.3 (immediate effect, fast decay).
- Display/social: 0.2-0.5.
- TV/branded video: 0.5-0.8 (persistent effect).
- Print/OOH: 0.3-0.6.
Saturation prior. Point at which additional spend doesn't generate proportional ROI. Hill function parameterized. Default sufficient for standard datasets.
Output: ROI, saturation, adstock
Typical Meridian outputs for mid-market SMBs:
| Channel | Spend (€/month) | Median ROI | 90% CI | Saturation |
|---|---|---|---|---|
| Search ads | 15k | 5.8x | [4.2, 7.5] | 75% |
| Meta Ads | 25k | 2.1x | [1.5, 2.9] | 88% |
| Display | 10k | 0.9x | [0.4, 1.5] | 45% |
| TV brand | 40k | 1.4x | [0.8, 2.2] | 35% |
| 3k | 8.5x | [6.0, 11.0] | 60% |
Typical pattern insights:
- Email + Search high ROI but above 60-75% saturation: increasing spend has diminishing returns.
- Meta Ads high saturation (88%): "capped" channel, additional spend is not efficient.
- Display ROI < 1: destroys value, eliminate or revise targeting.
- TV low saturation (35%): scaling potential for brand building.
Decisions: budget reallocation, scenario planning
Typical post-MMM action plan:
- Eliminate channels with ROI < 1. Display in the example above, redeploy budget.
- Maintain channels with ROI > 1 above saturation (Meta) but don't increase.
- Scale high-ROI channels below saturation (TV brand): increase spend by 30-50% and re-test.
- Scenario planning: Meridian allows simulating "if I move €10k from Display to TV, what's the expected revenue lift?". Output: probabilistic outcome distribution.
Re-run frequency: quarterly. Re-calibration after significant changes (product launch, geographic expansion, competitor event).
Common mistakes
(1) Training set too short. Below 12 months of weekly data, MMM is unstable. Below 6 months, completely unreliable. Wait for historical accumulation.
(2) Ignoring seasonality. If the business has marked seasonality, not including a seasonal factor = MMM attributes to channels variations that are actually cyclical.
(3) Multicollinearity between channels. If two channels are often activated together (e.g. TV + Meta always on promo), MMM struggles to separate them. Solution: explicit variation in spending during setup.
(4) Over-fitting to past. MMM explains the past well but the future may be different. Validate with holdout (last 3 months out-of-sample) before decisions.
(5) Ignoring critical external factors. Pricing, distribution, competitors — if not included, MMM attributes their effects to marketing channels, distorting ROI estimates.
Comparison Meridian vs Robyn vs Lightweight MMM
| Tool | Approach | Strength | Weakness |
|---|---|---|---|
| Meridian (Google) | Bayesian | Quantifies uncertainty, flexible priors | Compute intensive |
| Robyn (Meta) | Frequentist + ridge | Fast, automatic feature eng | No uncertainty, R-only |
| Lightweight MMM (Google ex) | Simplified Bayesian | Fast setup | Less powerful than Meridian |
| Custom Python/R | Custom-made | Maximum flexibility | Extensive setup |
For standard Italian SMBs: Meridian is the 2026 default for output quality and active Google support. Robyn is an alternative if the team uses R.
Costs: DIY vs agency
| Approach | Initial cost | Recurring cost | Time |
|---|---|---|---|
| DIY internal data scientist | €8-12k (60-100h) | €2-3k/quarter maint | 8-12 weeks |
| Freelance MMM specialist | €10-20k | €3-5k/quarter | 6-10 weeks |
| Mid-market agency | €15-40k | €5-10k/quarter | 8-12 weeks |
| Big consultancy | €100-300k+ | €30-100k/quarter | 12-20 weeks |
Sweet spot for mid-market SMBs: freelance specialist with open source tools (€10-20k initial), then internal maintenance with the model already built.
FAQ
Does MMM replace Google Analytics and attribution models?
No, it's complementary. GA + attribution model = digital touchpoint analysis (granular, intra-channel). MMM = total marketing mix (including offline). Both are needed. Optimal setup: GA for tactical optimization, MMM for strategic budget allocation.
Does cookie deprecation impact MMM?
Marginally. MMM works on aggregate spend and revenue, not user-level tracking. It's the most resistant framework to the post-cookie era. That's why it's growing 2024-2026 even in SMBs.
Can I do MMM only for digital or do I need to include offline?
Ideally both. Digital-only MMM is valid if the company is 100% online (pure-play e-commerce). For SMBs with TV/print/OOH/retail, including them increases model quality.
Statistical validity with a small SMB dataset?
Bayesian framework handles small samples well thanks to priors. Confidence intervals will be wide (high uncertainty), but the output remains directionally useful. Below 50 weekly observations (1 year) = not recommended.
How often should the model be re-run?
Quarterly standard. Earlier re-run after significant events (product launch, strategy change, expansion). Annual full recalibration with new priors.
Does MMM work for B2B SaaS?
More difficult for long cycles (3-12 months). Setup requires tracking lead-to-deal conversion lag. Better for B2C SaaS or B2B-SMB with cycle < 3 months. Alternatives for B2B enterprise: account-based attribution + multi-touch attribution.
Sources and references
- Google Meridian — github.com/google/meridian (open source)
- Meta Robyn — facebookexperimental.github.io/Robyn (open source R)
- Sambol, J. & Wadlow, T. — "MMM Best Practices" (working paper, 2024)
- Hanssens, D., Parsons, L., Schultz, R. — "Market Response Models: Econometric and Time Series Analysis" (Springer, 2nd ed.)
- Pauwels, K. — "Modeling Marketing Dynamics by Time Series Econometrics" (Marketing Science Institute)
- Google — "Meridian Public Beta Whitepaper" (2024)
- Forrester — "MMM Adoption Trends" (2023-2024)
- WARC — Marketing Mix Modeling case studies