| Identifier | Scope | Public use | Main failure |
|---|---|---|---|
| product ID | Shopify product record | internal/API relation | exposed as SKU |
| variant ID | sellable variant | variant URL/cart relation | lost when first variant is assumed |
| handle | URL component | canonical routing | changes without redirect |
| SKU | merchant inventory item | fulfilment and Product offer | reused across distinct variants |
| barcode/GTIN | assigned trade item | cross-system identity | invented or parent value copied |
| MPN | manufacturer part | manufacturer identity | replaced by Shopify ID |
schema @id |
entity graph node | connects Product/Offer/Review | duplicate owners create unrelated IDs |
Rhode’s observed 4.2 oz and 1.7 oz offers used one SKU, so the correct scanner state is needs_review, not an automatic accusation. HexClad’s real SKU remained useful even though Default Title polluted the name.
Variant URL check
curl -sSIL 'https://example.com/products/item?variant=123'
The page should select variant 123, expose its price/stock/SKU, and retain an intentional parent canonical strategy.
Rules
- never invent identifiers
- preserve leading zeros in SKUs/barcodes
- attach variant identifiers to variant offers
- redirect changed handles directly
- keep
@idstable and connected - report missing as unknown when the business does not maintain the field
Related guide: Add missing identifiers.