Variant rows, image rows and repeated handles
A Shopify product CSV is not one row per product. It is one row per variant, plus extra rows for additional images โ all tied together by the Handle column.
The shape of a product
- The first row for a handle carries the product-level fields: Title, Body (HTML), Vendor, Type, Tags, Published, and the first variant.
- Later rows with the same handle carry only variant-level fields โ option values, SKU, price, inventory. Their Title and description cells are intentionally blank.
- Image rows repeat the handle with only Image Src, Image Position and Image Alt Text filled in.
Blank is not the same as missing
Filling every blank can alter intentionally omitted data. Repeated handles alone are not duplicate products. CSV Spruce never fills blank product fields or copies them down, and never merges or de-duplicates repeated handles.
When a blank really is a blocker
- A missing handle when variant rows need grouping. Simple new-product files without variants can use Title alone.
- An empty Title on the first row of a handle โ Shopify has no product name to create.
Both stop the report at a blocker, with the row numbers listed. We do not invent a title from a handle or a file name.
Row counts and ragged rows
Every row must have the same number of comma-separated values as the header, even when most are empty. Rows that are short or long usually mean an unescaped comma or quote earlier in the file. Padding them would shift values into the wrong columns, so this is a blocker rather than a fix.
A two-row example
This synthetic excerpt illustrates grouping, not a complete import template.
| URL handle | Title | Option1 name | Option1 value |
|---|---|---|---|
| test-shirt | TEST Shirt | Size | Small |
| test-shirt | (blank) | Size | Large |
Both rows describe one product. CSV Spruce preserves their grouping. It cannot resolve duplicate variant combinations or invent missing options.
Header troubleshooting ยท TRUE/FALSE guide
Official documentation
Run your file through the free check to see how your rows are grouped.