Who this is for
- Marketing Analysts who need to credit multiple touchpoints fairly across a customer journey.
- Performance marketers optimizing budgets across channels and campaigns.
- Analysts building dashboards or reports that compare channel ROI.
Prerequisites
- Know your conversion event (e.g., purchase, lead) and lookback window.
- Have touchpoint data with user/session IDs, timestamps, and channels.
- Comfort with basic math and spreadsheets or SQL.
Why this matters
Real tasks you will face:
- Allocating revenue/lead credit to channels without overvaluing last click.
- Comparing campaign effectiveness when journeys have many touches.
- Explaining why recent touches often matter more and how you weighted them.
- Running budget shift scenarios based on time-weighted performance.
Concept explained simply
Time Decay Attribution gives more credit to touches that happen closer to conversion. Earlier touches still matter, just less. This mirrors real buyer behavior: memory fades and intent strengthens as people get closer to purchase.
Mental model
- Think of attention like a melting ice cube: the closer to conversion, the more solid the impact.
- We control how fast it melts with a βhalf-lifeβ (h). After h days, weight halves.
Weight formula (using days as the unit): w = 0.5^(age_in_days / half_life). Normalize weights so they sum to 1 per conversion, then allocate credit.
Terminology
- Lookback window: how far back you consider touches (e.g., 30 days).
- Half-life (h): how quickly credit decays; common picks: 7 days (B2C), 30 days (B2B).
- Normalization: divide each touch weight by the sum so credits add up to 1.
How to implement (step-by-step)
- Define scope. Choose the conversion and lookback window (e.g., purchases within 30 days of first touch).
- Pick a half-life (h). Start practical: 7 days for fast cycles (retail), 14β30 days for longer cycles (B2B). Plan to backtest.
- Compute touch weights. For each touch: age = conversion_time β touch_time. Weight w = 0.5^(age/h). Keep time units consistent.
- Normalize per journey. Sum all w for that conversion; each touch credit = w_i / sum_w.
- Aggregate. Sum credits by channel, campaign, ad group, etc.
- QA. Randomly sample journeys to ensure credits sum to 1, timestamps make sense, and single-touch paths get 100% credit.
Pro tips
- Use the same half-life across channels for fair comparison; only change it with strong evidence and clear documentation.
- Set sensible rules for βDirectβ: report both with and without last-non-direct to avoid over-crediting Direct.
- Backtest half-lives: choose the one that best predicts future conversions or aligns with business reality.
Worked examples
Example 1: B2C, half-life 7 days
Path: Facebook (14d), Paid Search (7d), Email (2d), Direct (0d). h=7.
Show calculation
- w_FB = 0.5^(14/7) = 0.25
- w_PS = 0.5^(7/7) = 0.5
- w_Email = 0.5^(2/7) β 0.820
- w_Direct = 1.0
- Sum = 2.57
- Credits: FB β 9.7%, Paid Search β 19.5%, Email β 31.9%, Direct β 38.9% (rounding may vary slightly)
Example 2: B2B, half-life 30 days
Path: LinkedIn (60d), Webinar (20d), SDR Call (5d), Direct (0d). h=30.
Show calculation
- w_LI = 0.5^(60/30) = 0.25
- w_Webinar = 0.5^(20/30) β 0.630
- w_SDR = 0.5^(5/30) β 0.891
- w_Direct = 1.0
- Sum β 2.771
- Credits: LinkedIn β 9.0%, Webinar β 22.7%, SDR β 32.1%, Direct β 36.1%
Example 3: Repeated channel touches
Path: Display (9d), Email (5d), Email (1d), Direct (0d). h=7.
Show calculation
- w_Display β 0.410
- w_Email_old β 0.610
- w_Email_recent β 0.906
- w_Direct = 1.0
- Sum β 2.926
- Per-touch credits: Display β 14.0%, Email_old β 20.9%, Email_recent β 31.0%, Direct β 34.1%
- Channel-level: Email total β 52.0%
Exercises
Do these now. Answers are available below each exercise in the Exercises panel and in the Solutions.
Exercise 1 β Single journey calculation
Given: Facebook (14d), Paid Search (7d), Email (2d), Direct (0d). h=7. Compute normalized credit by channel.
- Formula: w = 0.5^(age/7)
- Normalize per journey
- Round to one decimal place
Exercise 2 β Aggregate across multiple journeys
Five conversions; h=7. For each journey, compute per-touch credits, normalize, then sum by channel.
Dataset
- Journey A: Paid Social (10d), Email (3d), Direct (0d)
- Journey B: Organic (12d), Paid Search (6d), Email (1d), Direct (0d)
- Journey C: Paid Social (20d), Paid Search (2d), Direct (0d)
- Journey D: Organic (5d), Referral (2d), Direct (0d)
- Journey E: Paid Search (9d), Email (4d), Paid Search (1d), Direct (0d)
- Output needed: Channel share % across all 5 conversions.
Checklist
- Used same half-life across all journeys
- Weights computed with correct ages
- Each journeyβs credits sum to 100%
- Channels aggregated correctly (duplicates combined)
Common mistakes and self-checks
- Not normalizing per journey. Self-check: Pick 10 random conversions; confirm channel credits sum to 100% each.
- Wrong time unit. Self-check: Ensure age and half-life are in the same unit (both days or both hours).
- Over-crediting Direct. Self-check: Compare results with and without last-non-direct rule; large swings imply Direct is absorbing brand recall.
- Changing half-life per channel without evidence. Self-check: Keep one h for fairness; only vary after documented backtests.
- Including post-conversion touches. Self-check: Filter touches strictly before conversion timestamp.
- Timezone/timestamp errors. Self-check: Convert all times to a single timezone before calculating ages.
Practical projects
- Project A: Build a spreadsheet model that takes touch timestamps and outputs time-decay channel credits with a configurable half-life. Deliverable: a template with inputs, weights, and pivoted channel totals.
- Project B: Backtest half-lives (3, 7, 14, 30 days) on last monthβs data and pick the one that best correlates with this monthβs actual conversions or CAC. Deliverable: a one-page summary with charts and your recommendation.
- Project C: Create a dashboard visualizing channel credit under last-click vs time-decay (h=7). Deliverable: side-by-side comparison and a 3-bullet stakeholder takeaway.
Quick Test β how it works
Everyone can take the test below; only logged-in users get saved progress.
Mini challenge
Your median time-to-conversion is 14 days. You want a time-decay model that still values mid-funnel touches but clearly favors recency. What half-life would you start with, and why?
Suggested answer
Start with h = 7 days. Itβs about half the median path length, so mid-funnel touches keep meaningful weight while recency is emphasized. Then backtest against h = 5 and h = 10 to see which better predicts future conversions.
Learning path
- Before: UTM taxonomy and channel mapping, conversion tracking, session stitching.
- This lesson: Time Decay Attribution (setup, math, QA, reporting).
- After: Position-based models, data-driven/algorithmic attribution (e.g., Markov, Shapley), and Marketing Mix Modeling for high-level budget planning.
Next steps
- Implement time-decay in your reporting with a documented half-life and lookback window.
- Share a short note explaining the model and how it differs from last-click.
- Run a 2-week experiment shifting 10β15% budget toward channels that gain credit under time-decay; monitor CAC/ROAS and conversion quality.