<img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=9151474&amp;fmt=gif">
Skip to content

Methodology

Time-varying saturation: why one curve per channel is not enough.

Most marketing mix models give each channel one response curve for the whole training window. That says a euro on Google buys the same in July as in November. Here is what that assumption costs, how the Odins model lets the curve move with the season, and where the limits are.

Updated October 2026 · about 10 minutes to read

By the Odins team · Updated October 2026 · About 10 minutes

The short answer

Time-varying saturation means a channel's response curve is allowed to change over time instead of being estimated once and held fixed. In the Odins model the curve moves with the season: the same channel can have a higher ceiling and a higher optimal spend in November than in July.

It is standard in the models we run, which makes Odins one of few. Of the open-source frameworks, Google Meridian and Meta Robyn hold the media response fixed for the whole period, and PyMC-Marketing has an optional setting that scales total media contribution over time.

Why it matters: a fixed curve forces the model to say that a euro on Google buys exactly the same in July as in November. When that is not true, the error does not stay in the Google curve. It spreads to the baseline, to other channels and to every recommendation built on top.

What a fixed curve assumes

A response curve describes how sales respond as weekly spend on a channel goes up. It rises fast, then flattens. In the form we use, two numbers define it: the ceiling, the most the channel can add in a week, and the half-saturation point, the spend at which half the ceiling is reached. The basics are in our guide to marketing mix modeling.

A standard model estimates those two numbers once per channel and adds the result to a baseline:

Sales(t) = baseline(t) + sum over channels of ceiling × spend(t) / (spend(t) + half-saturation)

Seasonality lives in the baseline. Read that structure closely, because it makes a strong claim. The season can lift or lower the level of sales, but it cannot change what an extra euro of media buys. At a given spend, the marginal return is identical in every week of the year.

For most businesses that is not how it works. More people are in the market in peak season, so the same click, impression or TV spot is worth more.

What a fixed curve costs

A model that cannot represent a seasonal response still has to explain the sales. It does that by bending something else, and the damage is larger than it first looks. The problem sits in the estimate itself, before any recommendation is made.

The baseline takes credit that belongs to marketing

The extra sales that media produces in high season look like seasonality, so the seasonal component absorbs them. The channel is under-credited exactly when it works best. Cut it in November, and you lose more than the model said you would.

The curve gets the wrong shape

Most companies spend more when demand is high. High spend then coincides with a high return per euro, and one curve fitted through those weeks can come out straighter than the truth. The channel then looks less saturated than it is, and the model recommends more spend all year.

Other channels pick up the difference

Whatever runs heavily in the same season gets part of the credit. A TV burst in the fourth quarter can be credited with what was really search working better.

The rest becomes noise

What no component can absorb ends up as unexplained variation: wider ranges on every estimate, and forecasts that miss more at the peak and in the trough.

And the plan has no calendar

With a fixed curve, the optimal weekly spend on a channel is the same in every week. Any seasonal shape in the budget has to be added by hand, as a rule or a constraint. The timing of the plan is then an opinion, not a model output.

From our own models

We have seen it directly. One of our models, run without time variation, recommended more Google spend in a low-demand July and over-predicted sales.

One channel, two seasons
Weekly spend on the channelIncremental sales per weekNovemberJulyOptimal spend:JulyfixedNovemberThe channel in November: higher ceiling, higher optimal spendThe same channel in JulyOne fixed curve for the whole year: too high for July, too low for NovemberDots mark the spend where the next euro earns the same target return. Illustrative numbers.

How the Odins model lets the curve move

We start from an unusual place. The Odins model does not put its prior on a channel's ceiling. It puts it on the channel's optimal spend: the weekly amount at which the next euro earns exactly the target marginal return. The ceiling follows from that and from the half-saturation point. There is more on this in how priors are set.

That choice is what makes time variation manageable. The thing that moves through the year is the thing a marketer already reasons about: the budget that is right for the season.

The model adds one smooth curve over the calendar year. It says how far the optimal total budget sits above or below its yearly level, in currency. Each channel's optimal spend moves with it, and each channel's ceiling follows from its optimal spend. A second curve can move the half-saturation points as well, where there is a reason to believe the point at which returns bend shifts with the season. It is optional, and never used on its own.

responsec(x, t) = βc(t) × x / (x + κc(t))
Ac(t) = Ac + wc × m(t), with the weights wc summing to 1
κc(t) = κc × g(t), with g(t) = 1 when the second curve is off
βc(t) = α × (Ac(t) + κc(t))² / κc(t)

Here x is weekly spend on channel c, A is the optimal spend at the target marginal return α, κ is the half-saturation point, β is the ceiling and m(t) is the seasonal curve.

Two things follow from the algebra. At every date, the spend at which the channel's marginal return equals the target is Ac(t). And the optimal total budget is its yearly level plus m(t). So the seasonal curve answers a planning question: how much more, or less, is the right budget at this time of year?

Smooth by construction

The seasonal curve is a short Fourier series over the calendar year, with priors that penalize wiggle. It can say "more in the fourth quarter, less in summer". It cannot chase individual weeks. Where a market's seasonal pattern is itself drifting from year to year, the curve can be allowed to evolve instead of repeating.

Priors from the customer's own calendar

The starting belief comes from how the business has actually budgeted through the year: at a handful of dates, a range for how far the optimal budget sits from its yearly level. The data then moves it. Before training we check the direction against monthly spend. A curve that says "spend less" in the customer's biggest month is inverted, not seasonal.

Added second, never first

Every model starts static. We train and verify a fixed-curve model, then add the seasonal curve and check that the sampler still converges and that forecasts still hold against actuals the model has not seen. Flexibility added first is flexibility the data cannot check.

What the model learns: the optimal budget through the year
6080100120140Optimal weekly budget, index (yearly level = 100)JanFebMarAprMayJunJulAugSepOctNovDecPeak season: 123Low season: 81Optimal budget through the year, with its uncertainty bandFixed curve: one optimum all yearPrior ranges at a few dates, set from the customer's own calendar. Illustrative numbers.

What changes in the output

The plan gets a calendar

The optimizer can recommend more in the months where the next euro earns most and less where it does not, and scenario planning shows the split month by month. Spend where the next euro works hardest, not the same amount every month.

Marginal return is quoted for a period

"What does the next euro on paid social earn?" has a different answer in March than in November. The model answers for the period being planned, not for an average of three years.

Forecasts respect timing

Moving budget from October to July is not neutral, and the forecast shows what it costs.

One nuance. Peak demand and peak return usually arrive together, but the model does not assume it. The curve starts from the customer's calendar, and the data moves it.

What it costs, and what it does not do

Time variation is not free, and a page that only sold it would not be worth trusting.

  • It asks more of the data. When spend and demand peak together, higher seasonal demand and a higher seasonal media effect both look like more sales in November. One market's weekly series cannot fully separate them. The prior carries real weight, which is why it is written down, shown to the customer and tested on forecasts stored before the actuals arrive.
  • It can encode habit. A business that has always spent heavily in December hands the model a December-heavy starting point. If the habit was wrong, the prior is wrong the same way until the data or a test says otherwise. A structured test that pulses spend in a quiet month is the cleanest way to find out.
  • The season is shared. The seasonal curve moves all channels together. The model does not estimate a separate seasonal pattern for each channel. With one market and one observation a week, it could not.
  • It is a season, not a trend. The curve describes the shape of the year. A channel that is getting structurally better or worse over several years is a different question, and monthly retraining on recent data tracks it only gradually.
  • It does not say why. The model measures that the same spend buys more in peak season. Whether that is demand, competition or creative is outside what it can tell you.

How the open-source frameworks handle it

Commercial platforms rarely publish their model specification, so we compare with what can be checked: the three open-source frameworks, from their own documentation.

FrameworkWhat moves in the baselineWhat moves in the media response
Google MeridianA time-varying intercept for trend and seasonalityNothing. The Hill parameters are indexed by channel, not by time.
Meta RobynTrend, season and holidays, decomposed with ProphetNothing. One saturation curve per media variable for the whole window.
PyMC-MarketingAn optional time-varying interceptOptional: one latent multiplier that scales total media contribution over time. Saturation parameters stay fixed.
OdinsTrend, yearly seasonality and dated eventsStandard: each channel's optimal spend and ceiling move with the season. Optional: the half-saturation point moves too.

Credit where it is due: PyMC-Marketing comes closest. Its time-varying media option lets the level of media contribution rise and fall over time, and a skilled team can build the rest on top of it. Three things differ. It has to be switched on, given priors and validated by whoever builds the model. It is a free-form multiplier, not a statement about the budget in currency, so it is harder to set a prior for and harder for a marketer to sanity-check. And it leaves the half-saturation point where it was.

That is the difference between a framework and a product: possible in one, standard in the other. More on each: Odins vs PyMC-Marketing and Odins vs Google Meridian.

Questions to ask any MMM vendor

  • Is a channel's response curve the same in every week of the training window?
  • If it moves, what moves: the level of contribution, the ceiling or the half-saturation point?
  • Where does the seasonal prior come from, and can we see it before training?
  • Does the seasonal shape of the recommended plan come from the model, or from a rule added afterwards?
  • How do you check that the extra flexibility did not just fit noise?

We are happy to answer all five about our own model, on your data.

Sources

FAQ

Frequently asked questions.

What is time-varying saturation in marketing mix modeling?

It means a channel's response curve can change over time instead of being estimated once for the whole training window. In the Odins model the curve moves with the season, so a channel's ceiling and optimal spend can be higher in peak season than in the low season.

Why is a fixed saturation curve a problem?

It forces the model to say that a euro on a channel buys the same in every week of the year. When media works better in peak season, the difference has to go somewhere: into the seasonal baseline, into a distorted curve, into other channels or into noise. The plan also loses its calendar, because the optimal spend comes out identical every week.

Does Google Meridian have time-varying saturation?

No. In Meridian's model specification the Hill parameters are indexed by channel, not by time, so each channel has one curve for the whole period. What varies over time in Meridian is the intercept, which carries trend and seasonality in the baseline.

Does PyMC-Marketing have time-varying saturation?

Partly. PyMC-Marketing has an optional time-varying media setting: one latent multiplier that scales total media contribution over time. The saturation parameters themselves stay fixed, and the option has to be switched on and given priors by the modeler. In Odins the seasonal movement is standard, and it is expressed as the optimal budget through the year.

Is the seasonal curve estimated separately for each channel?

No. The seasonal curve moves all channels together, and each channel responds through its own optimal spend and half-saturation point. A separate seasonal pattern per channel is more than one market's weekly data can support.

How do you keep a time-varying model from overfitting?

Three ways. The seasonal curve is smooth by construction and cannot follow individual weeks. Its prior comes from the customer's own budget calendar and is checked before training. And it is added only after a static model has been trained and verified, with forecasts tested against actuals the model has not seen.

Does time-varying saturation change the budget recommendation?

Yes. The recommended spend per channel differs by month, and the marginal return is quoted for the period being planned. A fixed-curve model can only produce a seasonal plan if someone adds the seasonality by hand.

Talk to our team

Marketing spend, modeled like an investment.

A 30-minute walkthrough of the model on your channels: the curves, how they move through the year, and what that does to the plan.

Book a demo