Which columns does a Shopify product CSV need, and what does each one mean? (2026)
Only Title is required to create a product, and Handle (called "URL handle" in the current template) plus Title are required to update a product or to add variants. Every other column is optional, but variant columns such as SKU or weight need the Option1 name and Option1 value columns next to them, and a column that is present overwrites the store value even when its cell is blank. Shopify renamed most headers in its current template ("Variant SKU" became "SKU", "Image Src" became "Product image URL") and says it "maintains backward compatibility with older column names", so both spellings import, but each field must appear only once and header names are case-sensitive.
How the rows are organised
- One row per variant. The first row of a handle carries the product fields (Title, Description, Vendor, Tags…) and the first variant. Following rows repeat the handle and give only the variant fields.
- Extra image rows contain only the handle and the image fields (image URL, position, alt text).
- A product without variants still has one variant. Shopify's export writes Option1 Name
Titleand Option1 ValueDefault Title; the column guide says that for a single-option product the value "should be Default Title". - Rows of the same handle must stay together. Shopify warns that sorting the file in Excel or Numbers can lose images (Importing products).
- The file must be UTF-8 with LF line feeds and 15 MB or less.
Column reference
Values and defaults are from Shopify's CSV columns page. "Older name" is the header used by exports and templates before the current version.
| Current header | Older name | Level | Allowed values / default | Typical error |
|---|---|---|---|---|
| Title | Title | Product | Free text. Required | "Ignored line … because it did not contain product data" when the first row of a handle has no title |
| URL handle | Handle | Product | Letters, numbers, dashes, no spaces. Defaults from Title | Spaces or symbols; capitals that don't match the existing handle |
| Description | Body (HTML) | Product | Text or HTML | Unclosed tags; text cut at Excel's 32,767-character cell limit |
| Vendor | Vendor | Product | Free text | Blank cell erases the vendor with overwrite |
| Product category | Product Category | Product | Standard Product Taxonomy breadcrumb or ID | "Not a valid product category" |
| Type | Type | Product | Free text | — |
| Tags | Tags | Product | Comma-separated, up to 250 | — |
| Published on online store | Published | Product | true (default), false | Values like yes or 1 |
| Status | Status | Product | active (default), draft, archived. If the column is present it needs a value | Blank status |
| SKU | Variant SKU | Variant | Free text. Required with a custom fulfillment service | Duplicates; Excel scientific notation (1.23457E+11) |
| Barcodes | Variant Barcode / Barcode | Variant | Up to 20, separated by ;. The old singular Barcode column can't be used together with Barcodes | Leading zeros dropped by Excel |
| Option1 name / value (to Option3) | Option1 Name / Value | Product / variant | Up to 3 options | "Validation failed: options are not unique" |
| Price | Variant Price | Variant | Number without currency symbol. Default 0.00 | "Validation failed: price can't be blank"; decimal commas |
| Compare-at price | Variant Compare At Price | Variant | Number without currency symbol | Not above Price, so no reduction shows |
| Cost per item | Cost per item | Variant | Number without currency symbol | — |
| Charge tax | Variant Taxable | Variant | true (default), false | — |
| Inventory tracker | Variant Inventory Tracker | Variant | shopify, shipwire, amazon_marketplace_web, or blank (not tracked) | — |
| Inventory quantity | Variant Inventory Qty | Variant | Integer, default 0, single-location stores only | "Inventory quantity is not a number", "can't be blank" |
| Continue selling when out of stock | Variant Inventory Policy | Variant | deny (default), continue. Required if a tracker is set | "Inventory policy is not included in the list" |
| Weight value (grams) | Variant Grams | Variant | Number only, "without the unit of measurement or decimals". Default 0 | 950g, or a kilogram value typed in the grams column |
| Weight unit for display | Variant Weight Unit | Variant | g, kg (default), lb, oz | kgs, lbs |
| Requires shipping | Variant Requires Shipping | Variant | true (default), false | — |
| Fulfillment service | Variant Fulfillment Service | Variant | manual (default) or an existing service handle | "Fulfillment service can't be blank" |
| Product image URL | Image Src | Image | Public URL | Local paths, Google Drive share links, _thumb / _small / _medium files |
| Image position | Image Position | Image | Integer from 1 | — |
| Image alt text | Image Alt Text | Image | Up to 512 characters | — |
| Variant image URL | Variant Image | Variant | Image URL | — |
| Gift card | Gift Card | Product | false (default), true. Gift cards can't be created by CSV | — |
| SEO title | SEO Title | Product | Up to 70 characters. Defaults to Title | Longer titles |
| SEO description | SEO Description | Product | Up to 320 characters. Defaults to Description | Longer descriptions |
| Google Shopping / … | same | Product | Google Product Category, Gender, Age Group, MPN, Condition, Custom Product, Custom Label 0–4 | Unknown sub-column names |
Name (product.metafields.namespace.key) | varies by export date | Product | Product metafields only; variant metafields aren't supported | — |
| Price / [market], Compare-at price / [market], Included / [market] | same | Variant / product | Header uses your market name | Market renamed since the export |
The column guide also lists Packed product length, width, height and dimension unit (fill all four or none) and an optional Collection column (one collection name per product, not exported).
Headers: exact names matter
Shopify's troubleshooting section says "column header names are case-sensitive" and that a header row that doesn't match the template causes errors such as "Invalid CSV header: missing headers" (check trailing spaces) or the "Choose column headings" mapping window (Common import issues). The usual culprits:
| In the file | Should be |
|---|---|
body (html) | Body (HTML) (or Description) |
Variant Prise | Variant Price (or Price) |
Title (trailing space) | Title |
Option4 Name | Not possible: 3 options maximum |
Handle and URL handle in the same file | Keep one |
To check a whole file at once, the checker at Shopify product CSV checker matches each header against both the current and the older names, suggests the closest valid name (by edit distance) for anything misspelled, and lists every cell that breaks one of the rules in the table above with its row number.
FAQ
Do I have to switch to the new header names? No. Shopify says it keeps backward compatibility with older column names. Don't mix both names for the same field in one file.
Which columns can I delete from an export before re-importing? Any non-required column you don't want to change. With overwrite, an absent column keeps the store value, whereas an empty column erases it. Keep Handle, Title and the Option name/value columns.
Why does my product have a variant called "Default Title"? That is how Shopify represents a product without variants in a CSV: Option1 Name Title, Option1 Value Default Title. Keep these two values in files you re-import: Shopify documents that an overwrite import without the Option1 columns deletes the existing variants.
Can I set inventory for several locations in the product CSV? No. The Inventory quantity column only works for single-location stores. Shopify points to the inventory CSV for per-location quantities.
Where do I find the official template? In the admin under Products › Import, which links to a sample CSV, and on the Using CSV files page.