How Deep Should the Discount Be? The Calculus of Margin and Elasticity
With price elasticity of 2.5, the profit-maximising discount is 8.33%, not 20%. At 30% off you sell 2.4 times the units and earn 19.7% less. One derivative gives you the answer in closed form.
Table of contents
Discount depth is one of the few marketing decisions with a closed-form optimal answer. You differentiate the profit function, set it to zero, and solve. The result is usually much shallower than what teams actually run.
The short answer
For a product with list price P, unit cost C and constant price elasticity of demand e, profit is maximised at price p* = C x e / (e - 1). At $100 list, $55 cost and elasticity 2.5, that is $91.67, an optimal discount of $8.33 or 8.3%. A 20% discount earns 4.2% less than optimal. A 30% discount earns 19.7% less while shifting 2.4 times the units.
The setup
Constant elasticity demand says quantity responds to price as a power law:
q(p) = q0 x (p / P)^(-e)
Elasticity e is the percentage change in quantity for a 1% change in price. At e = 2.5, cutting price 10% raises volume about 27%. Profit is quantity times unit margin:
Profit(p) = q0 x (p / P)^(-e) x (p - C)
The derivative
Differentiate with respect to p and set to zero. The q0 and P^e constants fall out:
d/dp [ p^(-e) (p - C) ] = -e x p^(-e-1) (p - C) + p^(-e) = 0
Multiply through by p^(e+1):
-e(p - C) + p = 0 -ep + eC + p = 0 p(1 - e) = -eC p* = C x e / (e - 1)
That is the whole derivation. It requires elasticity above 1, which is the condition for a discount to raise revenue at all. Below that, any discount reduces revenue and the optimal discount is zero.
For C = 55 and e = 2.5: p* = 55 x 2.5 / 1.5 = $91.67. Optimal discount is $8.33.
What the profit curve looks like
| Discount | Effective price | Units sold | Margin per unit | Profit | vs optimum |
|---|---|---|---|---|---|
| $0.00 | $100.00 | 1,000.0 | $45.00 | $45,000.00 | -1.3% |
| $5.00 | $95.00 | 1,136.8 | $40.00 | $45,472.72 | -0.2% |
| $8.33 | $91.67 | 1,243.0 | $36.67 | $45,576.70 | optimum |
| $10.00 | $90.00 | 1,301.3 | $35.00 | $45,547.21 | -0.1% |
| $15.00 | $85.00 | 1,501.2 | $30.00 | $45,037.47 | -1.2% |
| $20.00 | $80.00 | 1,746.9 | $25.00 | $43,673.20 | -4.2% |
| $30.00 | $70.00 | 2,439.2 | $15.00 | $36,588.63 | -19.7% |
Two features of this curve matter more than the optimum itself.
The peak is flat. Anywhere between $0 and $10 off, profit is within 1.3% of optimal. Precision is not the point, and arguing about whether the right number is 8% or 9% is wasted effort.
The right side falls off a cliff. Past $15 the curve turns sharply. At 30% off you are moving 2.4 times the volume, running 2.4 times the fulfilment and support load, and earning $8,411 less than doing nothing at all. Volume growth is real. It is also, past a point, the mechanism of the loss rather than a consolation for it.
The model
def optimal_discount(list_price, unit_cost, elasticity, base_qty=1000.0):
if elasticity <= 1:
return {"optimal_discount": 0.0,
"note": "elasticity <= 1: any discount reduces profit"}
def qty(p):
return base_qty * (p / list_price) ** (-elasticity)
def profit(d):
p = list_price - d
return qty(p) * (p - unit_cost)
p_star = unit_cost * elasticity / (elasticity - 1)
d_star = list_price - p_star
return {
"optimal_price": p_star,
"optimal_discount": d_star,
"optimal_discount_pct": d_star / list_price,
"profit_at_optimum": profit(d_star),
"profit_at_no_discount": profit(0.0),
"profit_at_20pct": profit(list_price * 0.20),
}
for k, v in optimal_discount(100.0, 55.0, 2.5).items():
print(f"{k:24} {v:>12,.4f}")
Output:
optimal_price 91.6667
optimal_discount 8.3333
optimal_discount_pct 0.0833
profit_at_optimum 45576.6963
profit_at_no_discount 45000.0000
profit_at_20pct 43673.2005
How elasticity changes the answer
Everything above depends on one estimated parameter, so it is worth seeing its influence directly.
| Elasticity | Optimal price | Optimal discount | Interpretation |
|---|---|---|---|
| 1.5 | $165.00 | none, raise price | Demand barely responds. You are underpriced. |
| 2.0 | $110.00 | none, raise price | Still underpriced at $100 list. |
| 2.5 | $91.67 | 8.3% | Mild discount justified. |
| 3.5 | $77.00 | 23.0% | Deep discounting is correct here. |
| 5.0 | $68.75 | 31.3% | Highly competitive, thin margins, discount hard. |
Notice that at elasticity 2.0 or below, the model says your list price is too low and the correct move is to raise it. Teams reaching for a discount when elasticity is low are solving the wrong problem in the wrong direction.
Estimating your elasticity without a research budget
You need price variation and the resulting quantity. Most catalogues have it already in historical promo data.
import math
def implied_elasticity(p1, q1, p2, q2):
"""Log-log arc elasticity between two observed price points."""
return -(math.log(q2) - math.log(q1)) / (math.log(p2) - math.log(p1))
print(f"{implied_elasticity(100, 1000, 80, 1740):.3f}")
Output:
2.482
Two observations give a crude estimate. Several promo cycles at different depths give a usable one. The estimate matters far more than the arithmetic that follows it, so spend the effort there.
The caveats worth stating
Constant elasticity is a local approximation. It holds reasonably near your observed price range and badly outside it. Do not use a model fitted to 10% discounts to justify a 50% clearance.
The model prices a single product in isolation. It ignores cannibalisation, stockpiling, and the effect of discounting on reference price, which is the one that does long-run damage. Customers who learn your product goes on sale every month stop buying at list, which shows up as a permanent elasticity increase and is very hard to reverse.
None of that changes the core finding. The profit-maximising discount is computable, it is usually shallower than the round numbers teams reach for, and the cost of going deeper is convex. The next question is not how deep, but what the whole campaign will cost once redemption is uncertain, and that requires simulation rather than calculus.
Get the Promo & Bonus Economics Workbook
Every formula for pricing a promo before you launch it: expected value, wagering cost, breakage, breakeven conversion. Worked examples with real executed numbers.
Browse all free guides →Want to implement this with guidance?
Santosh helps founders turn insights like this into real systems.
External Resources
Further Reading & Tools
Investopedia — Financial Engineering
Reference on the field, its three pillars, and its primary applications
CFA Institute — Refresher Readings
Curriculum material on derivatives valuation, probability, and risk measurement
QuantLib
Open-source quantitative finance library, reference for how pricing models are structured
arXiv q-fin
Preprints in quantitative finance covering pricing, risk management, and market microstructure