You've picked your discount percentage, drafted your email, and you're about to hit publish — but do you actually know whether you'll make money on every order that comes through? Most Shopify merchants find out the answer only after the sale ends, when the margin report tells a story they weren't expecting.
I've run sales like that. Twenty-two years in retail jewellery teaches you that "the sale was busy" and "the sale was profitable" are two very different sentences, and you can have one without the other. The same is true on Shopify, except the cost layers are stacked deeper, and the discount screen in the admin shows you almost none of them.
Here's how to work out whether the sale you're about to run is going to make you money — before the first order lands.
Disclosure: ProfitShield is built by JMS Dev Lab, the publisher of this blog.
When you type "20" into the discount field in Shopify, your brain treats it like a clean 20% off your margin. It almost never is.
The discount percentage is applied to your selling price. Your margin is what's left after every other cost has come out of that selling price. So a 20% discount on a product where you were running at a 35% gross margin doesn't leave you with 15% — it leaves you with whatever's left once transaction fees, shipping, packaging, and your app stack have all taken their cut. On a lot of Shopify stores, that number is closer to zero than people realise.
The discount percentage is the input. The margin per order is the output. They are not the same number, and a campaign that's planned around the input will surprise you on the output side more often than not.
When you set up a discount in Shopify admin, the cart preview shows you the discounted price. It does not show you what the order is actually going to cost you to fulfil. There are four cost categories that are quietly eating into every discounted order, and you have to put numbers against all four before you launch.
Transaction fees. Shopify Payments charges roughly 2.9% plus 30 pence per online transaction on the standard plan (the percentage drops as you move up plans, but the per-transaction floor doesn't go away). If you're using a third-party gateway, Shopify takes an additional cut on top. On a £40 order discounted from £50, the transaction fee alone is roughly £1.46 — that's nearly 4% of the discounted revenue before you've packed anything.
Shipping. If you offer free shipping during the sale, the full shipping cost comes off your margin. If you have a "free over £X" threshold and the discount pushes orders just over that threshold, you've now bought every one of those orders a free shipping label. This is the cost most stores underestimate the hardest. (There's more on this in whether free shipping is actually profitable on Shopify.)
Packaging and fulfilment. Box, mailer, label, tissue, the time to pack. Whether you do it yourself or pay a 3PL, this is a real per-order cost that doesn't scale down with the discount.
Your app stack, amortised. Klaviyo, your review app, your subscription app, your shipping app — divide the monthly cost by the number of orders you process, and that's a per-order cost too. Most stores never put a number on this because it doesn't appear on the invoice for any specific order, but it's coming out of your bank account every month regardless.
Add those four up and you've got the gap between Shopify's "discounted price" and your actual margin per order. It's almost always wider than the merchant expected. For a full breakdown of every cost layer that chips away at Shopify profitability, see The Hidden Costs Eating Your Shopify Profit Margins.
The formula is unglamorous but it works. For any product going into a sale:
Margin per order = Discounted price
− Cost of goods
− Transaction fee (≈2.9% + £0.30 of discounted price)
− Shipping cost (if you're covering it)
− Packaging & fulfilment cost
− Per-order app stack cost
Plug your numbers in. When the margin per order hits zero, that's your break-even discount. Anything deeper and you're paying customers to take the product.
A quick worked example using round numbers (these are illustrative, not from any specific store): selling price £50, COGS £20, packaging £2, fulfilment £3, app stack amortised at £0.50 per order. At full price your margin is £50 − £20 − £1.75 (fees) − £2 − £3 − £0.50 = £22.75, or 45.5%.
Now apply a 30% discount. Selling price drops to £35. Fees drop to about £1.32. New margin: £35 − £20 − £1.32 − £2 − £3 − £0.50 = £8.18, or 23.4%. Still profitable, but you've handed over more than half your margin to fund the discount.
Push it to 50% off. Selling price £25. Fees about £1.03. Margin: £25 − £20 − £1.03 − £2 − £3 − £0.50 = −£1.53. You're losing £1.53 on every order at this discount level — and that's before you've added shipping if you're throwing that in too.
This is the calculation Shopify doesn't do for you anywhere in the discount creation flow. You have to do it yourself, per product, before you launch. If your catalogue is big, build it as a spreadsheet column and let it tell you which SKUs are safe to discount and which ones aren't.
The arithmetic above is fine when you've got one discount on one product. The trouble starts when you stack things.
Shopify lets you combine certain discount types — for example, a product discount and a shipping discount, or an order discount and a shipping discount. Each combination produces a different effective price per unit, and the per-line breakdown isn't always obvious from the order summary. Bundle apps add another layer: they apply discounts at the line-item level or as a synthetic discount across multiple items, which means the discount percentage on each individual SKU isn't what's printed on the bundle promotion.
The practical result is that a customer who uses a 10% sitewide automatic discount, then applies a "free shipping over £40" promotion, and then triggers a bundle discount because they added a paired product — that order has had three different cost reductions applied, and the per-product margin on each line is no longer the number you set when you created the discount.
If you're running stacked promotions, you need to think through the worst-case combination — the deepest discount path a customer can put themselves on — and calculate the margin for that path, not just the headline discount. The same problem plays out at scale in Are You Losing Money on Every Discount? if you want a fuller treatment of how discount stacking destroys margin across an entire campaign.
Before you publish any discount campaign, work through these five questions in order. If you can't answer one of them with a real number, stop and find the number first.
1. What's your true per-order cost? Not COGS. Not COGS plus shipping. The full stack: COGS, transaction fees, shipping if you're covering it, packaging, fulfilment, and a fair share of your app subscriptions.
2. At what discount percentage does each SKU in the sale go below break-even? This is a per-product number, not a sitewide number. Margin varies by product; the safe discount depth varies by product.
3. Can the discounts in your campaign stack with anything else — automatic discounts, bundle apps, shipping promotions, loyalty rewards? If yes, what's the deepest combined discount a single order can hit?
4. What is your minimum acceptable margin per order? Zero is not the right answer. You have rent, salaries (even if just your own), the cost of handling returns, and the marketing spend that drove the order in the first place. A break-even order isn't a good outcome; it's a wasted opportunity cost. Decide your floor — 10%, 15%, 20% — and treat any discount that breaches it as off-limits, regardless of what the competition is doing.
5. What will you do when an order falls below your margin floor? This question is worth answering before the sale starts, not during it. Your options are: exclude that product from the discount entirely, reduce the discount depth on that SKU, raise your free shipping threshold during the sale period, or let a tool enforce the rule automatically at checkout. Having a plan means you're not making reactive decisions under pressure when orders are flying through.
Everything above is the manual version. It works if you have a small catalogue, plenty of prep time, and the discipline to run the numbers on every campaign. Most merchants don't have all three.
ProfitShield automates the pre-launch check and takes it a step further: it validates profitability on every individual order at checkout, in real time, using actual order data rather than pre-campaign estimates.
Here's how it works. ProfitShield is built on Shopify Functions — Shopify's framework for running custom logic directly inside the checkout process. The validation code runs in milliseconds at the edge, so your customers experience zero latency and the checkout looks and feels exactly the same.
When a customer reaches checkout, ProfitShield calculates:
If the order's real margin meets your minimum threshold, it goes through. The customer never notices anything happened. If it falls below your floor, ProfitShield can do one of three things, depending on how you've configured it:
The difference from the manual approach: ProfitShield catches the edge cases the spreadsheet can't model. The customer who stacks a welcome code on top of your sale. The order that qualifies for free shipping because the discounted cart value crossed your threshold. The product whose COGS changed last week but whose discount rules weren't updated. Those orders slip through manual checks and get caught by ProfitShield at checkout.
For a detailed comparison of how ProfitShield's pre-checkout validation differs from post-sale reporting tools, see ProfitShield vs BeProfit vs TrueProfit. The short version: BeProfit and TrueProfit tell you what happened after the sale. ProfitShield prevents the loss before the order ships.
Whether or not you use ProfitShield, do this one thing before your next discount campaign:
Pick your three lowest-margin products — the ones where COGS is closest to your current selling price. Run the break-even formula on each one at your planned discount depth. If any of them go negative, exclude them from the promotion or reduce the discount on that SKU. That single step will protect more margin than any amount of post-sale analysis.
If your catalogue is large, or if you're planning stacked promotions, or if this summer's sale is meaningful to your business — install ProfitShield and let it run the calculation on every order for you. There's a free trial on all plans. Even a fortnight of data will show you exactly which orders in your sale were profitable and which weren't.
Or get in touch if you want to talk through your discount economics before the sale goes live. Real numbers help more than opinions.
Related reading: Losing money on every discount? · Is free shipping profitable? · Hidden costs eating your Shopify margins · ProfitShield vs BeProfit · ProfitShield.