A Shopify CSV import wiped my prices - how to recover, and how to not need the import
It usually goes the same way. You export your products, open the file in Excel or Google Sheets, change a few hundred prices, re-import it, and get the “import complete” email. Then a customer messages about a $0.00 product, or the sale badges are gone from your collection pages, or a size that used to exist has vanished from a product.
This guide covers what to do in the first ten minutes, why the import overwrote more than you selected, and how to make the same change next time without a round-trip.
First ten minutes: stop it getting worse
- Don't re-import anything yet. The instinct is to fix the file and import again. Every extra import writes more data over the damage and makes it harder to work out what the original values were.
- Find the export you took before the import. Check your downloads folder and the email Shopify sent when you ran the export. That file is your restore source - it is the only complete record of the old values.
- Export again now, to a clearly named file. Not as a backup - as evidence. Comparing before-import and after-import files side by side tells you exactly which fields changed and how many products are affected.
- Work out the blast radius before you fix anything. Sort the new export by price and look for zeros and blanks; check whether variant counts per handle match the old file. A change that hit 40 products is a very different afternoon from one that hit 4,000.
- If prices are wrong on live products, consider setting the affected ones to Draft while you restore - a draft product can't be bought at the wrong price. Note that this is the one step here that writes to your catalog, so on a few thousand products it's another bulk operation on top of the one that just went wrong: you'll need to set them back to Active afterwards, and they'll be out of your storefront's search and collection pages in the meantime.
One thing worth knowing up front: Shopify has no undo for a product import. There is no “revert this import” button and support can't roll one back for you. Recovery means writing the old values back yourself, which is why the pre-import export matters so much.
Why the import changed more than you selected
A product CSV import isn't a list of edits. It's a description of what those products should look like, and Shopify makes them look like that. Four things follow from this, and each one is a way merchants lose data.
1. It matches by handle, not by what you changed
Every row is matched to an existing product by its Handle. The importer has no way to tell which cells you edited deliberately and which ones your spreadsheet quietly altered - it writes the columns in the file for every row in the file. A file containing your whole catalog is a write to your whole catalog.
2. Your spreadsheet reformats data on open
This is the big one, and it happens before Shopify is involved at all. Excel and Google Sheets apply their own formatting to a CSV the moment it opens: long barcodes become scientific notation, SKUs lose their leading zeros, something that looks like a date becomes one, and currency formatting can turn a clean number into text. You then save and import a file that looks right on screen and isn't.
3. Blank cells are still instructions
An empty cell in a column you included isn't “leave this alone” - it's a value. This is why compare-at prices disappear so often: the column came along for the ride, the cells were blank, and the sale pricing went with them. Sale badges vanish from the storefront and nothing about the import looks like it failed.
4. Variants are rows, so a lost row is a lost variant
A product's variants are described by its group of rows in the file. Sorting, filtering, or trimming the file can separate those rows from their product, and the variant they described goes with them. That's the version of this where a size or color disappears from a live product.
None of these are exotic mistakes. They're the normal behavior of the tools involved, which is the actual problem: the CSV round-trip gives you no preview of what will change and no way back once it has. See what a Shopify product export actually contains for the fields in play.
Restoring your prices
If you have the pre-import export: that file is the fix. Cut it down to only the affected handles and only the columns you need to restore - Handle, the Option1/2/3 Name and Value columns that identify which variant each row is, and the price fields you're restoring (Variant Price, and Variant Compare At Price if that's what went missing) - then import it with the option to overwrite products that have the same handle. Get the option columns right: an under-specified restore file is how a size M price lands on size S.
Delete the columns you aren't restoring rather than blanking them. An empty column in the file is still a write, exactly as it was on the way in - leave Compare At Price in as an empty column and you'll wipe it a second time while fixing the first field, with the overwrite option on and no clean export left to go back to. Open the file in a plain-text editor rather than a spreadsheet if you can, so nothing gets reformatted on the way through, and run five products first, checking them in the admin against the old export before you run the rest.
If you don't have one: the old values have to come from somewhere else. Order line items record what each product sold for, so recent orders can reconstruct prices for products that have sold - with three caveats. Line prices are what the customer paid, so a discount code or an active sale is baked in; on a multi-currency store they're recorded in both presentment and shop currency, and picking the wrong one re-prices your catalog by the exchange rate; and they carry no compare-at value at all, which is the field that most often goes missing in the first place. A supplier price list or your own cost sheet covers the rest. If you run a catalog backup app, this is what it is for. Otherwise it's manual - the products that never sold are pure guesswork, and compare-at is a guess even for the ones that did. Which is the strongest argument there is for not needing the import at all.
The fix that actually sticks is not doing the round-trip. BulkSheet edits your catalog in place from a spreadsheet-style grid inside your Shopify admin - filter to the rows you mean, see every pending change before it saves, and undo the whole batch before or right after it saves.
See the bulk price editorMaking the same change without the import
The reason a CSV round-trip is dangerous isn't the format. It's that you export everything, edit it blind in a different application, and write it all back with no confirmation step. Editing in place removes every one of those.
- Filter first - by tag, vendor, status, price range, inventory, or whether a product is already on sale - so the rows in front of you are the only rows in play. Nothing outside the filter can be touched, which is the guarantee a full-catalog CSV can never give you.
- Apply the change as a bulk template (a percent or fixed price change, with optional .99 rounding) or by typing into cells like a spreadsheet. Variants get their own rows, so a variant can't be dropped by a sort.
- Read the preview: how many rows will change, a sample of old → new values, and which rows are being skipped and why. This is the step the CSV path doesn't have. Nothing has been written to Shopify yet.
- Save - and undo if it's wrong. The whole batch is a single undo step while you're editing, and for 15 minutes after the save on any plan - Pro can revert an already-saved batch for as long as it's in Edit History. On paid plans your draft undo history also survives closing the tab (up to 50 steps, for 30 days on Starter, 90 on Growth, 180 on Pro), and Edit History keeps a per-field log of what you saved over that same window.
The difference is where a mistake gets caught. The preview stops most of them before anything is written, and the ones that get through are reversible for as long as your plan keeps the history - rather than surfacing days later as a restore project with no way back. The full detail of what's stored and what can be rolled back is on the your catalog is safe page, and bulk editing prices without CSV walks through a price change end to end.
Frequently asked questions
Can I undo a Shopify CSV import?
No. Shopify has no rollback for a product import - once the import finishes, the new values are the live values, and support can't reverse it for you either. The only reliable restore is re-importing an export you took before the import, matched by Handle with the overwrite option on, which is why exporting immediately before any CSV import matters so much - it's the one thing that turns a wiped catalog back into a ten-minute fix instead of a manual rebuild from order history and supplier price lists. If you don't have that pre-import export, recovery gets slower and less exact: recent order line items can reconstruct sold prices (with caveats around discounts and currency), but compare-at prices and anything on a product that never sold have to be re-entered by hand. The practical takeaway is to export first, every time, and to prefer an editing method that previews changes and can undo them before anything reaches your store.
Why did the import change products I didn't edit?
A product CSV import isn't a list of edits - it's a full description of what those products should look like, and Shopify writes every row in the file to match it. Rows are matched to existing products by Handle, and every column you included gets written for every row, not just the ones you meant to change. That means a spreadsheet quirk can silently overwrite good data: Excel or Google Sheets reformat values the moment a CSV opens (long barcodes turn into scientific notation, leading zeros drop off SKUs), an empty cell in an included column is still a write - not “leave this alone” - which is why compare-at prices vanish so often, and a sorted or filtered file can separate a variant's row from its product, deleting that variant. None of these are edge cases; they're the normal behavior of the tools involved, which is exactly why a CSV round-trip offers no preview of what will change before it changes it.
How do I bulk change prices without risking this again?
Filter to the exact products you mean - by tag, vendor, status, price range, or a saved segment - then apply the change in place as a bulk template or by typing into cells, and check the preview of old and new values before anything is written to Shopify. Nothing reaches your store until you deliberately save, and while you're editing, the whole batch is a single undo step, so a bad change is caught in the preview rather than becoming a restore job later. After saving, undo still works for 15 minutes on any plan, and paid plans keep a cross-session draft-undo history (up to 50 steps, retained 30 days on Starter, 90 on Growth, 180 on Pro) plus an Edit History log of what was actually saved - on Pro, that saved history can be reverted too, so even a mistake that makes it past the preview has a way back.
If this is the second time a CSV has cost you an afternoon, the round-trip is the thing to remove - not the spreadsheet. See the bulk product editor for editing the whole catalog inline, or what to do when Shopify's native bulk editor isn't enough if you're weighing up the free options first. Install BulkSheet - it's free to start - or compare plans on the pricing page.