← Back to Blog
Quantitative MarketingPromo EconomicsFinancial EngineeringPython

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.

SPSantosh Paudel· July 28, 2026· 8 min read
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

DiscountEffective priceUnits soldMargin per unitProfitvs optimum
$0.00$100.001,000.0$45.00$45,000.00-1.3%
$5.00$95.001,136.8$40.00$45,472.72-0.2%
$8.33$91.671,243.0$36.67$45,576.70optimum
$10.00$90.001,301.3$35.00$45,547.21-0.1%
$15.00$85.001,501.2$30.00$45,037.47-1.2%
$20.00$80.001,746.9$25.00$43,673.20-4.2%
$30.00$70.002,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.

ElasticityOptimal priceOptimal discountInterpretation
1.5$165.00none, raise priceDemand barely responds. You are underpriced.
2.0$110.00none, raise priceStill underpriced at $100 list.
2.5$91.678.3%Mild discount justified.
3.5$77.0023.0%Deep discounting is correct here.
5.0$68.7531.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.

Free resource

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.

No spam. Unsubscribe anytime.

Browse all free guides →

Want to implement this with guidance?

Santosh helps founders turn insights like this into real systems.

Promo Economics Audit

External Resources

Further Reading & Tools

Related Posts

01
9 min
Risk ManagementPromo Economics
TodayQuantitative Marketing

Value at Risk and Kill Switches for Live Promotions

A spend cap set at expected payout shuts down 46% of perfectly healthy campaigns. The right multiple is 1.52x. Sizing exposure limits and automated kill switches against a real payout distribution.

Read article
02
8 min
Incentive DesignBehavioral Economics
TodayQuantitative Marketing

The Line Between Motivating and Manipulating: An Incentive Design Ethics Test

Every mechanic in this series works because of a cognitive bias. That makes them powerful and makes some of them indefensible. A six-question test for which side of the line your design sits on, and what regulators have already acted against.

Read article
03
8 min
Price DiscriminationPricing
TodayQuantitative Marketing

Why Promo Codes Beat Sales: Price Discrimination in Practice

A blanket 20% discount earns $20,000 less than no discount at all. The same discount behind a code that only bargain hunters bother to find earns $64,000 more. The friction is the entire mechanism.

Read article