August 23, 2026

How to change prices in bulk in Shopify

How to change prices in bulk in Shopify

Key takeaways

  • Price is already in the bulk editor's default columns. Unlike Description, you don't have to go looking for it. What isn't there is any way to say "plus 10%" — the grid gives you cells, and you type each new number.
  • The unit of work is the variant, not the product. In our test catalogue, 50 products came to 88 variants. Whatever number you have in mind for "how many prices", it is probably about 1.8x larger.
  • Timed: changing three prices by hand in the grid took 16.93 seconds, or 5.64 seconds per row, at a machine-steady pace. Extrapolated to a 500-product catalogue at the same variant ratio, that's roughly 1 hour 23 minutes of pure typing — before you decide what any of the new prices should be.
  • The CSV route needs five columns, and one row per variant. The one that decides whether any of it lands is the Overwrite products with matching handles tick.
  • Cost per item is not a default column in the grid. Which means the view you reprice in doesn't show you whether a new price still clears what the item cost.
  • The AI route on the same store, end to end: 5 minutes 46 seconds from pressing enter to the last price written — 2 minutes 17 seconds of that spent producing a preview you approve before anything is saved. And read that preview: three variants moved by more than the 10% we asked for.

Published 23 August 2026 by Adot Technologies Inc, the team behind Arvio. Every step below was run in a live Shopify admin in August 2026; the timings are stopwatched inside the screen recordings, not estimated. Method — including what we could not verify — in full at the end.

The video version

Sixteen seconds of it: prices going in one at a time, then the same job as a single prompt, with the confirmation card and its old → new list in between. Watch on YouTube.

The quick version

  1. A handful of prices: Products → tick them → Bulk edit. Price is right there in the grid. Type, tab, done.
  2. A percentage, or anything that needs maths: export a product CSV, do the arithmetic in a spreadsheet, re-import with Overwrite products with matching handles ticked. Nothing in the Shopify admin will compute the new prices for you.
  3. The whole catalogue, or a rule with exceptions: describe the change once, then read the preview line by line before you approve it.

The first two are very good at applying prices you have already decided on. Deciding them is still your problem, and neither route puts cost anywhere you can see it while you work.

Why "just change all my prices" is harder than it sounds

Four things get in the way, and you meet all four in the first five minutes.

Prices live on variants. A product with three sizes has three prices. Our 50-product test catalogue has 88 of them, so anyone sizing a repricing round off their product count is sizing it off the wrong number.

The product list pages at 50. The header checkbox selects the page, not the catalogue. On a 500-product store that is ten separate rounds, and nothing on screen tells you it isn't one — you can finish believing you covered everything when you covered a fifth of it.

There is no percentage field. The bulk editor is a grid of cells. In the grid we used in August 2026, a 10% increase means computing 88 new numbers somewhere else and then typing 88 numbers in.

Margin is invisible by default. Cost per item exists on the variant. It is not one of the columns the grid opens with.

Method 1 — the built-in bulk editor

Products → tick the products you want → Bulk edit.

The grid opens with a default column set — title, price, inventory, status — and unlike descriptions, price is in it. There is nothing to switch on. Click a price cell, type the new number, tab to the next.

While you are in Columns (top right), add Cost per item. Then each price sits next to what the item cost you. Without it you are changing prices with the other half of the decision off screen.

What this costs, measured. We recorded ourselves changing three prices in the grid — click the cell, type the new price, move on:

Row Old New Typing
Randers Wine Rack 34.95 38.45 1.71 s
Oak Serving Spoon Set 48.50 53.35 1.67 s
Roskilde Large Canister Set (variant) 74.00 81.40 1.60 s

Three rows: 16.93 seconds. 5.64 seconds per row. Only about a third of that is typing. The rest is hunting for the right cell and clicking into it.

Scale that at the variant ratio we measured (1.76 variants per product):

Catalogue Variants Pure typing
50 products 88 8.3 minutes
200 products ~352 ~33 minutes
500 products ~880 ~1 hour 23 minutes

Two things about that table before you use it. The pace is scripted and machine-steady, which makes it faster than most people type, so read the numbers as a floor. And it is keystrokes only: deciding what each new price should be isn't in there, and on a real repricing round that is the larger half.

Method 2 — export, do the maths, re-import

This is the only native route that can apply a percentage, and only because the arithmetic happens in your spreadsheet rather than in Shopify.

Products → Export → CSV for Excel, Numbers, or other spreadsheet.

The export is wide — the file we imported on 19 August 2026 carried 25 columns. You do not need most of them. The restore file we built for this store is 88 rows and five columns:

Handle,Title,Option1 Name,Option1 Value,Variant Price
kolding-serving-spoon-set,Kolding Serving Spoon Set,Size,Large,18.95

That is the same five-column shape that imported cleanly when we did this for descriptions, with Variant Price in place of the description column. Title is required on import even though you are not changing it. Option1 Name and Option1 Value are required as soon as any product in the file has variants — and they are what makes each row address one price rather than one product.

Then, in your spreadsheet, a new price column is one formula: =ROUND(E2*1.1, 2). Paste the result back over Variant Price, save as CSV, and import.

🔴 Tick "Overwrite products with matching handles". Left unticked, Shopify treats every row as a product it already has and skips it. The import reports success. Nothing changes. This is the single most common way a bulk price change quietly does nothing.

The mechanics of Shopify's CSV import — the two error messages nothing documents, the current versus legacy column names, and which columns are safe to leave out — are covered in detail in our bulk description guide; everything there about the import itself applies unchanged here.

Before you import anything: export first, and keep that file. An untouched export of your current prices is the only undo you get. It costs one click.

Method 3 — one sentence, then read the preview

Disclosure: Arvio is our own product. It's third here on purpose — the two routes above need nothing from us.

Both of those apply prices. Neither one works out which prices, and neither one says anything when a change is about to do something you did not mean. The timings below are measured; everything we could not verify is listed at the end.

We typed one sentence into a live store of 69 products:

Increase the price of every product by 10%

Here is the whole run, stopwatched from the recording:

Moment Clock
Prompt typed (42 characters) 4.85 s
Sent 0:11
Preview card on screen 2:28
Approved 2:31
Last price written 5:57

Two minutes seventeen seconds to produce the preview, three minutes twenty-six seconds to write the changes, five minutes forty-six seconds from enter to done. The human input across all of it was one sentence and one click.

The clock is not the interesting part. Nothing was written to the store until the preview had been approved. The card says what is about to happen — how many products and variants are in scope, the currency, how many variants have cost data on file and therefore had their margin checked, and a sample of specific old → new pairs. We re-read the store afterwards to check those samples independently:

Product / variant Old New Checked
Large Round Cutting/Charcuterie Board S$66.60 S$73.26 ✅ arithmetic exact, matches the store
TCHON Bamboo Salad Bowl — Matte Grey S$134.48 S$147.93
Macrame Toddler Swing — Khaki S$115.27 S$126.80
Iringa Basket Natural — 8 inch S$101.18 S$111.30
SOAI Bamboo Serving Bowl — Soleil S S$89.40 S$98.34

And the preview earned its place. It flagged that three variants — three sizes of the same basket — would rise by more than the 10% we asked for, because applying a flat 10% to that product's existing prices would have left a bigger basket cheaper than a smaller one. We verified afterwards that the size ladder does come out monotonic (8 inch S$111.30 → 12 inch S$163.60 → 14 inch S$189.40 → 16 inch S$215.02 → 17 inch S$238.08). We could not verify the stated 15–29% range for those three, because our pre-change snapshot did not include those rows. See the method section.

That is what a preview is for. A literal instruction, applied literally, would have gone through as a perfectly valid import and left a wrong price list behind it.

Five ways a bulk price change goes wrong

  1. The Overwrite tick, unticked. Import succeeds, nothing changes. Check a product, not the confirmation message.
  2. Counting products instead of variants. In our catalogue that understates the work by 76%. It also understates the blast radius.
  3. "Select all" selecting a page. The list pages at 50. Ten pages is ten rounds, and nothing tells you which round you are on.
  4. Repricing without cost in view. Cost per item is off by default in the grid, so the default view cannot show you a price that has fallen below what the item cost.
  5. Assuming a percentage rule is literal. A flat percentage will walk straight through a size ladder or a price point ending in .99 without noticing either. Read a sample of old → new pairs before you commit, whichever route you took, and keep the export that puts it back.

Method, and what we could not verify

Environment. One live Shopify store, 69 products — 50 a synthetic catalogue we built for testing and 19 pre-existing — in SGD, English admin, desktop Chrome. Manual timings recorded 17 August 2026; the automated run recorded 22 August 2026 at 1920x1080, 30fps, with an action log written alongside the recording.

The manual timing is a single run of three rows, timed from the action log: stopwatch start to stopwatch stop, 16.93 seconds, of which 4.98 seconds was keystrokes. The keystroke pace is scripted and steady, which makes it faster than a person. We report it as a floor. The 200- and 500-product rows in that table are arithmetic on our measured 5.64 s/row and our measured 1.76 variants per product — they are extrapolations, not observations, and a catalogue with a different variant structure will land somewhere else.

Exclusion rule. We only report a number from the automated run's confirmation card if we could reproduce it from the store itself. That excludes more than it includes, so here is the full list of what we did not confirm:

  • "Products affected 69" and "Variants changed 153". Our independent read covered 50 products and 61 variants — the product list pages at 50 and the grid is virtualised, so a scripted read does not see the rest. The 69 matches the number of products in the store, which is consistent, but consistent is not verified.
  • "Margin verified 65/153" and "Margin unverified 88 variants". Cost per item is not a default grid column, so we never read cost data at all. Verifying these means turning that column on and measuring again.
  • "12 size-price inversions already in the store". Reconstructing that requires size options and prices grouped per product, and the row labels we captured were not enough to order sizes reliably.
  • The 15–29% range on the three ladder-corrected variants. The direction and the resulting ladder we did verify. The magnitudes we cannot, because those rows are absent from our pre-change snapshot.

What we did confirm: the currency on the card (SGD, visible in the grid), and all five sampled old → new pairs, each both arithmetically exact and matching the store when re-read afterwards.

One run is one run. These are single measurements on one store, not a benchmark. We are publishing the numbers we have with their limits attached rather than rounder numbers we would have to invent.

FAQ

How do I change all prices at once in Shopify?

There is no single control that does it. In the native admin your options are the bulk edit grid, where you type each new price, or a CSV export and re-import, where a spreadsheet formula computes them. For a whole catalogue, the CSV route is the realistic one.

Can Shopify increase all prices by a percentage?

Not on its own. The bulk editor has no percentage field — it edits cells. The percentage has to happen in a spreadsheet before a CSV import, or in a tool that computes the new prices for you.

Does the Shopify bulk editor have a price column?

Yes, and it is one of the columns the grid opens with, along with title, inventory and status. This is the opposite of the description column, which exists but is switched off by default.

Which CSV columns do I need to update prices?

Five: Handle, Title, Option1 Name, Option1 Value, Variant Price. One row per variant. Title is required on import even when you are not changing it, and the option columns are required as soon as any product in the file has variants.

My price import said it worked but nothing changed. Why?

Almost always the Overwrite products with matching handles checkbox, left unticked. Shopify then treats every row as an existing product and skips it, and the import still reports success.

How do I undo a bulk price change in Shopify?

By re-importing an export taken before the change, which is why you take one. There is no undo button for an import. Our own restore file for this exercise is 88 rows and five columns — the pre-change prices, ready to import back.

How many products can I select at once?

The list pages at 50, and the header checkbox selects the page you are on. On a larger catalogue, plan for the number of pages rather than the number of products.

How long does repricing 500 products take by hand?

On our measurement, about 1 hour 23 minutes of typing at a machine-steady pace, assuming the same 1.76 variants per product. Deciding the prices is not included in that, and it is the larger half.

What we still don't know

We tested no catalogue with three option dimensions, no store with metafield-driven pricing, and no market with per-country price lists, so we have no idea whether these timings survive any of them. We also have not run an export anywhere near Shopify's file size limit. The arithmetic there would be the same; the import would not.


Related: How to bulk edit product descriptions in Shopify — the same CSV route applied to descriptions, including the two import errors nothing documents.

Related: Your SEO app found 400 missing meta descriptions. Now what? — the same shape of problem in SEO fields.

Written by Adot Technologies Inc, the team behind Arvio: AI Store Operator — describe a bulk change in plain language, review every edit before it goes live, and undo anything.

Arvio: AI Store Operator

Other AI tools give you a to-do list.
Arvio's AI store agent does the work.

Arvio scans your Shopify store daily, finds what needs fixing — SEO, prices, stock, product content — and drafts the fix. You approve it, Arvio ships it. Every edit can be undone.

Install on the Shopify App Store
4.9★ rated on Shopify App StoreFree trial availableEvery edit reversible