ABC analysis answers one question: which items carry the money. It says nothing about the other question that decides how an item should be managed, which is whether its demand can be predicted. XYZ analysis supplies that second axis, scoring every SKU by the coefficient of variation of its demand, and crossing the two produces a nine-cell matrix that assigns a policy to each corner of the catalogue. Run ABC alone and you will hand your most erratic items the same replenishment automation as your steadiest ones, purely because both are expensive.
Key takeaways
- XYZ classes items by demand stability using the coefficient of variation (CV), the standard deviation of demand divided by its mean.
- Published CV cutoffs disagree: a widely quoted convention puts X below 0.5 and Z above 1.0, while other published guides draw the lines at 0.25 and 0.5, or tighter. Pick a convention, state it on the report, and tune it to your catalogue.
- Crossed with ABC, each of the nine cells gets its own policy: AX earns automated replenishment, AZ earns human review on every order, CZ is a delisting candidate.
- CV measures variability, not forecastability. A perfectly seasonal item can score Z, short histories make the classes jumpy, and intermittent demand needs a different metric entirely.
What XYZ analysis measures
For each item, take demand per period over a consistent history (commonly the last twelve months in monthly buckets) and compute:
CV = sigma / mu
sigma = standard deviation of demand per period
mu = mean demand per period
A low CV means demand hums along near its average; a high CV means the average is a poor guide to any given month. X is stable and forecastable, Y fluctuates (often seasonally or on a trend), and Z is irregular and hard to forecast.
The cutoffs are where honesty is required, because published sources do not agree. LeanDNA gives a widely quoted convention: X below a CV of 0.5, Y from 0.5 to 1.0, Z above 1.0. The EIKONA logistics wiki and Kladana both draw the lines at 0.25 and 0.5, and AbcSupplyChain tightens them further, to 0.1 and 0.25. The X boundary alone spans a factor of five across published guides.
Two lessons fall out. First, XYZ thresholds are conventions, not laws, so an XYZ class is meaningless unless the report states which convention produced it. Second, the right move is the same one used for the class lines in ABC: plot the distribution of CVs across your own catalogue, draw the lines where it actually bends, and write them down.
A worked example: three SKUs, twelve months
Here is the computation on three illustrative SKUs, each with a year of monthly demand, classified using the 0.5 and 1.0 convention:
| SKU | Twelve months of demand | Mean | SD | CV | Class |
|---|---|---|---|---|---|
| Fastener kit | 85, 110, 95, 120, 100, 90, 115, 105, 80, 95, 110, 95 | 100.0 | 12.2 | 0.12 | X |
| Patio heater | 40, 60, 90, 140, 180, 200, 190, 150, 100, 70, 50, 40 | 109.2 | 60.2 | 0.55 | Y |
| Legacy spare part | 0, 0, 45, 0, 0, 0, 120, 0, 0, 30, 0, 0 | 16.3 | 35.9 | 2.21 | Z |
Walking through the patio heater as the worked example: the twelve months sum to 1,310 units, so the mean is 109.2 per month. The sample standard deviation (divide the squared deviations by n minus 1, then take the root) comes to 60.2, and 60.2 divided by 109.2 gives a CV of 0.55, just over the X line. Note what the number is and is not saying: the heater is not unpredictable, it is seasonal, and that distinction will matter in the limits section below.
The fastener kit wobbles a little around a flat level and lands deep in X territory. The legacy spare part sells nothing most months and then moves in bursts, and the zeros push its CV to 2.21, far into Z. Note that under the stricter 0.25 and 0.5 lines the patio heater would land in Z instead of Y, which is exactly why the convention belongs on the report header.
The nine-cell matrix
Cross the value classes from ABC analysis with the stability classes from XYZ and you get a policy map:
| X (CV below 0.5) | Y (CV 0.5 to 1.0) | Z (CV above 1.0) | |
|---|---|---|---|
| A (high value) | AX: automate replenishment, tight buffers, high service target | AY: statistical forecast with a seasonal profile, planner reviews exceptions | AZ: human review on every order, demand sensing, consider make-to-order |
| B (mid value) | BX: automate, periodic review | BY: automate with wider buffers and exception alerts | BZ: rule-based ordering with caps, quarterly policy review |
| C (low value) | CX: min-max, large infrequent orders | CY: min-max with a generous max | CZ: delisting candidate, order on demand, or hold none |
Three cells do most of the work. AX is where automation earns its keep: high value plus stable demand means a well-tuned reorder policy runs for months without intervention, and planner time spent here is wasted. AZ is the dangerous cell: high value plus erratic demand means any formula sized on averages will either bleed cash or stock out, so these items earn demand sensing on real signals (quotes, project pipelines, distributor commitments) and a human look at every order. CZ is the honesty cell: low value plus erratic demand usually costs more to manage than it contributes, which makes it the natural place to start a delisting review.
“The matrix is really a staffing decision. AX items should never see a human, and AZ items should never miss one. Most teams spend their planner hours exactly backwards, hand-checking orders a formula already got right while the erratic tail runs on autopilot.”
Nikhil Jathar, founder of AvanSaber
Where XYZ misleads
CV punishes seasonality it should not
CV measures variability, not forecastability. The patio heater above follows a demand curve any seasonal model would fit comfortably, yet raw CV files it alongside genuinely erratic items, and a sharper seasonal swing would push a perfectly predictable product into Z. If your catalogue is seasonal, either deseasonalize demand before computing CV or, better, compute the CV of forecast errors rather than of raw demand, so the classification reflects what your demand forecasting process can already explain.
Twelve data points is a thin basis
A standard deviation estimated from twelve observations is noisy, and the CV inherits that noise. One promotion, one stockout month, or one large project order can hop an item across a class line, so an XYZ run on a short history is partly a classification of your data quality. Two habits keep it honest: recompute on a schedule rather than once, and require a class change to persist for two consecutive runs before policy changes with it. Bucket size matters too. The same item shows a higher CV in weekly buckets than in monthly ones, because aggregation smooths variation, so classes are only comparable when everyone computes them at the same granularity.
Intermittent demand breaks the metric
Zeros inflate CV in a way that conflates two different situations: an item that is genuinely wild, and an item that is quiet with occasional, well-behaved bursts. The legacy spare part’s CV of 2.21 reads as “unmanageable” when the truer statement is “intermittent”. The intermittent-demand literature classifies such items on two axes instead, the average interval between demands (ADI) and the squared coefficient of variation of demand sizes, with cutoffs at 1.32 and 0.49 in the categorization scheme of Syntetos, Boylan and Croston (2005). Forecasting them calls for Croston’s method (1972) and its descendants, which estimate demand size and demand interval separately. We cover the practical choices in forecasting intermittent demand. The practical rule: pull the intermittent tail out of the XYZ pipeline before you compute anything, or the Z class becomes a junk drawer.
Running the matrix well
- Start from the ABC run you already have. XYZ is one extra computed column in the same dataset, not a new project.
- Recompute quarterly, and log class migrations. An item drifting from Y to Z is an early demand-signal warning, not just a reclassification.
- Wire each cell to a concrete policy: a service target, a review cadence, and a replenishment method. A matrix that does not change how orders happen is decoration.
- Spend forecasting effort where the matrix says it pays: AY and BY reward a proper seasonal model, AZ rewards demand sensing, and X items mostly need their history left alone.
“A CZ item is not really a product anymore, it is a standing cost with a SKU number attached. The matrix does not make the delisting decision for you, but it gives you permission to ask the question out loud.”
Nikhil Jathar, founder of AvanSaber
The takeaway
ABC tells you where the money sits; XYZ tells you where the surprises sit; the matrix tells you where to put automation, planner attention, and the delisting conversation. Classification is the cheap first step, and the payoff is in the policies each cell triggers, where lot sizing, buffers, and review cadence meet, the machinery described in running inventory and order management as one practice. If you want help wiring the cells to real policies, and deciding what the Z tail actually deserves, AvanSaber’s inventory advisory practice runs exactly this assessment.
Compute the second axis. Value told you what an item is worth; variability tells you whether you can trust it.