The Playbook
- 1. The Margin Math Nobody Runs
- 2. Incrementality — The Only Question That Matters
- 3. Holdout Design — Your Measurement Infrastructure
- 4. Cannibalization, Pull-Forward & Stockpiling
- 5. Uplift Targeting — Who Gets the Discount
- 6. The Segment Playbook
- 7. Discount Depth & Mechanics
- 8. The Promo P&L Dashboard
- 9. Implementation Roadmap
Promotions are usually the largest discretionary spend in an e-commerce P&L after marketing — and the worst measured. Marketing has attribution debates; promo often has no measurement at all beyond "GMV went up during the sale." Of course it did. The question was never whether GMV goes up. It's whether the gross profit from incremental sales exceeds the margin given away on sales that would have happened anyway. Everything in this playbook serves that one sentence.
1. The Margin Math Nobody Runs
Start with the brutal arithmetic of discounting. When you cut price, you sacrifice margin on every unit to gain volume. The required volume lift just to break even on gross profit:
Required volume lift = 1 ÷ (1 − discount ÷ margin) − 1
| Gross margin | 10% discount | 15% discount | 20% discount |
|---|---|---|---|
| 20% margin | +100% volume needed | +300% | ∞ — impossible |
| 30% margin | +50% | +100% | +200% |
| 40% margin | +33% | +60% | +100% |
| 50% margin | +25% | +43% | +67% |
Read that table again. A 20% discount on a 30%-margin product needs to triple volume just to hold gross profit flat — and that's before counting the promo's operational costs, and critically, before the incrementality haircut below. In electronics or grocery, where margins run 10–25%, deep sitewide discounts are mathematically incapable of paying for themselves on margin alone. They must be justified by something else: customer acquisition, inventory clearance (see the inventory playbook), or competitive defense — and each of those justifications has its own metric you should be tracking instead.
2. Incrementality — The Only Question That Matters
Every order placed during a promotion is one of these:
| Order type | What happened | Promo's contribution |
|---|---|---|
| Incremental | Would not have happened without the promo | ✅ Full margin of the new sale (minus discount) |
| Cannibalized (subsidized) | Would have happened at full price | ❌ Pure margin loss = discount amount |
| Pulled forward | Would have happened next month at full price | ❌ Margin loss now + a demand hole next month |
| Cross-cannibalized | Replaced a full-price purchase of a neighboring SKU | ❌ Margin delta between the two products |
The promo P&L in one line:
Promo profit = (incremental units × unit margin after discount) − (non-incremental units × discount) − operational costs
The typical unmeasured promo shows a beautiful GMV spike where 60–80% of redeemed discounts went to customers who were buying anyway. That's how "50–60% of promotions lose money" happens while every campaign readout claims success — the readouts measure participation, not incrementality.
3. Holdout Design — Your Measurement Infrastructure
Incrementality can only be measured against a counterfactual, and the gold standard is embarrassingly simple: randomly withhold the promo from a slice of eligible customers and compare.
# The entire incrementality readout, conceptually
# treated: eligible customers who could see/use the promo
# holdout: randomly selected eligible customers who could not
incremental_rate = treated.cvr - holdout.cvr
incremental_orders = incremental_rate * n_treated
true_cost_per_inc = total_discount_spend / incremental_orders
# Compare true_cost_per_inc against unit margin →
# the promo is profitable iff margin_per_order > true_cost_per_incpython
Design rules that make or break the measurement:
- Randomize at customer level, before the campaign. Comparing redeemers vs non-redeemers is selection bias in its purest form — redeemers were already your most purchase-ready users. This error alone accounts for most inflated promo ROI numbers in the industry.
- Size the holdout with power analysis (see the experimentation playbook). 5–10% of the eligible base is typical — small enough that the business barely notices, large enough to measure.
- Keep a permanent "universal holdout" — 2–5% of customers excluded from all CRM promos for a quarter. This measures your entire promo program's incrementality, catching the interaction effects single-campaign holdouts miss (customers trained to wait for vouchers).
- Measure over a window longer than the campaign — 2–4 weeks after, to catch pull-forward. If treated customers stop buying right after the promo while holdout keeps buying, you borrowed demand, not created it.
"We can't hold out customers, it's unfair / leadership won't allow it." This objection kills more measurement than any technical problem. The counter: you are currently spending millions without knowing if the ROI is positive — the holdout is the cost of knowing. Start with one campaign, show the incrementality number next to the naive readout, and let the gap make the argument.
4. Cannibalization, Pull-Forward & Stockpiling
Three demand-shifting effects that quietly rewrite your promo P&L:
Product cannibalization
Discounting Pepsi steals from Coke on your own shelf. If you carry both, your incremental category volume is far below the promoted SKU's lift. Measure at category level, not SKU level: the promoted SKU's +80% means little if category volume moved +6%. This is the single most common way merchandising teams fool themselves.
Pull-forward (inter-temporal cannibalization)
Diapers, detergent, pet food: customers don't consume more because it's discounted — they buy the same annual volume earlier and cheaper. The tell-tale signature is a post-promo trough in the sales curve. Always plot 4 weeks after the campaign; if the area of the trough approaches the area of the spike, the promo was a financing operation, not a growth one.
Stockpiling & deal-training
Run the same "20% off first Friday of the month" long enough and customers learn to never buy at full price. Deal-trained customers are structurally lower-LTV. Track full-price purchase rate by cohort — if customers acquired via deep discounts never convert to full-price buyers, your acquisition promos are buying revenue, not customers. Irregular timing and targeted (rather than public) offers slow the training.
5. Uplift Targeting — Who Gets the Discount
Holdouts tell you if a campaign was incremental. Uplift modeling makes the next campaign incremental by design — by predicting, per customer, how much the discount changes their behavior. The four types every promo owner should internalize:
| Segment | Buys with promo | Buys without | Action |
|---|---|---|---|
| Persuadables | Yes | No | ✅ Target — this is 100% of your ROI |
| Sure things | Yes | Yes | ❌ Suppress — every voucher here is margin burned |
| Lost causes | No | No | ❌ Suppress — save the budget and the send |
| Sleeping dogs | No | Yes | 🛑 Actively exclude — the nudge backfires (real: reminds churned users to cancel, cheapens brand for premium buyers) |
The practical implementation is less exotic than the name suggests. From any past campaign that had a randomized holdout, train a T-learner:
# T-learner uplift: two models, subtract predictions
import lightgbm as lgb
m_treated = lgb.LGBMClassifier().fit(X[treated], y[treated])
m_control = lgb.LGBMClassifier().fit(X[holdout], y[holdout])
uplift = m_treated.predict_proba(X_all)[:, 1] \
- m_control.predict_proba(X_all)[:, 1]
# Rank customers by uplift; send vouchers to the top decile(s).
# Negative uplift = sleeping dogs → exclude entirely.
# Evaluate with Qini curves / uplift@k, NOT accuracy or AUC.python
Features that typically carry uplift models: discount dependency (share of past orders with a voucher),
recency, price sensitivity proxies (brand mix, price-band mix), engagement without purchase (sessions, carts),
and lifecycle stage. Libraries: causalml (Uber) or scikit-uplift. The realistic
payoff, consistently reported across the industry: same incremental revenue at 30–50% less promo
spend, simply by not paying the sure things.
6. The Segment Playbook
While your uplift model trains, RFM segments plus discipline get you 70% of the value:
| Segment | Default move | Why |
|---|---|---|
| Champions / heavy loyals | No discounts. Early access, exclusives, service perks | Highest sure-thing density in your base — margin protection zone. Recognition retains them cheaper than 15% off |
| Regular actives | Small, targeted nudges: category expansion offers ("something from a category you haven't tried"), threshold offers | Grow share-of-wallet, not subsidize existing behavior |
| At-risk (recency slipping) | The prime persuadable pool. Escalating sequence: reminder → small offer → deeper offer only on continued silence | Highest uplift concentration; don't open with your deepest discount |
| Lapsed / churned | Deep win-back for a defined window, then stop | Some are recoverable; unlimited win-back attempts train the rest to wait. Respect the sleeping dogs signal |
| New / first purchase | Welcome offer sized to unit economics, structured to seed a second purchase (voucher on next order, not the first) | Second purchase is the single biggest LTV inflection in most e-commerce data — aim the subsidy at it |
Spend margin where behavior can change — at-risk and second-purchase moments — and spend recognition where it can't. Most promo budgets do the exact opposite, because rewarding loyal customers feels right and shows great (fake) redemption ROI.
7. Discount Depth & Mechanics
- Depth: use the smallest effective incentive. Test 5/10/15% ladders with holdouts per arm. The persuadable who needed 15% off is often equally persuaded at 10% — response curves flatten fast, and every extra point is pure margin. Where elasticity data exists, size depth to it per category.
- Threshold offers ("X off orders above Y") protect margin structurally: set Y at 110–120% of the segment's typical AOV and the discount funds its own basket growth. Watch the basket-padding-then-return pattern in guardrails.
- Percentage vs fixed amount: % reads better on low prices ("20% off" > "AED 6 off"), fixed reads better on high prices ("AED 100 off" > "4% off") — and fixed amounts cap your exposure on expensive baskets.
- Vouchers beat price cuts for measurement: a voucher is targetable, holdout-able, and trackable per customer. A public price cut can't be randomized at customer level (that's a pricing test — use region or time splits). Structural implication: shift budget from sitewide events toward targeted CRM offers as your measurement matures.
- Funded vs unfunded: in marketplaces, who pays the discount — you, the seller, or the brand — changes the P&L completely. Track incrementality on your contribution margin, not the face value of the discount.
8. The Promo P&L Dashboard
If your promo reporting shows GMV and redemptions, it's a participation tracker. The operator's version:
| Metric | Definition | What it catches |
|---|---|---|
| Incrementality % | (treated CVR − holdout CVR) ÷ treated CVR | The share of promo orders that are real |
| Cost per incremental order | Total discount spend ÷ incremental orders | Compare directly against unit margin |
| Incremental gross profit | The one-line P&L from section 2 | The actual answer |
| Category-level lift | Category volume vs baseline, not SKU volume | Cannibalization |
| Post-promo trough | Sales vs baseline, weeks +1 to +4 | Pull-forward |
| Full-price rate by cohort | Share of each cohort's orders without any discount | Deal-training |
| Voucher dependency | Distribution of customers by % of orders discounted | The addicted segment growing |
9. Implementation Roadmap
Month 1 — Measure
- Add a 5–10% randomized holdout to your next two CRM campaigns. Report incrementality next to the naive readout.
- Build the margin-math table (section 1) for your top categories — circulate it. It changes conversations immediately.
Month 2 — Stop the bleeding
- Suppress obvious sure things (recent frequent full-price buyers) from the next campaign. Measure the spend drop vs revenue drop.
- Stand up the promo P&L dashboard; add the post-promo trough view.
Month 3 — Target
- Train a T-learner on the holdout campaigns from month 1. Deploy top-decile targeting on one campaign, holdout-validated.
- Propose the universal holdout for next quarter.
Running promos at scale and seeing something different? I'd genuinely like to compare notes: sharmavikas.9798@gmail.com.
Sources & Further Reading:
Glencoyne: Promotion ROI Modeling •
CausalML (Uber) •
scikit-uplift •
RELEX: Promotion Optimization