"My variants are showing as separate products instead of one product" — handle mismatch on variant rows
Shopify groups variant rows into one product purely by whether the Handle column is identical, character for character, on every row. One row with a slightly different handle becomes its own single-variant product instead of joining the rest.
What you'll see
Instead of one product page with a size or color dropdown, your storefront shows several nearly identical products, each with a single option and its own listing — a "Blue" product and a "Large" product sitting side by side rather than one product with both options.
Grouping runs on Handle, and only Handle
In Shopify's CSV format, the Handle column is the only thing that ties variant rows together into one product. It has nothing to do with the product Title, which can (and for readability, should) repeat across variant rows — Shopify doesn't group by title. It's purely: identical handle text means same product; any difference at all means a new product.
"Identical" is stricter than it sounds. A trailing space that's invisible in a spreadsheet cell, a difference in capitalization (blue-t-shirt vs. Blue-T-Shirt), or a slug that got auto-incremented to blue-t-shirt-1 because some export tool thought it detected a duplicate handle and "fixed" it — all of these read as a completely different product to Shopify's importer, even though they look the same to a person skimming the file.
How to check and fix it
Sort your file by Handle and scan for near-duplicates rather than assuming a copy-paste of the handle down the column preserved it exactly. When filling in the handle for new variant rows, copy the literal text of the cell rather than retyping it or relying on autofill, which can alter trailing characters. Re-upload once every intended variant row shares one exact handle.
More Convert a product spreadsheet to a Shopify import CSV — free. guides
← All Convert a product spreadsheet to a Shopify import CSV — free. guides