Adstock & Carryover Effects
Capturing the Lasting Impact of Marketing
Marketing investments don't stop working the moment a campaign ends. A TV commercial seen this week continues to influence purchase decisions for weeks or even months. Adstock modeling (also called carryover effects or decay) mathematically captures this temporal persistence, ensuring accurate attribution of long-term marketing impact.
The Adstock Problem
Without Adstock: Immediate Attribution Only
Scenario:
- You spend $100K on TV in Week 1 
- Sales spike in Week 1: +$80K 
- Sales remain elevated in Weeks 2-4: +$40K, +$25K, +$15K 
- Total lift: $160K 
Linear Model Without Adstock:
Sales(t) = β × TV_Spend(t)Only captures $80K (Week 1), missing $80K of carry-over lift (50% of total impact).
Result: TV appears only half as effective as it truly is.
With Adstock: Full Attribution
Adstock Model:
Sales(t) = β × TV_Adstocked(t)Where TV_Adstocked captures the decaying effect:
- Week 1: $100K (original spend) 
- Week 2: $60K (60% carries over) 
- Week 3: $36K (60% of Week 2) 
- Week 4: $21.6K (60% of Week 3) 
Result: Model correctly attributes all $160K lift to TV investment.
Geometric Adstock: The Standard Approach
Mathematical Formula
Recursive Form (Easiest to Understand):
Adstocked(t) = Spend(t) + λ × Adstocked(t-1)Expanded Form (Shows Decay):
Adstocked(t) = Spend(t) + λ×Spend(t-1) + λ²×Spend(t-2) + λ³×Spend(t-3) + ...Where:
- λ (lambda): Adstock rate (0 to 1) 
- Spend(t): Original marketing spend at time t 
- Adstocked(t): Transformed value accounting for carryover 
Understanding Lambda (λ)
Lambda represents the percentage of impact that persists to the next period.
λ = 0 (No Carryover)
- All impact occurs immediately 
- No persistence to future periods 
- Typical for: Very short-term promotions, flash sales 
λ = 0.3 (30% Carryover)
- 30% of impact carries to next period 
- 70% decays immediately 
- Typical for: Search advertising, email 
λ = 0.5 (50% Carryover)
- Half of impact persists 
- Balanced decay rate 
- Typical for: Digital display, radio 
λ = 0.7 (70% Carryover)
- Strong persistence 
- Impact lasts many weeks 
- Typical for: TV, print, outdoor 
λ = 0.9 (90% Carryover)
- Very long-lasting effect 
- Slow decay 
- Typical for: Brand campaigns, sponsorships, PR 
Visualizing Adstock Decay
Example: $100K Spend in Week 1, λ = 0.6
Pattern: Each week retains 60% of previous week's value, creating exponential decay.
Half-Life Calculation
Formula:
Half-Life = ln(0.5) / ln(λ)Example with λ = 0.7:
Half-Life = ln(0.5) / ln(0.7) = 1.94 weeksAfter ~2 weeks, impact decays to 50% of original.
Interpretation Guide:
Typical Adstock Rates by Channel
Television
Typical Range: 0.4 - 0.7 Most Common: 0.5 - 0.6
Rationale:
- High reach builds awareness over weeks 
- Creative messaging has lasting impact 
- Frequency effects accumulate 
- Brand recall persists 
Business Reality: TV ad seen Week 1 influences purchases in Weeks 2-6 as consumers:
- Remember the brand when shopping 
- Discuss ads with friends/family 
- Search for product online (delayed response) 
Radio
Typical Range: 0.3 - 0.6 Most Common: 0.4 - 0.5
Rationale:
- Shorter creative (15-30 sec vs TV's 30-60 sec) 
- Often consumed passively (background) 
- Lower production value = less memorable 
- Still builds frequency over time 
Digital Display
Typical Range: 0.2 - 0.5 Most Common: 0.3 - 0.4
Rationale:
- Often served to high-intent users (immediate action) 
- Banner blindness reduces lasting impact 
- Frequency caps limit persistence 
- Some retargeting effect carries over 
Paid Search
Typical Range: 0.0 - 0.3 Most Common: 0.1 - 0.2
Rationale:
- Captures existing demand (bottom-funnel) 
- Users already searching = immediate conversion 
- Minimal brand-building component 
- Short-term transactional nature 
Social Media (Paid)
Typical Range: 0.3 - 0.6 Most Common: 0.4 - 0.5
Rationale:
- Engagement creates lasting impressions 
- Content may be shared (extended reach) 
- Algorithm amplification over time 
- Community effects 
Print
Typical Range: 0.5 - 0.8 Most Common: 0.6 - 0.7
Rationale:
- Physical presence lasts (magazines kept for weeks) 
- Pass-along readership extends impact 
- Deeper engagement than digital 
- Premium context enhances recall 
Outdoor (Billboards, Transit)
Typical Range: 0.6 - 0.8 Most Common: 0.7
Rationale:
- Repeated daily exposure (same commute route) 
- 4-week+ campaign durations typical 
- High frequency builds memory 
- Environmental integration 
Sponsorships & PR
Typical Range: 0.7 - 0.9 Most Common: 0.8 - 0.85
Rationale:
- Halo effect lasts months/years 
- Association building is gradual 
- Credibility compounds over time 
- Long-term brand equity impact 
Finding Optimal Adstock Rates
Method 1: Statistical Testing (Recommended)
In MixModeler:
- Navigate to Variable Testing 
- Select Marketing Variable (e.g., TV_Spend) 
- Test Multiple Adstock Rates (e.g., 30%, 40%, 50%, 60%, 70%) 
- Compare t-statistics across rates 
- Select Rate with Highest t-statistic (strongest significance) 
Example Results:
Rationale: Highest t-stat indicates the transformation that best explains KPI variance.
Method 2: Granger Causality
Question: Does marketing spending "Granger-cause" KPI at different lag periods?
Process:
- Test if TV(t-1) predicts Sales(t) 
- Test if TV(t-2) predicts Sales(t) 
- Test if TV(t-3) predicts Sales(t) 
- Continue until non-significant 
Result: Significant lags reveal carryover duration
Translation to Lambda:
- Significant at lag 1 only → λ ≈ 0.2-0.3 
- Significant at lags 1-2 → λ ≈ 0.4-0.5 
- Significant at lags 1-4 → λ ≈ 0.6-0.7 
- Significant at lags 1-6+ → λ ≈ 0.8+ 
Method 3: Business Judgment
Questions to Ask:
- How long do customers typically remember this advertising? 
- What's the purchase cycle duration for your product? 
- Is this brand-building or direct response? 
- What's the creative quality/memorability? 
Heuristic:
- Short purchase cycle (days-weeks) → Lower lambda 
- Long purchase cycle (months) → Higher lambda 
- Memorable creative → Higher lambda 
- Forgettable/generic → Lower lambda 
Method 4: Sensitivity Analysis
Process:
- Build model with λ = 0.5 (baseline) 
- Rebuild with λ = 0.3, 0.4, 0.6, 0.7 
- Compare model fit metrics (R², AIC) 
- Check coefficient stability 
- Select optimal lambda 
Best Practice: If multiple lambdas give similar fit, choose based on business knowledge.
Advanced: Time-Varying Adstock
Some campaigns have non-constant decay based on context:
Holiday Campaigns: Rapid decay after holiday (gift purchased)
λ_holiday = 0.3 during season
λ_post = 0.7 after season (brand halo)New Product Launch: Slow initial decay (awareness building)
λ_launch = 0.8 (Weeks 1-12)
λ_mature = 0.5 (Week 13+)Implementation: Split variable by time period and model separately.
Applying Adstock in MixModeler
Manual Adstock Creation
Step 1: Variable Workshop Navigate to Variable Workshop
Step 2: Create Adstock Variable
- Select base variable (e.g., TV_Spend) 
- Choose "Create Adstock Transformation" 
- Set lambda rate (e.g., 60% = 0.6) 
- Name: TV_Spend_ads60 
Step 3: Add to Model Use adstocked variable in Model Builder instead of raw spend
Integrated Adstock in Model Builder
Alternative Workflow:
- Add Variable to Model (e.g., TV_Spend) 
- Set Adstock Parameter directly in Model Builder 
- Model applies transformation automatically 
- Preview changes before applying 
Benefit: Faster iteration without creating new variables
Combining Adstock with Saturation
Most realistic MMM models apply both transformations:
Order Matters:
Option 1: Adstock THEN Saturation (Recommended)
1. Apply adstock: TV_ads60
2. Apply saturation: f(TV_ads60)Logic: Marketing impact accumulates over time (adstock), then diminishing returns apply to accumulated impact (saturation).
Option 2: Saturation THEN Adstock (Less Common)
1. Apply saturation: f(TV)
2. Apply adstock to saturated valuesLogic: Each period's spend saturates immediately, then effect carries over.
MixModeler Default: Option 1 (adstock first) aligns with industry best practices.
Common Adstock Mistakes
❌ Mistake 1: No Adstock for Media Channels
Problem: Underestimates long-term effectiveness Fix: Always apply adstock to TV, Radio, Print, Outdoor (λ ≥ 0.4)
❌ Mistake 2: Identical Adstock Across All Channels
Problem: Different channels have different persistence Fix: Customize lambda by channel type
❌ Mistake 3: Over-Adstocking
Problem: λ = 0.9 when reality is λ = 0.5 Symptom: Coefficient becomes non-significant or wrong sign Fix: Test multiple rates, select based on t-statistics
❌ Mistake 4: Ignoring Initial Conditions
Problem: Model doesn't account for pre-period advertising Fix: Use first 4-8 weeks as "warm-up" period for adstock accumulation
❌ Mistake 5: Forgetting Adstock in Forecasting
Problem: Future predictions ignore carryover from past periods Fix: When forecasting, include adstocked values from historical spend
Diagnostic: Is Your Adstock Rate Right?
✅ Good Signs
- Marketing variable has significant coefficient (t-stat > 2) 
- Coefficient sign is positive (makes business sense) 
- Model R² improved vs. non-adstocked version 
- Residuals show reduced autocorrelation (Durbin-Watson closer to 2) 
- ROI estimates align with business expectations 
⚠️ Warning Signs
- Coefficient becomes negative (over-adstocked) 
- t-statistic decreases vs. non-adstocked 
- High multicollinearity introduced (VIF spikes) 
- Business stakeholders disagree with implied persistence 
Action: Test alternative lambda values.
Interpreting Adstocked Coefficients
Example Model:
Sales = 1000 + 0.8 × TV_ads60Interpretation: "A $1 increase in TV spending generates $0.80 in sales:
- $0.40 immediately (Week 0) 
- $0.24 in Week 1 (60% carryover) 
- $0.14 in Week 2 (60% of Week 1) 
- $0.02 in Weeks 3+ (remaining decay)" 
Total: $0.80 cumulative effect from $1 spent.
Critical Point: The coefficient represents the total cumulative effect including all carryover, not just immediate impact.
Adstock and ROI Calculation
Without Adstock (Underestimate)
ROI = (Immediate_Sales_Lift / Marketing_Spend) - 1
ROI = ($50K / $100K) - 1 = -50% (appears unprofitable)With Adstock (Correct)
ROI = (Total_Sales_Lift_Including_Carryover / Marketing_Spend) - 1
ROI = ($150K / $100K) - 1 = 50% (actually profitable)Lesson: Adstock is essential for accurate ROI measurement. Without it, long-term channels (TV, Print) appear less effective than they truly are.
Special Case: Promotions and Price
Question: Should we apply adstock to price reductions or promotions?
Answer: Usually no or very low adstock (λ = 0.1-0.2)
Rationale:
- Price promotions have immediate effect 
- Customers respond quickly to discounts 
- Pull-forward effect (future sales borrowed) 
- Limited memory of past promotions 
Exception: Brand equity from sustained promotions may justify modest adstock.
Adstock in Decomposition Analysis
When running decomposition to calculate channel contributions:
Adstock is Already Incorporated: The model uses adstocked variables, so contributions automatically include carryover effects.
Example Decomposition:
- Week 1 TV spend: $100K 
- Week 1 TV contribution: $80K (includes immediate + future carryover) 
- Week 2 TV spend: $0 
- Week 2 TV contribution: $48K (carryover from Week 1) 
Total TV contribution over 2 weeks: $128K from $100K spend
Key Insight: Contributions in periods with zero spend reflect carryover from previous investments.
Best Practices for Adstock Modeling
✅ Do's
Test Multiple Rates Always test 3-5 different lambda values (e.g., 0.3, 0.4, 0.5, 0.6, 0.7)
Use Variable Testing Leverage MixModeler's Variable Testing feature to compare t-statistics
Channel-Specific Rates Don't use the same adstock rate for all channels
Document Decisions Record why specific lambda values were chosen
Consider Business Context Statistical fit + business judgment = best results
Validate with Stakeholders Show decay curves to marketing teams - do they make sense?
Update Periodically Adstock rates may change as creative quality or media mix evolves
❌ Don'ts
Don't Skip Adstock It's not optional for media channels - essential for accuracy
Don't Over-Complicate Geometric adstock works for 95% of use cases
Don't Ignore t-statistics If adstocked variable has low significance, try different rate
Don't Apply Blindly Not all marketing needs adstock (e.g., search often doesn't)
Don't Forget in Forecasts Future predictions must account for carryover from historical spend
Adstock Rate Summary Table
Quick reference for starting values by channel:
Note: These are starting points. Always validate with data using Variable Testing.
Advanced: Delayed Adstock
Sometimes impact doesn't occur immediately - there's a lag before effect starts:
Formula:
Adstocked(t) = Spend(t-d) + λ × Adstocked(t-1)Where d = delay period (e.g., d=2 means 2-week delay)
Use Cases:
- Direct mail (2-3 week delivery + response time) 
- Magazine print (4-8 week production + readership) 
- Trade show sponsorships (deals close months later) 
Implementation in MixModeler: Create lead/lag variable first, then apply adstock to lagged version.
Summary
Key Takeaways:
⏱️ Adstock captures lasting impact of marketing beyond immediate period
📉 Geometric decay (exponential) is industry standard and sufficient for most cases
🎯 Lambda (λ) controls persistence - higher λ = longer carryover
📊 Different channels have different rates - TV (0.6) vs Search (0.1)
🔬 Test multiple rates using Variable Testing to find optimal lambda
✅ Essential for accurate ROI - without adstock, long-term channels appear ineffective
🔗 Combine with saturation for realistic marketing response (adstock first, then saturation)
Properly modeling adstock ensures you capture the full value of marketing investments, especially for awareness-building channels that drive sustained impact over time.
Last updated