Opening a Shopify CSV format file for the first time can be intimidating. It is a wide spreadsheet with far more columns than your products seem to need, rows that look like duplicates, and product titles that appear on one row and then vanish. None of that is a mistake. The format has a logic to it, and once you understand a handful of ideas — handles, variant rows, and image rows — the whole file becomes readable.
One product can take several rows
The most important idea comes first. In this format, one row is not one product. One row is one variant or one image belonging to a product. A simple product with no variants might be a single row. A shirt in three sizes is four rows in spirit: the details sit on the first row, and each extra variant adds a row underneath.
That is why titles repeat strangely and then go blank. The product's main information lives on the first row for that product. Following rows carry only the extra information they need, such as a different size, a different price, or an additional photo.
A small example, simplified on purpose
The real file has 96 columns, and the table below shows only a few of them so the pattern is easy to see. This is a simplified illustration, not the full format.
| Title | Handle | Option1 Name | Option1 Value | Variant Price | Image Src |
|---|---|---|---|---|---|
| Classic Tee | classic-tee | Size | S | 20 | image-1 |
| classic-tee | M | 22 | image-2 |
The example shows a product called "Classic Tee", handle classic-tee, with two variants. Row 1 has Title "Classic Tee", Option1 Name "Size", Option1 Value "S", Variant Price 20, Image Src image-1. Row 2 has the same handle, Title blank, Option1 Value "M", Variant Price 22, Image Src image-2.
Read it as one product, not two. Shopify groups both rows by the shared handle and builds a single product page with a size choice: S at 20, or M at 22.
The handle groups rows into one product
The handle is the quiet organiser of the whole file. It is a short, URL-friendly version of the product name — classic-tee for Classic Tee — and it becomes part of the product's web address in your store.
Every row with the same handle belongs to the same product. Change a handle on one row and you can split a product in two by accident. Leave a handle inconsistent between rows and variants can detach from the product they belong to. When an import looks wrong, checking that handles are identical down a product's rows is one of the first useful checks.
Variants, options, and prices
Options are the choices a customer makes: Size, Colour, Material, and so on. The Option Name columns say what the choice is, and the Option Value columns give the answer on each row, such as S or M.
Each variant row carries its own Variant Price, because variants often cost different amounts, as the S and M rows above show. A variant can also carry its own SKU, so stock can be tracked per size or colour rather than only per product.
The compare-at price column carries the "was" price. If a variant is on sale, the Variant Price holds the selling price and the compare-at column holds the higher original price your store displays crossed out. Leave that column empty when there is no sale; an invented was-price makes a dishonest listing.
Images and markets columns
Extra images go on additional rows. A product with one variant but five photos still needs extra rows so each image has somewhere to live, with the image location in the Image Src column. That is another reason a file grows taller than the number of products it contains.
Further across the file sit the markets columns, labelled with Included and a country. These control where a product is sold. When products seem to vanish for overseas customers, these columns are a sensible place to look.
Why you must never renumber, reorder, or rename columns
Shopify maps by header name and order in its own export format, so the header row is a contract between your file and Shopify's importer. Never renumber, reorder or rename columns, even if a column looks unused or a different order seems tidier to you.
The safest way to obtain a correct file is to start from Shopify's own export format — exactly what a good extraction tool produces — and then edit values inside the rows, leaving the header row completely alone. Deleting a whole column you do not use feels harmless and can break the mapping for everything after it.
Common mistakes worth avoiding
Blank titles on later rows are normal, so do not fill them in. Broken image links are a genuine error: if an Image Src address is wrong, the product imports without that photo. Prices typed with currency symbols or commas can also fail, so keep prices as plain numbers, the way an export writes them.
Finally, test first. Import two products, open them in your store, and only then import the rest. The extractor guide walks through that routine in full.
Frequently asked questions
How many columns does a Shopify product CSV have?
WeCalculator's export matches Shopify's own export format, which has 96 columns. Most products only need values in some of them, and the rest can stay blank.
Can I delete columns I do not use to make the file smaller?
No. Keep the header row exactly as exported. Edit values in the rows instead, because Shopify relies on the column names and order to map your data.
Why does one product appear on several rows?
Because each variant and each extra image gets its own row under the same handle. Shopify reads all rows sharing a handle as a single product.
Get a correctly formatted file without building one
You do not have to assemble 96 columns by hand to use this format. Paste a product or collection URL into the Shopify Product Extractor and it produces a CSV in Shopify's export format, with handles, variant rows, prices, and images already arranged. Review the file using the ideas above, test it with two products, and you will understand exactly what Shopify is about to import before you press the button.