Field Guide · Measurement

Scrappy MMM: a directional read between the outputs

You don't need a six-figure vendor — or the quarterly refresh — to know which way your budget should move. Here's how to model the mix scrappily, fast, and without fooling yourself.

By Khalid HamadehUpdated June 20268 min read
The short version

Scrappy MMM isn't a budget version of a vendor MMM — it's the read you run in the gaps.

Define it

What scrappy MMM is — and isn't

Scrappy MMM is a lightweight media-mix model you build yourself to get a directional answer to "where should the next dollar go?" — fast, from weekly data, without a vendor engagement. It is not a discount replacement for a production MMM. It's the read you reach for when the official model is too slow, too coarse, or doesn't exist yet.

KeyA vendor MMM answers "how much, precisely, controlling for everything" on a monthly or quarterly clock. Scrappy MMM answers "which way, roughly, right now." Different jobs — and you want both.
The case

Why you'd run one even with a vendor MMM

"Just use the MMM" misses how decisions actually arrive. Even a great vendor model — and plenty now refresh monthly — leaves gaps a scrappy read fills:

1

The decision moves faster than the model

Your MMM refreshes monthly; a "should we pull $200K out of social this week?" question arrives on a Tuesday. A directional read now beats the precise read in three weeks.

2

The channel has no history

You just launched Connected TV or a new partner. The vendor model has nothing to fit. A scrappy curve from early data is the only read available.

3

The question is a what-if the model can't answer fast

"What happens to total subs if we shift 15% from App Campaigns to Search?" You can simulate that on your own curves in minutes instead of waiting for a re-run.

4

There is no vendor model

Most teams can't justify $100K+/yr. Scrappy MMM is the difference between a structured directional view and pure gut.

Be honest

What it can and can't tell you

The fastest way to discredit yourself with a scrappy model is to oversell it. Here's the honest division — and why the scrappy column is still worth running.

DimensionGut / last-year ±10%Scrappy MMMVendor / production MMM
Time to an answerInstantHours to a dayWeeks per refresh
Cost$0~your time$80K–$250K+/yr
PrecisionNoneDirectional onlyEstimated with uncertainty bands
Cross-channel haloIgnoredCrudely, if at allModeled
Captures brand / offlineNoPartly (it's still top-down)Yes
Best forNothing, reallyFast "which way" calls between refreshesThe quarterly budget envelope
TL;DRScrappy MMM sits between gut and vendor MMM on a cost-vs-confidence curve — and it sits right at the elbow, where the next bit of rigor stops being worth the wait.
The framework

The rigor ladder

Every measurement choice is a trade of effort for confidence, and the trade has sharply diminishing returns. Plot it, and the question stops being "what's most rigorous?" and becomes "where's the elbow?"

Confidence vs. effort — and where scrappy wins

The curve bends fast. Scrappy MMM captures most of the confidence for a fraction of the effort.
confidence effort & cost → Gut / last year ±10%cheap, blind Scrappy MMM← the elbow: most confidence, little effort Vendor MMM MMM + incrementality

Going from gut to scrappy buys you most of the available confidence. Going from scrappy to a full vendor MMM buys real rigor — but at weeks of latency and serious cost — and the last rung, MMM calibrated with incrementality, is the gold standard you reserve for the decisions that deserve it. The skill isn't always climbing higher; it's knowing which rung a given decision needs.

Do it

The scrappy MMM recipe

Four steps. None require a data-science team — though open-source tooling makes the middle two much easier.

1

Pull weekly spend + outcome

Spend per channel per week, plus the outcome you care about (subscriptions or revenue), plus obvious controls — price changes, promos, seasonality, big launches. A year of weekly rows is a workable minimum; more is better.

2

Transform: adstock × saturation

Apply an adstock (carryover) so this week's spend keeps working next week, then a saturation curve so each channel bends into diminishing returns. These two transforms are what separate a real mix read from a naive correlation.

3

Fit, then sanity-check against incrementality

Regress the transformed spend on the outcome. Then — the step people skip — check the implied channel contributions against any incrementality test you have. If your model says social is 3× more efficient than a clean geo holdout did, trust the holdout and constrain the model.

4

Read the curves for direction

Don't report "social ROAS = 2.31." Report "social looks past its efficient point; search and ASA still have room." Feed those response curves into an allocator and simulate the shift — directionally.

Where the curves go next

Once you have a saturation curve per channel, allocation is mechanical: shift budget until every channel's next dollar is worth the same. That's exactly what the budget allocator does — set the curves and watch the optimal split fall out.

Don't fool yourself

The four traps

Scrappy doesn't mean sloppy. These are the failure modes that turn a useful directional read into confident nonsense.

Spurious precision. Reporting two decimals from a model that's barely directional. Round hard, speak in ranges, lead with the direction.
Collinearity. Channels that scale together can't be cleanly separated — the model will hand one channel's credit to another. Watch for it; don't over-interpret tightly correlated channels.
Overfitting a short history. With a year of weekly data you have ~52 rows. Fit too many parameters and you'll model noise. Keep it simple; prefer priors over free parameters.
Forgetting the base. A big chunk of sales would happen with zero marketing. If you don't model base demand, every channel looks like a hero. Anchor the base before crediting channels.
Go to the source

Tools to build one

RobynMeta's open-source automated MMM — adstock + saturation out of the box. The most popular scrappy-to-serious on-ramp. Source: Meta Open Source.
MeridianGoogle's open-source Bayesian MMM, with first-class support for calibrating against incrementality experiments. Source: Google.
PyMC-MarketingOpen-source Bayesian media-mix + CLV modeling in Python — flexible priors, good for a careful in-house build. Source: PyMC Labs.
GeoLiftMeta's open package for the geo holdouts you use to calibrate the scrappy model in step 3. Source: Meta Open Source.
The budget allocatorTurn your fitted saturation curves into an optimal split. Source: this site.
The measurement field guideHow scrappy MMM fits with attribution and incrementality. Source: this site.
Keep going

The rest of the stack

Pillar

How to measure in 2026

The triangulation framework scrappy MMM lives inside — MMM, attribution, incrementality.

Read the field guide →
🎛️ Free tool

The budget allocator

Feed your saturation curves in and watch the optimal split fall out.

Open the tool →
Method

Forecast a range

Three forecast models that should disagree — and why a range beats a number.

Read it →
Method

The experimentation agenda

You can run a handful of clean tests a year. How to choose them like a portfolio.

Read it →
Quick answers

Common questions

What is scrappy MMM?
A lightweight, fast media-mix model you build yourself — fitting simple adstock and saturation curves to weekly spend-and-outcome data — to get a directional read on how budget should move. It isn't a cheaper substitute for a vendor MMM; it's the read you run in the gaps: between official refreshes, at any cadence, or when there's no vendor model at all.
Can scrappy MMM replace a real marketing mix model?
No. A vendor or in-house production MMM is more rigorous — it handles cross-channel effects, controls, and uncertainty properly. Scrappy MMM is a complement: it answers fast, directional questions the production model is too slow or too coarse to answer in the moment. Trust its direction, not its decimals.
How do you build a scrappy MMM?
Pull weekly spend per channel and the outcome, apply an adstock transform so spend's effect carries over, fit a saturation curve per channel, sanity-check the implied contributions against any incrementality results you have, and read the response curves for direction. Open-source tools like Robyn, Meridian, and PyMC-Marketing do the heavy lifting; a careful spreadsheet gets you a rougher version.
What are the biggest risks of scrappy MMM?
Spurious precision, collinearity between channels that move together, overfitting a short history, and ignoring base demand. The discipline is to present ranges and directions, not point estimates, and to calibrate against incrementality wherever you can.
This is how I operate

I build these reads on real budgets

If you want a directional model stood up fast — or a sanity check on the one you have before it drives a big reallocation — let's talk.

Try the budget allocator → Work with me

Last updated June 2026 · Part of an in-progress series on growth measurement & budget allocation.