Adstock as Memory: How MMM Remembers Advertising
A practical MMM lesson on why this week's outcome can still contain last week's media, using the shared MMM Dataset as source-of-truth evidence.
On this page
Why it matters
Most media does not vanish when the invoice closes. A TV spot can keep working after the flight goes dark. A podcast read can be remembered on the next commute. A paid search click, by contrast, usually behaves closer to the week it happened.
AdstockAdstockcarryover effectThe decaying residual effect of past advertising on current sales. Geometric adstock: Aₜ = Mₜ + λ·Aₜ₋₁, with 0 ≤ λ < 1. Higher λ means a longer-lasting flight (TV ~0.7); lower λ means same-week response (paid search ~0.2). is the MMM name for that memory. It turns raw spend into effective media by carrying a fraction of past exposure forward:
The parameter lambda is the memory rate. Low lambda means short memory; high lambda means the channel keeps echoing into future weeks. The business implication is simple: if you judge every channel only by same-week response, you will systematically undercount upper-funnel media and overtrust demand-capture channels.
Data
Uses the MMM Dataset. This lesson uses the shared synthetic DTC subscription dataset: 156 weekly observations, five media channels, business controls, and known source-of-truth adstock/contribution columns. Download the CSV, inspect the parameters, or read the dataset guide.
The business is a DTC subscription brand. The outcome is weekly new paid subscriptions. Media spend is measured in thousands of dollars across paid search, paid social, CTV/video, podcast/audio, and influencer.
Because the data is synthetic, we can validate the lesson against the truth. That is the point. In a real MMM project, the model estimates memory from noisy aggregate data. Here, we know the exact memory rule and can see what the model is supposed to recover.
Method
For each channel, the MMM Dataset applies recursive geometric adstock before saturation:
The same lambda can be translated into half-life:
Half-life is often easier to explain to a stakeholder than lambda. “CTV has a half-life of about two weeks” is more concrete than “CTV has lambda 0.72.”
| Channel | Lambda | Half-life | Teaching read |
|---|---|---|---|
| Paid Search | 0.18 | 0.40 weeks | Mostly same-week demand capture |
| Paid Social | 0.42 | 0.80 weeks | Moderate carryover |
| CTV / Video | 0.72 | 2.11 weeks | Long memory from flighted awareness |
| Podcast / Audio | 0.62 | 1.45 weeks | Audio keeps working after the read |
| Influencer | 0.35 | 0.66 weeks | Bursty drops with some spillover |
Results
The easiest way to see adstock is to compare a low-memory channel with a high-memory channel.
CTV spend is zero in weeks 7-15, but adstocked media remains positive throughout the gap. Week 7 still carries almost $494k of effective media because the previous flight has not decayed away. That is why a same-week regression can make flighted brand media look weaker than it is.
Paid search behaves differently:
Search adstocked media hugs spend much more tightly. It still has memory, but the memory is short. The model should not force CTV and paid search to share the same lag structure because their business roles are different.
What memory changes
Adstock changes the timing of contribution. In the MMM Dataset, CTV contributes conversions even when current CTV spend is zero:
Weeks 7-15 are the lesson: zero spend is not zero effect. The carryover is smaller each week, but it is still part of the outcome. A model without adstock tries to explain those weeks using base demand, seasonality, competitor pressure, or whichever channel happens to be correlated with the tail.
Across the full 156 weeks, true media contribution in the MMM Dataset is deliberately balanced enough to be useful for future modules:
| Channel | True contribution share |
|---|---|
| CTV / Video | 28.0% |
| Paid Search | 27.9% |
| Paid Social | 26.5% |
| Podcast / Audio | 13.0% |
| Influencer | 4.7% |
That does not mean these are universal benchmarks. They are the known truth for this scenario. The point is to give the learning path a stable object to test against.
Source-of-truth validation
The generator writes both the public CSV and the parameter JSON. To validate one row, use the previous week’s adstocked media:
CTV week 7 adstock = CTV week 7 spend + 0.72 * CTV week 6 adstock = 0 + 0.72 * 686.02 = 493.94That matches the ctv_video_adstock value in the CSV. The same calculation repeats by channel and week.
The interactive adstock and saturation simulator is useful for intuition: move lambda up and the tail gets longer. The MMM Dataset turns that intuition into a reusable table where later modules can fit models, compare estimates, and diagnose when the model misses the true memory pattern.
Business Insights
- Memory is a business assumption, not a chart decoration. Choosing
lambdatells the model how long customers keep responding after exposure. - Flighted channels need carryover. If CTV, audio, or TV goes dark, the effect should decay rather than disappear.
- Short-memory channels still matter. Paid search can be valuable because it captures demand close to conversion, not because it has a long tail.
- Half-life is stakeholder language. Translate
lambdainto weeks when explaining why two channels deserve different lag structures.
Further Reading
- Meta - Robyn open-source MMM
- Meta - siMMMulator
- PyMC Labs - PyMC-Marketing MMM quickstart
- Google - Meridian media saturation and lagging