Let x hold what is known at decision time, a be an eligible action, and 0 be no offer. Define:
Q(x, a) = E[contribution profit over the window if assigned action a | x]
delta(x, a) = Q(x, a) - Q(x, 0)
chosen action = argmax delta(x, a), among feasible actions including 0
delta(x, 0) = 0This is a conditional average effect: the expected difference for customers with similar observed
context. You see only one of the two outcomes for each person, so you cannot directly label anyone's
true uplift. Take the logged reward from the same accounting contract: contribution over the window
minus the specified incentive, fulfilment and contact costs, including failed delivery attempts. If
net contribution already subtracts a cost, do not subtract it again. Use that net reward for both
Q and policy evaluation, no-offer arm included.
A worked example. Suppose an order contributes ₹500 before the incentive. The incentive applies to every completed order in its assigned arm, and sending the offer costs ₹2. Assume no returns or other effects. Suppose randomised data and a validated model gave these made-up purchase probabilities for one customer context:
| Assigned action | Purchase probability | Contribution per purchase | Expected profit | Increment against no offer |
|---|---|---|---|---|
| No offer | 0.20 | ₹500 | 0.20 × 500 = ₹100 | ₹0 |
| ₹50 benefit | 0.25 | ₹450 | 0.25 × 450 − 2 = ₹110.50 | ₹10.50 |
| ₹100 benefit | 0.30 | ₹400 | 0.30 × 400 − 2 = ₹118 | ₹18 |
| ₹200 benefit | 0.35 | ₹300 | 0.35 × 300 − 2 = ₹103 | ₹3 |
The largest benefit wins on conversion but loses to the ₹100 benefit on incremental profit. If the ₹100 benefit were infeasible, the policy would pick from the remaining feasible actions. If every active action lost money against no offer, choose no offer. In a real campaign, discounts may apply only on redemption, baskets can change, and returns add later costs. Measure those parts, or model net profit directly, instead of forcing this simple formula onto the business.
Try it yourself. Sending the offer now costs ₹10 instead of ₹2, with the same purchase probabilities. Recompute the increments. Which action does the policy choose, and which active action now loses money against no offer?
Hint and explained answer
Subtract ₹10 instead of ₹2. The ₹50 benefit gives 0.25 × 450 − 10 = ₹102.50, an increment of
₹2.50. The ₹100 benefit gives 0.30 × 400 − 10 = ₹110, an increment of ₹10. The ₹200 benefit gives
0.35 × 300 − 10 = ₹95, an increment of −₹5. The ₹100 benefit still wins. The ₹200 benefit has the
highest purchase probability but is now worse than no offer. If the ₹100 benefit were infeasible,
the ₹50 benefit's ₹2.50 edge would need an uncertainty check before it could replace no offer.
A discount paid to customers who would have bought anyway is a real cost. Also check whether the offer only pulls a future purchase into the window, moves revenue from a higher-margin product, or pushes out an existing offer. That is how a short-term redemption metric can produce an expensive policy.