ABC-XYZ Analysis for S&OP: How to Calculate the Matrix and Set Inventory Policy
Step-by-step ABC-XYZ analysis: ABC cut-offs, CV thresholds, Excel formulas, a worked 8-SKU example, and the service level and forecasting method per cell.

TrueGradient Editorial Team

ABC-XYZ analysis is an inventory segmentation method that crosses two classifications: ABC, which ranks SKUs by annual consumption value, and XYZ, which ranks them by demand variability. The output is a nine-cell matrix that tells a planning team three things at once: where to spend analyst time, how much service level to buy, and which forecasting method each SKU deserves.
For Shopify teams connecting planning to storefront demand, Install TrueGradient for Shopify to turn store data into demand forecasts, reorder plans, and inventory decisions.
This guide is the working version. It covers the calculation for both axes, a worked eight-SKU example you can reproduce in a spreadsheet, a policy for every cell, the forecasting method that fits each variability class, and the FSN and VED extensions that catch what value and variability miss. If you want to see how the clusters feed a forecasting model directly, read cluster-level demand forecasting with ABC-XYZ. If you are questioning whether the method still holds for a fast-moving catalogue, read why ABC-XYZ classification breaks for growing brands.
What is ABC-XYZ analysis in S&OP?
ABC analysis applies the Pareto principle to inventory: a small share of SKUs carries most of the value. On its own, it treats every A item the same, whether its demand is flat all year or swings by a factor of five. XYZ analysis adds the missing dimension by measuring how much each SKU's demand varies from period to period.
Crossing the two gives nine cells, from AX (high value, stable demand) to CZ (low value, erratic demand). Each cell answers a different operational question. An AX item is worth protecting and cheap to protect, because its forecast is reliable. An AZ item is worth protecting but expensive to protect, because its forecast is not. A CZ item is rarely worth protecting at all. The value of the analysis is not the matrix itself but the differentiated policy it lets you run across thousands of SKUs without reviewing each one by hand.
How to calculate the ABC axis
- Choose the value basis. Annual consumption value (unit cost × annual units) is the standard. Gross margin contribution is a better basis for brands whose price points vary widely, because a high-revenue, low-margin SKU should not automatically outrank a high-margin one.
- Choose the granularity. Classify at the level where you set inventory policy. If safety stock is held per warehouse, classify per SKU-location, not per SKU; a SKU can be A in one region and C in another.
- Rank and accumulate. Sort SKUs by value, descending, and compute each SKU's cumulative share of total value.
- Apply the cut-offs. A common convention is A up to 80% of cumulative value, B up to 95%, and C for the remainder. In most consumer-goods catalogues, this puts roughly 10 to 20% of SKUs in A. Decide how to treat the SKU that straddles a boundary (this guide assigns it to the higher class) and apply the rule consistently.
How to calculate the XYZ axis with the coefficient of variation
The XYZ axis uses the coefficient of variation (CV), which normalises demand variability by the size of demand so that a 10,000-unit SKU and a 100-unit SKU can be compared on the same scale:
CV = standard deviation of periodic demand ÷ mean periodic demand
- Fix the time bucket. Monthly buckets are the usual choice for classification. Weekly buckets inflate CV for slower movers, so the same SKU can be X on monthly data and Z on weekly data. Pick one and never mix them.
- Use 12 to 24 months of history. At least one full seasonal cycle is needed; otherwise, a seasonal SKU is classified on whichever half of the year you happened to sample.
- Clean the demand series first. Replace periods suppressed by stockouts (zero sales while out of stock is not zero demand), separate promotional lift and one-off bulk orders from base demand, and exclude the launch ramp of new products. Classification on raw sales measures your past supply problems as much as your demand.
- Assign the classes. A common starting point is X for CV below 0.5, Y for 0.5 to 1.0, and Z above 1.0. These are conventions, not standards: tune them so each class holds a workable number of SKUs.
Even on cleaned demand, CV measures variation, not forecastability: a large but perfectly regular seasonal peak still scores as volatile. That distinction, and what to do about it, is covered in why ABC-XYZ classification breaks for growing brands.
ABC-XYZ analysis worked example
The table below applies both steps to eight SKUs using 12 months of monthly demand. ABC cut-offs are 80% and 95% of cumulative value; XYZ thresholds are 0.5 and 1.0. The data is illustrative.
| SKU | Unit Cost | Annual units | Annual value ($) | Cum. value % | Mean monthly demand | Std dev | CV | Cell |
| SKU-01 | 120 | 4,882 | 585,840 | 57.8 | 406.8 | 10.0 | 0.02 | AX |
| SKU-02 | 85 | 3,510 | 298,350 | 87.3 | 292.5 | 157.1 | 0.54 | AY |
| SKU-04 | 22 | 2,480 | 54,560 | 92.7 | 206.7 | 7.0 | 0.03 | BX |
| SKU-03 | 60 | 685 | 41,100 | 96.8 | 57.1 | 87.6 | 1.54 | BZ |
| SKU-05 | 18 | 1010 | 18,180 | 98.5 | 84.2 | 59.7 | 0.71 | CY |
| SKU-07 | 6 | 1,806 | 10,836 | 99.6 | 150.5 | 2.1 | 0.01 | CX |
| SKU-08 | 5 | 550 | 2,750 | 99.9 | 45.8 | 21.1 | 0.46 | CX |
| SKU-06 | 9 | 125 | 1,125 | 100.0 | 10.4 | 19.5 | 1.87 | CZ |
What the example shows:
- Value concentrates fast. Two SKUs, 25% of the range, carry 87.3% of value. SKU-02 crosses the 80% line and is assigned to A under the straddle rule.
- Same class, opposite policies. SKU-01 and SKU-02 are both A, but a CV of 0.02 against 0.54 means one can run on a lean statistical buffer while the other needs a model that explains its swings.
- SKU-02's pattern is structured. Its demand alternates high and low month to month, which looks like a promotional cadence rather than noise. Whether it truly belongs in Y is exactly the question the XYZ axis cannot answer by itself.
- The Z items are intermittent, not just volatile. SKU-03 has five zero months, and SKU-06 has eight. CV alone treats them like any other volatile SKU; the intermittent-demand classification further down separates them properly.
- Stable does not mean important. SKU-07 has the lowest CV in the range but sits in C. Automate it and stop reviewing it.
How to run ABC-XYZ analysis in Excel or Google Sheets?
Most teams build the first version of this in a spreadsheet, and it is worth doing once by hand before automating it. Lay out one row per SKU as follows, with twelve monthly demand columns in F to Q.
| Coulmn | Contents | Formula |
| A | SKU code | Entered |
| B | Unit cost | Entered |
| C | Annual units | =SUM(F2:Q2) |
| D | Annual consumption value | =B2*C2 |
| E | Cumulative value share (sort by D, descending, first) | =SUM($D$2:D2)/SUM($D$2:$D$500) |
| F to Q | Cleaned monthly demand | Entered after the cleaning step |
| R | ABC class | =IF((SUM($D$2:D2)-D2)/SUM($D$2:$D$500)<0.8,"A",IF((SUM($D$2:D2)-D2)/SUM($D$2:$D$500)<0.95,"B","C")) |
| S | Coefficient of variation | =STDEV.P(F2:Q2)/AVERAGE(F2:Q2) |
| T | XYZ class | =IF(S2<0.5,"X",IF(S2<=1,"Y","Z")) |
| U | ABC-XYZ cell | =R2&T2 |
Three notes that decide whether the output is usable:
- The ABC formula deliberately tests the cumulative share before the SKU is added, which is what implements the straddle rule from the section above. Using the plain cumulative share instead pushes every boundary SKU down a class.
- Clean the demand columns before the CV column, not after. Where a month was suppressed by a stockout, replace it with the planner's demand estimate or the median of the unaffected months; where a month contains a promotion or a one-off bulk order, hold the base demand in the cell and keep the lift in a separate column.
- STDEV.P versus STDEV.S: use the population form when the twelve months are the whole period you are classifying on. The sample form inflates the CV slightly and pushes borderline SKUs from X into Y.
To add the intermittent-demand test from the forecasting section, add two more columns: average demand interval =COUNT(F2:Q2)/COUNTIF(F2:Q2,">0"), and the squared CV of non-zero sizes =(STDEV.P(IF(F2:Q2>0,F2:Q2))/AVERAGEIF(F2:Q2,">0"))^2, which needs to be entered as an array formula in older Excel versions and works directly in Google Sheets and current Excel.
Finally, build the distribution table you will need for the next section: =COUNTIF($U$2:$U$500,"AX") for the SKU count in each cell, and =SUMIF($U$2:$U$500,"AX",$D$2:$D$500)/SUM($D$2:$D$500) for its share of value.
A spreadsheet is the right tool for the first pass and the wrong tool for the tenth. Once the classification has to be re-run on a schedule, reconciled against live sales and applied to policy automatically, the manual version becomes the bottleneck described in signs your demand planning has outgrown Excel.
How to tune ABC-XYZ cut-offs for your inventory catalogue
The 80/95 and 0.5/1.0 thresholds are conventions. The test of whether they fit your catalogue is the distribution they produce, so run the classification, build the count and value table per cell, and check four things:
- Is the A tier the right size? Roughly 10 to 20% of SKUs carrying about 80% of value is the usual shape. If A holds 40% of your SKUs, value is less concentrated than the default assumes and the cut-off should tighten; if it holds 3%, loosen it, because a tier that small cannot absorb the analyst attention it is meant to receive.
- Is any cell empty or overwhelming? A cell holding more than about half the catalogue is not segmenting anything. If almost every SKU lands in Z, suspect the inputs before the threshold: weekly buckets, uncleaned promotional demand, and stockout-suppressed history all inflate CV across the board.
- Does each cell contain SKUs a planner would group? Pull ten SKUs from each cell and review them with the demand planner. If AY and AZ look interchangeable to the people who manage them, the Y and Z boundary is not doing work.
- Do the cells survive a re-run? Classify on the trailing twelve months, then on the twelve months before that. SKUs that swing across two classes between the runs are telling you the boundary is inside their normal range, not that they changed behaviour.
Record the thresholds alongside the classification date. Comparing this quarter's cell distribution against last quarter's is only meaningful if the cut-offs were the same, and undocumented threshold changes are the most common reason two analysts produce different matrices from the same data.
ABC-XYZ matrix: inventory policy for each cell
The matrix earns its keep when each cell maps to a policy the system can execute without a planner touching it. The targets below are illustrative starting points, not benchmarks. Set real targets from margin, lead time, substitutability, and the cost of a lost sale in your category.
| Cell | Service level target | Review Cadence | Safety stock approach | Forecasting approach |
| AX | 97–99% | Weekly, automated with exception alerts | Statistical buffer from forecast error, kept lean | Statistical or ML time-series |
| AY | 95–98% | Weekly, planner-reviewed | Buffer sized to seasonal and promotional error | Models with explicit trend, seasonality and promotion drivers |
| AZ | 93–97% | Weekly or faster, planner-owned | Distribution-based buffer; prefer supplier flexibility over stock | Probabilistic forecast plus planner judgment |
| BX | 95–97% | Bi-weekly, automated | Statistically, lean | Statistical time-series |
| BY | 93–95% | Bi-weekly | Moderate, seasonally adjusted | Seasonal or driver-based models |
| BZ | 90–93% | Bi-weekly, exception-based | Distribution-based | Intermittent-demand methods |
| CX | 90–95% | Monthly, fully-automated | Min-max or fixed days of cover | Simple exponential smoothing |
| CY | 85–90% | Monthly, automated | Days of cover | Simple methods |
| CZ | Case by case, often make-to-order | Quarterly rationalisation review | Minimal or none; centralise stock | Do not invest; rationalise |
Read the matrix along two gradients. Moving from C to A, the cost of a stockout rises, so service level and analyst attention rise with it. Moving from X to Z, the forecast becomes less trustworthy, so the buffer has to carry more of the uncertainty and planner oversight increases. AX is the easy corner: important, and cheap to protect because the forecast is reliable. AZ is the hard corner: important, and expensive to protect, which is why supplier lead-time flexibility is often a cheaper lever there than more stock. For the mechanics of setting the buffer and trigger, see safety stock vs reorder point, and for the limits of static reorder rules, beyond reorder metrics.
Which forecasting method fits X, Y and Z items?
No single method fits all nine cells, and choosing the method per variability class is the most valuable use of the XYZ axis.
X items have stable demand, so standard methods such as exponential smoothing, ARIMA or a global machine-learning model perform well. The priority here is bias monitoring rather than model sophistication: a stable SKU with a persistent 5% over-forecast quietly builds excess stock across the whole A tier.
Y items are usually seasonal, trending, or promotion-driven. They reward methods that model those structures explicitly: Holt-Winters, regression with calendar and promotion features, or ML models with driver inputs. Decomposing demand into its components, as covered in capturing events and seasonality and factor contribution in demand forecasting, is what turns a volatile-looking Y series into a predictable one.
Z items split into two different problems: genuinely erratic demand, and intermittent demand with many zero periods. The Syntetos-Boylan-Croston (SBC) categorisation separates them using two measures: the average demand interval (ADI, the average number of periods between non-zero demands) and the squared CV of the non-zero demand sizes. With cut-offs of 1.32 for ADI and 0.49 for CV², demand falls into four patterns:
| Pattern | ADI | CV² of non-zero sizes | Suitable Approach |
| Smooth | Below 1.32 | Below 0.49 | Standard time-series method |
| Erratic | Below 1.32 | 0.49 or above | Probabilistic forecast with wide intervals |
| Intermittent | 1.32 or above | Below 0.49 | Croston's method or SBA |
| Lumpy | 1.32 or above | 0.49 or above | SBA or bootstrapped distributions; question the stocking decision |
In the worked example, SKU-03 has an ADI of 1.71 and a CV² of 0.96, and SKU-06 has an ADI of 3.0 and a CV² of 0.50. Both are lumpy, which tells you more about how to handle them than "Z" does.
Croston's method forecasts the size of demand and the interval between demands separately, rather than averaging a series full of zeros. The Syntetos-Boylan Approximation (SBA) corrects the known upward bias in Croston's estimates. For both, the useful output is a probability distribution rather than a point forecast, because a buffer for lumpy demand should be sized from the tail, not the mean.
Measure accuracy per class, too. MAPE breaks on Z items because it divides by zero-demand periods; use WAPE or MAE there. More on choosing metrics to improve demand forecast accuracy. New products start in Z by default because they have no history, not because their demand is erratic; they need attribute-based methods, covered in demand planning for new products in retail.
How to manage CZ items in ABC-XYZ analysis
The CZ cell is where inventory most often dies. It gets the least analyst attention because it sits at the bottom of the value ranking, yet it is the hardest to forecast. Left on autopilot, it produces dead stock and stockouts at the same time across a long tail of SKUs.
The instinct is to forecast CZ items better. The better move is usually to forecast them less and rationalise them more:
- Delist SKUs whose margin contribution turns negative once holding, handling and obsolescence costs are included.
- Centralise stock in one location instead of holding it at every node, accepting a longer delivery promise for items few customers buy.
- Switch to make-to-order or supplier drop-ship where lead times allow.
- Bundle or clear residual stock before it ages out; the clearance side is covered in how the apparel industry can reduce dead stock.
Effort spent perfecting a CZ forecast is almost always better spent shrinking the CZ tail. The working-capital case is to reduce working capital and optimize inventory levels.
Extending the matrix with FSN and VED analysis
ABC-XYZ is the common core, but two further dimensions catch what value and variability miss.
FSN analysis (Fast, Slow, Non-moving) classifies by velocity and recency of movement. It is the natural complement for spotting dying stock: an item can look stable on CV (low variation around a low mean) and still be Non-moving, with no sales in 180 days. ABC-XYZ alone would miss it.
VED analysis (Vital, Essential, Desirable) overlays strategic importance. A hero SKU that anchors a range, a loss leader that drives basket size, or a component whose stockout halts a production line may deserve a service level its financial value would never justify.
The caution: every added dimension multiplies the number of segments. ABC-XYZ-FSN-VED at SKU-location level can produce more policies than any team can operate consistently. Nine cells you act on beat twenty-seven you don't. For monitoring the health of each segment over time, inventory control charts are the practical companion.
Common ABC-XYZ analysis mistakes
- Computing CV on raw sales. Promotions, one-off orders, and stockouts contaminate the XYZ axis and push predictable SKUs into Z.
- Mixing time buckets. Weekly and monthly CVs are not comparable; a single catalogue classified on both produces meaningless cells.
- Classifying at the wrong granularity. A network-level classification applied to per-warehouse safety stock over-buffers slow nodes and under-buffers fast ones.
- Using one method for every cell. Forcing intermittent Z demand through a model built for smooth series produces biased forecasts and oversized buffers.
- Measuring Z accuracy with MAPE. Zero-demand periods make it undefined or explosive; use WAPE or MAE.
- Forecasting CZ items instead of rationalising them. The return on better CZ forecasts is almost always lower than the return on a shorter tail.
- Treating the matrix as permanent. SKUs move between cells as they launch, mature, and age; why a periodic snapshot falls behind is covered in why ABC-XYZ classification breaks for growing brands.
How to validate that your ABC-XYZ classification is working
A classification is a hypothesis: that these cells behave differently enough to deserve different policies. It should be tested, not assumed. Six checks, run quarterly against the previous quarter:
| Check | How to measure | What a healthy result looks like |
| Service level by cell | Achieved fill rate per cell against the target set for that cell | Achieved sits close to target; a cell chronically above target is over-buffered |
| Forecast error by cell | WAPE per cell over the same horizon | Error rises steadily from X to Z; if X and Z are similar, the variability axis is not separating anything |
| Inventory value by cell | Share of total inventory value held in each cell | A tier holds the most value but the fewest weeks of cover; CZ value share trends down |
| Days of cover by cell | Average forward cover per cell against target | Cover increases from X to Z by design, not by accident |
| Migration rate | Share of SKUs that changed cell since the last run | A high rate means the classification interval is too long for your catalogue |
| Stockouts and expedites by cell | Count and cost, attributed to the cell the SKU sat in | Concentrated in AZ and BZ, where the method predicts them, not spread evenly |
Two of these deserve weight. Forecast error by cell is the single best test of the XYZ axis: if error does not increase from X to Z, the axis is measuring something other than predictability, which is the argument developed in why ABC-XYZ classification breaks for growing brands. Migration rate is the best test of your cadence: a catalogue where a quarter of SKUs change cell each quarter is running on policies that are wrong for a material share of the portfolio most of the time.
Put these on the same review as the rest of your stock metrics rather than in a separate exercise; the tile set is covered in the inventory health dashboard, and the measurement choices behind WAPE in improving demand forecast accuracy.
ABC-XYZ analysis FAQs
What is ABC-XYZ analysis?
ABC-XYZ analysis is an inventory segmentation method that crosses two classifications: ABC, which ranks SKUs by annual consumption value, and XYZ, which ranks them by demand variability measured with the coefficient of variation. The result is a nine-cell matrix, from AX (high value, stable demand) to CZ (low value, erratic demand), used to set differentiated service levels, review cadences, safety stock methods, and forecasting methods for each cell.
How do you calculate ABC-XYZ analysis?
Calculate annual consumption value (unit cost multiplied by annual units) per SKU, sort descending, and assign A, B, and C using cumulative-value cut-offs such as 80% and 95%. Then compute each SKU's coefficient of variation (standard deviation divided by mean periodic demand) over 12 to 24 months of cleaned demand, and assign X, Y, or Z using thresholds such as 0.5 and 1.0. Combine the two letters to place each SKU in the matrix.
What coefficient of variation thresholds should be used for X, Y, and Z items?
Common starting points are a CV below 0.5 for X, 0.5 to 1.0 for Y, and above 1.0 for Z. These are conventions, not standards: tune them so each class holds a workable number of SKUs, and keep the demand period consistent, because weekly data produces higher CVs than monthly data for the same SKU.
What is the difference between ABC and XYZ analysis?
ABC ranks items by value; XYZ ranks them by demand variability. ABC tells you an item matters but not whether its demand is stable; XYZ tells you demand is stable but not whether the item matters. Combined, they support differentiated policies, such as lean safety stock on high-value stable AX items and rationalisation of low-value erratic CZ items.
Which forecasting method should be used for Z items?
Z items with intermittent demand are better served by methods that separate demand occurrence from demand size, such as Croston's method or the Syntetos-Boylan Approximation, than by standard time-series models. The Syntetos-Boylan-Croston categorisation, using an average demand interval cut-off of 1.32 and a squared CV cut-off of 0.49, distinguishes smooth, intermittent, erratic and lumpy demand before a method is chosen.
How do you do ABC-XYZ analysis in Excel?
Put one row per SKU with twelve months of cleaned demand. Calculate annual consumption value as unit cost multiplied by annual units, sort descending, and derive the ABC class from the cumulative value share before each SKU is added. Calculate the coefficient of variation with STDEV.P divided by AVERAGE across the monthly columns, assign X, Y or Z with a nested IF on 0.5 and 1.0, then concatenate the two letters to get the cell.
How do you know if your ABC-XYZ classification is working?
Test it rather than assume it. Measure forecast error per cell: it should rise steadily from X to Z, and if it does not, the variability axis is not separating predictability. Then check achieved service level against target per cell, inventory value and days of cover by cell, the share of SKUs migrating cells each quarter, and whether stockouts concentrate in the cells the method predicts.
What should you do with CZ items?
CZ items, low value and highly variable, are usually not worth forecasting better. They receive the least attention yet are the hardest to predict, and they tend to accumulate as dead or slow-moving inventory. The higher-return move is rationalisation: delisting, centralising stock in one location, or shifting to make-to-order.
Where TrueGradient fits
Running ABC-XYZ in a spreadsheet gets you the matrix. Running it inside the planning system gets you the policy. In TrueGradient, classification sits directly on cleaned demand, each cell maps to a forecasting method and a service-level target, and safety stock is sized from each SKU's forecast distribution across AI demand forecasting, end-to-end inventory optimization, and replenishment and allocation. The typical time to first measurable outcome is eight to twelve weeks; see what the first 90 days look like.
**Book a demo** · **Talk to us**
Related reading: Cluster-level demand forecasting with ABC-XYZ · Why ABC-XYZ classification breaks for growing brands · Safety stock vs reorder point · Probabilistic modelling using prediction intervals

TrueGradient Editorial Team
The TrueGradient Editorial Team creates expert, research-backed content on AI-powered supply chain planning, including demand forecasting, demand planning, inventory optimization, production planning, S&OP, and IBP. Our articles are developed with insights from supply chain practitioners, AI specialists, and product experts, and are reviewed for technical accuracy, industry relevance, and practical value. By combining real-world experience with the latest advancements in AI and machine learning, we help consumer brands, retailers, distributors, and manufacturers make smarter, data-driven planning decisions.
Add TrueGradient as a Preferred Source on Google
Helps your Top Stories and AI results prioritize TrueGradient.
