Shopify CSV Format Explained: Every Column You Need to Know
TL;DR
Shopify's product CSV has specific columns for product info, variants, images, and SEO. Getting the format wrong causes import failures. If you'd rather skip the manual data entry, Ohavah generates correctly formatted Shopify CSVs from your supplier invoices automatically.
Turn supplier invoices into Shopify products instantly
Skip the manual data entry. Upload a PDF, get ready-to-import products.
Shopify's CSV import is powerful, but the format is particular. One wrong column name or a misplaced value and your import fails - often with unhelpful error messages. This guide breaks down every column so you know exactly what goes where.
How to Get the Template
The best starting point is Shopify's own sample file:
- Go to Shopify Admin > Products
- Click Import
- Click "Download a sample CSV template"
This gives you a file with all the correct column headers and a few example rows.
Required vs. Optional Columns
Shopify only strictly requires a few columns to create a product:
- Handle - always required (the URL slug for the product)
- Title - required on the first row for each handle
Everything else is technically optional, but in practice you'll want to fill in most columns to create useful product listings.
Column-by-Column Reference
Product-Level Columns
These only need values on the first row for each Handle. Subsequent variant rows leave them blank.
| Column | Description |
|---|---|
| Handle | URL-friendly identifier (e.g., classic-tee). Lowercase, hyphens instead of spaces. Must be unique per product. |
| Title | Product display name shown to customers. |
| Body (HTML) | Product description. Supports HTML tags for formatting. |
| Vendor | Brand or supplier name. Shows up in Shopify filters. |
| Product Category | Shopify's standardized product taxonomy (e.g., "Apparel & Accessories > Clothing > Shirts"). Used for tax and reporting. |
| Type | Your custom product type (e.g., "T-Shirts"). Used for filtering in admin and collections. |
| Tags | Comma-separated tags (e.g., summer, cotton, new-arrival). Used for automated collections and search. |
| Published | TRUE or FALSE. Whether the product is visible on your storefront. |
| Status | active, draft, or archived. Controls product state. |
Variant-Level Columns
These appear on every row, including the first row and each additional variant row.
| Column | Description |
|---|---|
| Option1 Name | Name of the first option (e.g., "Size"). |
| Option1 Value | Value for this variant (e.g., "Medium"). |
| Option2 Name | Name of the second option (e.g., "Color"). Leave blank if unused. |
| Option2 Value | Value for this variant (e.g., "Blue"). |
| Option3 Name | Name of the third option. Leave blank if unused. |
| Option3 Value | Value for this variant. |
| Variant SKU | Stock keeping unit - your internal identifier. |
| Variant Grams | Weight in grams (used for shipping calculations). |
| Variant Inventory Tracker | Usually shopify. Set to blank if you don't track inventory. |
| Variant Inventory Qty | Starting stock quantity. Only used on initial import. |
| Variant Inventory Policy | deny (stop selling at 0) or continue (allow overselling). |
| Variant Fulfillment Service | Usually manual. |
| Variant Price | Selling price (e.g., 29.99). No currency symbol. |
| Variant Compare At Price | Original/strikethrough price for sale items. Leave blank if not on sale. |
| Variant Requires Shipping | TRUE or FALSE. |
| Variant Taxable | TRUE or FALSE. |
| Variant Barcode | UPC, ISBN, or other barcode. |
Image Columns
| Column | Description |
|---|---|
| Image Src | Full URL to the product image (must be publicly accessible). |
| Image Position | Order of the image (1, 2, 3...). |
| Image Alt Text | Alt text for SEO and accessibility. |
SEO Columns
| Column | Description |
|---|---|
| SEO Title | Custom title tag for the product page (max ~70 characters). |
| SEO Description | Custom meta description (max ~320 characters). |
Row Structure Rules
This is where most mistakes happen:
- First row for a handle: fill in all product-level columns plus the first variant's details
- Additional variant rows: same Handle, leave product-level columns blank, fill in variant columns only
- Image-only rows: same Handle, only fill in Image Src / Position / Alt Text - used to add extra images without creating variants
Example with two sizes and two images:
Handle,Title,Option1 Name,Option1 Value,Variant Price,Image Src
classic-tee,Classic Tee,Size,Small,29.99,https://example.com/tee-front.jpg
classic-tee,,Size,Medium,29.99,
classic-tee,,,,, https://example.com/tee-back.jpg
Common Errors and Fixes
"Invalid CSV file" on upload - Your file might not be UTF-8 encoded. In Excel, use "Save As > CSV UTF-8". In Google Sheets, download as CSV (it's UTF-8 by default).
Products importing without variants - Check that your Option1 Name and Value columns are filled in. If they're blank, Shopify creates a "Default Title" variant.
Duplicate products instead of updates - When reimporting, check "Overwrite existing products that have the same handle". If unchecked, Shopify creates new products even when the handle already exists.
Prices showing wrong - Don't include currency symbols or thousand separators. Use 29.99, not $29.99 or 1,299.99.
