A test runs in four phases — pre-test, ramp-up, measurement, cool-down — each one attribution window long. The cool-down lift adds back.
Pre-test. Ramp. Measure. Cool. The cool-down adds back.
Ad stock and the attribution window are two lenses on the same process; they must align, and the test window
must contain them. Read the lift only after the ramp settles, and credit the cool-down to the in-test investment.
In the math below, p = peak incremental revenue (value) per day, s = spend per day,
w = one attribution window in days. So p/s has units of revenue per dollar —
incremental ROAS (iROAS). The figure uses w for each phase as a teaching convenience —
"cool-down" here is the same thing the adstock literature calls decay, carryover, or tail.
The triangular ramp and cool-down are a teaching idealization. Real adstock follows
exponential carryover: lift(t) = λ · lift(t−1) + s with
carryover coefficient λ ∈ (0,1). Ramp and cool-down become equal in area only when the
ramp has fully saturated — typically when w ≥ 3 × adstock half-life. Below that,
cool-down accumulates more than ramp delivered, and the geometric symmetry argument tightens but
doesn't hold exactly. The "phase = attribution window" framing is also a teaching choice; real
ramp duration is set by adstock half-life, not by the attribution rule.
With ad-stock decay, the ramp triangle and the cool-down triangle are mirror images — same area. Together with the steady-state plateau, the response integrates to exactly twice the measurement-window lift.
wp / ws = p/s).
1.5wp / 2ws = 0.75 p/s — a 25% undercount. Excluding ramp from both spend and lift but
still adding cool-down gives 1.5wp / ws = 1.5 p/s — a 50% overcount. Whichever side
you keep, keep it on both legs.
Options A and B give the same expected iROAS but different precision. Option A integrates 3w of daily DiD data; Option B integrates w. Which one has the tighter confidence interval depends on the per-day signal-to-noise of the ramp and cool-down days — not on the integrated "area." More days usually tighten the estimate, but low-signal edge days can add noise without adding much lift. The reason most weekly reports use Option B isn't precision — it's timing: at the moment you ship a report, the cool-down data hasn't arrived yet.
The cool-down of test A bleeds into the pre-test of test B if you run them back-to-back. Test B's
"no-marketing baseline" is contaminated by A's residual lift. Either separate consecutive tests by
≥ 1 cool-down (one attribution window in this model, longer with high adstock), or
explicitly model A's decay as a covariate in B's analysis.
Computing this from a real test: at daily granularity, compute
lift(d) = treatment(d) − control(d) — which is causal only if the two cells would have
moved together absent the test (parallel trends, the assumption a clean randomization buys you).
Sum over the phases your chosen option includes;
divide by spend over the same phases; bootstrap or use cluster-robust standard errors for the CI.
Default to Option B in operational reporting because cool-down hasn't landed yet; switch to Option A
in retrospective analyses where you have the full window. And remember — the triangle is a model.
Channels with near-instant response (branded paid search) are closer to a rectangle; channels with
long carryover (TV, programmatic display) need a measurement window of weeks, not days, before the
symmetry argument is anywhere near exact.