ClearStock is live on the Shopify App Store.Install free →

← All blogs

Guides9 min read

How to bulk edit prices on Shopify without corrupting compare-at

Bulk editing prices on Shopify: the admin bulk editor, the product CSV loop, filtering by vendor or collection, and the compare-at traps that survive the edit.

InventoryX is in development and not available today. ClearStock is the live Shopify app.

Bulk editing prices on Shopify is straightforward until you touch the compare-at column. The price field is one number per variant and it means one thing. The compare-at field is a display anchor that, once written, sticks around — so a bulk edit that writes compare-at across 400 variants creates 400 permanent "was" prices, and a bulk edit that clears it removes the only record of what your prices used to be. The edit itself takes ten minutes. Cleaning up after a careless one takes a weekend.

This is the safe procedure: two native methods, the filters that make selection accurate, and the compare-at rules that decide whether your edit is reversible. Field mechanics are in sale price vs compare-at; this is the operation.

Before anything: the two-field rule

Write these on a sticky note before you start.

  • Price is what the customer pays. It feeds checkout, tax, shipping thresholds, discounts, and every revenue report.
  • Compare-at price is presentation. It produces the struck-through anchor and does nothing else. It must be higher than price to display at all, and in several jurisdictions a struck-through reference price is regulated — it's expected to have been a genuine recent selling price, not a number invented for the sale.

The rule that follows: change price when you want a different price; change compare-at when you want a different story about the price. A bulk job that changes both at once is doing two things, and it needs two exports.

Method 1: the admin bulk editor

Best for: a few dozen to a few hundred products, price changes you can eyeball, and anything you want to undo within the hour.

  1. Go to Products and filter to the set you want (see the filters section below).
  2. Select the products — or use the select-all checkbox for the filtered view.
  3. Click Bulk edit.
  4. Open Columns and add Price and Compare-at price. Add SKU and Vendor too; they're how you'll confirm you're editing the right rows.
  5. Edit cells. You can drag a cell's fill handle to copy a value down a column, and select a range to set one value across it.
  6. Save, then check three products on the storefront — one from the top of the list, one from the middle, one you didn't intend to touch.

Two behaviours to verify in your own admin at the time of writing, because they vary with product structure: whether multi-variant products appear as one row with a single price or as variant rows, and whether a column you add is product-level or variant-level. Open a product with several variants and check before you select all 400 — the fastest way to corrupt a catalog is to apply a price to a product row whose variants you never looked at.

The bulk editor has no undo. Your save is immediate and storefront-visible. That's why step 6 exists, and why the export in the sequence below isn't optional.

Method 2: the product CSV loop

Best for: hundreds to thousands of variants, recurring price work, and anything you want a paper trail for.

  1. Export. Products → Export → All products (or your filtered set) → CSV for Excel or a plain CSV. Export all fields, not a subset.
  2. Save the export twice. One copy is your rollback file, untouched. One copy is your working file.
  3. Edit only the columns you mean to change. In the product CSV these are Variant Price and Variant Compare At Price. If you have multiple variants, the row identity is Handle plus Option1 Value (and Option2/Option3 where they exist).
  4. Keep the row set intact. Don't delete rows, don't re-sort in a way that separates variants from their handle, and don't let a spreadsheet convert 0012 style SKUs into numbers.
  5. Test with one product. Import a two-row file first, confirm the storefront, then import the full file.
  6. Import. Products → Import → upload → review the preview summary → confirm. Fix and re-import only the failed rows.
  7. Verify. Three products on the storefront, plus the admin's price column, plus a test cart that adds up.

The blank-cell trap. In Shopify's product CSV import, a blank cell is not a reliable "leave this alone." Several fields are treated as part of the product's definition, so an incomplete file can write blanks over data that existed. Export first, edit only two columns, and never import a hand-built file containing only the columns you care about. If you're editing a subset, delete rows — never columns.

The multi-market caveat. Admin and CSV prices are your base-currency prices. If you sell in multiple markets with price lists, those lists can hold their own adjusted prices and may not follow your edit. Check one product in each market after the import rather than assuming a single write propagated.

Filters: getting the selection right

The bulk editor is only as good as the filter in front of it. Useful native filters on the Products page:

Filter Use it for Watch out for
Vendor Marking down a single brand's overstock Vendor strings drift ("Acme" vs "Acme Co.")
Collection A curated seasonal set Automated collections change membership as you work
Product type Category-wide repricing Messy free-text types split the set
Tag Any custom grouping you maintain Case variants and stale tags
Status Active only, excluding drafts and archived Drafts often hold old prices you'll want too
Inventory / stock level Only discount what's actually on hand "Available" excludes committed units

Then save the filter as a view. A saved view means the same selection is reproducible next month without rebuilding it by hand, and it's the difference between a process and an improvisation.

The compare-at pitfalls

These are the four that do lasting damage:

1. Writing compare-at across the whole catalog. It feels harmless — it's only display. But it means every product in your store permanently reads as on sale, which trains customers to ignore the anchor entirely and, in some markets, creates a reference-pricing problem. Only write compare-at on products that are genuinely in a markdown.

2. Overwriting a real MSRP with a sale anchor. If compare-at held your manufacturer's suggested price and you replace it with "price before this sale," the MSRP is gone. If you later restore from compare-at, you restore the wrong story. Capture the pre-edit value in a metafield or a spreadsheet column before you overwrite it.

3. Setting compare-at at or below price. It won't display. Harmless-looking, and it makes your next audit confusing because the field has a value that does nothing.

4. Clearing compare-at to "tidy up." If compare-at is your only record of the pre-sale price, clearing it destroys your restoration baseline. Export before clearing, always.

The safe sequence

Step Action Why
1 Define the exact SKU list and write it down A list you can't recite is a list you can't verify
2 Export the full product CSV; file an untouched copy Your rollback and your baseline
3 Record current price and compare-at in the working sheet Restoration source, independent of the admin
4 Decide: price change, compare-at change, or both Two changes need two decisions
5 Set or check the margin floor for every SKU Clearance floors stop a price edit from going underwater
6 Apply to a two-row test file or a single bulk-edit cell Catches column and mapping errors cheaply
7 Apply the full change in one pass Partial application is invisible and worst
8 Verify three products on the storefront and one in each market Admin and storefront can disagree
9 Place a guest test order Cart, discount, and tax all reconcile
10 Log the change with a date and a restore-by date Bulk price edits are sales until proven otherwise

Step 10 is the one nobody does. If the edit is a sale, it needs an end date; if it's a permanent repricing, it needs a note saying so, because the next person to see a below-market price will assume it's a sale and "restore" it.

When spreadsheets stop being the tool

The CSV loop is fine when price work is periodic and one person owns it. It stops being fine when prices change every week by rule rather than by decision — aged stock moving down a ladder, restoration when a window closes, a different depth per aging bucket. At that point you're maintaining a spreadsheet that computes what a rule engine should compute, and every import is a chance to write the wrong number into 900 variants.

That's the scope ClearStock covers: rules that set markdown price and compare-at from product status, runway, or velocity, with a cap and an exclusion list, and restore the original price when the rule ends. If your next twelve months of price work fits in two imports, stay in the CSV.

Common questions

How do I bulk edit prices in Shopify? Select the products you want on the Products page, click Bulk edit, add the Price and Compare-at price columns, edit the cells, and save. For larger sets, export the product CSV, change the Variant Price and Variant Compare At Price columns, and re-import.

Does bulk editing prices change the compare-at price? No — they're separate columns and separate fields. Changing price alone leaves compare-at untouched, which is what usually produces a stale anchor or a vanished one. Add the compare-at column to the editor deliberately, and record the old value first.

Can I import a CSV with only price columns? Don't. Shopify's product CSV import treats some blank fields as updates, so an incomplete file can clear data you didn't intend to touch. Export the full product CSV, keep every column, and edit only the two price columns.

Why did my price change not show on the storefront? Usually a market price list overriding the base price, a cached storefront, or a compare-at price that is now below the price so the anchor doesn't render. Check the product in each market, then check both price fields, then check the cart.

How do I undo a bad bulk price edit? Re-import the untouched export you took before the edit — that's the whole reason for step 2. There's no single undo button in the bulk editor, and the product CSV is the only complete record of the prior state.

Next step: export your full product catalog today and open it in a spreadsheet. Add one column: price minus cost, divided by price. Sort ascending. That single column tells you which of your products cannot survive a price edit at all — and it's the input for moving from spreadsheet to a real inventory view when the catalog outgrows the loop.