Template
Shopify product CSV template
Shopify's product importer is strict about headers, handles and variant rows, and most failed imports are one of five mistakes. This page gives you the column list with Shopify's current spellings, the rules for variants and images, a small CSV to start from, and the step that comes after import: turning that catalog into Google, Meta and TikTok feeds without exporting it again.
We connect your store, build the feed and keep it in sync. Updated 2026-10-27.
At a glance
- Only Title is required for a new product; URL handle is required when adding variants or updating. Everything else has a default.
- One row per variant and one row per extra image, all sharing the same URL handle. Up to three options and 250 images per product.
- Files must be UTF-8 comma-separated CSV; Shopify documents no row cap, so file size (15 MB per file in third-party guides) is the practical limit.
- Google Shopping columns (Google Product Category, Gender, Age Group, MPN, Condition, Custom Label 0-4) live in the CSV as 'Google Shopping / ...' metafield columns.
Shopify product CSV columns and what each one accepts
Shopify reads the header row to decide what each column is, so the spelling must match. The current headers use plain English ('URL handle', 'Product image URL') rather than the older 'Handle' and 'Image Src'; exports from a current store use the names below. Unless marked required, a blank cell gets a default.
| Column header | Required? | Accepts |
|---|---|---|
| Title | Required for new products | Customer-facing product name |
| URL handle | Required for variants and updates | Letters, numbers and dashes, no spaces; same value on every row of one product |
| Description | Optional | Product description (HTML allowed) |
| Vendor | Optional | Brand or source; becomes brand in most channel feeds |
| Product category | Optional | Shopify Standard Product Taxonomy breadcrumb or category ID |
| Type | Optional | Your own product type label, any format |
| Tags | Optional | Comma-separated, max 250 per product |
| Published on online store | Optional, default true | true or false |
| Status | Optional, default active | active, draft or archived; must have a value if the column exists |
| Option1 name / Option1 value | Optional | e.g. Size / M; up to three options; 'Default Title' for a single-variant product |
| SKU | Optional | Variant SKU |
| Barcodes | Optional | Up to 20, semicolon-separated, prefixed with a type such as gtin: |
| Price | Optional, default 0.00 | Amount only, no currency symbol |
| Compare-at price | Optional | Original price shown struck through |
| Inventory quantity | Optional, default 0 | Stock count for single-location stores |
| Continue selling when out of stock | Optional, default deny | deny or continue |
| Weight value (grams) | Optional, default 0 | Whole grams, no unit |
| Requires shipping | Optional, default true | true or false |
| Product image URL | Optional | Public URL; one row per image; max 250 per product |
| Image position | Optional | 1, 2, 3 ... display order |
| Image alt text | Optional | Max 512 characters |
| Variant image URL | Optional | Image for that variant row |
| SEO title / SEO description | Optional | Up to 70 / 320 characters |
| Google Shopping / Google Product Category | Optional | Google category breadcrumb or ID |
| Google Shopping / Custom Label 0 ... 4 | Optional | Custom label metafields used by Google Shopping campaigns |
Headers and rules from Shopify's help page on importing and exporting products with CSV, checked 2026-10-27. Option2 and Option3 columns mirror Option1.
Variant rows, image rows and the five import errors
A product with three sizes is four rows at minimum: the first row carries Title, Description, Vendor and Tags; the following rows repeat only the URL handle and the variant-specific columns (Option values, SKU, Price, Inventory quantity, Variant image URL). Extra images get their own rows with just the handle, Product image URL and Image position. Option combinations must be unique within a product, and changing an Option value later deletes and recreates the variant, which breaks anything keyed on the variant ID.
The five errors that reject most files: a header Shopify does not recognize (usually an old spelling or a trailing space); curly quotes or a non-UTF-8 save from Excel; a row with a handle but no title on the first row of a product; two variant rows with the same option combination; and a blank Fulfillment service when a value is expected (use manual). Save from Google Sheets or Numbers as CSV UTF-8 and the second error disappears.
From the Shopify product CSV to a channel feed
Once products are in Shopify, you do not need this CSV again to advertise them. Textfinity connects to the store directly and pulls products, variants, metafields, markets and locales; it never writes back to Shopify. The columns above become attributes you map to each channel's spelling: Vendor to brand, Product category to google_product_category, Option1 value to size or color, Barcodes to gtin, Inventory quantity to availability through a rule. The mapping is set once per feed and reapplied on every scheduled sync.
Shopify column → Google Shopping attribute (mapping rules)
Vendor → brand (rename)
Product category → google_product_category (rename)
Barcodes → gtin (remove from regexp: ^gtin:)
Option1 value → size (rename)
Inventory quantity → availability (advanced: if calc{[variant_inventoryQuantity]} > 0
then "in_stock" else "out_of_stock")
Vendor + Title + Option1 → title (combine, delimiter " ")Why the Google Shopping metafield columns matter
Shopify stores Google-specific attributes as metafields and exports them as 'Google Shopping / Gender', 'Google Shopping / Age Group', 'Google Shopping / MPN', 'Google Shopping / Condition' and 'Google Shopping / Custom Label 0' through 4. Filling them in the CSV means every feed tool, including the native Google & YouTube app, has the values. If you leave them blank, a feed tool can still derive them: gender from the product type, condition as a static 'new', custom labels from price or margin rules. Textfinity reads these metafields through the Shopify connection, so values entered once in the import carry into Google, Meta and Pinterest feeds without re-entry.
Keep in mind that the CSV cannot carry variant metafields, videos or 3D models; those are set in the admin. If your channel feed needs a variant-level attribute the CSV cannot hold, a merged source in Textfinity (a second CSV or Google Sheet joined on SKU) adds the column at feed time without touching Shopify.
Examples
Worked examples, by situation
Three rows you can paste into the template, from three different kinds of store.
A variant product across four rows
tee-shirt rows (columns trimmed)
Title,URL handle,Vendor,Option1 name,Option1 value,SKU,Price,Inventory quantity
Organic Crew Tee,organic-crew-tee,Fieldnote,Size,S,FN-TEE-S,29.00,12
,organic-crew-tee,,Size,M,FN-TEE-M,29.00,20
,organic-crew-tee,,Size,L,FN-TEE-L,29.00,8How we set it up
After import, Textfinity pulls the three variants as separate products sharing a product id. We map item_group_id as a rename of the Shopify product id, size as a rename of Option1 value, and title as a combine of Vendor, Title and Option1 value.
Extra image rows that share the handle
Before
Product image URL,Image position https://cdn.example/oak-desk-front.jpg,1
After
URL handle,Product image URL,Image position oak-desk-120,https://cdn.example/oak-desk-front.jpg,1 oak-desk-120,https://cdn.example/oak-desk-side.jpg,2 oak-desk-120,https://cdn.example/oak-desk-detail.jpg,3
How we set it up
Image rows carry only the handle, URL and position. In the feed we map image_link as a rename of the first image and additional_image_link as a combine of the rest with a "," delimiter. Feed hygiene's URL validation flags any image URL that is malformed before Merchant Center does.
Barcodes and Google Shopping columns in one row
headphones row (columns trimmed)
Title,URL handle,Vendor,SKU,Barcodes,Price,Google Shopping / Google Product Category,Google Shopping / Condition,Google Shopping / Custom Label 0
ANC Over-Ear Headphones,anc-over-ear,Soundline,SL-ANC-1,gtin:4006381333931,149.00,Electronics > Audio > Headphones,new,bestsellerHow we set it up
Barcodes arrive as 'gtin:4006381333931'. We map gtin with remove from regexp ^gtin:, which strips the prefix. The custom label metafield maps straight to custom_label_0; condition and category come through as entered.
Copy this plan
Import the CSV, then build the feeds without exporting again
About an hour the first time. Steps one to three happen in Shopify; we do four to six in Textfinity.
01
Download the template or export a current product
Export one existing product from Products → Export to get the exact headers your store uses, or start from the CSV below. Delete the example rows before adding your own.
02
Fill one row per variant and one per extra image
Same URL handle on every row of a product. Title, Description, Vendor and Tags only on the first row. Save as CSV UTF-8 with comma separators.
03
Import in Shopify and check the summary
Products → Import → upload. Tick 'Overwrite products with matching handles' only when updating. Fix any header or quoting error the summary reports and re-import.
04
Give the feed read access to the store
A read-only connection pulls products, variants, metafields, markets and locales on a schedule. Nothing is written back to Shopify.
What we set up: We connect your store through Textfinity's read-only Shopify connection once you approve access.05
Start a feed from the channel template and map the Shopify columns
The Google Shopping template already lists every attribute in Google's spelling. Map Vendor, Product category, Barcodes, Option values and Inventory quantity as shown above.
What we set up: We create the feed from the Google Shopping channel template and map each column as a rename, combine or advanced rule.06
Exclude what should not be advertised and publish
Drafts, archived products and zero-stock variants are the usual exclusions. Then add the feed URL to Merchant Center as a scheduled data source.
What we set up: We add exclude filters on product.status is not equal to ACTIVE and variant.inventoryQuantity is less or equal to 0, then add the feed URL to your Merchant Center with you.
Customization tips
Make it yours
Use Type and metafields for feed logic, not just navigation
A consistent Type ('Running Shoe', 'Desk') becomes product_type and a title component. Tags stay in Shopify: the Textfinity connection does not import them, so flags like 'clearance' or 'new-2026' belong in a product metafield, which a mapping condition turns into a custom label. Inconsistent values here mean regex clean-up later.
Fill Barcodes with the gtin: prefix
Typed barcodes import cleanly and the prefix is easy to strip in a feed rule. Untyped barcodes import as Custom, which some channels ignore.
Keep Compare-at price for sale feeds
Channels want the regular price in price and the discounted one in sale_price. With Compare-at filled you can map it as price and Price as sale_price; without it you have no way to show a discount.
Decide between the CSV and a merged source for extra attributes
Attributes that belong to the product (material, gender) go in the CSV once. Attributes that change for marketing (season label, margin band) are better in a Google Sheet merged onto the catalog in Textfinity, so you never re-import.
Downloads
Take the files
FAQ
Questions about shopify product csv template
Where do I get the official Shopify product CSV template?
Shopify's help page on importing products links a sample CSV, and any export from Products → Export produces a file with your store's exact headers. The download on this page uses the same current header names, with two example products you delete before adding your own.
Which columns are required in a Shopify product CSV?
Title is required to create a product. URL handle is required when a product has variants or when you are updating existing products. Every other column is optional and takes a default when blank: Price defaults to 0.00, Status to active, Inventory quantity to 0.
How do I add variants in the Shopify CSV?
One row per variant, all with the same URL handle. Put Title, Description, Vendor and Tags on the first row only; on the other rows fill the Option values, SKU, Price, Inventory quantity and Variant image URL. A product can have up to three options, and each option combination must be unique.
Can I use the Shopify product CSV as a Google Shopping feed?
Not directly; Google expects different headers (title, link, image_link, availability) and values such as in_stock. A feed tool maps the Shopify columns to Google's. Textfinity does this from the live Shopify connection rather than from the CSV, so the feed updates on a schedule without re-exporting.
Is there a limit on products per CSV import?
Shopify's help page does not state a row cap. Third-party guides cite a 15 MB file limit and advise splitting larger files. Stores with 500,000 or more variants are limited to 10,000 new variants per 24 hours unless on Shopify Plus.
Set up for you
Have your imported catalog turned into channel feeds.
Send us your Shopify store and the channels you sell on. We map Vendor, Barcodes and Option values once from the Google Shopping template, and Textfinity rebuilds every feed on a schedule.
Tell us your store and channels. We reply within 24 hours.