440. Quantity Discounts

440.1. EOQ with quantity discounts

Relax one dimension from basic EOQ: unit price is no longer flat. The supplier offers per-unit discounts at break quantities — buy more, pay less per unit. Now purchase cost 𝑐𝐷 depends on 𝑄 (via the chosen price tier), so we cannot drop it from TC.

Two discount rules are common; we treat both.

440.1.1. All-units discount

The discounted price applies to every unit once you cross the break.

Tiers indexed 𝑘=1,2,,𝐾 with break quantities 0=𝑄0<𝑄1<<𝑄𝐾1 and unit costs 𝑐1>𝑐2>>𝑐𝐾:

𝑐(𝑄)=𝑐𝑘if𝑄𝑘1𝑄<𝑄𝑘

(Last tier 𝑘=𝐾 has no upper bound: 𝑄𝑄𝐾1.)

Holding cost is typically 𝑘=𝑖𝑐𝑘 where 𝑖 is the annual carrying-cost rate (% of unit value), so the effective holding rate scales with the unit cost.

440.1.2. Cost model

Total cost (now keep purchase cost — it depends on tier):

TC𝑘(𝑄)=𝑐𝑘𝐷+𝑆(𝐷𝑄)+𝑘(𝑄2)where𝑘=𝑖𝑐𝑘

The new term 𝑐𝑘𝐷 is the only addition vs basic-EOQ TRC, but it’s the dominant one.

440.1.3. Algorithm (all-units case)

  1. For each tier 𝑘, compute the within-tier EOQ:

    𝑄𝑘=2𝑆𝐷𝑘=2𝑆𝐷𝑖𝑐𝑘
  2. Feasibility: is 𝑄𝑘[𝑄𝑘1,𝑄𝑘)?

    • If yes: candidate 𝑄𝑘=𝑄𝑘.
    • If 𝑄𝑘<𝑄𝑘1 (EOQ too small for this tier): candidate 𝑄𝑘=𝑄𝑘1 (snap up to the break).
    • If 𝑄𝑘𝑄𝑘 (EOQ too large for this tier): tier 𝑘 is dominated by a lower tier (𝑘+1 at least), skip it.
  3. Evaluate TC𝑘 at each candidate.
  4. Pick the candidate with the smallest TC𝑘 — that’s 𝑄.

Geometric intuition: each tier has its own U-shaped TRC curve, sitting on top of a tier-specific constant 𝑐𝑘𝐷. Lower tiers have a higher floor but the same shape. The optimum is the lowest feasible point across all tiers’ curves.

440.1.4. Incremental discount (briefly)

Each break only discounts units beyond the threshold. So the cost is piecewise linear in 𝑄 (no jump at breaks):

Purchase(𝑄)=𝑘=1𝐾𝑐𝑘max(0,min(𝑄,𝑄𝑘)𝑄𝑘1)

The TC curve is continuous (no jumps). Optimization is similar but there’s no need to snap to break quantities — you just minimize TC(𝑄) piecewise within each segment.

440.1.5. Final formulas

For the all-units case, no closed-form 𝑄 — must enumerate tiers as above.

Sanity check: with a single tier (𝐾=1), the algorithm reduces to basic EOQ exactly.

Example

Given (shared EOQ params + a 3-tier discount schedule):

  • Annual demand: 𝐷=12000 units/year
  • Order cost: 𝑆 = $50 / order
  • Carrying-cost rate: 𝑖=0.20 (20%/year)
  • Discount schedule:
Tier 𝑘Quantity rangeUnit cost 𝑐𝑘
1𝑄<500$10.00
2500𝑄<1000$9.50
3𝑄1000$9.00

Step 1 — within-tier EOQ for each tier

Holding cost is 𝑘=𝑖𝑐𝑘:

𝑄1=250120000.210=600000775𝑄2=250120000.29.5=631579794𝑄3=250120000.29=666667816

Step 2 — feasibility check

  • Tier 1 (range 𝑄<500): 𝑄1=775 is outside (too large). Tier 1 is dominated. Skip.
  • Tier 2 (range 500𝑄<1000): 𝑄2=794 is inside ✓. Candidate 𝑄2=794.
  • Tier 3 (range 𝑄1000): 𝑄3=816 is outside (below the break). Snap to break: candidate 𝑄3=1000.

Step 3 — evaluate TC at each candidate

TC2(794)=𝑐2𝐷+𝑆(𝐷𝑄)+2(𝑄2)=(9.5)12000+50(12000794)+(0.29.5)(7942)=114000+755.7+754.3115510TC3(1000)=(9.0)12000+50(120001000)+(0.29.0)(10002)=108000+600+900109500

Tier 3 wins.

Step 4 — compare to basic EOQ at the cheapest flat price

  • Basic EOQ at 𝑐= $10 (no discount available): 𝑄=775, TC120000+774+775121549.
  • With discount (use 𝑄=1000): TC109500. Save $12049/year by ordering just past the break to capture the volume discount.

The savings come almost entirely from the lower unit cost ($9 vs $10 saves $12000/year on purchase alone). The order/holding penalty for ordering above the unconstrained optimum is small because EOQ is forgiving (square-root cushion).