Key takeaways
A maintenance kit is the set of parts staged for one planned job before the job starts.
As a record it is three assertions made at once, against one planned work order.
| The kit asserts | Against what |
|---|---|
| These units are spoken for | The stock record (a reservation) |
| These units have left the shelf | The bin and the picker |
| These units are together, here | A container at a staging place |
Drop any one of the three and the record stops being a kit.
An issue is the transaction where stock leaves the storeroom and its cost lands on a job.
It is final: the units are consumed, the stock value drops, and the consumption history for that part gains a line.
A kit is none of that yet. The parts are still owned by the plant, still countable and still returnable.
| Question | Kit vs issue |
|---|---|
| Can it be undone? | Kit yes, issue no |
| Does stock value drop? | Kit no, issue yes |
| Does the job own the cost? | Kit no, issue yes |
| Is the part still counted? | Kit yes, issue no |
| Is it a demand signal? | Kit yes, issue yes |
The last row fools people: a kit and an issue both say "this part is wanted". The other four say one cannot stand in for the other.
Most plants without a kit record fake one by issuing the parts a week early and leaving them in a corner.
Stock value. The parts are physically in the building, the ledger says they are gone, and the understatement never returns to zero on a busy line.
Consumption history. The issue date becomes the staging date, not the fitting date, and quantity issued becomes quantity staged, not quantity used.
The second one compounds. A min level raised because "we use four a month" when the plant fits three and returns one is a permanent 33% overstock on that part.
How much to hold and when to order sit in our guide to spare parts inventory management, and they only work on honest consump‑tion data.
This is the only page in this series about staging parts for a job that has not started yet.
The reservation, the pick, the container, the kit lifecycle and the return live here and nowhere else in the set.
| Owned elsewhere | Which page |
|---|---|
| Wait reason codes, downtime link | Spare parts and downtime |
| Storeroom, part master, stock policy | Spare parts management |
| The planned job a kit serves | PM plan data model |
| Purchasing and goods receipt | MRO purchasing |
| Serialised repairable units | Rotable spare data model |
A rotable unit is kitted differently, because the serial number travels with it and a return is a repair induction, not a restock.
Almost every storeroom system carries two numbers per part per location, on hand and on order.
Two numbers cannot express the most ordinary situation in planned maintenance, a part that is physically present and already spoken for.
Add one field, reserved, and one derived figure, available to promise.
| Figure | Definition |
|---|---|
| On hand | Units physically in the bin |
| Reserved | On hand units committed to open kits |
| Available to promise | On hand minus reserved |
| On order | Units on a purchase order |
| Projected at date D | Available plus on order due by D |
Available to promise is the number a planner should see. On hand should never be shown alone.
Part SEAL‑40‑VT, one storeroom, on hand 3 units, on order 4 units due 18 June.
| Step | On hand | Reserved |
|---|---|---|
| Monday 8 June | 3 | 0 |
| Job A reserves 3 | 3 | 3 |
| Job B asks for 2 | 3 | 3 |
| Pick for job A | 0 | 0 |
At step three the second planner asks: can I promise two units for 15 June?
Available to promise = 3 minus 3 = 0, so the answer is no, and the planner sees it seven days before the job.
Projected available on 18 June = 0 plus 4 = 4, so job B is schedulable from 18 June with two units to spare.
Now run the same week without a reserved field. Both planners see on hand 3, both promise, and total demand reaches 3 plus 2 = 5 units against 3 on the shelf.
The shortfall is 2 units, discovered by a technician standing at a machine that is already stopped.
That is not a stock level failure. The stock was correct and the plant sold it twice.
A reservation is a claim on a quantity of a part in one location, owned by one kit, with an expiry.
Reservations without an expires_
Four tables carry the whole model: a kit header, a kit line, a reservation, and a return.
One row per kit, one kit per planned work order.
| Field | Type, required | Why |
|---|---|---|
| kit_ | text, yes | Printed on the container label |
| wo_ | text, yes | The one job this kit serves |
| asset_ | text, yes | Machine the job is on |
| kit_ | enum, yes | Where it is in the lifecycle |
| store_ | text, yes | Which storeroom reserves |
| requested_ | user, yes | Who asked, for questions |
| requested_ | time, yes | Start of the readiness clock |
| required_ | time, yes | Planned job start |
| container_ | text, no | Trolley, bin or pallet code |
| staging_ | text, no | Where the picker left it |
| staged_ | time, no | When it became ready |
| closed_ | time, no | When reconciliation finished |
requested_at and required_at are the pair that makes readiness measurable at two moments, which the worked example uses.
One row per part number on the kit. This is where completeness lives.
| Field | Type, required | Why |
|---|---|---|
| kit_ | text, yes | Key for returns to point at |
| kit_ | text, yes | Parent kit |
| part_ | text, yes | Your part number |
| qty_ | number, yes | What the task calls for |
| qty_ | number, yes | What stock agreed to hold |
| qty_ | number, no | What left the bin |
| qty_ | number, no | What the job consumed |
| qty_ | number, no | What came back |
| line_ | boolean, yes | Can the job start without it |
| bin_ | text, no | Where the picker goes |
| line_ | enum, yes | Short, reserved, picked, staged |
| plan_ | text, no | Which task step needs it |
Required 4, reserved 4, picked 4, issued 3, returned 1 is an ordinary row, and collapsing it to a single "quantity" throws away every fact worth having.
One row per claim on stock, kept separate from the kit line because a reservation has a life the line does not.
| Field | Type, required | Why |
|---|---|---|
| reservation_ | text, yes | Audit key for the claim |
| part_ | text, yes | What is held |
| store_ | text, yes | Which location is held |
| kit_ | text, yes | Who owns the claim |
| qty_ | number, yes | Units held |
| reserved_ | time, yes | When available dropped |
| reserved_ | user, yes | Who made the claim |
| expires_ | time, yes | When the hold releases itself |
| reservation_ | enum, yes | Open, consumed, released |
Make expires_at mandatory and default it to required_at plus seven days, long enough for a job that slips a week.
Reserved per part is then a sum of open reservations, not a stored counter, and a sum cannot drift.
One row per quantity coming back, pointing at the kit line it left on.
| Field | Type, required | Why |
|---|---|---|
| return_ | text, yes | Key for the movement |
| kit_ | text, yes | What it is coming back from |
| qty_ | number, yes | Units handed back |
| disposition | enum, yes | Decides stock and cost |
| returned_ | time, yes | When the shelf got it back |
| returned_ | user, yes | Who handed it over |
| condition_ | text, no | Why it is not restockable |
| restock_ | text, no | Where it actually went back |
| cost_ | money, yes | What the job still pays |
cost_to_job stops a return from quietly refunding a job that genuinely destroyed a part.
Eight statuses cover every kit anybody has ever staged.
Each one needs an actor, a record, and a defined effect on stock.
| Status | Who moves it in | Must record |
|---|---|---|
| Requested | Planner | Lines, qty, required_at |
| Reserved | Storekeeper | Qty per line, expiry |
| Picked | Picker | Qty picked, bin scanned |
| Staged | Picker | Container, staging place |
| Issued | Technician | Collection, time, job |
| Partially returned | Technician | Qty back, disposition |
| Closed | Storekeeper | Reconciliation, variances |
| Cancelled | Planner | Reason, what to do with stock |
| Status | On hand | Reserved |
|---|---|---|
| Requested | No change | No change |
| Reserved | No change | Up by qty |
| Picked | Down by qty | Down by qty |
| Staged | No change | No change |
| Issued | No change | No change |
| Partially returned | Up by returned | No change |
| Closed | No change | No change |
| Cancelled | Up by picked | Down by open |
On hand drops at picking, not at issuing, because picking is the moment the units physically leave the bin.
Issuing then carries the cost to the job without moving a unit, and that split is what an issue-only system cannot express.
Cancelled rots a storeroom quietly.
It must put back whatever was picked and release whatever was reserved, or the parts stay in a trolley for a year.
Closed gets skipped under pressure.
A kit that reaches issued and never reaches closed leaves its returns unrecorded, the largest source of overstated consump‑tion in the whole model.
Require that required minus issued minus returned equals zero on every line, or the kit stays open with a named var‑iance.
Most kits return something, because planners round up and a spare seal is carried for every job that might need one.
A model that cannot record a return cannot be trusted on consumption, which every stock policy is built from.
| Disposition | Stock effect | Cost effect |
|---|---|---|
| Unused, good | Back on hand | Job refunded |
| Wrong part | Back on hand | Job refunded |
| Opened, unusable | None | Job pays |
| Damaged in the job | None | Job pays |
A wrong part return moves the same stock as an unused one, but it says the kit line was built from a bad bill of materials.
A seal kit opened to check a size, a length of hose cut to fit, a bearing dropped on a concrete floor: none of them can go back.
The honest record has three parts: the units are not added back to on hand, the cost stays on the job, and condition_note says why in one line.
Recording it as a good return is worse than recording nothing: it adds a phantom unit the next planner will confidently reserve.
| Disposition | Units |
|---|---|
| Fitted on the job | 431 |
| Unused, good | 41 |
| Wrong part | 5 |
| Opened or damaged | 9 |
| Staged | 486 |
Check the column: 431 plus 41 plus 5 plus 9 = 486, which is what left the shelf.
Units that came back at all = 41 plus 5 plus 9 = 55, which is 55 ÷ 486 × 100 = 11.3% of everything staged.
True consumption is staged minus the units that went back on the shelf: 486 minus 41 minus 5 = 440 units.
A plant that stages 486 and never records a return books 486, overstating consumption by 486 minus 440 = 46 units.
As a share of the truth that is 46 ÷ 440 × 100 = 10.5%, enough to move a reorder point in the expensive direction on every part in the kit.
Those 46 units at an illustrative average standard cost of 24 EUR are 46 × 24 = 1,104 EUR of stock on a shelf the ledger says is empty.
Separately, the 9 opened or damaged units at an average standard cost of 27 EUR are 9 × 27 = 243 EUR that correctly stays on the jobs.
Use your own standard costs. Those two averages are the only judgement figures in the example.
Two rates and one rule come out of the same kit lines, and only the rule is a decision.
| Metric | Denominator |
|---|---|
| Kit fill rate, by line | Kit lines |
| Kit fill rate, by kit | Kits |
By line tells you how well the storeroom is performing. By kit tells you how many jobs could actually start.
Our study of spare parts availability and downtime argues the same about fill rate denominators for unplanned work, and its wait reason codes classify a kit line that could not be filled.
A fill rate by line is an average, and averages are the wrong shape for a decision. The rule with the right shape is one test on the line_blocking flag.
A job starts only when every blocking line on its kit is staged.
Non-blocking lines can be short, and the job goes ahead without them.
| Blocking | Not blocking |
|---|---|
| The bearing being replaced | Spare gasket carried just in case |
| The matched belt set | Cable ties and wipes |
| The gearbox oil | A second filter for next time |
Setting the flag is a maintenance judgement, made once per task in the plan library, not by a picker under time pressure.
It belongs beside the task in the preventive maintenance plan, copied onto the kit line when the kit is requested.
A kit at 9 of 10 lines reports 90.0% on a line basis, which reads like a near miss. It is not, because the missing line is not a random tenth of the work.
The second is the expensive one, and the equipment failure record is where it belongs.
A job held two days costs two days. A job started short can cost a shutdown window and a second machine.
One filling line, 1 to 30 June 2026, planned maintenance only. No unplanned work is in these figures.
| Input | Value |
|---|---|
| Planned jobs, each kitted | 20 |
| Kit lines across them | 140 |
| Units staged | 486 |
| Short lines at plan date | 18 |
| Short lines at job start | 9 |
Average lines per kit = 140 ÷ 20 = 7.0, a normal size for planned work on a filling line.
Plan date here means requested_at, seven days before the job. Job start means required_at.
At job start, 9 of the 140 lines were short, and those 9 shorts fell across 6 kits.
So 140 minus 9 = 131 lines were staged, and 20 minus 6 = 14 kits were complete.
Kit fill rate by line = 131 ÷ 140 × 100 = 93.6%.
Kit fill rate by kit = 14 ÷ 20 × 100 = 70.0%.
The gap is 93.6 minus 70.0 = 23.6 percentage points from the same 140 rows, read two defensible ways.
In counts it is 9 short lines against 6 jobs that could not start, and the second is what a production manager cares about.
Measured seven days earlier, at requested_at, the same 140 lines looked worse.
At that moment 18 lines were short, across 9 kits.
| Moment | By kit | By line |
|---|---|---|
| At plan date | 55.0% | 87.1% |
| At job start | 70.0% | 93.6% |
At plan date, 140 minus 18 = 122 lines and 20 minus 9 = 11 kits were complete.
That is 122 ÷ 140 × 100 = 87.1% by line and 11 ÷ 20 × 100 = 55.0% by kit.
The shortfall shares are the complements: 18 ÷ 140 × 100 = 12.9% of lines short at plan date, and 9 ÷ 140 × 100 = 6.4% at job start.
Between the two moments the storeroom closed 18 minus 9 = 9 lines and rescued 9 minus 6 = 3 kits.
Four honest numbers from one month: 55.0, 87.1, 70.0 and 93.6.
The widest pair, 93.6 minus 55.0, is 38.6 percentage points apart, and both ends are correctly computed from the same rows.
So the reporting rule is a sentence, not a number: readiness is x percent, by kit or by line, measured at plan date or at job start.
| Kit | Lines short | Of those, blocking |
|---|---|---|
| KIT-2026-0604 | 1 | 1 |
| KIT-2026-0609 | 1 | 0 |
| KIT-2026-0612 | 1 | 1 |
| KIT-2026-0617 | 2 | 1 |
| KIT-2026-0621 | 1 | 0 |
| KIT-2026-0628 | 3 | 3 |
| Total | 9 | 6 |
Of the 9 short lines, 6 were blocking and 9 minus 6 = 3 were not.
Kits carrying at least one blocking short are 0604, 0612, 0617 and 0628, which is 4 kits.
| Rule | Jobs that start |
|---|---|
| Every line staged | 14 of 20 |
| Every blocking line staged | 16 of 20 |
Under the complete-kit rule, 14 ÷ 20 × 100 = 70.0% of jobs start.
Under the short-line rule, 20 minus 4 = 16 jobs start, which is 16 ÷ 20 × 100 = 80.0%.
The two rules differ by 80.0 minus 70.0 = 10.0 percentage points, which is 2 jobs in this month.
The short-line rule releases 2 jobs a naive rule holds, and it holds 4 jobs on evidence a line average of 93.6% hides completely.
Three of the four blocked kits were rescheduled to a date when the part was in, costing only a calendar change.
The fourth, KIT‑2026‑0628 with three blocking lines short, went ahead because the shutdown window was already agreed with production.
The planned window was 180 minutes. The job took 420 minutes.
The overrun is 420 minus 180 = 240 minutes, which is 240 ÷ 60 = 4.0 hours taken out of production time.
At an illustrative 180 EUR per hour of lost contribution, that is 4.0 × 180 = 720 EUR from one go decision.
Get the rate from finance and publish it beside the figure. It is the one input here that is a judgement, not a record.
One of the three missing lines was solved by taking the part off a standby unit.
That is a second machine down and a stockout in no stockout report, a trap our study of parts and downtime found on unplanned work too.
Rank by blocking shorts, not by short lines, and the list is four kits long instead of six.
Behind those four sat three distinct part numbers, because 0604 and 0612 were short the same item.
Question two separates the tools, because few systems can hold parts in a state that is neither on the shelf nor consumed (equipment maintenance software).
Fabrico is an OEE platform with a full CMMS built in, and its inventory module holds a catalogue, min and max levels, deliveries, stock-takes and a supplier listing.
The part that matters most here: Fabrico ties parts consumption to the work order that used them, which is exactly the record a kit reconciles against when the job is closed.
QR codes on parts and machines are what make a physical pick fast, because a picker with a phone confirms a bin and a part without typing a code.
Work orders with task detail, approvals, work shifts and notifications carry the planned job, and a work order in Fabrico is always created and confirmed by your team.
Analytics with Excel export, a REST API, webhooks and SAP or ERP connectors let you join Fabrico's consumption data to whatever holds your stock movements.
What Fabrico does not do: it has no kit record, no reservation, no reserved stock state, no picking or staging workflow and no available to promise figure.
Treat the model on this page as a specification to test a shortlist against, Fabrico included, and check the five questions above against what you are shown.
Want to see how your planned jobs and your parts consumption line up today? Book a 30 minute demo with a Fabrico consultant, no commitment, or contact us with your questions.
For the stock policy underneath all of this, start with spare parts management and the MRO purchasing data model.
Kitting is staging every part a planned job needs into one container before it starts, tied to that work order. As a record it is a reservation, a pick and a container reference.
An issue consumes stock and lands the cost on the job. A kit holds parts the plant still owns, still counts and can still take back.
Available to promise is on hand minus the units reserved for open kits. On hand alone lets two jobs promise the same last part.
Compute it two ways from the same rows: lines staged ÷ kit lines, and kits with every line staged ÷ kits. Always state which moment you measured at.
Only if every line flagged as blocking is staged. That flag is set with the task when the plan is written, never by a picker on the day.