Shopify product CSV format: the complete reference guide (2026)
Everything you need to know about Shopify's product CSV import format — all 33 columns explained, with examples for simple and variable products, common errors, and how to generate a valid CSV automatically.
Shopify's product CSV import is powerful but unforgiving. A single malformed column header, an extra space, or a mismatched variant row can cause your entire import to fail — or silently skip hundreds of products.
This guide covers every column in Shopify's product CSV format, with examples, common mistakes, and tips for generating valid files from WooCommerce exports.
The Shopify CSV column reference
Shopify's product CSV uses 33 standard columns. Here's what each one does:
Core product fields
| Column | Type | Notes |
|---|---|---|
Handle |
Required | URL-friendly identifier. Must be unique per product. Use lowercase letters, numbers, and hyphens only. Example: blue-running-shoes |
Title |
Required (first row) | Product title. Only needed on the first row for multi-variant products. Subsequent rows for the same product (same Handle) leave this blank. |
Body (HTML) |
Optional | Product description in HTML format. Shopify accepts HTML but strips unsafe tags. Only on first row per product. |
Vendor |
Optional | Brand or manufacturer name. Appears in Shopify admin and can be used for filtering. Only on first row. |
Product Category |
Optional | Shopify's standardized product taxonomy (not the same as collections). Example: Apparel & Accessories > Shoes |
Type |
Optional | Custom product type (free-form text). Different from Product Category. Often used to map WooCommerce categories. |
Tags |
Optional | Comma-separated list of tags. Example: running, sports, outdoor. Only on first row. |
Published |
Optional | TRUE or FALSE. Determines if product is visible in your store. |
Option fields (for variable products)
Shopify supports up to 3 option types per product. The option names go in Option1 Name, Option2 Name, Option3 Name, and the values for each variant go in Option1 Value, Option2 Value, Option3 Value.
| Column | Example |
|---|---|
Option1 Name |
Color |
Option1 Value |
Blue |
Option2 Name |
Size |
Option2 Value |
M |
Option3 Name |
Material |
Option3 Value |
Cotton |
Important: Shopify enforces a hard limit of 3 option types and 100 variants per product. WooCommerce has no such limits — if your WC products exceed these, you'll need to restructure them before import.
Variant fields
| Column | Type | Notes |
|---|---|---|
Variant SKU |
Recommended | Stock Keeping Unit. Must be unique across all variants in your store. Leave blank if you don't use SKUs. |
Variant Grams |
Optional | Weight in grams (always grams, regardless of your store's weight unit). Example: 500 for 500g. |
Variant Inventory Tracker |
Optional | shopify to track inventory, blank to not track. |
Variant Inventory Qty |
Optional | Starting inventory quantity. Only applicable if Inventory Tracker is shopify. |
Variant Inventory Policy |
Optional | deny to prevent overselling, continue to allow. |
Variant Fulfillment Service |
Optional | Usually manual. Can be a third-party fulfillment service ID. |
Variant Price |
Required | Selling price. Decimal number, no currency symbol. Example: 29.99 |
Variant Compare At Price |
Optional | Original price (shown as crossed-out). Used to indicate a sale. Must be higher than Variant Price to show as a discount. |
Variant Requires Shipping |
Optional | TRUE or FALSE. Default is TRUE. |
Variant Taxable |
Optional | TRUE or FALSE. Default is TRUE. |
Variant Barcode |
Optional | EAN, UPC, or ISBN barcode value. |
Image fields
| Column | Notes |
|---|---|
Image Src |
Full URL to the product image. Shopify will download and host this image. Must be publicly accessible at import time. |
Image Position |
Integer (1, 2, 3...). Controls image display order. Position 1 = main product image. |
Image Alt Text |
Alt attribute for the image. Important for SEO and accessibility. |
Variant Image |
URL of the image to associate with this specific variant. Must match an Image Src value in the same product's rows. |
SEO fields
| Column | Notes |
|---|---|
SEO Title |
Page title tag. Defaults to product title if blank. Keep under 70 characters. |
SEO Description |
Meta description. Keep under 160 characters for best display in search results. |
Other fields
| Column | Notes |
|---|---|
Google Shopping / Google Product Category |
Google taxonomy category for product feed. Optional but useful for Google Shopping campaigns. |
Google Shopping / Gender |
Male, Female, or Unisex. For apparel. |
Google Shopping / Age Group |
Adult, Kids. For apparel. |
Google Shopping / MPN |
Manufacturer Part Number. |
Google Shopping / AdWords Grouping |
For Google Ads product groups. |
Google Shopping / AdWords Labels |
Comma-separated labels for Google Ads. |
Google Shopping / Condition |
New, Refurbished, or Used. |
Google Shopping / Custom Product |
TRUE or FALSE. |
Google Shopping / Custom Label 0–4 |
Five additional custom label fields for Google Shopping feeds. |
Variant Weight Unit |
The unit for display: kg, g, lb, or oz. Note: Variant Grams is always in grams regardless of this setting. |
Variant Tax Code |
Tax code for Avalara or other tax services. Leave blank for most stores. |
Cost per item |
Your cost to source the item. Not visible to customers. Used for profit reporting. |
Included / [Location] |
TRUE or FALSE. Whether this variant is stocked at a specific location (for multi-location inventory). |
Status |
active, draft, or archived. |
Multi-variant product row structure
This is where most CSV imports go wrong. For a product with multiple variants, you need one row per variant, all sharing the same Handle. Only the first row gets the product-level fields (Title, Body HTML, Vendor, Tags).
Example — a t-shirt with 3 color options:
Handle,Title,Body (HTML),Vendor,Type,Tags,Option1 Name,Option1 Value,Variant Price,Image Src,Image Position
basic-tee,Basic T-Shirt,"<p>Classic cotton t-shirt.</p>",ACME,Shirts,tee,Color,Blue,24.99,https://example.com/tee-blue.jpg,1
basic-tee,,,,,,Color,Red,24.99,https://example.com/tee-red.jpg,2
basic-tee,,,,,,Color,Black,24.99,https://example.com/tee-black.jpg,3
Key rules:
- Same Handle on all rows for the same product
- Title, Body HTML, Vendor, Tags only on the first row (leave blank on subsequent rows)
- Each row needs a Variant Price
- Image Src and Image Position can appear on any row — use Position to control order
Simple product example
For a product with no variants:
Handle,Title,Body (HTML),Vendor,Type,Tags,Option1 Name,Option1 Value,Variant SKU,Variant Price,Image Src,Image Position,Status
blue-mug,Blue Coffee Mug,"<p>12oz ceramic mug.</p>",HomeGoods,Mugs,kitchen,Title,Default Title,MUG-BLUE-001,14.99,https://example.com/mug.jpg,1,active
For simple products, use Option1 Name = Title and Option1 Value = Default Title.
Common import errors
"Invalid product" or silent row skip
Missing required fields (Handle, Variant Price). Check that every row has a Handle and every variant has a price.
Images not loading after import
Image URLs must be publicly accessible HTTPS URLs. Shopify fetches them at import time — if the URL redirects, requires authentication, or returns a 404, the image is skipped silently.
Variants missing after import
If the Handle matches an existing product in your store, Shopify will update that product rather than create a new one. Existing variants not present in the CSV will be deleted.
Price shown as $0.00
Variant Price must be a plain decimal number with no currency symbol, commas, or spaces. 29.99 is correct; $29.99, 29,99, or 29 .99 will fail.
Products imported as drafts instead of active
Check the Status column — if it's draft or missing, products won't be visible to customers. Set it to active.
Weight format: the grams trap
Shopify's CSV format stores weight in the Variant Grams column — always in grams, regardless of what your store's weight unit is set to. The Variant Weight Unit column only controls the display unit in the admin interface.
If you're migrating from WooCommerce and your products have weights in kg or lb, you need to convert them to grams for the CSV. For example: 2.5 kg → 2500 grams, 5 lbs → 2268 grams.
k-sync handles this conversion automatically — the Weight Converter panel lets you convert all variant weights between units before exporting, and the CSV export always outputs Variant Grams in the correct unit.
Generating a valid Shopify CSV automatically
Building a correct Shopify CSV by hand for hundreds or thousands of products is error-prone and time-consuming. k-sync generates Shopify-compatible CSVs automatically from imported WooCommerce data:
- Correct column headers in the right format
- Multi-variant product rows structured correctly (first row with product data, subsequent rows with variant data)
- Weight converted to grams
- Price formatted correctly (no currency symbols)
- HTML descriptions preserved
- All 33 columns populated where data exists
You can export all products or just selected products, validate the data first to catch issues, and re-download after fixing problems.
Migrate your store with k-sync
Connect your WooCommerce store, validate your products, and push to Shopify in minutes. Free for up to 50 products.
Get started freeRelated reading
Migrating a luggage and travel accessories store from WooCommerce to Shopify (2026)
How to migrate a luggage, travel bags, or travel accessories WooCommerce store to Shopify — luggage specifications, airline compliance, TSA lock, warranty and durability claims, and luggage retail Shopify setup.
Migrating a motorcycle accessories store from WooCommerce to Shopify (2026)
How to migrate a motorcycle accessories, biker gear, or motorbike parts WooCommerce store to Shopify — helmet safety standards, CE-rated protective clothing, type approval for parts, fitment compatibility, and motorcycle retail Shopify setup.