To bulk edit products in Shopify, open Products, filter your list, click Edit products, add the columns you want to change and edit inline — the changes save automatically. For more than a few hundred products, or when you need previews, scheduling or undo, use a CSV export/import or a dedicated bulk-edit app instead.
- The native bulk editor is fast for <500 products but has no preview and no undo.
- CSV scales to any catalog size but is unforgiving: one misplaced column overwrites the wrong field silently.
- Always take a filtered CSV export before any bulk operation — it's your only rollback path.
- Dedicated apps add snapshots, previews and scheduling on top of the Admin API.
- Never bulk-edit product handles: it breaks URLs, sitemaps and inbound links.
Shopify gives you four ways to edit many products at once: the native bulk editor, CSV export/import, the Admin API, and dedicated apps. The native editor is fastest for filtered edits under ~500 rows but has no preview and no undo. CSV scales to any catalog size but overwrites blanks silently and creates duplicates if you touch the Handle column. For any recurring change — repricing, seasonal tag hygiene, SEO refreshes — use a dedicated app with previews, safety limits and one-click undo.
What bulk editing actually means in Shopify
Bulk editing in Shopify is any change applied to more than a handful of products or variants in a single operation. In practice that covers almost every routine catalog task: dropping prices by 15% across a Summer collection, adding a `clearance` tag to every product from one vendor, rewriting SEO titles on last season's catalog, toggling the taxable flag off on a set of gift cards, or replacing image alt text across 4,000 variants. Two structural facts change everything about how you approach the work. First, Shopify stores prices, SKUs, barcodes, inventory quantities, weights and options at the variant level, but tags, titles, descriptions, SEO fields, product type, vendor, status and metafields at the product level — the same click-path can touch either surface, and mistakes here silently overwrite the exact fields you rely on to sell. Second, Shopify keeps no per-field version history: once you commit an edit, the previous value is gone unless you exported it first. That is why scale changes the risk profile of an edit. Editing five products by hand is trivially reversible; editing five thousand with no snapshot is a full-blown catalog-recovery incident. This guide walks through the four production-grade methods — native bulk editor, CSV, Admin API, dedicated apps — with concrete click-paths, a worked numeric example, five common pitfalls and a six-step safety checklist. Read the pitfalls section before you touch anything.
Method 1 — Shopify's native bulk editor
The native bulk editor lives at Products → filter the list → tick the checkboxes → Edit products (top-right of the list view). It renders a spreadsheet-style grid: rows are products or variants, columns are the fields you choose to expose with the 'Add fields' button. It is fast, requires zero setup, and is the correct tool for filtered edits under about 500 products where you know exactly what you want to change and every row is going to get the same value. Supported fields cover most of the common catalog surface: title, description (rich-text editing is truncated), status, product type, vendor, tags (add/remove/replace modes), price, compare-at price, cost per item, taxable, inventory quantities per location, SKU, barcode, weight, requires shipping, and a growing list of metafield types since 2024. What the native editor does not do is where the risk lives: there is no preview screen showing before/after values, no computed-change preview for percentage adjustments (a +10% pass writes $20.90, not $20.99 — rounding is a separate manual pass), no scheduling, no safety floor or ceiling, and no undo. Every keystroke commits directly to the live catalog the moment you tab out of the cell. The grid also does not scale: above ~500 rows the UI slows down, keyboard navigation lags, and the browser can drop keystrokes, which is exactly how phantom price changes appear on random SKUs the next morning. Use it for small, targeted, easy-to-verify jobs — toggling a `sale` tag on 40 filtered products, fixing vendor spelling across one brand, or bumping inventory at a single location. For anything bigger, more repetitive, or requiring a review step, use one of the next three methods.
- 1Filter first
Products → Filters. Combine collection, tag, vendor, status and price range until the count matches what you expect. An unfiltered edit is the single most common source of accidental catalog damage.
- 2Select the rows
Tick the header checkbox to select the page, or use the 'Select all N products that match this search' banner to select every match — Shopify shows the exact count.
- 3Open Edit products
Click Edit products at the top of the list. The bulk editor opens with the default columns (title, status, inventory, price).
- 4Add only the columns you need
Click 'Add fields' and expose only the fields you will actually change. Fewer columns means fewer chances to accidentally overwrite something you didn't mean to touch.
- 5Edit inline and verify a sample
Type new values, tabbing between cells. Before closing the tab, open one edited product on the live storefront in a new tab and confirm the change looks right — including on mobile.
The native editor writes every keystroke straight to your live catalog. Treat every edit as irreversible unless you exported a CSV first — because at the field level it genuinely is.
Method 2 — CSV export and import
The CSV workflow is Products → Export → edit in a spreadsheet → Products → Import. On export, pick 'Current search' to get only the filtered set (not the whole catalog) and 'CSV for Excel, Numbers or other spreadsheet programs' for UTF-8. The file has one row per variant, with the parent product's fields (Title, Handle, Body HTML, Vendor, Type, Tags, SEO Title, SEO Description, Status, Published) repeated on the first variant row and blank on subsequent variant rows of the same product. That layout is the source of most CSV disasters: variant rows must appear in the correct position relative to their parent product, and the Handle column is the primary key — renaming it silently creates duplicate products instead of updating existing ones, leaving the original orphaned but still fulfilling orders. Blanks in the import are written as blanks: leaving the 'SEO Description' column in your file with empty cells empties the SEO description on every row it touches. Encoding is the second trap. Excel silently mangles CSV data — long barcodes become scientific notation, leading zeros are stripped, non-ASCII characters lose their encoding — so use Google Sheets, LibreOffice, or a dedicated CSV editor. CSV wins when you need a diffable archive of what you changed, when your source data lives in an external spreadsheet or ERP, or when the row count exceeds what the native editor can handle without slowing. It loses when you need a preview, when you need per-job undo, or when the change is recurring — because you will get one CSV wrong eventually, and the only rollback is the snapshot you took before importing. Always export first with the exact filter you intend to edit, save two copies (one to edit, one untouched as the rollback), delete every column you are not changing, and import a 10-row test file before running the full import.
- Products → Export → pick 'Current search' to export only the filtered set, not the whole catalog.
- Save two copies immediately: one you edit, one you keep as your rollback snapshot.
- Delete every column you are not changing before importing — blank cells become blank fields.
- Never rename, sort or clear the Handle column. It is the primary key that identifies each product.
- Import a 10-row test file first, verify the changes on the storefront, then run the full file.
If you edit or clear a Handle, Shopify treats the row as a new product and creates a duplicate instead of updating the existing one. Your original stays untouched but disconnected from your edit. Never sort, rename or clear handles in a CSV.
Method 3 — Admin API and bulk operations
For programmatic changes at scale — nightly repricing from an ERP, a 40,000-row migration, or conditional logic more complex than 'set field X to value Y' — the GraphQL Admin API is the right tool. Standard mutations like `productUpdate` and `productVariantsBulkUpdate` cover most product-field changes at a few records per second. For catalog-wide jobs, the Bulk Operations API (`bulkOperationRunMutation`) queues the mutation asynchronously against a staged JSONL upload, bypasses the per-request rate limit, and returns a result file when it finishes — the correct path for anything above ~10,000 rows or that needs to run overnight without babysitting. Two things trip up every first-time API integration. The first is rate limiting. Shopify's GraphQL API uses a leaky-bucket cost model: every query has a cost, you get 50 (Plus: 100) points per second refilling into a 1,000-point bucket, and ignoring the `extensions.cost` block in responses will cause 429s within minutes on a real catalog. The second is idempotency. Any script that mutates by delta (`price = price * 0.9`) will double-apply the change if a retry runs after a partial failure. Always mutate by absolute value (`price = 19.99`), always log which record IDs succeeded, and always design the job so it can safely re-run on the same input.
mutation UpdatePrice($input: ProductVariantsBulkInput!) {
productVariantsBulkUpdate(input: [$input]) {
productVariants { id price }
userErrors { field message }
}
}GraphQL gives you 50 cost points/sec (Plus: 100) refilling into a 1,000-point bucket. Ignore the cost extension and you will 429 within minutes on a real catalog and silently miss half your writes.
Method 4 — Dedicated bulk edit apps
Dedicated bulk-edit apps sit on top of the Admin API and add the four capabilities the platform is missing. First: a before/after preview screen you can review row by row before committing, including the computed value of any percentage or rounding transform so ugly $20.90 endings are caught before they hit the storefront. Second: snapshot-based undo per job — the app records the exact prior value of every field it is about to write, so a single click restores them even weeks later. Third: safety limits — price floor, price ceiling, maximum percentage change, maximum row count, minimum-price skip, so a fat-fingered '-90%' aborts instead of destroying your margin. Fourth: scheduling with automatic restore, so a Friday 09:00 sale flips back to the original prices on Sunday 23:59 without a human sitting at a laptop at midnight. A good app treats every change as reviewable and every commit as reversible; a bad one just wraps the API with a nicer form. The trade-off is a monthly subscription; the payoff is that a mistake becomes a five-second Smart Undo instead of a two-hour manual reconstruction. ABAR Bulk Edit is built exactly this way: every change starts as a preview, every commit records a snapshot, Smart Undo restores original values on one click and detects manual edits made after the job so it never blindly overwrites new work. It is launching soon on the Shopify App Store; the free plan covers 20 changes per action on every Shopify plan.
| Capability | Native bulk editor | CSV | Admin API script | Dedicated app |
|---|---|---|---|---|
| Before/after preview | No | No | Custom-built only | Yes |
| Snapshot-based undo | No | Manual (via export) | Custom-built only | Yes |
| Safety limits (floor, max %) | No | No | Custom-built only | Yes |
| Rounding rules (.99 / .95) | No | Spreadsheet formulas | Custom-built only | Yes |
| Scheduling with restore | No | No | Yes (with cron) | Yes |
| Handles ≥10k products | Slow | Yes | Yes | Yes |
| Learning curve | None | Low | Developer-only | Low |
| Cost | Free | Free | Developer time | $–$$/mo |
Worked example — +10% with .99 rounding on 6 products
Numbers make the risk concrete. Suppose you run a 6-product filtered subset from a Summer collection and want to lift prices by 10% and round to .99 endings — the standard psychological rounding for most consumer catalogs. You also set a safety limit: skip any variant whose current price is below $5.00, because rounding tiny prices distorts them (a $3.50 belt becomes $4.99, a 43% increase). The table below shows every row. Notice how the naive `price * 1.10` result rarely lands on a .99 ending — the rounding pass is where most manual bulk edits produce unpleasant $32.34 or $19.03 price points. Notice too that row 6 is skipped entirely by the $5.00 minimum-price safety limit — the native bulk editor cannot express that rule, a CSV can only express it with a helper column, and a dedicated app expresses it as a one-line safety limit before the preview even renders.
| SKU | Title (example) | Before | ×1.10 | Rounded to .99 | Result |
|---|---|---|---|---|---|
| TSH-BLK-M | Cotton T-Shirt — Black M | $29.00 | $31.90 | $31.99 | Applied |
| TSH-BLK-L | Cotton T-Shirt — Black L | $29.00 | $31.90 | $31.99 | Applied |
| HDY-NVY-M | Fleece Hoodie — Navy M | $54.00 | $59.40 | $59.99 | Applied |
| CAP-BLK | Twill Cap — Black | $19.00 | $20.90 | $20.99 | Applied |
| SCK-WHT | Crew Sock — White (3-pack) | $12.50 | $13.75 | $13.99 | Applied |
| STK-PIN | Enamel Pin — Logo | $3.50 | $3.85 | $3.99 | Skipped (below $5.00 minimum) |
Pitfalls and gotchas
The five mistakes below are the ones every experienced Shopify operator has made at least once. They are almost all invisible in the moment and only show up hours later — on the storefront, in a Google Merchant Center disapproval, or in a support ticket from a customer who was charged the wrong price.
- Product vs variant confusion. A percentage bump applied at product level in a CSV can silently write the same price to every variant, erasing size-based pricing you built up over months. Always confirm whether your transform operates at the product row or the variant row before importing.
- Handle edits create duplicates. Renaming a handle in a CSV does not rename the product — it creates a new one and leaves the original orphaned but still connected to past orders. Never sort or edit the Handle column.
- Blank CSV cells overwrite as blank. Leaving the SEO Description column in your import file with empty cells empties the field on every row. Delete columns you are not changing; do not blank them out.
- Rate limits kill long API jobs halfway through. A script that ignores 429 responses stops writing but still exits with success. Always implement exponential backoff, always retry idempotently, always log which IDs succeeded so you can resume.
- Compare-at ghost sales. Increasing the real price without clearing an old compare-at silently reactivates a previous sale badge — sometimes months after the original promotion ended, which is where EU Omnibus fines start.
Safety checklist
Run this checklist before every non-trivial bulk edit. It costs about five minutes and prevents the overwhelming majority of catalog-recovery weekends.
1. Snapshot — export the exact filtered set to CSV, name it with the date and reason, and store it before opening any editor. 2. Filter narrowly — verify the row count matches your expectation ±5% before proceeding. 3. Test on five — run the transform on a five-product subset first and verify each one on the live storefront, desktop and mobile. 4. Preview — if the tool supports it, review before/after values on every row and skip any yellow-flagged rows until you understand them. 5. Apply outside peak hours — schedule for 02:00–05:00 store time so the write budget does not contend with checkout. 6. Verify a sample after apply — open five random products on the storefront and in your Google Merchant feed, and keep the snapshot for at least 30 days.
Related guides
Once you have picked a method, the guides below cover the specific field-level operations most merchants run into on their first serious bulk edit. Start with pricing if the change involves money, tags if it involves collection routing, and undo if you are reading this after a mistake has already happened.
- How to Change Prices for Multiple Products in Shopify — pricing-specific workflow with rounding and compare-at hygiene.
- How to Undo Product Changes in Shopify — what Shopify does and does not restore, and how to build your own rollback routine.
- Shopify Bulk Editor vs CSV — field-coverage table, speed benchmarks and decision tree between the two native methods.
Glossary
- Bulk editor
- The spreadsheet-style grid at Products → Edit products for inline changes across a filtered selection.
- Admin API
- Shopify's authenticated GraphQL/REST API for programmatic access to products, variants, inventory and metafields.
- Bulk operation
- An asynchronous GraphQL job that queries or mutates large data sets without hitting per-request rate limits.
- Snapshot
- A saved copy of a product's fields taken before an edit, used to restore the prior state.
Bulk edit products, prices, inventory and metadata — with previews, scheduling and reliable undo.
Learn moreFrequently asked questions
The most common questions merchants ask us about bulk editing.