Fix "Validation failed: options are not unique" in a Shopify CSV
Exact error message
- Validation failed: options are not unique
Shopify shows "Validation failed: options are not unique" when two variants of the same product end up with the same option values, for example two rows with Size M. Usually a row was copied and not changed, or two products share a handle. Drop the file below: the tool lists the colliding rows for each product.
Wording and rules verified on
Fixed in your browser – your file never leaves your device.
Files over 50 rows: 1 credit each ($0.75–$1 depending on pack), no subscription · See prices
Several files? Select or drop them together to fix them all at once.
Sample files with typical import errors, loaded in your browser. Fixing and downloading them is free.
Why it happens
Shopify builds a product from every row with the same handle (URL handle in the current template). Each of those variant rows needs a different combination of Option1, Option2 and Option3 values, because the combination is what tells the variants apart.
The line in the error can be the line where the product starts rather than the duplicate row. With many variants per product the colliding row can be far below it.
- A variant row was copied and its option value wasn't changed: two rows say Size M.
- Two values that look different are the same to Shopify: "M" and "m", or "Blue" and "Blue " with a trailing space.
- A product has two options (Size and Color), but one column was left empty, so rows that differed only in that option collapse into one combination.
- The same handle is used again further down the file, so a second product's rows join the first product and their options collide.
How to fix it manually
Excel or Google Sheets
- Sort by handle (keep the original order in a spare column if you need it back), so each product's rows sit together.
- Add a helper column that joins the handle and the option values, e.g. =A2&"|"&LOWER(TRIM(I2))&"|"&LOWER(TRIM(K2)) with your Option1 and Option2 Value columns.
- Use conditional formatting → Highlight duplicate values on the helper column. Every highlighted pair is a collision.
- For each pair, delete the row if it's a real duplicate, or correct the option value. If two different products share the handle, give one of them its own handle.
- Delete the helper column and save as "CSV UTF-8 (Comma delimited)".
Before and after
Handle,Title,Option1 Name,Option1 Value,Variant Price
organic-tee,Organic Cotton Tee,Size,M,24.90
organic-tee,,,L,24.90
organic-tee,,,m,24.90Handle,Title,Option1 Name,Option1 Value,Variant Price
organic-tee,Organic Cotton Tee,Size,M,24.90
organic-tee,,,L,24.90
organic-tee,,,XL,24.90The third variant was meant to be XL, but its row says "m", the same size as M. The fixed row gives it its own value.
Fix it automatically
- Groups the rows into products by handle, the way Shopify does, in both the current and the old template.
- Compares option values ignoring capitalisation and extra spaces, and lists every variant whose combination is already taken, with its line number.
- Flags a handle that's reused by a second product further down the file.
- Doesn't delete or rename variants on its own: whether a row is a duplicate or needs another value is your call.
Checking and the preview are free. Downloads are free up to 50 rows; a larger file costs 1 credit.
Choose a fileThe file is read and repaired inside your browser. Nothing is uploaded: only the row count and the platform are ever sent to us, so supplier prices and customer data stay private.