Shopify imported fewer products than my CSV had, and reported success

Two rows sharing a handle become one product. Shopify merges them silently, shows a "Products imported" banner, and never mentions what it collapsed.

What you are seeing

The import succeeded. The product count in Shopify is lower than the number of products in your file, and nothing tells you which ones are missing.

There is no error message for this one. That is the problem, not an omission on this page — the import reports success and the damage is only visible if you go looking for it.

Why it happens

Shopify groups rows into products by Handle and by nothing else. If two genuinely different products end up with the same handle, they become one product — the second one's data lands as variants or is dropped, and the import reports success either way. We put a file through a real store whose preview promised 5 products and 6 SKUs; 3 products arrived, under a success banner, with no warning naming the two that did not.

The collision is often invisible in the file, because Shopify normalises the handle before comparing. Two different-looking strings can slugify to the same handle: spaces, punctuation, accents and doubled hyphens all collapse. We watched "Gate-Q1-Foo-Bar" become "gate-q1-foo-bar" with no error at all.

The other shape is a handle appearing in two separate places in the file. Rows for one product do not have to be adjacent for Shopify to merge them, so a file sorted by supplier rather than by product can collide with itself and look perfectly ordered.

How to fix it

  1. Compare the count first, and compare products against products: count DISTINCT handles in your file, not rows. A row is not a product.
  2. Normalise your handles the way Shopify does — lowercase, non-alphanumerics to hyphens, collapse repeats, trim — and then look for duplicates in the normalised values. Duplicates in the raw column will miss the ones that only collide after slugification.
  3. Where two products legitimately share a name, disambiguate the handle deliberately (add the SKU or the colour) rather than letting the importer decide which one survives.
  4. If a handle is already in use by an existing product in the store, that one IS rejected outright rather than merged — so a mixture of loud and silent failures in one import is normal and does not mean two different problems.

Where this came from

We broke a real Shopify store on purpose to answer these questions, and kept what it said. Nothing on this page is quoted from documentation.

  • A file whose preview promised 5 products and 6 SKUs produced 3 products, under a "Products imported" banner, with no error, no warning and no mention of the two that did not arrive. Both collision shapes collapsed: rows sharing a handle in two separate places in the file, and two DIFFERENT strings that normalise to the same handle.
  • "Gate-Q1-Foo-Bar" was stored as "gate-q1-foo-bar". Spaces, punctuation, accents and doubled or trailing hyphens are slugified the same way and none of them is rejected. A handle that is already in use IS rejected outright.

What we did not measure. We measured the collapse and the normalisation on one store on 2026-09-04. We did not establish which row wins when two collide, only that one of them does not survive.

Observed 2026-09-04. The store this was measured on has since been deleted, so these answers are an archive rather than something we re-run — we would rather tell you the date than imply it is checked continuously.

Check your file before you upload it

The Pre-Flight Report reads your supplier file and names every blocker, with the row it is on, before you go near an importer. It is free, it needs no account, and it does not send your file to a model.

Check a file free