ML Systems Lab Open interactive version →
Advanced 26 min read Pricinguplift modelingincrementalitycannibalization

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

Takeaway

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

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%.

Q2. After a promo ends, sales drop below their normal level for several weeks. What is this, and how should it change measurement?

Q3. An uplift (HTE) model classifies a segment of customers as "sure things." What is the correct action, and why?

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 →