Shopify product CSV errors: invalid header and skipped rows
The Importly team · Published 2026-08-22 · Updated 2026-08-23
Shopify's product CSV is unforgiving in a specific way: it accepts the file, tells you the import finished, and leaves you with products missing their variants, prices at zero, or half the catalogue absent. The errors it does report are terse.
Here is what each one means.
"Invalid header" — an unrecognised column name
Shopify matches columns by their exact header text. Variant price, variant_price and Price are all wrong; the column is Variant Price. Capitalisation and spacing both matter.
The fix. Export one existing product from Products → Export and use that file's header row as your template. It is always the current, correct set of names for your store.
The handle is what ties variant rows together
URL handle is the product's URL slug — lowercase letters, numbers and hyphens. Leave it out on a new product and Shopify derives it from the Title, so a blank handle is not what makes products vanish.
Where it decides everything is variants. Every variant row must repeat the same handle as its parent, because that is the only thing linking them. A variant row with a blank or mistyped handle becomes a separate product — the real cause of "the product imported but every size is its own item".
When you are updating existing products rather than creating them, Shopify's documentation is explicit: URL handle and Title are the required columns.
Variants not created, or collapsed into one product
This is the part of the format that trips up nearly everyone. Variants are not columns — they are additional rows.
A product with three sizes is four rows in the file:
- Row 1 carries the full product:
Handle,Title,Body (HTML),Vendor,Type,Tags, plusOption1 Name(Size),Option1 Value(S), and that variant's price and SKU. - Rows 2–4 repeat the same
Handle, leaveTitleand every other product-level column empty, and fill onlyOption1 Value(M,L) with their own price, SKU and inventory.
Two failure modes follow from getting this wrong:
- Repeating the
Titleon every row makes Shopify treat each as a separate product. - Filling
Option1 Valuebut leavingOption1 Nameempty on the first row means the options are ignored entirely.
Prices imported as 0, or rejected
Variant Price and Variant Compare At Price must be plain numbers with a period as the decimal separator. No currency symbol, no thousands separator, no space.
1 299,00 € fails. 1299.00 works.
This is a systematic problem with exports from European tools, where 1.299,00 is the normal way to write the amount — and Excel will happily re-apply that format every time you open the file.
The fix. Format the price column as Text and write the raw value, or do the conversion at export time. Note that reformatting the display in Excel is not enough — what matters is what lands in the saved CSV.
Accented characters garbled
The file must be UTF-8. A CSV saved from a French or German Excel is Windows-1252, so Café arrives as Café.
The fix. Save as → CSV UTF-8 (Comma delimited) — the separate entry in Excel's format list. The plain CSV option will not do it.
Images not imported
Image Src must be a full, publicly reachable URL — https://…, not a local path and not a link behind a login. Shopify fetches each one at import time; anything it cannot download is skipped silently.
For a product with several images, add extra rows sharing the Handle, filling only Image Src and Image Position.
Other things worth knowing
PublishedtakesTRUEorFALSE;Statustakesactive,draftorarchived.Variant SKUshould be unique across the store — duplicates make inventory behave unpredictably.- Importing a
Handlethat already exists updates that product rather than creating a new one. This is useful on purpose and destructive by accident.
Pre-flight checklist
- Header row copied from a real Shopify export
URL handlesupplied when updating existing products (Shopify derives it for new ones)- Variant rows repeat the handle and leave product columns empty
Option1 Namefilled on the first row of each product- Prices as plain numbers with a period decimal separator
- File saved as CSV UTF-8
- Image URLs public and absolute
When it's the same supplier file every week
Building this by hand once, for a catalogue migration, is a reasonable afternoon.
Doing it every week on a supplier price list is not. Importly takes the raw export, renames the columns to Shopify's names (Title, Variant SKU, Variant Price, Variant Grams, Image Src…), strips currency symbols and converts decimal separators, normalises weights, quantities and barcodes, fixes the encoding and drops empty rows. Save it as a profile and next week's file goes through the same rules without you re-deriving them — the Handle and the variant rows stay yours to set, because Importly cleans column names and values rather than reshaping rows.
Keep reading
Stop reformatting exports by hand.
Try Importly free