MMMM Studio

The headline, in one sentence

Media produced about $153.2M of your $259.3M — roughly 59 cents in every dollar. We can’t split that by channel: not one of your nine channels could be measured on its own.

No channel below has a return of its own on this run, so there is no range to read yet — only the total above, which your data does support. Each channel says why it could not be measured and what would change that.

We can't put a number on any channel on its own

When we hid known returns in your own spend, the setup we chose could not find the returns of Social — Meta, Social — TikTok, Search — Brand, Search — Non-brand, Programmatic Display, Video — CTV and Out of Home on their own, and could not tell TV — Broadcast apart from TV — Cable, so for that pair we report only what the two returned together. All of them still count toward the total effect of your media above.

A test that changes one channel’s spend on its own is what would make it measurable — for a tangled pair, one of the two without the other. Each channel’s own line in the list of returns below says what it would take.

Show me the statistics

Held back on this run: TV — Broadcast, TV — Cable, Social — Meta, Social — TikTok, Search — Brand, Search — Non-brand, Programmatic Display, Video — CTV, Out of Home. The media total at the top of this page, its share of your sales and the business you would have had anyway still count them — their spend still did something; we just cannot say how much each one did. The budget planner leaves them at today’s spend.

The validation tab lists every change we made to this fit, each of these channels included, in the engine’s own words.

How do I read this?

Two years of revenue, and where it came from

Each band is one channel's contribution, stacked on the business you'd have had without any media at all. The white line is what you actually sold.

$259.3M

actually sold

$4.0M/WK13 WEEKS WE HID FROM THE MODEL →20222023

The pale mass underneath is the business you’d have had anyway: $110.5M, two fifths of everything.

TV — Broadcast + TV — Cable is drawn as one band, because only the two together could be measured. The hatched band is other media: Social — Meta, Social — TikTok, Search — Brand, Search — Non-brand, Programmatic Display, Video — CTV and Out of Home. Its weeks are drawn so the stack still adds up to what you sold, but it is not measured on its own, so it gets no share of its own here.

TV — Broadcast + TV — Cable3.2%
Other medianot measured
Everything else41.9%
±media total 47.0%–70.2%
How do I read this?
Nothing is settled yet

Not one of your channels has a return we could measure on its own.

That is a real result, not a missing one: your spend cannot yet show what each channel did apart from the others. What it does show is the total at the top of this page — the effect of your media taken together. Nothing below should be cut or scaled on this evidence.

What would settle it: a test that changes one channel’s spend on its own. The evidence tab says, channel by channel, why each one could not be measured.

What each dollar came back as

Sorted by how much your data actually pinned down. The dotted line is break-even — a band crossing it means we can't tell you whether it won or lost.

TV — BroadcastOnly found as a pair—

You get no separate return and no budget advice for TV — Broadcast. Only a test that changes TV — Broadcast's spend without TV — Cable's can split the two. See their combined return

TV — CableOnly found as a pair—

You get no separate return and no budget advice for TV — Cable. Only a test that changes TV — Cable's spend without TV — Broadcast's can split the two. See their combined return

Social — MetaNot found on its own—

You get no return and no budget advice for Social — Meta. A test that changes its spend on its own would make it measurable.

Social — TikTokNot found on its own—

You get no return and no budget advice for Social — TikTok. A test that changes its spend on its own would make it measurable.

Search — BrandNot found on its own—

You get no return and no budget advice for Search — Brand. A test that changes its spend on its own would make it measurable.

Search — Non-brandNot found on its own—

You get no return and no budget advice for Search — Non-brand. A test that changes its spend on its own would make it measurable.

Programmatic DisplayNot found on its own—

You get no return and no budget advice for Programmatic Display. A test that changes its spend on its own would make it measurable.

Video — CTVNot found on its own—

You get no return and no budget advice for Video — CTV. A test that changes its spend on its own would make it measurable.

Out of HomeNot found on its own—

You get no return and no budget advice for Out of Home. A test that changes its spend on its own would make it measurable.

How do I read this?

Do this first

Don't cut anything on this evidence.

No channel here has a return of its own on this run, so nothing has shown it lost money. A cut made on this page would be a cut made on nothing but the total, and next year would look like proof that the cut worked.

Do this next

To tell Search — Brand and Search — Non-brand apart, pause Search — Brand, the one you spend less on, everywhere for 13 weeks, and keep Search — Non-brand running as usual.

A test this long would narrow the range we could give for Search — Brand by about 20%.

Don't do this

Don't share out the media total by spend.

We could not measure what those channels each did on their own. Splitting the total between them by what each one cost would print exactly the number this page refuses to — a guess wearing a return’s clothes.

13 things would make next quarter’s answer sharper. 8 of them are ours.

Everything the run flagged, in one place and sorted by who actually does the work. Nothing in the first two columns is generic — each item is the engine’s own words about a specific finding in your data. The third column is opinion, and is drawn so you can tell at a glance.

Email this list

Your media team

changes to how you buy, not to the data

Severe variance inflation

Usually the same cause as near-duplicate channels: this one is reconstructable from the others. Combine it with whichever channel it shadows, or drop a control that is standing in for it. A channel that launched partway through the window hits this too, because the baseline absorbs the period it was dark.

More than met. TV — Cable has no individual number on this run at all — when we hid known returns in your own spend, the setup we chose could not find its own — so there is nothing left to treat as unreliable. Only its combined return with its partner is reported.

FROM · vif · TV — Cable · 5170.9 vs 10

Two channels are near-duplicates

These two were bought as one thing, so model them as one thing: combine the columns. If you need them split, the only way to get there is an experiment that moves one without the other.

FROM · collinearity

TV — Broadcast is off air most weeks

TV — Cable is off air most weeks

Out of Home is off air most weeks

Nothing to fix in the data — this is a media plan, not a defect. Expect a wide range on this channel and weight it accordingly; a lift test on a single burst would pin it faster than more history would.

FROM · burst_flighting · TV — Broadcast, TV — Cable, Out of Home

Us

nothing for you to do — one click and we rerun

Failed checkChain convergence (R-hat)

Worst R-hat 1.2264 at roi. Above 1.01 the chains have not mixed and the posterior is not yet the posterior.

FROM · scorecard · rhat · 1.23 vs 1.01

Failed checkBulk effective sample size

Lowest bulk ESS 13 at beta. Under 400 the point estimates carry visible Monte Carlo error.

FROM · scorecard · ess_bulk · 13.04 vs 400

Failed checkTail effective sample size

Lowest tail ESS 16 at beta. Under 400 the interval endpoints carry visible Monte Carlo error.

FROM · scorecard · ess_tail · 16.41 vs 400

Runs the same fit with twice the draws (1000 → 2000), and a more careful search (target_accept_prob 0.9 → 0.95). Nothing else moves — same data, same priors, same holdout — so the two are comparable. If the answer shifts, that shift is itself the finding.

WarningIn-sample accuracy

MAPE 6.8% (target <10%), R-squared 0.879 (target >0.9). In-sample fit is necessary, not sufficient — a model with enough knots fits anything.

FROM · scorecard · in_sample · 6.79 vs 10

WarningHoldout accuracy

MAPE 15.5% (target <15%) and MASE 0.62 (target <1) on 13 held-out cells the likelihood never saw. MASE compares the error against forecasting the same period last year; above 1 the model has not earned its complexity out of sample.

FROM · scorecard · holdout · 15.5 vs 15

Failed checkVariance inflation (post-transform)

Highest VIF 5170.9 on TV — Cable (warn 5, hard 10), measured after adstock and saturation because that is what the model sees.

FROM · scorecard · vif · 5170.9 vs 5

Failed checkDesign conditioning

Condition number 216.3 (target <30) on the media block with the baseline and controls projected out.

FROM · scorecard · condition_number · 216.32 vs 30

WarningObservations per parameter

104 observations, 38 parameters, 2.7x (target >4).

FROM · scorecard · degrees_of_freedom · 2.74 vs 4

WarningData moved the prior

Indistinguishable from the prior: Social — TikTok (its return is withheld), Search — Brand (its return is withheld), Programmatic Display (its return is withheld). A channel whose posterior is its prior has been assumed, not estimated.

FROM · scorecard · prior_shift · -128.16 vs 0.2

WarningNo prior/data conflict

Outside the prior's 1st-99th percentile: Search — Brand (its return is withheld), Search — Non-brand (its return is withheld). Either the prior is wrong or the data are being over-read; the fit is a compromise between two claims that disagree.

FROM · scorecard · prior_conflict · 2 vs 0

Those are a property of the data and the priors rather than of the search, so running it again will not move them. Listed here so nobody goes looking for a fix that does not exist.

Your file

Thin degrees-of-freedom budget

Merging two closely related channels would buy back headroom. Otherwise expect wide intervals and treat them as the honest answer rather than a defect.

FROM · dof · 2.74 vs 4

Your file

Ill-conditioned design matrix

The design as a whole is near-singular, so no single column is to blame. Simplify: fewer channels, fewer controls, or a longer window.

FROM · condition · 216.32 vs 30

General advice — not from your data

true of most MMMs, not measured on this one

Keep a channel dark somewhere, on purpose

The single cheapest thing you can do for next year's model is leave one region or one fortnight without a channel that normally runs everywhere. Continuous channels are the hardest to measure precisely because they never stop.

Record promotions and price changes weekly

A column of promotion weeks and a column of average price cost nothing to keep, and their absence is the usual reason media ends up with the credit for a price cut. Most uploads arrive without them.

This column is separated on purpose. Everything in the other two is traceable to a finding in your run; nothing in this one is.

Stamped so this can be reproduced

Every fit is written to disk with the data it read and the version that read it, so a number in last quarter’s deck can be traced to the run that produced it — and that run can be produced again. Nothing on these pages is computed when you open them.

run
20261028-155318-7261f3
data
d1639c05b048
engine
0.3.0
holdout
13 periods
dataset
hard_case
fitted
28 Oct 2026
took
3 min
name
Demo run

Past runs

Every fit is kept, with its verdict and its date, so a number in last quarter’s deck can always be traced back to the run that produced it.

This is the only fit on record. The second one is where this list starts earning its space.

How do I read this?