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

← All blogs

Guides7 min read

Inventory health score — grade your catalog on 5 factors with one spreadsheet

Score your inventory health on 5 factors — cover vs lead time, dark days, aging stock, sell-through spread, and count accuracy — with a scorer.

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

An inventory health score is a single number, 0–100, that grades your catalog across five factors: whether stock covers your lead times, how much of the period your best-sellers spent dark, how much capital is aging, how unevenly your stock is spread across your sell-through, and whether your counts are trustworthy. One score per factor, weighted average, and a plain reading: no single number tells you what to do, but the score tells you whether to look — and which factor is dragging it down tells you where. This article gives you the five factors, the spreadsheet scorer, and the honest rule that all benchmarks here are self-baselines, not industry numbers.

The five factors

1. Cover vs lead time (weight 30). Days of cover — on-hand ÷ daily velocity — only means something against the lead time it must survive. A SKU with 20 days of cover and a 45-day supplier is unhealthy no matter how comfortable "20" sounds. Compute per-SKU: cover days ÷ lead-time days. The cover calculation is in days of cover; here it's a ratio scored at the catalog level.

2. Dark days (weight 25). The share of the last 90 days your fast-moving SKUs spent out of stock. Dark days are facts, not estimates — the ledger behind them is the core of how InventoryX measures demand, computing velocity only on days a SKU was actually in stock so dark days don't silently deflate your reorder math (the in-stock-only correction). In a spreadsheet, dark days per SKU come from comparing order-gap patterns against stock snapshots.

3. Aging capital (weight 20). The percentage of your total inventory value sitting in the 90+ day buckets of an aging report. Aging stock is frozen cash with a storage bill — the buckets and action ladder are owned by the inventory aging report.

4. Sell-through spread (weight 15). How concentrated your sell-through rates are. A healthy catalog has a distribution — some fast, some slow, mostly mid. A sick one has extremes: capital parked in zero-movers while the movers are dark. Score it as the share of inventory value held in SKUs selling below one-third of catalog-median sell-through.

5. Count accuracy (weight 10). The percentage of counted SKUs whose physical count matches the record within a small tolerance. Below ~95% on your fast movers, every other number in this score is built on sand — the cadence that keeps it honest is in inventory counts.

The spreadsheet scorer

Build it once (30–45 minutes), refresh monthly. Column spec, one row per SKU, using your top-50 sellers plus a value-sorted sample:

Column Content Source
A: SKU SKU code Product export
B: On-hand Units Inventory export
C: Velocity Units/day, in-stock basis Sales ÷ in-stock days
D: Cover days =B2/C2 (blank if C is 0) Computed
E: Lead time Days, per supplier Your PO records
F: Cover ratio =D2/E2 Computed
G: Dark days (90d) Days out of stock last 90 Stock snapshots / order gaps
H: Inventory value =B2 × cost per item Export
I: Days since receipt Days Last receipt date
J: Sell-through Units sold ÷ units received, 90d Sales + receipt records

Factor scoring, computed on the block of rows:

  1. Cover vs lead time: =COUNTIF(F:F,">=1")/COUNT(F:F) → share of SKUs whose cover exceeds lead time. Score = that share × 30.
  2. Dark days: total dark days across the block ÷ (SKU count × 90). Score = 25 × (1 − that share). A SKU dark 18 of 90 days contributes 20% dark share.
  3. Aging: sum of inventory value where I > 90 ÷ total inventory value. Score = 20 × (1 − that share).
  4. Spread: inventory value in SKUs with J below one-third of median J ÷ total value. Score = 15 × (1 − that share).
  5. Count accuracy: matched counts ÷ counted SKUs, last cycle. Score = 10 × accuracy.

Total = sum of the five. 100 is a ceiling, not a promise — treat 0–100 as your own ruler.

Reading the score

Worked example, one store's October 2026 run (illustrative numbers from a ~400-SKU craft-and-hobby catalog):

Factor Raw reading Score
Cover ≥ lead time 61% of top SKUs 18.3 / 30
Dark share 9% of fast-mover days 22.8 / 25
90+ aging share 14% of inventory value 17.2 / 20
Stale-value share 11% below one-third median ST 13.4 / 15
Count accuracy 96% matched 9.6 / 10
Total 81.3 / 100

The reading is factor-first, total-second: this catalog's problem is not shrinkage or dead stock — it's that two of five fast-movers carry less cover than their lead time. That's a buying-depth problem, and it's the factor with the most points available to recover. The total (81) mainly answers the monthly question: better or worse than last month?

Benchmarks are self-baselines

The score has no industry standard, and any specific target you read elsewhere should be treated as an assumption. The honest method: run the scorer for three consecutive months and treat your trailing average per factor as "normal for us." Movement against your own baseline is the signal — a cover ratio that slides from 70% to 55% between October and January is a finding no external benchmark could give you, because no external store has your suppliers, your lead times, or your category mix.

Two calibration notes: factor weights should tilt toward what actually hurts you — if your catalog is high-value and slow-turning (jewelry, equipment), aging and count accuracy deserve more weight than the defaults; and score the same SKU block every month, because a changing sample makes the trend meaningless.

What the score is not

It's not a KPI dashboard — the standing metric set (turnover, GMROI, sell-through, fill rate and friends) lives in inventory KPIs, and several of those feed this score as inputs. The health score is the composite on top: five factors, one number, one monthly reading, and a ranked list of which factor to work next. It's also not a substitute for the per-SKU decisions underneath it — it routes attention; the buying list and the aging action ladder do the work.

Common questions

What is an inventory health score? A composite number, typically 0–100, that grades a catalog across several health factors — here: cover vs lead time, out-of-stock days, aging capital, sell-through spread, and count accuracy. Its job is to tell you whether to look closer and which factor is dragging the number down.

How do I measure inventory health? Score each factor from your own exports — cover ratios from stock and velocity, dark days from snapshots or an out-of-stock ledger, aging from receipt dates, spread from sell-through, accuracy from counts — then combine with weights into one number. Refresh monthly and compare against your own trailing baseline.

What is a good inventory health score? No external benchmark transfers between stores, so treat any published target as an assumption. Baseline yourself: three monthly runs, average per factor, and act on movement — a falling factor score is the finding, regardless of its absolute level.

How often should I check inventory health? Monthly is enough for the composite — it's a trend instrument, not a daily alarm. Run it the same day as your buying session so a weak factor feeds that week's decisions, and keep the SKU block identical between runs.

Which inventory health factor matters most? Whichever scores lowest, but the weights deliberately put the most points on cover vs lead time — a catalog whose fast-movers can't survive their lead times loses sales no matter how clean the rest of the data is. Fix the biggest gap first and let the total catch up.

Your next step

Build the scorer this week with just the top-50 block — columns A through J take one export session, and the five factor formulas take minutes. Run it, write the total down, and re-run the same block in 30 days; the first reading gives you the weak factor, the second gives you the trend, and the factor guide you need for the weakest one is linked from its row above.