In brief
- Judge a discount on what the order keeps after product cost and payment fees, not on revenue. That is its contribution margin.
- Units needed to break even = profit per unit at full price ÷ profit per unit after the discount. On a product with a 40% cost ratio, 20% off needs about half as many sales again.
- Shopify applies stacked discounts one after another: product discounts first, then order discounts on the reduced subtotal, then shipping.2
- The Sales by discount codes report gives you each code's sales; you add the cost and the fees to see its margin.1
Why discounts cost more than they look
Take an invented product that sells for $50.00 and costs you $20.00, sold with Shopify Payments at 2.9% + 30¢ (the US Basic rate).5 At full price each sale keeps $50.00 − $20.00 − $1.45 − $0.30 = $28.25. Every dollar of discount comes off that $28.25, while the cost stays at $20.00.
| Discount | Price paid | Kept per unit | Margin | More units needed |
|---|---|---|---|---|
| None | $50.00 | $28.25 | 56.5% | none |
| 10% | $45.00 | $23.40 | 52.0% | +21% |
| 20% | $40.00 | $18.54 | 46.4% | +52% |
| 30% | $35.00 | $13.69 | 39.1% | +106% |
| 40% | $30.00 | $8.83 | 29.4% | +220% |
| 50% | $25.00 | $3.98 | 15.9% | +611% |
Kept per unit = price paid − $20.00 cost − 2.9% of the price paid − 30¢. Margin = kept ÷ price paid. More units needed = $28.25 ÷ kept − 1. Invented figures; shipping, returns and overheads not included.
A 20% code has to sell half as many units again just to stand still, and 40% has to more than triple them. Few codes do. That does not make every discount wrong: a discount that brings a first order from a customer who comes back can pay for itself later. But you should know what it costs today before deciding it will.
The break-even uplift
The question to ask of any discount is how many more units it has to sell to leave you where you were:
| Measure | Formula |
|---|---|
| Kept per unit | price paid − cost − (fee rate × price paid) − fixed fee − shipping you absorb |
| Units needed, as a multiple | kept per unit at full price ÷ kept per unit after the discount |
| Uplift needed | that multiple − 1 |
| Contribution margin | kept per unit ÷ price paid |
If the kept amount is zero or negative, no volume recovers the discount: every extra sale loses more.
Free shipping belongs in the same sum. If a 20% code also ships free and delivery costs you $6.00, the order keeps $18.54 − $6.00 = $12.54, and the uplift needed rises from 52% to 125%.
The deepest safe discount
Set a margin floor, the share of each sale you are not willing to give away. 15% is a common choice. The deepest discount that keeps it is:
maximum discount = 1 − (cost + fixed fee) ÷ (price × (1 − fee rate − floor))
For the $50.00 product: 1 − 20.30 ÷ (50.00 × (1 − 0.029 − 0.15)) = 1 − 20.30 ÷ 41.05 = 50.5%, so 50%. At 50% the sale keeps $3.98, a 15.9% margin; at 51% it would keep 14.2%. If you also absorb shipping, add it to the cost in that formula.
Work it out for your lowest-margin products, not your average. A code that applies to the whole catalogue is only as safe as the thinnest margin it can land on.
Stacked discounts
Shopify lets discounts combine when you allow it in each discount's Combinations settings. Product discounts apply first, order discounts apply to the subtotal after product discounts, and shipping discounts apply last.2
So a 20% product discount and a 15% order discount take 1 − 0.80 × 0.85 = 32% off. On the $50.00 product that is $34.00 paid and $12.71 kept, a 55% drop in profit per unit from a pair of codes that each looked modest. Stacking is where most accidental losses come from: an automatic sale plus a welcome code plus an influencer code, none of which was meant to meet the others.
Check a discount code in Shopify admin
- Open Analytics › Reports › Sales by discount codes for the last 90 days. It groups sales by the name of the discount, automatic discounts included.1
- Note each code's orders and net sales. Net sales are gross sales minus discounts minus returns and other sales reversals.1 The report counts only the line items the discount affected.
- Add the product cost of those items from cost per item.4 If costs vary widely, use the cost ratio of the products the code was used on, not your store average.
- Add payment fees: fee rate × net sales + fixed fee × orders. Use your own rate; the fees calculator lists Shopify's by plan and country.
- Work out the margin: (net sales − cost − fees) ÷ net sales, and compare it with your floor.
An invented example, a welcome code used on 38 orders:
| WELCOME25, 90 days | Amount |
|---|---|
| Net sales after the discount | $2,090.00 |
| Product cost | −$1,913.49 |
| Payment fees: 2.9% × $2,090.00 + 38 × 30¢ | −$72.01 |
| Kept | $104.50, 5.0% |
| Kept at a 15% floor: 15% × $2,090.00 | $313.50 |
| Short of the floor | $209.00 |
Invented figures. $209.00 is what this code gave away beyond what a 15% floor allows in 90 days.
Do not add up the rows
With combinable discounts, an order appears once in each row for every discount applied to it.1 Summing the rows counts those orders more than once.
Fixing a code that loses money
- Add a minimum purchase amount so the code cannot land on a basket too small to carry it. Shopify counts it before shipping and taxes, and only the eligible items count when the discount is limited to certain products.3
- Limit it to collections whose margin can absorb it, instead of the whole catalogue.
- Reduce the depth to the safe discount for the products it applies to, or set an end date if it was meant to be temporary.
- Turn off combinations it does not need, in the discount's Combinations settings.2
- Check again after a week: the margin on orders using the code should be above your floor.
Pitfalls
- Missing cost per item. Without it, a code's margin is a guess. Fill in costs for anything that is often discounted first.4
- Judging on revenue. "The code brought in $2,090" says nothing about whether it made money.
- Averages hide the losers. A code can be fine across the store and lose money on every order of one low-margin product. Check products sold below cost after the discount separately.
- Returns. A discounted order that comes back loses the fee and the handling on top of the discount.
- Fees differ. Card rates vary by plan and country, and another payment provider adds Shopify's own fee on top. Use your rate.
Doing it automatically
Store Diagnosis is our free, read-only Shopify app. It reads every order with its discount codes, line items, costs and refunds, and each night checks every code the way this guide does: net sales, product cost, payment fees at 2.9% + 30¢ an order, and the margin left. Codes that keep less than 15% are listed with the amount it would take to bring them back to that floor; codes whose orders lose money outright are marked critical. Automatic discounts are grouped together.
It also flags products sold below cost once a discount was applied, orders where two or more codes together took off more than 40%, and it links each code to its page in Discounts, with the steps to fix it. Where cost per item is missing it assumes a 50% margin and marks the figure as estimated.
Store Diagnosis, free and read-only.
- Discount codes below a 15% margin
- Products sold below cost
- Stacking past 40% off
- Refunds and small-order fees
Frequently asked questions
How do I know if a Shopify discount code is profitable?
Take the net sales of the orders that used the code from the Sales by discount codes report, subtract the product cost of what they bought and the payment fees, and divide what is left by the net sales. If that margin is below the floor you set, often 15%, the code is costing you money you would not have agreed to give away.
How many more sales does a discount need to break even?
Divide the profit per unit at full price by the profit per unit at the discounted price, and subtract 1. A $50 product costing $20 keeps $28.25 at full price after fees of 2.9% + 30¢, and $18.54 at 20% off, so it needs 28.25 / 18.54 − 1 = 52% more units just to make the same profit.
What is the deepest discount I can give?
The deepest discount that keeps a margin floor is 1 − (cost + fixed fee) / (price × (1 − fee rate − floor)). For a $50 product costing $20, fees of 2.9% + 30¢ and a 15% floor, that is 1 − 20.30 / 41.05 = 50%.
How do stacked discounts add up on Shopify?
One after another, not added together. Shopify applies product discounts first, then order discounts to the reduced subtotal, then shipping discounts. A 20% product discount with a 15% order discount takes 1 − 0.80 × 0.85 = 32% off, not 35%, but it is still far deeper than either code on its own.
Why does the Sales by discount codes report count an order twice?
When discounts can combine, the same order appears once in each row for every discount applied to it, and each row's sales include only the line items that discount affected. Do not add the rows together to get total discounted sales.
Does free shipping count as a discount cost?
Yes. When you pay for shipping the customer does not, that amount comes straight out of the order's profit. Add what the shipping cost you to the discount's cost when you work out its margin and its break-even.
Sources
- Shopify Help Center. Sales reports: Sales by discount codes, orders counted once per applied discount, and the definitions of gross sales, discounts and net sales, checked 25 Sep 2026. vendor-published
- Shopify Help Center. Combining discounts: which discount classes combine and the order in which product, order and shipping discounts apply, checked 25 Sep 2026. vendor-published
- Shopify Help Center. Amount off discounts: minimum purchase amount, counted before shipping and taxes, checked 25 Sep 2026. vendor-published
- Shopify Help Center. Product prices: cost per item and the margin shown on the product page, checked 25 Sep 2026. vendor-published
- Shopify. Pricing, United States view: 2.9% + 30¢ for standard online cards on Basic with Shopify Payments; see our fees calculator for other plans and countries, checked Sep 2026. vendor-published
Every worked figure on this page is invented for illustration. Shopify changes its reports and rates from time to time; names and rates are quoted from the linked pages as of September 2026.