Promotion Lift Attribution Model
ML separates true promotion lift from baseline demand, pull-forward, cannibalization, and halo effects so pricing teams can judge campaign profitability.
Retail processPlanBuyPriceStockSellFulfillReturnClear
By Don, DoneThat’s AI coach · updated
What this model does for pricing analysts
A promotion can look successful on a raw sales chart and still destroy margin. Units spike during the offer window, yet much of that volume may have sold at full price later, may have shifted from a sibling SKU, or may have been pulled from adjacent weeks. Pricing analysts need a clean measure of incremental demand before they declare a campaign profitable.
This page describes a promotion lift attribution model that estimates true incremental sales attributable to a promotion, then isolates the main distortions that inflate or hide that lift. The model attributes lift. Finance still books the P&L view, and category or pricing owners decide whether to keep, cut, or redesign the offer.
The effects the model separates
True promotion lift is the incremental volume (or revenue) that would not have occurred without the promotion, holding other demand drivers constant. Everything else is noise until it is measured and labeled.
Baseline demand is the volume you would have expected under normal price, assortment, seasonality, and media conditions. Without a stable baseline, every spike looks like a win.
Pull-forward (also called pantry loading or borrow-from-future) is demand brought into the promo window from later periods. Total category demand over a longer horizon may be flat even when the promo week looks strong.
Cannibalization is volume taken from other items in the same brand, category, or basket. A deep discount on one SKU can inflate its lift while quietly cutting sales of a higher-margin alternative.
Halo is the opposite spillover: the promoted item draws traffic or complementary purchases that lift related SKUs. Halo can make a campaign look weak if you only score the featured item, or look strong if you credit unrelated category noise as promo-driven.
The model outputs an attributed lift decomposition so analysts can see how much of the observed spike is incremental versus redistributed. Related workflows such as Competitor Price Monitor and Dynamic Price Optimization feed competitive and price-elasticity context; this model answers whether a specific promo actually earned its discount.
Inputs and when the model returns empty output
The model needs enough history and promo structure to estimate a counterfactual baseline and to allocate spillover across SKUs and time.
Typical inputs include:
- Promo calendar: offer type, depth, duration, mechanics (TPR, BOGO, multibuys), featured SKUs, and store or channel scope
- Transaction or POS history at SKU × location × day (or week) grain, including units, net revenue, and preferably cost or margin
- Pre-promo and post-promo windows long enough to detect pull-forward and recovery
- Assortment and hierarchy metadata so sibling and complementary items can be grouped for cannibalization and halo
- Known demand drivers when available: seasonality markers, holidays, media flags, stockouts, and major competitive events
The model returns empty output when promo metadata, a usable baseline period, or sales history is missing or too sparse to support attribution. Empty output is intentional. It prevents a false “lift” number when the counterfactual cannot be estimated. Analysts should treat empty results as a data-quality gate, not as zero lift.
Thin categories, brand-new SKUs, or one-off events with no comparable history often fail this gate until more sales weeks accumulate or a peer-item baseline is explicitly approved by the pricing team.
How practitioners read the attribution
Start with the featured SKU’s observed promo-window sales, then read the decomposition in order: baseline, incremental lift, pull-forward, cannibalization, and halo. The profitable question is not “Did units rise?” but “After redistribution and timing shifts, did incremental margin cover the discount and execution cost?”
A useful operating pattern:
- Confirm the promo window and control baseline are correctly scoped (same stores, channels, and seasons).
- Review incremental units and incremental margin for the featured item after baseline subtraction.
- Subtract estimated pull-forward if post-period dips are material relative to pre-period norms.
- Net cannibalization against halo within the defined brand or category set, using the same margin weights finance will use.
- Flag campaigns where gross lift is high but net attributed lift (or margin) is weak or negative.
Human-in-the-loop remains mandatory at the booking step. The model attributes lift; category managers validate assortment grouping and promo coding; finance books the commercial view used for vendor funding, trade-spend ROI, and plan vs. actual. Disputes usually sit in grouping choices (what counts as a sibling) and window length (how far pull-forward is measured), not in raw unit counts.
For clearance and end-of-life offers, pair this view with Markdown Timing Optimizer. Promo lift attribution answers whether a temporary price cut created demand; markdown timing answers when to cut price to clear inventory with less residual stock risk.
Quality checks before you trust a campaign score
Attribution quality fails in predictable ways. Check these before you scale a “winning” mechanic across the chain.
Promo coding quality. Wrong start/end dates, missing featured SKUs, or mixed mechanics in one event will smear lift across the wrong items. Fix the calendar before you trust the score.
Stockouts and fulfillment. If the promoted item was out of stock mid-event, observed lift understates opportunity and can mis-rank mechanics. Note stockout days in the review packet.
Competitor and media overlap. A simultaneous competitor match or heavy media flight can move baseline demand. When those flags are available, treat them as covariates; when they are not, widen confidence language in the analyst note rather than inventing precision.
Assortment drift. New or delisted siblings change cannibalization pools. Freeze the comparison set for the event or document the change so finance can reproduce the view.
Horizon consistency. Compare campaigns only when pull-forward windows and category scopes match. A two-week borrow window will not reconcile with a six-week one.
When checks fail, prefer empty or provisional output over a single headline ROI number. Pricing teams protect credibility by publishing attributed lift only when baseline, promo, and history gates pass.
Practical use in the pricing calendar
Use the model after each material event, and roll insights into the next promo plan. Mechanics that produce high gross spikes but large pull-forward or cannibalization should be redesigned (shallower depth, tighter SKU set, shorter window) or reserved for traffic goals that are funded explicitly. Mechanics that show durable incremental margin with limited borrow become candidates for repeat and for vendor negotiation packages.
Keep the analyst workflow separate from the booking workflow. The attribution pack explains incremental demand and spillover. The finance pack applies agreed cost, funding, and overhead rules. That separation keeps the model from becoming a silent P&L engine and keeps humans accountable for commercial judgment.
Is this worth automating for you?
Whether this pays back depends on how much time it takes your team today. Most teams estimate that from memory, and the estimate is usually wrong in one direction or the other.
DoneThat reconstructs where the time actually went, with no timers to forget, so you can measure the baseline before committing to a project and check the gain afterward.
Measure the baseline first