A SKU (Stock Keeping Unit) is the unique alphanumeric identifier a brand assigns to each distinctly sellable variant in its catalog — one SKU per size, color, scent, pack-size, or bundle combination. It is the atomic unit of inventory, pricing, fulfillment, and reporting: the storefront, the 3PL‘s WMS, accounting, ad feeds, and the analytics warehouse all join on it. A SKU that drifts between systems breaks every join that depends on it, which is why it’s treated as a stable, author-supplied key.
One SKU per variant, not per product
SKU granularity is set by what the brand tracks separately, not by what the customer sees as one product. A cotton tee in four sizes and three colors is twelve SKUs — each size-color combination has its own inventory count, velocity, and potentially cost. A 2-pack bundle of an existing single-unit SKU is its own SKU, because the pack ships, sells, and counts as a distinct unit.
SKU vs. Shopify variant ID vs. UPC
New operators commonly conflate the SKU with two adjacent identifiers.
The Shopify variant ID is a numeric primary key Shopify auto-generates inside its database. The SKU is the brand-supplied field Shopify stores alongside it in the variant’s sku slot — and every other system in the stack joins on that brand-supplied SKU, not on Shopify’s internal ID. Re-platforming changes the variant ID and should not change the SKU; if the SKU drifts in migration, every historical join breaks.
The UPC (and its GS1-issued global form, the GTIN) is a different layer: a globally unique 12-digit identifier registered with GS1 and encoded into the retail barcode. One product has one UPC, shared across every retailer that stocks it; the SKU is internal and arbitrary, and every retailer may assign its own.
Naming the SKU like you’ll have to read it later
A human-parseable SKU pays back every time an operator reads it under pressure. TSHIRT-BLK-M is instantly legible in a pick list, an RMA report, or a Google Shopping feed audit; a hash-style A7X9Q2 forces a lookup every time.
The discipline is to encode axes that are structural and stable — product type, color, size, pack-size — and not the ones that change. If “season” or “fabric weight” is encoded, every refresh creates a new SKU and orphans the velocity history attached to the old one.
Proliferation has a real cost
Every additional SKU adds carrying cost, forecasting variance, and stockout risk on the long tail. Each new SKU needs a forecast, a safety-stock buffer, a warehouse slot, and a row on every report someone reads. At a catalog of fifty, every SKU can get the same care. At five hundred it cannot, and the brand that hasn’t differentiated treatment stocks out on the SKUs that pay the rent while sitting on the ones that don’t.
That tension is why ABC analysis and SKU-velocity tracking exist — they scale operational attention to economic importance once the catalog outgrows the team’s bandwidth to treat every SKU equally.