Key takeaways
- Shopify's bulk editor finalizes changes when you click Save, and a product CSV import can't be canceled once it begins, so plan the undo before the change.
- Export your products to CSV before every bulk price edit; Shopify lists creating a backup as one of the reasons to export.
- When you re-import, keep the URL handle, Title and option columns: Shopify warns that leaving out Option1 name and Option1 value creates a new default variant and deletes existing variants.
- A blind restore can overwrite prices that were changed on purpose after the sale started, so compare live prices first or use a restore that skips them.
- Percent changes don't reverse with the same percent: $40 minus 25% is $30, and $30 plus 25% is $37.50.
Can you undo a bulk price change in Shopify?
Not with a single click. When you edit prices in the bulk editor, the changes are final when you click Save. A product CSV import is even more final: Shopify says imports can't be canceled once they begin, and you can't view a history of past imports (importing products).
So "undo" really means "apply the old prices again", and that needs a record of what the old prices were. There are four usual records: a CSV export taken before the change, the math you used to make the change, old values written down somewhere, and the previous prices saved by the app that made the change. Which one you have decides how you restore.
Which way of restoring prices fits your situation?
Pick the method by what you actually have. Each one has a weak spot worth knowing before you start.
| Your situation | How to restore | Works well when | Watch out for |
|---|---|---|---|
| You exported products to CSV before the change | Re-import the export with overwrite turned on | The file covers the products you changed | It also reverts prices changed on purpose since the export |
| You changed prices by a percent or a fixed amount | Reverse the math in a spreadsheet, then import or bulk edit | No rounding was applied | Rounded prices can't be reversed exactly |
| Only a few products changed | Retype the old prices in the bulk editor | You know the old prices | Typos and leftover compare-at prices |
| An app made the change and saved previous prices | Use the app's restore | The app kept a snapshot for each variant | Variants changed elsewhere since the sale |
| A Markets rollout Event activated a catalog | End or pause the rollout | The sale was set up as a catalog | Catalog price edits save right away; the rollout only switches the catalog's status |
How do you back up prices before a bulk change?
Export first. Shopify lists creating a backup of your products as one of the main reasons to export (exporting products). It takes a minute, and it's the only undo that works for every kind of bulk edit, whether you use the bulk editor, a CSV import or an app.
- From your Shopify admin, go to Products and click Export.
- Choose All products, or the products that match your search and filters if you're only changing one segment.
- Choose the CSV file for Excel, Numbers or another spreadsheet program.
- Export. If any product has more than 100 variants, Shopify emails the file instead of downloading it.
- Rename the file with the date and the reason, such as 2026-11-20-before-black-friday.csv, and keep it where your team can find it. Never edit this copy.
How do you restore prices from a CSV backup?
Restoring is an import with the overwrite option. To update existing products, the product CSV needs the URL handle and Title columns, and the price columns are Price and Compare-at price. Columns you leave out of the file stay as they are in your store, but a non-required column that is in the file and blank overwrites the store's value with a blank.
Title is required, so if you renamed any products after the backup, update their titles in the file first or the import will change them back.
- Make a copy of your backup file and work on the copy.
- Delete the rows for products the bulk change didn't touch, so you only restore what it affected.
- Keep the columns URL handle, Title, Option1 name and Option1 value (plus Option2 and Option3 if your products use them), Price and Compare-at price. Delete the other columns. Don't edit the option values.
- From Products, click Import, add the file, and select Overwrite products with matching handles.
- Click Upload and continue, review the summary, then click Import products.
- When Shopify's confirmation email arrives, spot-check a few products on the storefront, including one with several variants.
Never drop the option columns from a restore file. Shopify warns that if the Option1 name and Option1 value columns are missing, a new default variant is created and existing variants are deleted, and that changing option values creates new variant IDs. Either outcome is far worse than the price mistake you're fixing.
Why can a full restore overwrite newer prices?
A backup is a picture of one moment. Anything that changed after that moment is lost when you import it again. Say you put 300 products on sale on Monday. On Wednesday a supplier raises costs on 12 of them, so you raise their regular prices. On Sunday you re-import Monday's backup. Those 12 products go back to Monday's prices, the new regular prices are gone, and nothing warns you.
To avoid this, compare three prices for each variant before restoring: the price before the sale, the sale price you set, and the price live in the store right now. In a spreadsheet, export the current prices and line them up with your backup by URL handle and option values. Then apply these rules:
- Live price equals the sale price: nobody touched it, so restore it.
- Live price equals the price before the sale: it's already back, so leave it.
- Live price is something else: someone changed it, on purpose or by mistake. Don't overwrite it; review it by hand.
How does an automatic restore with stale protection work?
That three-way check is what a careful restore should do for you. In Sale Scheduler by SalePilot, every sale saves each variant's previous price and compare-at price before it changes anything, one snapshot per variant. When the sale ends, or when you click Restore prices, the app first reads each variant's live price in Shopify. The details are on the restore prices page and in the rollback help article.
- If the price is already back at the original, the variant is marked restored and nothing is written.
- If it still shows the sale price, the previous price and compare-at price are put back.
- If it shows anything else, the variant is skipped and labeled "Skipped because price changed" so you can review it. A newer price is never overwritten.
- Scheduled sales restore automatically at their end time. Sales started with Start after I review have no automatic end, so their prices stay until you click Restore prices.
- Restoring is never blocked by your plan or usage, and restored rows don't count toward usage. The sale page shows how many variants were restored, failed or skipped.
- A restore covers price and compare-at price for the variants the sale updated. It isn't a backup of your whole catalog, so keep exporting a CSV before big edits made any other way.
How do you reverse a percentage price change?
If you know exactly what you did, you can often calculate the old price from the new one. The formula is the inverse of the change, not the same change in the other direction. The price change calculator lets you paste a price list to check the numbers before you apply them.
- Decreased by a percent: original price = current price ÷ (1 − percent). A $30 price after a 25% decrease: $30 ÷ 0.75 = $40.
- Increased by a percent: original price = current price ÷ (1 + percent). A $55 price after a 10% increase: $55 ÷ 1.10 = $50.
- Changed by a fixed amount: add back or subtract the same amount. A $40 sale price after $5 off: $40 + $5 = $45.
- The common mistake: undoing a 25% decrease with a 25% increase. $40 minus 25% is $30, and $30 plus 25% is $37.50, not $40.
- Rounding breaks the math: if the new prices were given an ending like .99, different originals can land on the same price. For example, $23.37 and $23.80 both become $23.99, so the formula can't tell them apart. Use a backup instead.
What about compare-at prices left behind after a sale?
Restoring the price alone isn't enough if the sale also set compare-at prices. Shopify shows a sale whenever the compare-at price is higher than the price (sale pricing). If a sale moved a $50 product to $40 and set its compare-at price to $60, restoring only the price leaves $60 crossed out next to $50. The product still looks discounted, and the crossed-out price isn't a price you ever charged.
Fix both in the same pass. Include the Compare-at price column in your restore file with the values from your backup (a blank cell clears it), or add the compare-at column in the bulk editor and correct it there. For how the field works and the rules around it, see our compare-at price guide.
How do you avoid needing an undo next time?
The cheapest undo is the one you prepare before the change. Make these habits part of every bulk price edit:
- Export a CSV before every bulk price change, and name it with the date.
- Preview every new price, per variant, before anything is saved.
- Set the end of a temporary sale when you create it, so the restore isn't a separate task someone has to remember. See how to schedule a sale on Shopify.
- Change one collection first, check the storefront, then do the rest.
- Keep a short change log: the date, who made the change, what changed and which file is the backup.
- Agree that nobody edits prices on sale products while a sale is running.