Key takeaways
- Set a margin floor before choosing a discount; a discount as large as your margin sells every unit at cost or below.
- Compare-at prices must be real previous prices and higher than the sale price, or the sale is misleading or doesn't show.
- Stacked discounts multiply: a 30% sale price plus a 20% code is 44% off the compare-at price, not 50%.
- Schedule the end of every sale, and restore the price and the compare-at price together.
- Save previous prices before the sale, and don't overwrite price changes made while it was live.
What are the most common sale pricing mistakes?
The 12 mistakes below fall into four groups: the math, the compare-at price, the timing and the process. The table is a quick reference; the sections after it explain each mistake with an example and a fix.
| # | Mistake | What goes wrong | Fix |
|---|---|---|---|
| 1 | Discounting below your margin floor | Units sell at a loss once the discount reaches the margin | Set a floor and a maximum discount per product group |
| 2 | Mixing up markup and margin | Targets look met, but the real margin is lower | Set targets as margins: price = cost ÷ (1 − margin) |
| 3 | Stacking discounts without the math | A sale price plus a code goes deeper than planned | Multiply the discounts and set combinations on purpose |
| 4 | Inflated compare-at prices | Misleading reference prices and legal risk | Use the real price the item was offered at before the sale |
| 5 | Compare-at not higher than the price | Shopify doesn't show the sale | Check every variant's compare-at against its new price |
| 6 | Ending only half of the sale | Price or compare-at stays changed after the sale | Restore price and compare-at price together |
| 7 | Ending sales by hand | The sale runs late, or the countdown doesn't match | Schedule the end when you create the sale |
| 8 | Ignoring time zones | The sale starts or ends at the wrong local time | Know each tool's time zone and state it in announcements |
| 9 | Advertising a discount that rounding changed | "25% off" turns into 24.5% off | Recheck the percentage after rounding |
| 10 | No record of previous prices | Prices can't be restored accurately | Back up or snapshot prices before every sale |
| 11 | Overwriting changes made during the sale | A newer price is replaced by an old one | Restore only variants still at the sale price |
| 12 | Skipping the preview | Wrong products, missing variants and typos go live | Review every variant's price before and after |
Which pricing math mistakes cost the most? (1 to 3)
1. Discounting below your margin floor. A discount comes straight out of profit. A product priced at $40 with a $28 cost has a 30% margin; at 35% off it sells for $26, which is $2 below cost before shipping and fees. Decide the lowest margin you will accept before you choose the discount, and set a different maximum for each margin band.
2. Mixing up markup and margin. Adding 40% to a $30 cost gives $42, which is a 28.6% margin, not 40%. If a target is a margin, price = cost ÷ (1 − margin), so a 40% margin on a $30 cost needs a $50 price. The margin vs markup guide has a full conversion table.
3. Stacking discounts without the math. A discount code applies to the price the customer pays, so a code on a product that is already on sale stacks on the sale price. Discounts multiply: a 30% sale price plus a 20% code is 1 − 0.70 × 0.80 = 44% off the compare-at price. On Shopify, discounts don't combine automatically; you choose combinations for each discount. When they do combine, product discounts apply first and order discounts apply to the revised subtotal, as Shopify's guide to combining discounts explains.
What goes wrong with compare-at prices? (4 to 6)
4. Inflated compare-at prices. A compare-at price tells shoppers what the item cost before the sale, so it has to be true. The US Federal Trade Commission's Guides Against Deceptive Pricing treat a former price as a legitimate basis for a comparison when it is the actual, bona fide price the item was offered at to the public on a regular basis for a reasonably substantial period, and call a bargain false when an artificial, inflated price was set just to advertise a large reduction from it. In the EU, the Omnibus Directive requires any announced price reduction to show the prior price, defined as the lowest price the trader applied in a period of at least 30 days before the reduction.
5. A compare-at price that isn't higher than the price. Shopify only shows a sale when the Compare-at price is higher than the Price (setting sale prices). After a bulk change, some variants can end up with a compare-at equal to or below the new price, for example when you set one compare-at value for a product whose variants have different prices, and those variants show no sale at all. Check every variant, not just the first one. Our guide to a compare-at price not showing covers the other causes.
6. Ending only half of the sale. A sale usually changes two fields, and both need to go back. If you restore the price but leave a raised compare-at price behind, the product keeps advertising a saving that no longer exists. If you remove the compare-at price but forget the price, the item stays discounted with no sale label. Restore both fields from the same record, at the same time.
This is general information, not legal advice. Reference-price rules differ by country and change over time, so check the rules in each market you sell to before you run a sale.
How do timing mistakes hurt a sale? (7 to 9)
7. Ending sales by hand. A sale that should end at midnight on Sunday often ends on Monday morning, when someone remembers. That costs margin on every order in between and turns an honest deadline into a false one. The same goes for countdown timers that restart or don't match the real end. Schedule the end when you create the sale, and tie any countdown to that real end time; our guide to countdown timers covers honest use.
8. Ignoring time zones. "Ends at midnight" means different moments for your shop, your team and your customers. Know which time zone each tool uses. In Sale Scheduler by SalePilot, for example, one-time sales are entered in your browser's local time, and recurring sales follow your shop's time zone. When your customers span several time zones, state the time zone in the announcement.
9. Advertising a discount that rounding changed. Price endings can raise a sale price within the same whole number. 25% off $45 is $33.75; rounded to $33.99, the real discount is 24.5%, so a "25% off" banner overstates it. Recheck the percentage after rounding, or choose an ending that stays at or below the exact sale price for that range, such as .49 in this case, which gives 25.6% off.
Which process mistakes are easiest to fix? (10 to 12)
10. No record of previous prices. If you don't save prices before a sale, you have to rebuild them afterward, and reverse math fails once prices are rounded: a $24.99 item at 15% off, rounded to $21.99, divides back to $25.87, not $24.99. Export your products to CSV before any bulk change; Shopify lists creating a backup of your products as one use of its product export. Better still, use a tool that saves each variant's previous price automatically.
11. Overwriting changes made during the sale. Prices change while sales run: a supplier raises a cost, a colleague fixes a typo, another app adjusts a price. A restore that blindly writes back the old prices undoes those newer changes. Before restoring a variant, check that it is still at the sale price, and review the ones that aren't by hand.
12. Skipping the preview. Most sale errors are visible before launch: the wrong collection, a missing variant, a decimal in the wrong place, an ending that raised prices. Review every variant's price before and after the change, filter for anything unusual, and only then start the sale. Narrow the selection as well: new arrivals, bestsellers and low-margin items often don't need to be in a storewide sale, so consider excluding them.
How do you avoid these mistakes? A pre-launch checklist
Run through this list before every sale, whatever tool you use. It takes a few minutes and covers all 12 mistakes.
- Confirm the cost per item and the margin of every product group in the sale.
- Set the maximum discount for each group from your margin floor.
- Check that each compare-at price is the real previous price and higher than the sale price.
- Work out the stacked total if discount codes or automatic discounts can combine with the sale.
- Apply price endings, then recheck the percentage you plan to advertise.
- Save the previous prices, with a CSV export or an automatic snapshot.
- Preview every variant, including skipped or unusual rows.
- Schedule the start and the end, and note the time zone.
- After the sale, restore price and compare-at price together, and review any variant that changed while the sale was live.
How does Sale Scheduler handle the risky parts?
Sale Scheduler is built around several of these mistakes. It changes catalog prices and compare-at prices; it does not create discount codes, so it works alongside your Shopify discounts rather than replacing them.
Before anything goes live, the price preview shows every variant's price before and after, plus the compare-at price, with a Ready, Warning or Skipped status. Rows where the compare-at price would not be higher than the new price are flagged Warning and are not applied, and no Shopify prices change until you start or schedule the sale. Rounding applies to the new price only, never to the compare-at price.
With Schedule start and end, a sale starts and ends automatically at the times you set; schedules are processed every minute, so a sale may start within about one minute of the set time. Before a sale changes anything, Sale Scheduler saves each variant's previous price and compare-at price. When the sale ends, or whenever you choose, it restores them. If a price was changed somewhere else after the sale started, that variant is skipped and flagged for you, so newer prices are never overwritten. Restoring is never blocked by your plan or usage, and it doesn't count toward usage.