ClearStock is live on the Shopify App Store.Install free →

← All blogs

Guides7 min read

XYZ analysis — classify demand stability and pair it with your ABC data

XYZ analysis inventory method: classify SKUs by demand stability — X steady, Y seasonal, Z lumpy. Compute CV and read the ABC×XYZ matrix per cell.

InventoryX is in development and not available today. ClearStock is the live Shopify app.

XYZ analysis classifies every SKU by how stable its demand is: X items sell at a steady, predictable rate, Y items swing with season or promotion, and Z items are lumpy — long silences punctuated by bursts. It answers the question ABC can't: two SKUs can both be class-A revenue drivers, but one sells 3 units every single day while the other sells 40 in a week and nothing for a month — and they need completely different buying methods. This article gives you the CV calculation, the ABC×XYZ matrix, and what each cell deserves.

The classification: coefficient of variation

XYZ is computed from demand variability, usually via the coefficient of variation (CV): the standard deviation of periodic demand divided by its mean. Take a demand window (weekly buckets over 12 weeks works for most catalogs), compute mean and standard deviation per SKU, then CV = σ ÷ mean.

Common cutoffs — treat them as conventions, not laws, and recalibrate against your own catalog:

Class CV (weekly demand) Character Examples
X ≤ 0.5 Steady, predictable Everyday consumables, staples
Y 0.5–1.0 Variable, patterned Seasonal goods, promo-driven items
Z > 1.0 Lumpy, erratic Big-ticket sporadic buys, new products, fads

Worked example, three SKUs from an aquarium supply store, 12 weekly buckets (illustrative data):

SKU Weekly sales (12 wks) Mean Std dev CV Class
FILTER-CARB-3PK 22, 20, 24, 21, 19, 23, 22, 20, 21, 24, 22, 20 21.5 1.6 0.08 X
HEATER-100W 8, 3, 2, 1, 2, 4, 14, 18, 15, 9, 4, 2 6.8 5.9 0.86 Y
TANK-75GAL 0, 0, 2, 0, 0, 0, 1, 0, 0, 3, 0, 0 0.5 1.0 2.00 Z

Same store, three different planning problems. FILTER-CARB-3PK can run on a plain reorder point. HEATER-100W needs a seasonal buy pattern. TANK-75GAL should not have an automated reorder at all — its demand is events, not a rate.

One correction before you compute: use demand that excludes dark days. A SKU that was out of stock for three of the twelve weeks shows artificially low (and artificially variable) demand — the same censoring error that corrupts velocity generally (the in-stock-only correction). Where you know the dark weeks, either exclude them or interpolate the rate; where you don't, read Z classifications on fast-movers with suspicion, because frequent unavailability can masquerade as lumpiness.

The ABC×XYZ matrix

ABC ranks importance (typically by revenue or profit contribution — the spreadsheet method is owned by ABC inventory analysis); XYZ ranks predictability. Cross them and every SKU lands in one of nine cells, and each cell has a natural method:

X (steady) Y (seasonal) Z (lumpy)
A (top value) The cash engine. Tight reorder points, modest safety stock, frequent counts. Automate attention. The managed risk. Seasonal buys planned backward from peak; deeper safety stock through the swing window. The white whale. Hand-buy each order; consider preorders or deposits; never let a formula own it.
B (middle) Low effort, keep the routine. Standard planning with a seasonal overlay. Order-to-demand where possible; hold shallow stock.
C (tail) Candidates for min/max automation; near-zero attention. Buy shallow, clear fast, don't carry over. The elimination zone. Question why it exists at all — this cell feeds rationalization.

Two cells deserve special attention:

  • A×Z is where money is made or lost. High value, unpredictable demand — the worst combination. The methods that work are human judgment per order, customer commitments (preorders, deposits), and refusal to carry deep speculative stock. If a third of your capital sits in A×Z, that's the store's central planning problem.
  • C×Z is the quiet bleed. Low value and lumpy demand means every unit bought is a small bet you'll never notice losing. These SKUs are natural candidates for pruning or made-to-order handling.

What each class gets operationally

  • X items: trust the math. A standard reorder point with modest safety stock sized to their low variance is sufficient; over-buffering X items is the most common waste in stores that just added buffers everywhere.
  • Y items: the method is calendar-driven, not rate-driven. Plan the seasonal buy backward from the demand window, and recompute CV on in-season weeks only — a full-year CV blends two different products (in-season and off-season) into one meaningless number.
  • Z items: turn off automated triggers. Event-based buying, explicit forecast bets you can audit later, or exit. Measure forecast quality on these separately if you try to forecast them at all (MAPE and bias) — a blended catalog MAPE mostly measures Z-item noise.

Before/after: what the classification changes

Before, one undifferentiated rule — "reorder at 2 weeks of cover" — applied to all three example SKUs. The results:

  • FILTER-CARB-3PK: fine, by luck. Steady demand makes almost any rule look OK.
  • HEATER-100W: the rule buys 2 weeks of cover in September, right before the winter run — every year, a repeat gap during the exact weeks that matter.
  • TANK-75GAL: the rule triggers a reorder after the 3-unit burst in week 10, ordering stock that sits for months until the next burst.

After XYZ: the filter runs on autopilot with minimal buffer; the heater gets a planned seasonal buy starting September at deeper cover; the tank has no trigger at all — it's hand-bought against the events that create demand. Same catalog, same effort ceiling, three appropriate methods instead of one wrong one applied three ways.

Doing it in a spreadsheet, quickly

  1. Export 12 weeks of sales by SKU (weekly buckets).
  2. Compute mean and sample STDEV (STDEV.S) per row, then CV = STDEV.S ÷ mean.
  3. Apply the class cutoffs with an IFS formula; blank or zero-mean SKUs go straight to Z pending review.
  4. Join with your ABC classes (value ranking) and pivot the 3×3 matrix; sort within cells by inventory value to see where the capital actually sits.
  5. Refresh quarterly — classifications drift as catalogs and demand patterns shift.

Common questions

What is XYZ analysis in inventory management? XYZ analysis classifies SKUs by demand stability: X items have steady, low-variability demand (CV typically ≤ 0.5), Y items fluctuate with season or promotions (0.5–1.0), and Z items are lumpy and erratic (> 1.0). The class determines which planning method — automated reorder, seasonal planning, or hand-buying — fits the SKU.

How do you calculate XYZ classification? Bucket demand into consistent periods (usually weeks) over a window like 12 weeks, compute the mean and standard deviation per SKU, and divide: CV = standard deviation ÷ mean. Apply your class cutoffs to the CV. Exclude or correct out-of-stock periods first, or unavailability will masquerade as instability.

What's the difference between ABC and XYZ analysis? ABC ranks SKUs by importance — usually revenue or profit contribution; XYZ ranks them by demand predictability. ABC decides where attention goes; XYZ decides which method each item gets. Combined in the 3×3 matrix, they assign both an attention level and a planning approach to every SKU.

What should I do with Z items? Stop applying rate-based reorder rules to them. Buy Z items event-by-event against real orders or known occasions, use commitments like preorders where the item is valuable enough, and prune the low-value Z cell — low-value lumpy SKUs are the classic rationalization candidates.

How often should I re-run XYZ classification? Quarterly is a sensible default — class memberships drift as products mature and seasons rotate. Re-run sooner after major catalog changes, new product introductions (which always start as Z), or a demand-shifting event like a new channel.

Your next step

Run the CV calculation on your top 50 SKUs by revenue this week — they hold most of your capital, so their X/Y/Z labels matter most. Cross-tab against your existing ABC classes, then read the A×Z and C×Z cells first: one needs a hand-buying policy, the other needs a pruning review, and both are sitting there in your own data.