Shopify coupon loss: how a code that lifts sales still sells products below cost
For Shopify stores that run discount codes · 6-minute read
A coupon is usually judged on one number: did orders go up. That number can look good while the coupon quietly sells some products for less than they cost you. Nothing is broken and no one complains — the code did what it was asked, and a few order lines left with some of your money.
Coupon loss is not about the code being too big in general. It is about the code being bigger than the margin of the products it lands on. The same 50% code can be safe on one product and lose money on the next.
Two views of the same order
From the revenue side, a discounted order is a win: it arrived, it paid, it counts in this month's sales. From the margin side, the only question is whether the amount the customer paid for a line is at least what that line cost you:
coupon loss = (price after all discounts × quantity) − (cost per item × quantity)
When that number is negative, the line sold below cost. Shopify's sales and discount reports show the discount amount and the revenue, but not the cost behind the line, so a below-cost sale looks like a normal sale.
The safe size of a coupon depends on the product
A product's room to discount is its profit per unit as a share of its price. That is the deepest total discount that still leaves it at cost — not below it:
max safe discount = (price − cost) ÷ price
Here are the products from the sample exports that ship with the free loss report below, using the real figures in those files:
| Product | Price | Cost per item | Max safe discount |
|---|---|---|---|
| Ceramic Mug - Blue | $18.00 | $11.00 | 38% |
| Fleece Hoodie - L | $52.00 | $31.00 | 40% |
| Soy Candle - Small | $16.00 | $7.25 | 54% |
| Cotton Tee - M | $24.00 | $9.50 | 60% |
| Gift Wrap | $2.00 | $0.60 | 70% |
The sample's 50% code sits inside the candle's 54% headroom and 12 points past the mug's 38%. A single “50% off” rule is therefore both fine and not fine, depending on which product it reaches. This figure is a price-versus-cost limit only; shipping, payment fees and returns come on top of it.
Worked example: one code, two products, opposite results
The sample data covers one week, 1–7 October 2026, with six orders. Order #1042 used FLASH50 on a mug and a tee:
| Line | Paid per unit | Cost per item | Result |
|---|---|---|---|
| Ceramic Mug - Blue × 2 | $9.00 | $11.00 | −$4.00 on the line |
| Cotton Tee - M × 1 | $12.00 | $9.50 | +$2.50 on the line |
The two products came to $60.00 at list price; the order's subtotal was $30.00, a 50% order discount. So the code “worked”: one order, two products, half off. On the mug it took $2.00 a unit more than the mug cost, $4.00 in total. On the tee it still cleared cost by $2.50. If you only tracked what FLASH50 cost in discounts, you would see the $30.00 and miss the $4.00 that never arrived.
Where the second loss hides: the free item in a bundle
Order #1044 used BUNDLE and took a line-level discount on two items:
| Line | Paid | Cost | Result |
|---|---|---|---|
| Fleece Hoodie - L × 1 | $26.00 | $31.00 | −$5.00 |
| Gift Wrap × 1 | $0.00 | $0.60 | −$0.60 |
| Sample Pack × 1 | $14.00 | no cost on file | not counted |
The hoodie is the obvious one: 50% off a product with 40% headroom. The gift wrap is the easy-to-miss one — it was given away free, and free is below cost by definition. It cost $0.60. The sample pack had no cost per item, so it is listed separately and never guessed at.
Across the week that is $9.60 of loss on three lines in two of the five counted orders — 13.7% of the $70.00 those two discounted orders paid for products, and 4.5% of the $212.00 the five orders paid in total. (Order #1045 was refunded, so it is skipped.) None of that appears as a red number in Shopify; it only exists once cost per item is brought into the same line as the discounted price.
Before your next code
- Size the code to the tightest product it can reach. If a code can apply to a 38%-headroom product, 38% is the ceiling, not the average.
- Keep low-margin products out. Limit codes to collections with healthy margins, or exclude the cheap, heavy, or additive items that decide whether a basket makes money.
- Count free gifts as discounts. The cheapest item in a bundle is often the loss, because its whole price disappears while its cost does not.
- Check automatic discounts too. They have no code, so they are easy to forget, but they reduce line totals the same way.
- Multiply, don't add. A sale price, a code and an order-wide discount combine; see discount stacking for the maths.
Before any of that, the numbers have to exist. Products without a cost per item can never be measured — they are skipped, not guessed. Add cost per item first, at least for everything you discount.
See what your last coupon actually cost. The free loss report reads your Shopify Orders and Products exports, compares every order line's discounted total with its cost per item, and groups the losses by discount code so each coupon gets a real number. It runs in your browser; your files are never uploaded.