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:

Safe discount headroom per product in the sample exports, tightest first
ProductPriceCost per itemMax safe discount
Ceramic Mug - Blue$18.00$11.0038%
Fleece Hoodie - L$52.00$31.0040%
Soy Candle - Small$16.00$7.2554%
Cotton Tee - M$24.00$9.5060%
Gift Wrap$2.00$0.6070%

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:

Order 1042 with FLASH50: mug sold below cost, tee stayed above cost
LinePaid per unitCost per itemResult
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:

Order 1044 with BUNDLE: hoodie and free gift wrap both sold below cost; sample pack had no cost and is excluded
LinePaidCostResult
Fleece Hoodie - L × 1$26.00$31.00−$5.00
Gift Wrap × 1$0.00$0.60−$0.60
Sample Pack × 1$14.00no cost on filenot 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

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.

Check my coupon loss