Discount Codes on Thin Margins: What 15% Off Actually Costs
A discount is quoted in percentage points of the price, but it is paid entirely out of the profit. Those are two very different bases, and the gap between them is why a code that sounds modest in a marketing meeting can remove a third of a product's earnings before anyone checks. The arithmetic is short, it fits on one line, and every store selling wholesale-bought goods should know it by heart.
The one line that explains everything
Write margin the usual way — m = (price − cost) ÷ price — and let d be the discount as a decimal. Gross profit per unit before the code is price × m. After the code, the customer pays price × (1 − d) while the cost doesn't move, so:
profit after discount = price × (m − d)
The cost term cancels out completely. What's left says that a discount of d subtracts d from your margin in absolute points, which means it destroys d ÷ m of your gross profit. A 15% code against a 40% margin: 15 ÷ 40 = 37.5% of the profit, gone. Against a 25% margin, the same code removes 60%. Against a 15% margin it removes everything.
The second formula tells you what margin you're actually left holding:
margin after discount = (m − d) ÷ (1 − d)
The denominator is why the new margin isn't simply m − d: you're now measuring a smaller profit against a smaller price. It softens the blow slightly on the percentage view — and that softening is exactly what fools people, because the dollars are already gone.
Six dollars and thirty cents per unit. If that SKU moves 25 units a month, the code costs $157.50 a month while it runs — which is a perfectly reasonable thing to spend, provided somebody decided to spend it rather than discovering it later.
The table to keep near your promo calendar
Two numbers per cell: the margin you're left with, and the volume increase required to earn back the same gross profit dollars you were making before the code. That second number is pure arithmetic — m ÷ (m − d) — not a forecast. It's what the discount commits you to, not what it will achieve.
| Margin before | 10% off | 15% off | 20% off |
|---|---|---|---|
| 25% | 16.7% · +67% units | 11.8% · +150% | 6.3% · +400% |
| 30% | 22.2% · +50% units | 17.6% · +100% | 12.5% · +200% |
| 35% | 27.8% · +40% units | 23.5% · +75% | 18.8% · +133% |
| 40% | 33.3% · +33% units | 29.4% · +60% | 25.0% · +100% |
| 50% | 44.4% · +25% units | 41.2% · +43% | 37.5% · +67% |
| 60% | 55.6% · +20% units | 52.9% · +33% | 50.0% · +50% |
Read down a column rather than across a row and the shape of the problem appears. The same 20% code asks a 60%-margin brand for half again as many units and asks a 25%-margin distributor for five times as many. This is the entire reason discounting culture differs so sharply between a fashion label and a parts warehouse — not temperament, arithmetic. If you sell wholesale-bought goods at 25–35%, the discount ladder that works for a 65%-margin DTC brand will bankrupt you on the same volume.
The maximum discount your floor allows
If you run a margin floor — the line where a SKU stops paying its way — then the floor also defines a discount ceiling. Rearranging the formula above for the largest d that still lands on a floor f:
max discount = (m − f) ÷ (1 − f)
A 40%-margin SKU with a 20% floor: (0.40 − 0.20) ÷ 0.80 = 25%. Check it on the $42.00 example — 25% off gives $31.50, minus the $25.20 cost is $6.30 of profit, and 6.30 ÷ 31.50 is exactly 20.0%. A 30%-margin SKU with the same floor tolerates only 12.5%, and a 25%-margin SKU tolerates 6.3% — which is to say, in practice, nothing.
| Margin before | Max discount, 15% floor | Max discount, 20% floor |
|---|---|---|
| 25% | 11.8% | 6.3% |
| 30% | 17.6% | 12.5% |
| 35% | 23.5% | 18.8% |
| 40% | 29.4% | 25.0% |
| 50% | 41.2% | 37.5% |
| 60% | 52.9% | 50.0% |
You may notice these cells repeat the first table's margins. That isn't a copy-paste error — the relationship between "discount applied" and "margin left" is its own inverse. Whatever discount takes a 40% SKU down to 25% is the same discount that takes it to 25% from 40%. One table, read two directions.
Where the arithmetic quietly breaks
The margin you typed in is last quarter's
Every number above starts from m, and m comes from the cost field. Shopify stores exactly one cost per variant with no history and no supplier attached, so if a price file landed since you last touched it, your whole discount plan is calibrated to a margin that no longer exists.
Take the same SKU after a modest 8% supplier increase — cost $25.20 → $27.22, retail untouched at $42.00. The margin is now 35.2%, not 40%. Run the 15% code anyway and you get $35.70 − $27.22 = $8.48, a 23.8% margin. The code still costs its $6.30 — that part never depended on cost — but you planned to land on $10.50 a unit and you landed on $8.48, and against the $16.80 this SKU earned before either event, a discounted unit now brings home barely half. The promotion didn't change; the ground under it did.
Order-level discounts hit a blended margin
A code applied to the cart works against whatever mix happens to be in it, and mixes are rarely flattering. Two lines — a $42.00 item at 40% and a $19.00 accessory at 25% — make a $61.00 order carrying $39.45 of cost and $21.55 of profit: a blended margin of 35.3%. A 15% order code leaves $51.85 and $12.40, i.e. 23.9%. The customer thinks they took 15% off. You lost 11.4 points of blended margin, weighted toward whichever line you'd least like to discount.
Nothing in a storefront's discount configuration is aware of cost. A code doesn't know a margin floor exists, can't decline to apply itself to a SKU that's already thin, and will happily stack on top of an item you were about to reprice. That's not a defect to complain about — it's just the reason the guardrail has to live in your process rather than in the checkout.
Fixed per-order costs come out of what's left
The discount lands on gross profit; the shipping label, the packaging and the fixed part of the payment fee then land on the remainder. On a small order the two together are far worse than either alone, because the per-order stack doesn't shrink just because the order got cheaper. A 15% code on a $19 item that already barely covers its own logistics doesn't reduce the profit — it turns the order into a subsidy. The same logic governs where you can safely set a free-shipping threshold.
Dollar-off codes are percentage codes in disguise
"$10 off" reads as one promotion and behaves as many: 24% off a $42 item, 53% off a $19 one. If you use fixed-amount codes, attach a minimum order value that keeps the implied percentage inside your ceiling — a $10 code with a $60 minimum can never exceed 16.7%, and that bound is worth more than any amount of monitoring after the fact.
A practical routine
- Refresh costs before the campaign, not after. Any SKU whose cost changed since the last review is a SKU whose planned discount depth is wrong.
- Compute the ceiling per tier, not per catalog. Group SKUs by margin band and give each band its own maximum. One store-wide discount depth is always too deep for the thin band and too shy for the fat one.
- Exclude, don't hope. Anything sitting within a few points of its floor should be excluded from the code outright. This is the one control that's easy to configure and it's the one most often skipped.
- Write down the volume commitment. Put "+60% units to break even" in the campaign brief next to the discount depth. It reframes the conversation from "how much off?" to "against what?", which is the conversation worth having.
- Review after with the same formulas. Units sold × profit per discounted unit, against the same period without the code. Revenue lift is not the test; gross profit is.
Know the margin before you set the depth
Every formula on this page starts from a current cost. Load your latest supplier price list and your Shopify product export into the free Supplier Price Margin Checker to see each SKU's margin as it stands today — matched by SKU, entirely in your browser.
Open the free checker ↗