CFCSV Forge

The Shopify product CSV format, column by column

Shopify’s product importer reads a flat CSV with a fixed header. The table below lists all 61 columns in the exact order they appear in the official product_template.csv sample, which is the authority when the prose documentation and the file disagree — and they do. The column reference calls column 11 Barcodes; the sample file calls it Variant Barcodes. Shopify’s common-import-issues article still prints an older header set entirely (Handle, Body (HTML), Variant SKU). CSV Forge emits the sample’s spelling.

Three kinds of row in one table

The single biggest source of failed imports is treating the CSV as one row per product. It is not. One product occupies as many rows as it has variants, plus one extra row per image beyond the first:

  • The product’s first row carries product fields (Title, Description, Vendor, Tags, SEO, option names) plus the first variant and the first image.
  • Each additional variant row repeats only URL handle and the variant columns. Product fields are left blank — Shopify ignores them there, and filling them invites confusion about which row “wins”.
  • Each additional image row carries URL handle, Product image URL, Image position and optionally Image alt text. Nothing else.

Rows are tied to their product by URL handle alone. If the handle differs by a single character between two rows meant to be the same product, you get two products.

Required, and effectively required

Title is the only column Shopify requires to create a new product. Adding variants additionally requires URL handle; updating existing products requires both. In practice a usable catalogue also needs SKU, Price and at least one image URL, which is why CSV Forge warns when those are unmapped even though the importer would accept the file.

The 61 columns

#ColumnTypeScopeConstraintExample
1TitlerequiredtextproductThe only column Shopify requires for a new product. Blank on variant rows.Physical Product “The Band” T-Shirt
2URL handlehandleproductLetters, digits and dashes only; no spaces. Repeated on every row of a product.physical-product-the-band-t-shirt
3DescriptionlongtextproductPlain text or HTML. Quoted when it contains commas or line breaks.Celebrate the timeless legacy of…
4VendortextproductFree text. Commonly your supplier or brand name.Harmony Threads
5Product categorytextproductA Shopify taxonomy breadcrumb or taxonomy ID. Not the same field as the Google category.Apparel & Accessories > Clothing > Clothing Tops > T-Shirts
6TypetextproductYour own free-text product type.Graphic shirt
7TagslistproductComma-separated, max 250 characters for the whole cell.Unisex, Clothing, Men, Women
8Published on online storebooleanproductTRUE or FALSE. Defaults to TRUE when the cell is blank.TRUE
9Statusenumproductactive, draft or archived. If the header is present the cell needs a value.active
10SKUtextvariantIdentifies the variant. Keep leading zeros — it is text, not a number.TheBandTShirt-SG
11Variant BarcodeslistvariantUp to 20 values separated by semicolons, optionally type-prefixed (ean:, upc:, gtin:, isbn:).ean:4006381333931; upc:036000291452
12Option1 nametextproductSet once on the first row of the product. Max three options per product.Size
13Option1 valuetextvariantOne value per variant row. Combinations must be unique inside a product.Small
14Option1 Linked TotextproductOptional metafield reference that links the option to a metaobject.product.metafields.shopify.color-pattern
15Option2 nametextproductOnly when the product has a second option.Color
16Option2 valuetextvariantRequired on every variant row once Option2 name is set.green
17Option2 Linked TotextproductOptional metafield reference for option 2.product.metafields.shopify.color-pattern
18Option3 nametextproductOnly when the product has a third option. Shopify allows no fourth.Material
19Option3 valuetextvariantRequired on every variant row once Option3 name is set.Cotton
20Option3 Linked TotextproductOptional metafield reference for option 3.—
21PricemoneyvariantNumber only — no currency symbol, no thousand separator, dot as decimal mark. Blank imports as 0.00.19.99
22Compare-at pricemoneyvariantSame numeric rules as Price. Leave blank when there is no reference price.24.99
23Cost per itemmoneyvariantYour cost. Used for margin reporting; never shown to customers.11.00
24Charge taxbooleanvariantTRUE or FALSE.TRUE
25Tax codetextvariantAvalara or Shopify Tax code. Plan-dependent; usually left blank.A9277
26Unit price total measuredecimalvariantUnit-pricing numerator (EU unit price). All four unit-price columns go together.500.00
27Unit price total measure unittextvariantUnit for the total measure, e.g. ml, g, cl, kg, l, m², m.ml
28Unit price base measuredecimalvariantUnit-pricing denominator.50.00
29Unit price base measure unittextvariantUnit for the base measure.ml
30Inventory trackerenumvariantshopify, shipwire, amazon_marketplace_web, or blank for no tracking.shopify
31Inventory quantityintegervariantWhole number. Single-location stores only; multi-location needs the separate inventory CSV.47
32Continue selling when out of stockenumvariantDENY stops selling at zero stock; CONTINUE allows overselling.DENY
33Weight value (grams)integervariantInteger grams. No unit text, no decimals — convert kg/lb/oz before export.150
34Weight unit for displayenumvariantDisplay unit only. The stored value stays in grams.g
35Requires shippingbooleanvariantFALSE for digital goods and services.TRUE
36Fulfillment servicetextvariantmanual, or the handle of a custom fulfillment service. Custom services require a SKU.manual
37Product image URLurlimageA publicly reachable http(s) URL. Shopify downloads it at import time.https://burst.shopifycdn.com/photos/forest-hiker.jpg
38Image positionintegerimageStarts at 1 and increases per product. Extra images go on extra rows.1
39Image alt texttextimageMax 512 characters.Green t-shirt with The Band graphic
40Variant image URLurlvariantThe one image shown for this variant. http(s) URL.https://cdn.example.com/red-small.jpg
41Gift cardbooleanproductTRUE only for gift-card products, which cannot be created by import.FALSE
42SEO titletextproductMax 70 characters.Vintage The Band Graphic T-Shirt
43SEO descriptiontextproductMax 320 characters.Celebrate the legacy of rock icons…
44Color (product.metafields.shopify.color-pattern)listproductStandard product metafield. Semicolon-separated colour names.green; gray; red
45Google Shopping / Google product categorytextproductA Google taxonomy breadcrumb or ID. Not used by the Google & YouTube channel.Apparel & Accessories > Clothing > Shirts & Tops
46Google Shopping / GendertextproductUnstructured Google metafield.Unisex
47Google Shopping / Age grouptextproductUnstructured Google metafield.Adult (13+ years old)
48Google Shopping / Manufacturer part number (MPN)textproductUnstructured Google metafield.TSH-12345-GRY-S
49Google Shopping / Ad group nametextproductUnstructured Google metafield.Rock Band Graphic Tees
50Google Shopping / Ads labelstextproductUnstructured Google metafield.Music Merch
51Google Shopping / ConditiontextproductTypically New, Refurbished or Used.New
52Google Shopping / Custom productbooleanproductTRUE or FALSE.FALSE
53Google Shopping / Custom label 0textproductUnstructured Google metafield.Top Seller
54Google Shopping / Custom label 1textproductUnstructured Google metafield.—
55Google Shopping / Custom label 2textproductUnstructured Google metafield.—
56Google Shopping / Custom label 3textproductUnstructured Google metafield.—
57Google Shopping / Custom label 4textproductUnstructured Google metafield.—
58Packed product lengthdecimalvariantAll four packed-dimension columns must be filled together, or all left blank.30
59Packed product widthdecimalvariantAll four packed-dimension columns must be filled together, or all left blank.20
60Packed product heightdecimalvariantAll four packed-dimension columns must be filled together, or all left blank.3
61Packed product dimension unitenumvariantcm or in. Required when any packed dimension is set.cm

Value rules that reject files

Money columns take digits only

Price, Compare-at price and Cost per item accept a number with a dot decimal mark and nothing else. No currency symbol, no thousand separator, no decimal comma. A blank price imports as 0.00 rather than failing, which is worse than an error because it is silent.

Booleans and enums are not interchangeable

The sample file writes booleans as TRUE/FALSE, out-of-stock behaviour as DENY/CONTINUE, and status as lowercase active/draft/archived. Writing true into Continue selling when out of stock is a rejected value, not a synonym for CONTINUE.

Weight is an integer number of grams

Weight value (grams) takes a whole number with no unit text and no decimals. Weight unit for display is a separate, cosmetic field (g, kg, lb, oz) that does not change the stored value. A source column in kilograms must be multiplied by 1000 and rounded before export.

Packed dimensions are all four or none

Packed product length, width, height and dimension unit must be populated together or all left blank. Three of four is invalid, which is a common outcome when a supplier sheet gives dimensions but no unit column.

Barcodes are semicolon-separated

Variant Barcodes takes up to 20 values separated by semicolons, optionally type-prefixed as ean:, upc:, gtin: or isbn:. Commas are not separators here. Never include both a legacy Barcode column and Variant Barcodes.

Options: three maximum, combinations unique

A product supports at most three options. Option names go on the product’s first row, option values on every variant row, and the combination of values must be unique within the product or the import fails with Validation failed: options are not unique. A simple product with no options leaves all six option columns blank; Shopify creates the default variant itself.

Length limits

SEO title 70 characters, SEO description 320, Image alt text 512, and the whole Tags cell 250. These truncate rather than fail, so they are warnings in CSV Forge and not errors.

File-level requirements

  • UTF-8 encoding, LF line endings, comma delimiter.
  • Maximum 15 MB per product CSV. Larger catalogues must be split into several files; there is no documented row cap, only the size cap.
  • Image URLs must be publicly reachable over http(s) at import time — Shopify downloads them. Local file paths and bare filenames produce getaddrinfo errors.
  • Inventory quantities apply to single-location stores. Multi-location inventory needs the separate inventory CSV.
  • Variant metafields cannot be imported through the product CSV at all. Product metafields can, using <name> (product.metafields.<namespace>.<key>) headers.

Overwriting is destructive

When you import a file whose handles already exist and choose to overwrite, an empty cell can erase existing data rather than leave it alone. Export your current products first and map only the columns you intend to change. See Shopify’s note on overwriting with a CSV.

Convert a supplier file against this format →