July 25, 2026 · CostSentry

How to Bulk Update Cost per Item in Shopify (Without Wiping It)

A supplier sends a new price file with 1,400 changed lines. Updating them one product at a time isn't a plan. Here are the four routes that work, ranked by how many SKUs they suit — and the one precaution that separates a routine update from a very bad afternoon.

Before anything else: export your current costs. Products → Export → CSV. Shopify keeps no history of the cost field, so once you overwrite it the old number is gone for good. That dated export is your only record of what you used to pay — and your only undo. Archive it in a folder named by date, every single time.

Route 1 — The bulk editor (up to ~50 SKUs)

The fastest option with no file handling at all:

  1. Products list → tick the products you want (filter by vendor or collection first to narrow it down).
  2. Click Edit products to open the bulk editor.
  3. Add fieldsCost per item. It appears as a column.
  4. Type or paste values down the column, then Save.

You can paste a column from a spreadsheet if the row order matches — sort both sides by SKU first, and spot-check the first and last row after pasting. Beyond a few dozen products this gets tedious and error-prone; that's your signal to move to CSV.

Route 2 — CSV export, edit, re-import (the workhorse)

The standard route for hundreds or thousands of lines. Costs live in the product CSV — the inventory export doesn't carry them.

  1. Products → Export → All products → CSV. The file arrives by email for larger catalogs.
  2. Open it and find the Cost per item column (some older docs and third-party tools call it Variant Cost — same field).
  3. Match your supplier's file to it by SKU with a lookup — see reading supplier price lists for the matching traps.
  4. Write the new costs into that column.
  5. Products → Import, tick "overwrite existing products that have the same handle", and run it.

The trap that eats cost data

Shopify's importer applies what's in your file. The dangerous case isn't a wrong number — it's an empty cell in a column that's present. Round-trip a file through a spreadsheet, or export from a tool that doesn't carry cost, and you can blank thousands of costs in one import with no warning and no undo.

Two habits prevent it:

Excel will damage your SKUs if you let it. Part numbers like 0034205 lose their leading zeros, and codes like 5E3 or 1-2-2026 get converted to scientific notation or dates. Import the CSV via Data → From Text/CSV and set every identifier column to Text, or use Google Sheets with "convert text to numbers" turned off. A silently mangled SKU column produces an import that matches nothing — or worse, matches the wrong things.

Route 3 — Bulk-edit apps

Tools like Matrixify (formerly Excelify) and similar bulk-import apps handle Excel natively, match on SKU rather than handle, update only the columns you supply, and give you a proper preview and error log. If you do this monthly across a big catalog, the subscription pays for itself the first time it prevents a bad import. They're operating on the same underlying field — you're paying for safety rails and file flexibility, not for a different capability.

Route 4 — The Admin API

If you're comfortable with code, cost is a field on the inventory item, not the variant:

mutation {
  inventoryItemUpdate(
    id: "gid://shopify/InventoryItem/1234567890",
    input: { cost: "9.00" }
  ) {
    inventoryItem { id unitCost { amount } }
    userErrors { field message }
  }
}

Get the inventory item ID from the variant (variant.inventoryItem.id), then update. This is the route to build on if you want the update to happen automatically each time a supplier file lands — and it's exactly what a cost-monitoring app does under the hood. Mind the rate limits on large batches and log every change you make, since Shopify won't.

Before you push: check what the new costs do to your margins

Bulk-updating costs is a mechanical step. The decision that matters happens just before it: at your current retail prices, which SKUs does this new cost file push below your margin floor — or under water entirely?

Answer that first, and the update becomes part of a pricing decision instead of an act of data entry. It's also the moment to catch data errors: a SKU that suddenly shows a negative margin is far more often a per-case price in a per-unit field than a genuine loss-maker.

The repeatable loop

  1. Export current products (this is your cost history — keep it dated).
  2. Diff the supplier's new file against the previous one: which SKUs moved, and by how much.
  3. Compute the new margin at current retail; flag everything under your floor.
  4. Decide prices on the flagged lines — reprice, absorb, renegotiate, or drop.
  5. Import the new costs, minimal columns, tested on three rows first.
  6. Verify a handful of products in the admin, then archive both files.

Every one of these steps is repetitive, rule-based, and identical each month. Which is exactly the kind of work worth handing to something that doesn't get bored halfway through row 900.

See the margin damage before you import

Drop your Shopify product export and the supplier's new price list into the free Supplier Price Margin Checker. It matches by SKU, shows every cost increase, the resulting margin per product, and the price you'd need to hold your target — then exports the result as CSV.

Open the free checker ↗
Runs entirely in your browser. Your cost data never leaves your device.