Key takeaways
Ask a maintenance manager how many minutes of downtime last quarter were spent waiting for a spare part.
In most plants nobody knows, and the figure quoted is a memory of the two worst jobs.
That is a structural gap, not a failure of care. The facts that would answer it sit in three places, joined by nothing.
| Fact | Where it usually lives |
|---|---|
| The machine stopped at 14:02 | Machine data or downtime log |
| A technician was assigned | The work order |
| A part was requested at 14:40 | Nowhere |
| The part was issued at 16:20 | Inventory ledger |
| The machine restarted at 16:55 | Machine data |
Row three is the gap. Most systems record the issue, when the storeroom handed the part over, and never the request, when the technician asked for it.
Without the request timestamp there is no wait to measure, only a distance between two events.
If your technicians book parts against a cost centre instead of a job number, this measurement is not hard, it is impossible.
That one rule, parts booked against the work order, is a schema decision in our CMMS data model.
How much to hold and when to order are separate questions, answered in safety stock vs reorder point and spare parts inventory management.
A four hour job with three and a half hours of waiting is reported as a four hour repair, so maintenance carries a storeroom number.
Give the wait its own reason code, at the same level as breakdown and changeover, never as a child of breakdown.
A child code is only reached by somebody who already chose the parent, so it gets picked at close, hours later. The rules it lives inside are in our guide to downtime reason code design.
| Boundary | Definition |
|---|---|
| wait_ | The needed part is known and is not at the machine |
| wait_ | The part is in the technician's hand, at the machine |
wait_start is not the moment the machine stopped, and not the moment somebody walked to the store.
It is the first moment a better stocked storeroom could have changed the outcome: the fault is diagnosed and the part is named.
wait_end is delivery at the machine, not the issue transaction. A part booked out at 16:20 and carried across a large site by 16:35 cost fifteen more minutes the ledger will never show.
Two rules keep the number defensible.
A hall reporting a 150 minute mean time to repair may be reporting a 96 minute repair and a 54 minute logistics problem.
| Sub-case | What the record shows |
|---|---|
| Not stocked | No part record, or a record with no min level |
| Out of stock | On hand was 0 at the moment of the request |
| Not found | On hand was above 0, part located after a search |
Not stocked means a stocking decision was never made. The wait is the supplier lead time, and no reorder point applies to a part with no record.
Out of stock is a level problem: the min was too low, the replenishment was late, or demand arrived in a lump.
Not found is a location problem. The stock was in the building and the plant paid downtime for a labelling failure.
The third case vanishes without this field. The system records the line as filled from stock, because it was, so the fill rate report shows no defect.
Six fields on the work order and six on the part issue line are enough.
| Work order field | What it holds |
|---|---|
| wo_ | The key both sides join on |
| asset_ | Machine that stopped |
| downtime_ | Machine stopped producing |
| downtime_ | Machine produced again |
| wait_ | Part named, not at the machine |
| wait_ | Part delivered at the machine |
| wait_ | not_ |
| Issue line field | What it holds |
|---|---|
| wo_ | The join, never a cost centre |
| part_ | Your part number |
| qty_ | Units handed over |
| issued_ | Timestamp of the issue |
| stock_ | On hand at wait_ |
| source | stock, purchase, cannibalised |
stock_on_hand_at_
Recomputed later it is worthless. A delivery arriving after the technician gave up makes the part look available for a stop it did nothing to prevent.
source is the second field almost nobody keeps, and it finds the stockouts you are not counting.
| source | What actually happened |
|---|---|
| stock | Issued from the storeroom |
| purchase | Bought or expedited for this job |
| cannibalised | Taken off another machine |
The third row matters most. A part stripped off a standby machine appears as a stockout nowhere, and the plant now owns a second dead machine.
Count those lines into the stockout total. They are stockouts paid for with an asset instead of time.
The repair side of the same work order is covered in our equipment failure record data model.
The objection is that technicians will not fill in two more timestamps. They will not, so make both a side effect of something they already do.
Set that threshold at ten or fifteen minutes. Below it the wait is walking time, and classifying walking time kills a measurement in its first month.
These terms get used as one measurement. They have four denominators and answer four questions.
| Metric | Denominator |
|---|---|
| Line fill rate | Request lines |
| Unit fill rate | Units requested |
| Stockout rate | Part days |
| Cycle service level | Replenishment cycles |
The two fill rates diverge whenever anybody asks for more than one unit. Four bearings met with two is a failed line but a half filled request.
Cycle service level is the odd one out. It is a planning input, the target you feed into a safety stock formula, not something you read off last quarter.
Quoting that target as a measurement is how a storeroom reports 95% while technicians wait every week.
Stockout rate measures over time, not demand, so it is the only one that notices a part sitting at zero for six weeks.
A 98.0% line fill rate and a 60.0% critical part fill rate can describe the same quarter in the same storeroom.
In the example below, 20 of 450 request lines were for parts in the top criticality class, and 8 of those 20 could not be filled.
Those 8 lines are 1.8% of the quarter's request lines, and they carry the great majority of the downtime.
Publish the fill rate per criticality class, with the line count beside it. A percentage without its denominator is not a measurement.
Six machines, 1 April to 30 June 2026, which is 91 days.
The hall recorded 40 unplanned repair work orders and 5,400 minutes of repair downtime across them.
The storeroom issued 450 request lines that quarter, and twelve of the 40 jobs waited for a part.
| Work order | Part | Wait |
|---|---|---|
| WO-26-0412 | BRG-6206 | 35 |
| WO-26-0418 | SEAL-24V | 20 |
| WO-26-0427 | BLT-8M-1200 | 180 |
| WO-26-0433 | BRG-6206 | 50 |
| WO-26-0441 | PCB-SRV-03 | 960 |
| WO-26-0455 | FIL-02 | 45 |
| WO-26-0463 | BRG-6206 | 30 |
| WO-26-0470 | VLV-25-PN16 | 180 |
| WO-26-0482 | SEAL-24V | 25 |
| WO-26-0491 | PCB-SRV-03 | 480 |
| WO-26-0498 | BLT-8M-1200 | 80 |
| WO-26-0505 | CHN-08B-3 | 75 |
| Total | 12 waits | 2,160 |
Every figure is minutes of machine downtime inside the wait window, not clock time in the storeroom.
2,160 ÷ 5,400 × 100 = 40.0%.
The other 3,240 minutes were diagnosis, repair, refit and test, the work maintenance actually controls.
2,160 minutes is 36.0 hours. At an illustrative 180 EUR per hour of lost contribution on this hall, the wait cost 6,480 EUR.
Use your own rate and get it from finance. It is the only figure here that is a judgement rather than a record, so publish it alongside.
Nine of the 450 request lines could not be filled from stock at the moment of the request.
Line fill rate = (450 − 9) ÷ 450 × 100 = 441 ÷ 450 × 100 = 98.0%.
Twenty of the 450 lines were for class C1 parts, and 8 of those 20 were among the nine that failed.
| Class | Lines | Fill rate |
|---|---|---|
| C1 | 20 | 60.0% |
| C2 and C3 | 430 | 99.8% |
| All | 450 | 98.0% |
C1 fill rate = 12 ÷ 20 × 100 = 60.0%. Everything else = 429 ÷ 430 × 100 = 99.8%.
The headline reached 98.0% because C1 lines are only 4.4% of the total, so they cannot move the average.
A storeroom manager reporting 98.0% is not lying. One reporting only 98.0% is hiding the number that matters.
The hall holds 38 C1 part numbers, so the quarter contains 38 × 91 = 3,458 part days.
Five of those part numbers stood at zero on hand at some point, for 96 part days in total.
C1 stockout rate = 96 ÷ 3,458 × 100 = 2.8%.
Three true numbers from one quarter: 98.0%, 60.0% and 2.8%. Each is correctly computed and tells a different story.
The 2.8% is the most comforting and the least useful, because 30 quiet days at zero count the same as the one day the line went down.
Read as twelve stockouts, the quarter says raise stock levels on twelve part numbers, and that would be the wrong action on five of them.
One extra field, wait_reason, splits the same 2,160 minutes into three different problems.
| Sub-case | Waits | Minutes |
|---|---|---|
| Not stocked | 2 | 1,440 |
| Out of stock | 7 | 615 |
| Not found | 3 | 105 |
| Total | 12 | 2,160 |
The shares are 66.7%, 28.5% and 4.9%, and they sum to 100% before rounding.
Only the middle row, 615 minutes and 1,845 EUR, is a stock level problem a higher min would have prevented.
The top row, 1,440 minutes and 4,320 EUR, is one part number that was never on the stock list at all.
WO‑26‑0412, WO‑26‑0418 and WO‑26‑0433 waited 35, 20 and 50 minutes for two part numbers, BRG‑6206 and SEAL‑24V.
In all three cases stock_on_hand_at_
That is 105 minutes and 315 EUR, and a min level rise on those two part numbers would have prevented none of it.
It would also have cost money. Raising BRG‑6206 from a min of 2 to a min of 6, at 62 EUR each, adds 248 EUR of stock that solves nothing.
The fix is a bin location on the part record, a label on the bin, and a cycle count.
| Reading of the quarter | Minutes a level rise could remove |
|---|---|
| Version A, twelve stockouts | 2,160 |
| Version B, seven true stockouts on stocked parts | 615 |
The two versions describe exactly the same twelve stops and disagree by 1,545 minutes, which is 71.5% of the total wait.
That gap is the entire value of one extra field on the downtime record.
| Part | Requests | Minutes |
|---|---|---|
| PCB-SRV-03 | 2 | 1,440 |
| BLT-8M-1200 | 2 | 260 |
| VLV-25-PN16 | 1 | 180 |
| BRG-6206 | 3 | 115 |
| CHN-08B-3 | 1 | 75 |
| FIL-02 | 1 | 45 |
| SEAL-24V | 2 | 45 |
| Total | 12 | 2,160 |
One part number, PCB‑SRV‑03, carries 1,440 of the 2,160 minutes from two requests out of twelve.
That is 66.7% of the wait, and finding it needs no statistics. A Pareto on this table is the whole analysis.
Now notice what a request count would have told you. BRG‑6206 has the most requests of any part number and 5.3% of the minutes.
Rank by events and the plant goes shopping for bearings. Rank by minutes and it goes shopping for a spare control board.
The natural next step is to correlate stock availability with downtime month by month and report a coefficient.
On one plant's data that is almost always a waste of a quarter, for three reasons.
A quarter of monthly data gives three points. A full year gives twelve.
With twelve monthly pairs, a correlation of 0.5 has a 95% confidence interval of roughly minus 0.10 to 0.83.
That interval contains zero, so the honest conclusion from a coefficient of 0.5 on twelve months is that you still do not know.
Twelve wait events will not support a coefficient anybody should act on.
Monthly fill rate is a ratio over hundreds of routine lines, so it barely moves. Monthly downtime is driven by two or three large events, so it is spiky.
Correlating a stable ratio against a spiky total mostly measures which month held the big breakdown.
A serious breakdown stops the line and consumes critical parts in the same hour.
Downtime and part issues therefore rise together for a reason unrelated to how well the storeroom is run.
A positive correlation between parts issued and downtime is close to certain, and it says nothing about availability.
Rank part numbers by minutes waited and act on the top two.
The measurement is a sum, its denominator is stated, and no statistical method needs agreeing first.
For a number that moves with performance, track wait minutes as a share of repair downtime each month, next to your unplanned downtime total and your equipment availability figure.
In the example that share is 40.0%, and a quarter where it falls to 25% is a result you can defend.
Correlation becomes worth computing at hundreds of events, for example every wait line across a year and twenty machines.
A single storeroom target averages a bearing you can buy in an hour with a control board that takes eight weeks, and describes neither.
| Class | Meaning | Target |
|---|---|---|
| C1 | Stops the line, no workaround | 98% line fill |
| C2 | Reduced output or a workaround exists | 95% line fill |
| C3 | No production impact | None, order on demand |
Those two figures are an example. Set your own against what a miss costs.
Criticality belongs to the part in its position on a specific asset, not to the part number in the abstract.
The same filter is C1 on the bottleneck and C3 on a standby unit, so the class lives on the asset to part link, not the part master.
An insurance spare is held because the consequence of not having it is intolerable, not because you expect to use it.
A fill rate cannot justify one, because with expected usage near zero it is undefined in most years.
Do the arithmetic on the consequence instead.
A gearbox with a 26 week lead time, on a line losing 180 EUR per hour across 16 hours a day and 5 days a week, exposes 26 × 5 × 16 × 180 = 374,400 EUR.
Against that, 40,000 EUR of stock is cheap. The honest part is the assumption underneath: that no workaround exists.
Write that assumption on the part record, with the date and the person who accepted it.
Then review it yearly. Some insurance spares in a long running storeroom protect a machine that was replaced years ago.
The wait_reason field plus the part number routes every wait to the right fix.
| Pattern in the data | The actual fix |
|---|---|
| Out of stock, short lead time | Raise min and max |
| Out of stock, long lead time | Raise min, add a second source |
| Not found, on hand above 0 | Bin location, label, cycle count |
| Not stocked, seen twice or more | Add to the list with a min level |
| Not stocked, first occurrence | Decide on criticality, not on one event |
| Cannibalised from another machine | Count as a stockout, then stock it |
| Short waits, same part, repeated | Point of use box at the machine |
The first occurrence row is where storerooms grow fat. One breakdown is not evidence of demand, and a stock list built from single events becomes a museum with a budget.
The long lead time row beats stock levels. Cutting eight weeks to one does more for availability than any min level, and costs nothing to hold.
The point of use row is the cheapest win. Filters, belts and seals used weekly on one machine do not belong in a store four minutes away.
Work the table top down, then re-measure next quarter with the same definitions. Change the definition and the stock together and you cannot say which moved the number.
Question two separates the tools. Few systems tell you what was on the shelf when the technician asked (equipment maintenance software).
Fabrico is an OEE platform with a full CMMS built in, so the stop and the part issue can live on the same work order.
Parts sit in an inventory module with min and max levels, and consumption is booked against the work order that used it, the join this page depends on.
QR codes on machines and parts open the right record from a phone, and the iOS, Android and web apps let a technician book a part at the machine, not an hour later at a desk.
Downtime and micro stops come from PLC connections, IoT sensors and AI cameras, and notifications reach the storeroom while the machine is still down.
Reports cover stock and consumption per machine alongside downtime, OEE and MTTR, and you can export them.
What Fabrico does not do: it will not place a purchase order for you, and the wait window and sub-case above are a specification you configure.
Want to know how many of your downtime minutes were spent waiting for a part? Book a 30 minute demo with a Fabrico consultant, no commitment, or contact us with your questions.
Record a wait window on the work order, from the moment the needed part is named and missing to the moment it reaches the machine. Then sum the wait minutes that fall inside a downtime window, separately from repair time.
Fill rate measures demand met, the share of request lines or units filled from stock. Cycle service level is a planning target over replenishment cycles, fed into a safety stock formula.
Yes, at the same level as breakdown and changeover rather than underneath them. Folded into the repair it becomes invisible, and a storeroom problem gets reported as slow maintenance.
Not usefully on one plant and one year, because twelve monthly points cannot separate a real link from the month that held the big breakdown. Rank part numbers by minutes waited instead.
Set the target per criticality class, for example 98% line fill on parts that stop the line and 95% on parts with a workaround. Always publish the line count next to the percentage.