Promotion & Discount Uplift
Measuring the INCREMENTAL effect of a discount — separating true uplift from cannibalization, pull-forward, and buyers who would have bought anyway
Run a 20%-off promo, watch units sold jump 40%, and declare victory — that is how most promotions are "measured," and it is almost always wrong. The number that matters is not units sold at the discount, it is incremental units caused by the discount: the sales that would not have happened otherwise. Everything else is money handed to buyers who needed no persuasion.
Uplift is a causal quantity: units *because of* the promo, not units *during* it. Gross redemptions = baseline (would-have-bought) + incremental (persuaded). The whole discount is spent on both groups, but only the incremental group is a return. If 40% more units sold and 30 of those 40 points were people who'd have bought at full price, your real uplift is 10 points and you paid a discount on all of them. This is why naive promo ROI — (revenue during promo) ÷ (discount cost) — systematically overstates value.
Three leakages inflate the naive number, and each needs a different correction
- Baseline sales — buyers who would have purchased anyway; the discount is pure margin given away. - Pull-forward — you didn't create demand, you *borrowed it from next month*; sales spike then dip, and a window that ends at the spike books a phantom win. - Cannibalization — the discounted SKU steals sales from your own full-price products; category-level units are flat while you've traded margin for mix.
Measuring only the promoted SKU over only the promo window hides all three.
The fix is a control group plus uplift (heterogeneous-treatment-effect) modeling. A holdout that *doesn't* see the promo gives the baseline directly: incremental = treated − control, over a window long enough to catch pull-forward payback and wide enough (whole category) to catch cannibalization. Then go further: an uplift model estimates each customer's *individual* treatment effect and sorts them into persuadables (buy only if discounted — the real target), sure things (buy anyway — discounting them is waste), lost causes (won't buy regardless), and sleeping dogs (the promo *reduces* their purchase). Targeting discounts only at persuadables is where uplift modeling pays for itself: same promo budget, far more incremental margin.
Key points
- Uplift is incremental units caused by the promo, not gross units at the discount. Gross = baseline (would-have-bought) + incremental (persuaded). The discount is paid on both, but only the incremental group is a return. Naive ROI = revenue-during ÷ discount-cost systematically overstates value.
- Three leakages inflate the naive number. Baseline sales (buyers who'd have purchased anyway — pure margin given away), pull-forward (demand borrowed from next month; sales spike then dip), and cannibalization (the promoted SKU steals from your own full-price SKUs). Measuring one SKU over the promo window alone hides all three.
- A control group is the fix for baseline; window/scope are the fix for pull-forward and cannibalization. A holdout that doesn't see the promo gives incremental = treated − control. Extend the window past the payback dip to catch pull-forward, and measure the whole category (not just the promoted SKU) to catch cannibalization.
- Uplift modeling targets only persuadables. A heterogeneous-treatment-effect model sorts customers into persuadables (buy only if discounted — the target), sure things (waste), lost causes (won't buy), and sleeping dogs (promo backfires). Discounting only persuadables converts the same budget into far more incremental margin.
A promotion's value is incremental units caused by the discount, not units sold at the discount — and the naive "units jumped 40%" number is inflated by baseline buyers (would have bought anyway), pull-forward (demand borrowed from the future), and cannibalization (stealing from your own full-price SKUs). A no-promo control group over a long-enough, category-wide window measures true uplift = treated − control, and uplift/HTE modeling goes further by discounting only the persuadable customers instead of the sure things.
Recap
- Uplift = incremental units caused by the promo, not gross units at the discount. Gross = baseline + incremental; the discount is paid on both but only incremental is a return. Naive ROI overstates value.
- Three leakages inflate the naive number: baseline (would-have-bought — free margin given away), pull-forward (demand borrowed from the future; spike then dip), and cannibalization (stealing from your own full-price SKUs).
- A no-promo control gives the baseline: incremental = treated − control. Extend the window past the payback dip (pull-forward) and measure the whole category (cannibalization), not one SKU over the promo window.
- Uplift/HTE modeling sorts customers: persuadables (buy only if discounted — the target), sure things (waste), lost causes (won't buy), sleeping dogs (promo backfires).
- Target only persuadables: same discount budget, far more incremental margin. Discounting sure things is pure margin donation.
Check your understanding
Q1. A 20%-off promo raises units sold by 40%. Select the two leakages that could make true incremental uplift far smaller than 40%.
- A) Baseline sales — buyers who would have purchased at full price anyway.
- B) Pull-forward — demand borrowed from next month's sales rather than newly created.
- C) Elasticity threshold effects — 40% sits just below the unit-elastic cutoff of |ε| = 1.
- D) Measurement lag — POS systems undercount promotional transactions by design.
Q2. After a promo ends, sales drop below their normal level for several weeks. What is this, and how should it change measurement?
- A) Cannibalization — the promo permanently reduced category demand going forward, so no change to measurement window is needed.
- B) Pull-forward — demand was borrowed from the future, so the window must extend past the dip or you'll book a phantom win.
- C) A seasonal artifact entirely unrelated to the promo's timing, so the post-promo sales dip should simply be ignored.
- D) Baseline drift — recalibrating the baseline model to the new post-promo average makes the dip disappear from the data.
Q3. An uplift (HTE) model classifies a segment of customers as "sure things." What is the correct action, and why?
- A) Target them heavily with discounts, since sure things have the highest historical conversion rate of any customer segment observed.
- B) Do NOT discount them — they buy at full price regardless, so the discount is pure margin given away with zero incremental effect.
- C) Discount them modestly, hedging against classification error since the model's segment boundaries are only ever probabilistic.
- D) Exclude them entirely from all future campaigns, including full-price offers and general marketing communications.
Try it interactively
ML Systems Lab is a free interview-prep platform for ML engineers — work through the full interactive module, quizzes, and drills.
Open ML Systems Lab →