Key takeaways
Most plants start with one drop-down of scrap reasons, and it grows one entry at a time.
Every complaint adds a code, nobody ever removes one, and two years later the list holds 60 entries in the order they were added.
Three things then happen at the station.
The fix is not a longer list, but a short list with a second level underneath.
A single flat list stays reliable to roughly 25 entries, the same range our guide to downtime reason code design recommends for stops.
Scrap needs more resolution than downtime, because a defect has a type and a place on the part. The answer is depth, not width.
Keep the category level at 10 to 14 codes, and keep any single detail list under 8. The operator sees 12 choices, taps one, then sees 6.
The category level is fixed for the whole plant and never changes without a formal decision. Every report, every plant comparison and every trend rolls up to it.
The detail level sits under one category and may be tailored per line or per part family. A machining cell and a filling line share DIM but need different details under it.
Two rules keep the categories mutually exclusive.
That rule stops the most common corruption of a scrap list: codes that turn into blame labels.
Twelve categories cover discrete and process plants. Change the names, but keep the count and keep them exclusive.
| Code | Covers |
|---|---|
| SET | Setup and first-off: pieces consumed proving a setting at the start of a run |
| MAT | Material and incoming: the defect arrived with the raw material or a bought part |
| DIM | Dimensional: a feature is outside a drawing tolerance |
| SUR | Surface and cosmetic: visible defect with no dimensional effect |
| ASM | Assembly: wrong, missing, reversed or damaged component in a build |
| CON | Contamination: swarf, oil, water, dust, allergen or foreign body |
| HND | Handling and transport: the part was made right and damaged afterwards |
| EQP | Equipment fault: a machine or tooling failure made the part bad |
| MET | Operator method: the documented method was not followed |
| TST | Test and inspection reject: failed a functional test with no single feature named |
| CHG | Changeover: product lost in the transition between two products |
| OTH | Other: nothing above fits; free text mandatory, reviewed weekly |
SET and CHG are easy to confuse, so split them by what is being proved. SET is the first-off of one product, CHG is the material lost moving from product A to product B.
DIM and TST are the other pair that drifts. If you can name the feature that is out, it is DIM; if the part simply failed the test, it is TST.
In the six big losses framework, SET and CHG are startup rejects, and everything else is a production reject. Our guide to the six big losses maps the rest of the losses the same way.
The detail level is where the resolution lives. Three worked lists follow, ready to lift into a configuration.
| Detail code | Meaning |
|---|---|
| DIM-01 | Oversize, above the upper limit |
| DIM-02 | Undersize, below the lower limit |
| DIM-03 | Position or true position out |
| DIM-04 | Form: flatness, roundness, profile |
| DIM-05 | Thread, tap or bore finish fault |
| DIM-06 | Feature missing or machined twice |
| Detail code | Meaning |
|---|---|
| MAT-01 | Wrong material or wrong grade issued |
| MAT-02 | Inclusion, void or lamination in the stock |
| MAT-03 | Incoming stock outside size tolerance |
| MAT-04 | Surface defect on arrival: rust, scale |
| MAT-05 | Damaged in transit from the supplier |
| MAT-06 | Out of shelf life or wrongly stored |
| Detail code | Meaning |
|---|---|
| SET-01 | First-off pieces to prove the setting |
| SET-02 | Offset or program correction after first-off |
| SET-03 | Fixture or clamping trial |
| SET-04 | Re-qualification after a tool change mid run |
| SET-05 | Warm-up pieces after a long stop |
A MAT‑02 trend points at a supplier, and a DIM‑01 trend points at tool wear. The same two events coded only as "material" and "dimensional" point at nothing.
These three get merged in most systems, and the merge is expensive. They have different records, different costs and different effects on the OEE Quality factor.
| Event | Record | Quality factor |
|---|---|---|
| Scrap | Scrap record with reason and detail | Counts as a bad piece |
| Rework | Rework record with reason, detail and minutes | Counts as a bad piece at first pass |
| Yield loss | Material reconciliation on the order | No effect: no piece exists |
Scrap is a piece that will never be sold. It leaves the order and the material is written off.
Rework is a piece that failed, was repaired and passed. It is sold, but it cost extra labour, extra machine time and a second inspection.
Yield loss is material consumed that never became a countable piece: purge, flush, offcuts, bar ends, trim and evaporation. No piece was ever counted, so no piece can be coded bad.
In the OEE calculation, the Quality factor is good count divided by total count, and a part that needed rework is not a good part.
If you count reworked parts as good, Quality rises, OEE rises and the rework cell stays busy forever.
Record the rework event separately, with its own reason code, detail code and minutes. See first pass yield and rolled throughput yield for why the first pass number moves behaviour.
A scrap record is a transaction, not a note. It belongs to one work order, one operation and one machine, like the quantity reports in a production work order data model.
| Field | What it holds |
|---|---|
| work_ | Order the pieces were made under |
| operation | Operation number, for example 20 |
| machine | Asset or work centre code |
| part_ | Item number, with revision |
| qty_ | Pieces or quantity scrapped |
| uom | Unit: pcs, kg, m, L |
| reason_ | Category code: SET, DIM, CON |
| detail_ | Detail under that category |
| detected_ | Station where it was found |
| cost_ | Accumulated cost per piece, frozen now |
| recorded_ | User who wrote the record |
| timestamp | When the record was written |
| Field | Rule |
|---|---|
| lot_ | Mandatory if the part is lot tracked |
| caused_ | Station that made it bad, or "not determined" |
| defect_ | Place on the part, from a fixed list |
| tool_ | Mandatory on multi-cavity or multi-spindle work |
| shift | Derived from the timestamp, never typed |
| comment | Free text, mandatory only when reason_ |
Every field a report groups on has to come from a controlled list. Free text in a grouping field is the same as no data.
| Field | Source of the list |
|---|---|
| reason_ | The taxonomy table, filtered by the category |
| detected_ | Station master for that line |
| defect_ | Fixed zone list per part family |
| machine, operation | Asset register and the order routing |
| part_ | Item master |
| recorded_ | User directory, never a typed name |
cost_basis deserves one extra rule. Store the accumulated standard cost of the piece at the moment the record is written, so that re-costing next year does not silently rewrite last year's Pareto.
If the part is lot tracked, lot_
A scrap record almost always captures where the defect was found. It rarely captures where the part was made bad.
Those are usually different stations, and the gap between them is where the money is.
Take the 16 pieces coded TST‑01 below, all rejected at final test on operation 40.
With only detected_
With caused_
| What you record | What the plant concludes |
|---|---|
| detected_ | "Final test rejects 16 pieces a shift." Action goes to operation 40 |
| detected_ | "Milling tool life costs 11 pieces a shift." Action goes to operation 20 |
At the same illustrative €38.00 per piece, that is €418.00 a shift attached to a tool change interval, and it was invisible before.
The other five rejects were caused at op 30, so €190.00. The two add back to the €608.00 that TST‑01 carries in the Pareto, now split between the two operations that caused it.
Allow caused_
When caused_
A machining and assembly line runs one part for a full shift. Every euro figure here is illustrative, chosen so the arithmetic stays checkable, and none of it is a price list.
Every number below reconciles, so run the same arithmetic on your own costs.
| Item | Value |
|---|---|
| Pieces processed (total count) | 4,000 |
| Good at first pass | 3,750 |
| Reworked and recovered | 90 |
| Scrapped | 160 |
| Good pieces shipped | 3,840 |
| Full standard cost, finished piece | €42.00 |
The three groups reconcile: 3,750 + 90 + 160 = 4,000 pieces.
With availability at 90.0% and performance at 95.0%, the shift scores 0.900 × 0.950 × 0.9375 = 80.2% OEE.
Counting rework as good would have reported 0.900 × 0.950 × 0.960 = 82.1%. The same shift, 1.9 points apart, decided by one bookkeeping rule.
The 160 scrapped pieces split across five codes.
| Code | Pieces | Share |
|---|---|---|
| SET-01 first-off | 60 | 37.5% |
| MAT-02 inclusion | 40 | 25.0% |
| DIM-03 position out | 32 | 20.0% |
| TST-01 test reject | 16 | 10.0% |
| SUR-01 handling scratch | 12 | 7.5% |
| Total | 160 | 100.0% |
Scrap rate by count is 160 ÷ 4,000 = 4.0%, which is the figure our guide to scrap rate defines.
Read on its own, this table sends the team to the setup process, because SET‑01 is 37.5% of the pieces.
Now apply cost_
| Code | Per piece | Cost |
|---|---|---|
| TST-01, 16 pcs | €38.00 | €608.00 |
| DIM-03, 32 pcs | €17.50 | €560.00 |
| SUR-01, 12 pcs | €24.00 | €288.00 |
| SET-01, 60 pcs | €4.50 | €270.00 |
| MAT-02, 40 pcs | €6.00 | €240.00 |
| Total | €1,966.00 |
Scrap cost per good piece is €1,966.00 ÷ 3,840 = €0.51.
Scrap rate by cost is €1,966.00 ÷ (3,840 × €42.00) = 1,966 ÷ 161,280 = 1.22%, against 4.0% by count.
Ranking the same five codes by pieces and by money gives two different action lists.
| Rank | By count | By cost |
|---|---|---|
| 1 | SET-01 | TST-01 |
| 2 | MAT-02 | DIM-03 |
| 3 | DIM-03 | SUR-01 |
| 4 | TST-01 | SET-01 |
| 5 | SUR-01 | MAT-02 |
SET‑01 is 37.5% of the pieces and 13.7% of the money, because a first-off piece dies before any value has been added to it.
TST‑01 is 10.0% of the pieces and 30.9% of the money, because those pieces died after four operations and a coating.
SUR‑01 moves from last by count to third by cost, for the same reason.
The rule to take away: rank by cost, then check whether the count tells a different story. Our guide to Pareto analysis covers the wider method.
The 90 reworked pieces took 6 minutes each at €6.00 of labour and machine time, so rework cost €540.00.
That €540.00 appears nowhere in the scrap Pareto, yet it would rank third if the two reports were merged: TST‑01 €608.00, DIM‑03 €560.00, rework €540.00.
Material tells the third story. The order issued 2,050 kg of bar for 4,000 pieces at a theoretical 0.48 kg each, which is 1,920 kg.
Yield loss is 2,050 - 1,920 = 130 kg, and at €2.10 per kg that is €273.00 of material that never became a piece.
Total quality cost for the shift is €1,966.00 + €540.00 + €273.00 = €2,779.00. Only the first line was in the scrap report.
A taxonomy is not a one-off design job. Without governance it returns to 60 entries within two years.
One named owner, usually the quality or continuous improvement data steward, holds the list. Nobody else may create a code.
A line requests a new code in writing, names the defect and attaches a recent example part. The decision happens at the monthly review, at the detail level only.
Never let a station create codes on the fly. A station that can create a code will create a duplicate of one that already exists, spelled differently.
| Every | What to check |
|---|---|
| Week | OTH rows and their free text; cluster them |
| Month | Pareto by pieces and by cost; split any code over 40% |
| Quarter | Detail lists per line; retire codes unused for two quarters |
| Year | Category level only; expect no change, since a change breaks every trend |
Set two thresholds, not one. OTH above 5% of scrapped pieces or above 5% of scrap cost in a month means the list is missing something.
The cost threshold matters more. Three expensive assemblies in OTH are a hidden defect mode, while fifty cheap first-off pieces are only untidy.
The audit is simple: pull a month of OTH rows with their comments, cluster them, and promote any cluster of five or more to its own detail code.
Never delete a code, and never re-use a code string for a new meaning. Both actions rewrite history silently.
Give the taxonomy table its own fields: status (active or retired), valid_
A retired code disappears from the station picker but stays in the dimension, so old records still resolve to a name.
When a code is split into two, point replaced_by at the successor and build one reporting view that maps old to new. Trends then survive the change, and anyone can see where the join happened.
Fabrico records scrap against the work order and the machine, so every piece lost has a place and a job attached to it.
It calculates real-time OEE, including the Quality factor, from data collected through PLC connections, IoT sensors and computer vision cameras.
Operators work from mobile apps or a web screen, and QR codes on machines and parts open the right record without typing.
Fabrico is not a quality management system. It does not hold your control plan or your non-conformance dossier, it does not do automatic root cause analysis, and it does not force a problem, cause and remedy code set before a work order can be closed.
What it does hold is the measured history underneath those decisions, plus a full CMMS your team uses to act on the machine making bad parts.
Want your scrap coded and costed per machine instead of estimated? Book a 30 minute demo with a Fabrico consultant, no commitment, or contact us with your questions.
For the wider picture, start with our guide to OEE for manufacturing.
Use 10 to 14 category codes for the whole plant, with under 8 detail codes beneath each one. A single flat list stops being selected accurately above about 25 entries.
No. The Quality factor counts only parts that were good at first pass, so a reworked part is a bad part in OEE even though it is later sold.
Scrap is a counted piece that will never be sold, so it lowers the Quality factor. Yield loss is material consumed that never became a countable piece, such as purge or offcuts, so it shows up in material reconciliation instead.
Detected-at tells you which station found the defect, which is usually an inspection point rather than the source. Caused-at is what sends the action to the operation that actually made the part bad.
Rank by cost first, then look at the count. In the example above the code with 37.5% of the pieces held 13.7% of the money, while the code with 10.0% of the pieces held 30.9%.