Shopify product CSV guide
Validation failed: options are not unique — compare the expressed option tuple
Shopify reports “Validation failed: options are not unique” when option values collide. Multiple rows can legitimately share a product’s URL handle; the narrower problem is that two actual variant rows for that product express the same combination of option values. Image-only continuation rows should not be mistaken for another variant.
Build the identity carefully
Within a current product CSV, the URL handle groups rows belonging to a product. A variant is then distinguished by the values expressed under its option columns. For a product with Color and Size, the meaningful tuple might be (Blue, Small). If two variant rows under the same handle both express that tuple, an importer cannot treat them as two distinct option combinations merely because their SKUs, prices, inventory, or images differ.
The comparison must use the options that are actually expressed. Missing option dependencies can make a row ambiguous, so repairing duplicates by generating a made-up size or color is unsafe. Decide whether the row is accidental duplication, represents a genuinely missing option value, or belongs to a different product. The right repair changes catalog meaning and requires human judgment.
Why a repeated handle is not enough
A product commonly spans several rows. Variant rows repeat the handle so Shopify can associate them with the same product. Additional product images can also use continuation rows that repeat the handle while leaving option cells empty and supplying image data. Such an image-only row is valid in structure and is not another expressed option tuple. Deleting it as a “duplicate variant” could remove catalog imagery.
CSV SafeCheck therefore compares same-handle rows only when option values are expressed. It excludes a continuation row whose role is image data rather than a variant. This narrow rule reduces one known false positive, but it does not prove that every repeated row is semantically correct.
A conservative diagnosis sequence
- Sort or filter a copy by
URL handlewhile preserving the untouched source. - For each reported product, write down the option values expressed by the first variant row and the reported later row.
- Check whether both rows really represent variants. A row with empty option cells and only an image URL may be a valid continuation.
- If both are variants, compare SKU, inventory, price, barcode, and image fields to understand why both rows exist; those differences do not themselves create a distinct option combination.
- Remove or merge a row only when the catalog owner can identify the intended product structure. Otherwise introduce a missing legitimate option through the appropriate Shopify workflow, not an invented validator fix.
- Run preflight again, then inspect Shopify’s preview against a current backup before accepting an import.
What remains store-dependent
A local file cannot establish every collision. The checker does not know which handles and variants already exist in the target store, which overwrite settings the operator will choose, or whether another system will merge data before import. It also cannot verify remote image reachability or the intended image position in the live product. Store/position conflicts remain unverified, even when the file contains no duplicate expressed option tuple.
Primary sources
- Shopify Help Center: Using product CSV files
- Shopify Help Center: Common issues with product CSV files
- Shopify Help Center: Importing products with a CSV file
Retrieved 26 August 2026. The local rule is deliberately narrower than full store-aware validation and does not guarantee acceptance.