How to bulk update Shopify products from a CSV without breaking anything
Updated September 2026
A spreadsheet is still the fastest way to prepare a large product update: a supplier price list, a seasonal tag pass, rewritten SEO titles for a whole category. The import step is where it goes wrong. Reviews of the big CSV apps repeat the same three stories: a blank column wiped descriptions, an import reformatted HTML, and there was no way back. This guide covers what a safe import looks like and how SureEdit does it.
The three ways CSV imports damage a catalog
1. Blank cells that overwrite
Many tools treat an update row as the complete truth: whatever is not in the row is erased. Export, delete a column you did not mean to touch, re-import, and 4,000 descriptions are gone. A safe importer must treat blank as "no change" and make clearing an explicit action.
2. HTML that comes back different
Descriptions carry entities, inline styles, embedded scripts from apps, and line breaks that matter. An importer that decodes, trims or re-serialises HTML changes products you never meant to edit, and you only find out when a theme block breaks.
3. No preview and no undo
Shopify's native import applies the file and reports a count. If the file matched the wrong rows, or a decimal separator was off, the only fix is another import that you hope is right. There is no record of what each field was before.
What a safe import does instead
- Recognises your file. Matrixify and Shopify export headers are mapped automatically; you can change any column, and columns SureEdit does not import (images, options, inventory) are listed as left untouched rather than failing the file.
- Matches rows to products you already have by ID, Handle, Variant ID or Variant SKU. It never creates or deletes products, so nothing it does is impossible to reverse.
- Treats blank as no change. To clear a field you type
__CLEAR__in the cell. Only fields that can be empty (compare-at price, SEO fields, tags, metafields, description) accept it; a cleared title is rejected as an error. - Keeps HTML byte for byte. The Body HTML cell is written exactly as it is in the file and compared exactly, so an unchanged description is never rewritten.
- Shows every change before anything is written. The preview lists each product and field with its current value and the value from the file, with counts per field and a list of skipped rows and why.
- Verifies every write. After writing, each field is re-read from Shopify and compared with what the file asked for. The import is only reported as verified when every field matches; anything else lands in a needs-attention list with reasons.
- Flags what moved since the preview. If a value changed between the preview and the run (someone edited the product, another app wrote to it), that field is skipped and flagged instead of overwritten, with an explicit overwrite option.
- Undoes the whole import in one click. The value each field had immediately before the write is recorded, and the undo runs through the same verified path. Fields changed after the import are flagged, not clobbered.
A worked example
Export your products from SureEdit (or reuse a Matrixify sheet), change the Variant Price column for 300 variants and leave every other column as it was. Upload the file. The mapping page recognises every header; "Check file" reports two rows with a price that has a currency symbol and skips them. Resolve: the preview shows 298 price changes and zero changes anywhere else, because unchanged cells are no-ops and blank cells are not writes. Run: 298 writes, 298 verified. Two weeks later the supplier corrects the sheet; you undo the import in one click and 298 prices are back to what they were, each one confirmed by re-read.
Limits worth knowing
- Files up to 25 MB or 50,000 rows; split larger catalogs.
- Variant prices need a Variant ID or Variant SKU column, or a single-variant product. Shopify's native export identifies variants by option values, which SureEdit does not yet read.
- Rows with any error are skipped whole, so one bad cell never lets the rest of that row through half-applied.
- Your plan's per-import product cap applies to products that actually change, not to rows in the file.
WRITE → READ → MATCH ✓
Run this edit with proof, not hope
Import from a spreadsheet and keep the safety net: preview every change, verify every write, undo the whole import in one click.
Install free on ShopifyFrequently asked questions
Can a blank cell in my CSV erase a Shopify product field?
In most importers, yes: an empty Body HTML or Tags cell on an update row clears the field. SureEdit treats a blank cell as no change, always. To clear a field on purpose you type __CLEAR__ in the cell, and only fields that can be empty accept it.
Will a CSV import reformat my product descriptions?
It can, when the tool decodes entities or normalises HTML on the way through. SureEdit writes the Body HTML cell exactly as it is in the file and compares it byte for byte, so an unchanged description is never rewritten and a changed one lands exactly as typed.
Can I undo a CSV import in Shopify?
Shopify's native import cannot be undone. SureEdit records the value each field had immediately before it was written, re-reads every write to confirm it, and restores the whole import in one click. Fields that someone changed after the import are flagged instead of overwritten.
Related: bulk editing without a CSV, importing metafields from a CSV, and why bulk edits fail silently.