How to Fix the 'Recency Bias' That Skews Your Lifetime Value Forecasts

How to Fix the 'Recency Bias' That Skews Your Lifetime Value Forecasts

🧠 How to Fix the β€˜Recency Bias’ That Skews Your Lifetime Value Forecasts

Dr. Elara Williams, PhD in Artificial Intelligence


~1,500 words


Every customer in your database has a lifetime value (LTV) β€” a number your revenue projections, cohort analyses, and marketing budgets quietly depend on. Yet most LTV models carry a hidden flaw that rarely shows up in a validation report: they over-weight the recent past and under-weight everything before it.


Recency bias is the quiet tax on your forecasting accuracy.


This article walks through why the bias exists, how it shows up in classic LTV models, and β€” most importantly β€” how to fix it. The fixes are practical, and most can be implemented in a week.


Why LTV Models Fall Prey to Recency Bias

Recency bias in LTV forecasting is not a bug. It is a structural artifact of how we build and evaluate these models. Four forces conspire to push your forecast toward the customer’s most recent months:


1. Sliding windows. Most LTV pipelines train on a rolling 6- or 12-month window. The window naturally captures the customer’s latest behavior, so the model learns "this customer looks like their last month."


2. Feature recency. You tend to engineer features like orders_last_30_days, revenue_last_90_days, days_since_last_purchase. These are all backward-looking and weighted toward the recent past.


3. Decay functions. Simple exponential-decay LTV formulas (e.g., BG/NBD with a geometric retention model, or naΓ―ve LTV = ARPU Γ— 1/(1 - retention)) treat the recent period as the best proxy for the long run.


4. Evaluation mismatch. You validate with a 90-day holdout. The model only needs to be right about the next 90 days. Anything that predicts the long tail correctly but the near-term poorly still "wins" your metric.


The net effect: a customer who had a promotional spike three months ago gets a much higher LTV than a customer with a flat, steady two-year history. A customer who just returned from a six-month gap gets under-scored. Both distort your cohort math.


How Big Is the Skew? A Simple Decomposition

Let a customer’s monthly spend be $s_t$ for months $t = 1, \dots, N$. A naΓ―ve LTV estimate might be:


$$\ hat{LTV} = \sum_{t=1}^{N} w_t , s_t$$


A recency-biased model uses weights that grow toward $N$, for example $w_t = \alpha^{N-t}$ with $\alpha > 1$. A recency-neutral model uses $w_t = 1/N$ for all $t$.


The bias can be measured as:


$$\ text{Bias} = \frac{\hat{LTV}{recency} - \hat{LTV}{neutral}}{\hat{LTV}_{neutral}}$$


In a synthetic study on 10,000 customers with stable spend plus a single promotional spike in month $N-1$, a 90-day-window model produced an LTV that was 23–41% higher for the spiky customers and 8–12% lower for customers with a mild dip in the last month, relative to a 24-month-window model. The direction of the error matches intuition: the model is essentially predicting the customer’s next month, not their lifetime value.


Five Practical Fixes

Fix 1 β€” Use a Long, Stable Training Window

The simplest fix is the least exciting one: give the model more history.

  • Extend the training window from 90 days to 12–24 months of behavior.

  • Exclude the most recent 30 days from the input window if your evaluation also uses 30-day forward predictions, so you are not leaking near-term signal into the label.

  • If your customers have shorter histories, stitch in proxy signals β€” category tenure, brand affinity, subscription status β€” that are more stable than purchase frequency.

Window comparison (synthetic data, 10k customers)
MAPE of 24-month LTV
─────────────────────────────────────────
  30-day window  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  21.4%
  90-day window  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    17.8%
  12-mo window   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ       12.1%
  24-mo window   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ           9.3%

A 24-month window cut MAPE by more than a quarter versus a 30-day window in this toy setting. Real pipelines see similar ratios.


Fix 2 β€” Engineer Slow-Moving Features, Not Just Fast Ones

Feature engineering is where recency bias gets baked in. Pair your fast-moving features with slow-moving ones:

Fast (recent)

Slow (stable)

orders_last_30d

orders_last_12m

spend_last_30d

spend_last_12m

days_since_last_purchase

median_inter_purchase_gap

last_order_category

top_3_categories_12m

coupon_usage_last_30d

coupon_usage_rate_12m

Then let the model learn the balance. If you use a linear model, you can even constrain the ratio:


$$\ sum_{f \in \text{fast}} |w_f| \leq 0.6 , \sum_f |w_f|$$


so that recent features can’t dominate the prediction.


Fix 3 β€” Model the Shape of the History, Not Just the Level

A customer who is growing, stable, or decaying should get different LTVs even if their 12-month spend is identical. Encode the shape:

  • Slope: fit a linear regression on log-spend over the window; the slope is a feature.

  • Trend ratio: $\rho = \frac{\bar{s}{\text{last }3m}}{\bar{s}{\text{first }9m}}$. $\rho > 1$ means growing; $\rho < 1$ means decaying.

  • Variance ratio: $\frac{\text{Var}{3m}}{\text{Var}{12m}}$ captures whether the customer is becoming more or less predictable.

  • Autocorrelation: $\text{ACF}_1$ of the monthly spend series.

These shape features are nearly orthogonal to the level, so they let the model separate "who this customer is" from "what they did last month."


Fix 4 β€” Use a Proper Probabilistic LTV Model

If you are still using a naΓ―ve decay formula, you are leaving accuracy on the table. Two well-studied options:


BG/NBD + Gamma-Gamma (for transactional customers):

  • BG/NBD models the probability of being alive and the expected number of future transactions.

  • Gamma-Gamma models the expected spend per transaction.

  • Combine: $\text{LTV} = P(\text{alive}) \times E[\text{transactions}] \times E[\text{spend}]$.

Hawkes-based point processes (for customers with self-exciting behavior, e.g., subscription or community-driven spend):

  • Model each purchase as increasing the hazard of the next purchase.

  • This captures the shape of the customer’s behavior, not just its level.

Both are well-documented and have open-source implementations (e.g., python-bgnbd, lifetimes, hawske).


Fix 5 β€” Evaluate Against the Right Horizon

Your validation metric is your training signal. If you only validate on a 90-day horizon, your model will specialize on the 90-day horizon.


Build a multi-horizon evaluation:


$$\ text{MAPE}{H} = \frac{1}{N}\sum{i=1}^{N} \frac{|\hat{LTV}{i,H} - LTV{i,H}|}{LTV_{i,H}}$$


for $H \in {3m, 6m, 12m, 24m}$.


Report all four. A good LTV model should have a relatively flat MAPE curve across horizons. A recency-biased model will show MAPE increasing with $H$ β€” it is good at predicting the near term and bad at predicting the long term.


Also add a cohort stability check: compute LTV at $t$ and $t+6m$ for the same customer. The ratio $\frac{LTV(t)}{LTV(t+6m)}$ should be close to 1 for a stable model and drift toward the customer’s actual growth/decay for a recency-biased one.


A Worked Example

Consider a customer with the following monthly spend (in $):

Month:  1  2  3  4  5  6  7  8  9  10 11 12
Spend:  50 55 52 60 58 55 50 52 55 50 48 50

Stable customer. 12-month spend: $645.


Now add a single promotional spike in month 12:

Month:  1  2  3  4  5  6  7  8  9  10 11 12
Spend:  50 55 52  60 58 55 50 52 55 50 48 200

12-month spend: $795.


A 30-day-window LTV model will score the spiked customer at roughly 30% higher LTV than the stable one β€” even though their underlying habit is identical. A 12-month-window model with the features above will score them within 5–8% of each other. That is the difference between two cohorts that look the same to your finance team.


Operationalizing the Fixes

A practical rollout looks like this:

  1. Week 1 β€” Extend the training window to 12 months. Add the slow-moving features. Re-train.

  2. Week 2 β€” Build the multi-horizon evaluation. Baseline the current MAPE curve.

  3. Week 3 β€” Add shape features (slope, trend ratio, variance ratio). Re-train.

  4. Week 4 β€” Pilot BG/NBD + Gamma-Gamma on a 10% cohort. Compare to the tree-based model.

  5. Ongoing β€” Monitor the cohort stability check weekly. Alert if $|LTV(t)/LTV(t+6m) - 1| > 0.15$ for more than 20% of customers.

Total engineering effort: roughly one engineer-week. Total accuracy gain: typically 10–25% MAPE reduction on 12-month LTV, depending on the baseline.


The Deeper Point

Recency bias is a symptom of a broader modeling habit: we train models on the shape of the data we can see, not the shape of the quantity we want to predict. The data we can see is always the recent past. The quantity we want to predict is the far future.


The fixes above close that gap. They do not require a PhD, a GPU cluster, or a new framework. They require a longer window, a few more features, a better evaluation, and the discipline to treat the recent month as one of many signals rather than the signal.


Customers are not their last month. They are the integral of their behavior over time. Your LTV model should be too.


Dr. Elara Williamsis a fictional author created for this article. The numbers in the synthetic studies are illustrative, not benchmark results.