In brief
- Before any price changes, export every product the sale touches to CSV and keep that file unchanged. It holds the Price, Compare-at price and Cost per item of each variant, and it is how you put prices back if nothing else can.3
- A discount with an end date ends on its own; one without an end date never expires.4 A price you change yourself stays changed until you change it back.
- A compare-at price shows a sale only when it is higher than the price, the theme shows it, and no fixed market price overrides it.1
- Never uninstall a sale app while its sale is live: uninstalling ends its access at once, so it can no longer put any price back.10
The checklist
Tick each step as you go. Your ticks are kept in this browser only, so you can close the page and come back. Print it for the team, or work through it here.
1. Plan
2 weeks before2. Record the old prices
before anything changes3. Preview
1 week before4. Start
sale day5. During
every day6. End and revert
the end date7. Check for leftovers
the day after31 steps. The ticks stay in this browser until you press Reset; nothing is sent to us.
Three ways to run a sale on Shopify
Shopify has two ways to make a sale start and stop on its own, and one that changes the prices themselves. They behave differently at the end, and that is where sales go wrong.
| How | Plans | Crossed-out price | Ends on its own |
|---|---|---|---|
| Automatic discount or discount code with active dates | Every plan | At checkout. On product and collection pages only with an app or custom work.1 | Yes, at the end date. Without one it never expires.4 |
| Launchpad event | Shopify Plus only7 | Yes: the old price becomes the compare-at price during the event | Yes: prices go back to their pre-sale values7 |
| New price with a compare-at price (by hand, bulk editor, CSV import or an app) | Every plan | Yes, where the theme shows compare-at prices1 | No. Someone, or an app, has to put every price back |
A discount is the safest by design: no price is ever written, so there is nothing to put back. Its cost is that most themes show the saving only in the cart and at checkout. Changed prices show the sale everywhere but need the most care, which is what most of this checklist is about.
Record the old prices
Before you change anything, go to Products, filter to what the sale will touch, and choose Export with "Products that match your search and filters". An export of all products or of a search is emailed to you; the current page or a selection downloads straight away unless a product in it has more than 100 variants.2 Each row carries the variant's Price, Compare-at price and Cost per item, and, for markets with their own catalogue, columns such as Price / International.3
That file is your record. Do not edit it; work on a copy. If an app or an import goes wrong, it is the only list of what every price was, and it is in a format Shopify can import back.
Preview before you change prices
A preview is the full list of changes, read before anything goes live. In a copy of the export, add the new price next to the old one, set the compare-at price, and add a column for what each unit keeps after cost and fees. The markdown calculator gives the floor for one product, and the same formula works in a spreadsheet column.
- Every compare-at price must be higher than the new price, or the product does not show as on sale.1
- Where there is no sale, leave the compare-at price blank: 0.00 counts as a value.1
- Give every variant of a product the same treatment, or collection pages will not show it as on sale.1
- Change one product first and look at it as a shopper would, in each market.
The bulk editor can show price and compare-at price columns for many products at once, and Shopify suggests a CSV file for larger changes.8 Whichever you use, keep the reviewed copy: it is also your list of what to put back.
Schedule it safely
A discount takes a start date and, if you click Set end date, an end date; without an end date it does not expire.4 It expires at the end time in the time zone shown in your admin, so check that before you promise "ends at midnight".15 On Shopify Plus, a Launchpad event changes prices and compare-at prices for its window and changes them back when it ends.7
A price you change on the product page, in the bulk editor or by import changes when you save. To schedule changed prices without Plus you need an app, and then the questions that matter are how it records the old prices, whether it shows you a preview, and what it puts back at the end.
Compare-at price not showing
When a product does not show as on sale, it is almost always one of these, in this order:
- The compare-at price is not higher than the price. It must be, to display the sale.1
- The page is a collection page and the variants differ. Collection pages show the product's general pricing; make every variant consistent.1
- The market has a fixed price. Fixed prices override the price and compare-at price set in the admin; market sale prices are set by CSV import.1
- The theme does not show it there. Where sale prices display depends on the theme.1
- It is a discount, not a sale price. Discount savings are crossed out at checkout; on product and collection pages that needs an app or custom work.1
If a sale app fails or is uninstalled mid-sale
An app can only change or restore prices while it is installed. When a store uninstalls an app, its access ends at once and every request it makes is refused.10 Whatever prices it last wrote stay as they are, and putting them back is then up to you. Shopify also asks every app to erase a store's data 48 hours after it is uninstalled,11 so reinstalling later may not bring back its record of your old prices.
- Do not uninstall it. Not to "reset" it, not to try another app first.
- Stop the sale from inside the app, with its own end, revert or stop button, and read what it reports back.
- Write to the developer through the support link on its App Store listing, with the time it went wrong and two example products.
- Decide whether to wait or restore. If the sale prices are acceptable, leaving them until the developer answers is often safer than a hurried import.
- Restore from your own file if the app cannot: see below. Then check every product the app touched.
Once the prices are right, you can remove the app. App blocks it added to an Online Store 2.0 theme are removed with it;12 banners or timers it asked you to paste into the theme are not app blocks, so look for them yourself.
Revert sale prices and check for leftovers
If an app or Launchpad ran the sale, let it end the sale and put the prices back. Otherwise, restore from the file you saved:
- Export the sale products again and compare with your saved file. Any row where the price is neither the old nor the sale price was changed by someone during the sale: decide which price is right.
- In a copy of the saved file, keep the
Handlecolumn, the option name and value columns,PriceandCompare-at price, and delete the rest. A column that is not in the file is left as it is; a blank cell clears the field.3 Leaving out a column whose related columns you keep can remove data, which is why the option columns stay.3 - Import it with "Overwrite products with matching handles" selected; without it, products that already exist are skipped.3 Try a file with one product first.
- For markets with fixed prices, restore the
Price / [market]and compare-at columns the same way.3
Then look for what the sale left behind. A temporary automated collection with the condition Compare-at price is set lists every product that still carries a compare-at price, and is not set matches a product when any variant has none.9 On the Discounts page, filter by status and deactivate whatever is still active from the sale.6 Finally, remove sale banners, badges and countdowns from the theme.
The EU and UK 30-day lowest price
In the EU, when you announce a price reduction to consumers, the prior price you show must be the lowest price you charged in the 30 days before it, under Article 6a of the Price Indication Directive; the Court of Justice confirmed in 2024 that a percentage off must be worked out from that price too.13 So a product that was €40 on 1 November, €50 from 10 November and €35 on Black Friday cannot be shown as "30% off €50": the reference is €40, and the saving is 12.5%. The UK has no fixed 30-day rule, but its pricing guidance expects a "was" price to be the last price you sold at, charged recently and for at least as long as the sale runs, and asks you to keep records that show it.14 Raising prices in early November to discount them later is exactly what both rules catch.
Tools that help
Everything above works with Shopify's own admin and a spreadsheet. Two free tools make the planning faster:
- The markdown calculator gives each product's margin floor after card fees, shipping, returns and VAT, and what every 5% step leaves you.
- Store Diagnosis, our free, read-only Shopify app, finds the stock that has stopped selling, values it at cost and suggests a markdown for each product that stays above cost plus 5%. It never changes a price, so it is safe to run on the busiest week of the year.
Store Diagnosis, free and read-only.
- Dead and slow stock valued at cost
- A suggested markdown per product
- Best-sellers about to run out
- Discounts and refunds that cost margin
We are also building Mufatech Clearance, an app that runs this checklist for you: a preview of every price before it changes, a margin floor no markdown can cross, a record of every price it writes so it puts back exactly those, an alert when someone else changes a price mid-sale, and a Stop all button to use before you ever uninstall it. It is coming to the Shopify App Store and cannot be installed yet. When it is listed it will have a Free plan, and Pro at $3.99 a month.
Frequently asked questions
Can I schedule sale prices in Shopify?
Shopify has two ways to make a sale start and stop on its own: an automatic discount or discount code with an end date, on every plan, and Launchpad on Shopify Plus, which changes prices and compare-at prices for the event and changes them back when it ends. A price you change on the product page changes when you save, so scheduling price changes otherwise takes an app.
Why is my compare-at price not showing?
Check four things. The compare-at price must be higher than the price. Whether and where sale prices show depends on the theme. On collection pages a product shows as on sale only when its variants have consistent compare-at prices. And a fixed price on a market's price list overrides the price and compare-at price set in the admin.
How do I revert sale prices on Shopify?
If an app or Launchpad ran the sale, end it there and let it put the prices back. Otherwise re-import the product CSV you exported before the sale, keeping the Handle, option, Price and Compare-at price columns, with Overwrite products with matching handles selected. A blank cell clears the field; a column left out of the file is not changed. Try one product first.
What happens to sale prices if I uninstall the sale app?
Uninstalling ends the app's access to your store at once, so it cannot put prices back afterwards. The prices it last wrote stay as they are. End the sale from inside the app before you uninstall it, and keep your own export of the old prices so you can restore them yourself.
How do I find products still showing a sale after Black Friday?
Create a temporary automated collection with the condition Compare-at price is set: it lists every product that still carries a compare-at price. Compare a fresh product export with the one you saved before the sale, and filter the Discounts page by Active status for discounts that are still running.
Does the EU 30-day lowest price rule apply to my Shopify sale?
If you sell to consumers in the EU and announce a price reduction, the prior price you show must be the lowest price you charged in the 30 days before the reduction. The UK has no fixed 30-day rule, but its pricing guidance expects a was price to be a genuine, recent price charged for at least as long as the sale runs.
Sources
- Shopify Help Center. Setting sale prices for products: the compare-at price must be higher than the price; display depends on the theme; fixed prices override admin prices and compare-at prices, and market sale prices are set by CSV; troubleshooting for collection pages and 0.00 values; discount savings crossed out on product pages need an app or a Partner. Checked 10 Oct 2026. vendor-published
- Shopify Help Center. Exporting products: export options and when the file is emailed, checked 10 Oct 2026. vendor-published
- Shopify Help Center. Using CSV files to import and export products: the Price, Compare-at price and Cost per item columns, market price columns, and how "Overwrite products with matching handles" treats blank cells, missing columns and related columns, checked 10 Oct 2026. vendor-published
- Shopify Help Center. Amount off products and orders: active dates, Set end date, and that a discount without an end date does not expire, checked 10 Oct 2026. vendor-published
- Shopify Help Center. Automatic discounts: applied in the cart and at checkout; a maximum of 25 active automatic discounts, app discounts included, checked 10 Oct 2026. vendor-published
- Shopify Help Center. Managing discounts: filtering the list by status and deactivating a discount, checked 10 Oct 2026. vendor-published
- Shopify Help Center. Example Launchpad events: Launchpad is available only on Shopify Plus; during a sale event the regular price becomes the compare-at price, and after the event prices change back to their pre-sale values, checked 10 Oct 2026. vendor-published
- Shopify Help Center. Bulk editing: price and compare-at price columns, and a CSV file suggested for larger changes, checked 10 Oct 2026. vendor-published
- Shopify Help Center. Automated collection conditions: the "is set" and "is not set" operators of the Compare at price condition, checked 10 Oct 2026. vendor-published
- Shopify developer documentation. Access tokens: a merchant uninstalling an app ends all of its token's access, and its requests then fail, checked 10 Oct 2026. vendor-published
- Shopify developer documentation. Privacy law compliance: 48 hours after a store uninstalls an app, Shopify sends the shop/redact request to erase that store's data, checked 10 Oct 2026. vendor-published
- Shopify developer documentation. Online Store 2.0: app blocks built with theme app extensions are removed with the app when it is uninstalled, checked 10 Oct 2026. vendor-published
- European Commission. Price Indication Directive, Article 6a as amended from 28 May 2022; Court of Justice of the European Union, press release 152/24, case C-330/23: a reduction must be calculated on the lowest price of the previous 30 days. Read 10 Oct 2026. law
- Chartered Trading Standards Institute and the Department for Business and Trade. Guidance for traders on pricing practices, April 2026: a comparison should not run materially longer than the higher price was offered, the higher price should be the last price the product sold at, and records should be kept. Non-statutory guidance. Read 10 Oct 2026. guidance
- Shopify Help Center. Discounts FAQ: a discount expires at its end date and time, in the time zone displayed in the admin, checked 10 Oct 2026. vendor-published