Using Gridproof

Bulk editing from a CSV

When every product needs its own value rather than one shared rule. The complete column spec, the two cell values that mean something special, and what happens when a file has a mistake in it.

A filter-based job applies one rule to many products: everything in this collection, down ten percent. A CSV import does the opposite — it carries a specific target value for each specific entity. Supplier price lists, individually negotiated prices, a batch of metafields exported from somewhere else: those are CSV jobs.

Everything after the upload is identical to any other job. Same checkpoint snapshot, same full preview, same typed confirmation, same post-write verification, same rollback. The CSV only decides what the target values are, not how carefully they're applied.

The one rule that explains the rest

Every cell states a target, not a change. Put 19.99 in a price cell and that variant ends at 19.99. There is no "reduce by" column, because that's what a filter-based price job is for.

Columns

Each row addresses exactly one entity, identified by either variant_id or product_id — never both in the same row. Which one you use decides which other columns that row may fill in.

ColumnGoes withAccepts
variant_id A numeric variant id or a full gid. Unlocks the two price columns.
product_id A numeric product id or a full gid. Unlocks tags, status and metafields.
pricevariant_id A money value, e.g. 19.99.
compare_at_pricevariant_id A money value, or NULL to clear the compare-at price.
tagsproduct_id Comma-joined. A full replacement of the product's tag list.
statusproduct_id ACTIVE, DRAFT or ARCHIVED.
metafield.namespace.keyproduct_id The value. NULL removes the metafield.

Metafield columns can name a type by appending it after a colon — metafield.custom.width:number_integer. Without one the value is treated as single-line text. This is how you reach metafield types the wizard's dropdown doesn't offer.

You may mix variant rows and product rows in one file; the header just needs both id columns present, with each row filling in only one of them. Any column name that isn't in the table above (and isn't a metafield. column) is rejected — a typo in a header is caught rather than silently ignored.

Empty cells and NULL

These two are not the same thing, and the difference is the whole reason a CSV import is safe to run against a partial export:

This is the opposite of how a Shopify product CSV re-import behaves on some fields, and it's deliberate. An export-edit-reimport round trip through a spreadsheet is a common way to destroy data you never intended to touch. Here, a column you didn't include cannot be affected by the job at all.

The tags column is a replacement

Worth its own heading because it catches people. tags sets the product's tag list to exactly what's in the cell. Tags applied by your theme, your reviews app or your subscriptions app are not preserved unless they're in the cell too.

If you want to add or remove a tag while leaving everything else intact, use a filter-based tags job instead — it has separate add and remove fields for precisely this reason. See what Gridproof can change.

Limits

What happens when the file has a mistake

The whole file is rejected, and nothing is written. Gridproof validates every row first and reports the problems it found with their row numbers — an unparseable price, an unknown column, a row filling in both id columns, a duplicate entity. It does not import the good rows and leave you to work out which ones those were.

The same applies to ids that don't exist on your store: if a row points at a variant or product that isn't there, the job stops and names them rather than quietly dropping those rows from the count.

Fix the file, upload again. Because nothing was written, there's nothing to undo.

Running the import

  1. Jobs → New bulk job, job type CSV import, choose the file.
  2. Gridproof reads the current state of every entity your file references — that read is the checkpoint you can roll back to — and computes the difference between it and your target values.
  3. You get the same preview as any other job: every row, with before and after. Rows whose target already matches reality simply don't appear, so the count is what will genuinely change, not how many lines your spreadsheet has.
  4. Type the count, execute, and read the verified receipt.
A job awaiting confirmation, showing the change table with before and after values above a field asking for the exact number of changes.
A CSV job and a filter job are indistinguishable from here on.

Before a big import

Next steps

See how Gridproof works