Key takeaways
A nonconformance is where quality, production and maintenance start arguing. The same event costs three departments different money, and each of them counts it a different way.
Most plants have one record for this and believe they have two. They have a scrap reason code on a production transaction, and call it quality data.
| Scrap reason code | Nonconformance record |
|---|---|
| Why a piece was lost | Which requirement was not met |
| Attached to a transaction | A record with its own life |
| The piece is already gone | The material still exists |
| Closed the moment it is written | Open until somebody decides |
| One outcome only | Six possible outcomes |
| No approver | A named approver per outcome |
The last two rows are the whole difference. A scrap code has exactly one ending, and a nonconformance has six, five of which put material back into the plant.
So the scope answer is short. A nonconformance covers a defined requirement that was not met, on a defined quantity, awaiting a defined disposition, and a scrap code covers none of those three.
| You only have | What breaks |
|---|---|
| Scrap codes | Held material is invisible |
| Scrap codes | No record of a concession |
| Scrap codes | Rework costs vanish |
| Nonconformances | No reason taxonomy to group by |
| Nonconformances | Losses never reach the stock ledger |
| Nonconformances | Small losses never get logged |
A scrap only plant reports a clean quality number and has no idea what its inspectors released. In the monthly example below it sees 1.1% and never sees the other 2.1 points of quantity that was held, argued over and shipped.
A nonconformance only plant has the opposite problem: nobody raises a record for four bad housings, so small steady losses appear nowhere and the stock count drifts. You need both, joined on one field, specified at the end of the worked example.
Our page on nonconformance vs defect owns the definition comparison, including why a defect is a narrower idea. The reason codes themselves belong to our scrap reason code taxonomy, and this page does not respecify a single one of them.
The inspection result data model owns the record that usually detects the nonconformance: the round, the typed answer and the tolerance it was judged against. When a machine caused the problem, the repair side is in the equipment failure record data model.
This page owns what none of those four specify: the header, the affected quantity, the containment action and the disposition decision. In other words, what the record carries between the moment somebody says stop and the moment the material leaves the hold area.
The header is one record per event, and an event is one requirement failing on one identifiable quantity of one item. Two requirements failing on the same pallet are two records.
| Field | What it holds | M |
|---|---|---|
| nc_ | NCR-2026-0412 | Yes |
| raised_ | 2026-04-12 14:20 | Yes |
| raised_ | Who stopped it | Yes |
| item_ | The part number | Yes |
| batch_ | B-2026-0771 | If batched |
| work_ | The job that made it | No |
| asset_ | MCH-04 | No |
| operation_ | Where it was made | No |
| requirement_ | Drawing, spec or clause | Yes |
| requirement_ | What should have been true | Yes |
| observed_ | What was actually true | Yes |
| defect_ | From the shared taxonomy | Yes |
| detection_ | See the table below | Yes |
| detection_ | Inspection, operator, audit | Yes |
| inspection_ | The reading that found it | No |
| severity | Safety, regulatory, fit, cosmetic | Yes |
| status | Open, contained, dispositioned, closed | Yes |
| owner | Who must move it on | Yes |
| closed_ | When the last unit left hold | No |
A nonconformance without a requirement_
Keep defect_
Where a nonconformance was found is the most valuable field on the record, and it is usually buried in free text. Give it a controlled list of five or six values.
| detection_point | What it means |
|---|---|
| incoming | On goods receipt, before use |
| in_ | At the machine that made it |
| next_ | Found downstream, same plant |
| final | At final inspection or pack |
| warehouse | In stock, after putaway |
| customer | After despatch |
Add origin_
The quantity is not a number on the header. It is a small table, because the affected quantity moves after the record opens.
| Field | What it holds | M |
|---|---|---|
| nc_ | The key | Yes |
| nc_ | Parent record | Yes |
| qty_ | 480 | Yes |
| uom | Pieces, kg, metres | Yes |
| qty_ | Found, suspect, confirmed | Yes |
| location_ | Where these units sit | Yes |
| hold_ | On hold, released, moved | Yes |
| as_ | 2026-04-12 16:05 | Yes |
| source | Initial find or containment | Yes |
| counted_ | Who did the count | Yes |
The field that surprises people is qty_
The second surprise is that qty_
Give every row an as_
These three words are used interchangeably in most plants, and they are three different records with three different owners. Keeping them apart is a field level decision.
| Term | What it is | Record |
|---|---|---|
| Containment | Protect everything else, now | Containment action |
| Correction | Deal with the affected units | Disposition |
| Corrective action | Stop it happening again | A separate record |
Containment is measured in hours and asks how far the problem reaches. Correction is measured in units and asks what happens to the material you have, while corrective action is measured in months and asks about the process.
| Field | What it holds | M |
|---|---|---|
| containment_ | The key | Yes |
| nc_ | Parent record | Yes |
| action_ | Segregate, stop shipment, sort | Yes |
| scope_ | WIP, stock, transit, customer | Yes |
| qty_ | Units actually looked at | Yes |
| qty_ | Suspect units added | Yes |
| owner | One named person | Yes |
| due_ | Hours, not days | Yes |
| completed_ | When the sweep ended | No |
| verified_ | Who checked it was done | Yes |
| status | Open, done, not applicable | Yes |
qty_
NCR‑2026‑0412 opened at final inspection on 120 units in one pallet, from batch B‑2026‑0771 of 4,800. The containment sweep ran the same afternoon across four locations.
| Location swept | Suspect found |
|---|---|
| WIP at the next operation | 168 |
| Finished goods | 156 |
| In transit | 36 |
| At the customer | 0 |
| Added by containment | 360 |
The rows add up: 168 plus 156 plus 36 plus 0 equals 360. The affected quantity moves from 120 to 120 plus 360 = 480, which is 10.0% of the 4,800 unit batch.
That is three quarters of the final affected quantity arriving after the record was opened. The zero at the customer is the fact that keeps this an internal problem.
This article specifies the record, not the investigation. There is no cause tree here and no eight discipline template, because those are a different model with a different lifetime.
The boundary is one field: corrective_
Resist putting cause_
Disposition is the decision that closes a nonconformance, and the field everything else supports. Six values cover a manufacturing plant, and each is a different contract.
| Disposition | Who may authorise |
|---|---|
| Use as is | Named approver for that requirement |
| Rework | Production supervisor, quality confirms |
| Repair | Engineering plus quality |
| Regrade | Quality plus commercial |
| Return to supplier | Purchasing plus quality |
| Scrap | Quality, plus finance above a value |
The distinction plants get wrong is rework against repair. Rework brings the item back to the original requirement, repair makes it acceptable for use without meeting it.
So repair needs the same approval as use as is, and rework does not. A reworked part is conforming again, and a repaired part is a permanent departure that somebody must own in writing.
| Disposition | What it needs to close |
|---|---|
| Use as is | Approver, justification, expiry |
| Rework | Work order, reinspection result |
| Repair | Method, approver, permanent mark |
| Regrade | New grade or part number, price |
| Return to supplier | Return note, supplier claim ref |
| Scrap | Stock move, cost centre, witness |
The heaviest word in that table is expiry. A concession is granted for a stated quantity or a stated date, and one without a limit quietly becomes the new specification.
| Disposition | Effect on the balance |
|---|---|
| Use as is | Terminal, released to stock |
| Rework | Not terminal, reopens |
| Repair | Terminal, released with a mark |
| Regrade | Terminal, moves part number |
| Return to supplier | Terminal, leaves the site |
| Scrap | Terminal, writes the ledger |
Rework is the only one of the six that is not terminal. Everything hard about nonconformance quantities comes from that single row.
| Term | When permission is given |
|---|---|
| Concession | After the parts exist |
| Deviation | Before they are made |
A concession is the paperwork behind a use as is disposition, and it always names a person. If the unmet requirement belongs to the customer, only the customer may approve.
A deviation is granted in advance and is not a nonconformance at all, because nothing was out of specification when the parts were made. Store the approver as an identity, never as a role, because six months later the question is who signed.
One nonconformance produces one or more disposition lines, each carrying a quantity. This is where the arithmetic lives.
| Field | What it holds | M |
|---|---|---|
| disposition_ | The key | Yes |
| nc_ | Parent record | Yes |
| disposition_ | One of the six | Yes |
| qty | 300 | Yes |
| disposition_ | 1, then 2 if it fails | Yes |
| is_ | Yes on the final outcome | Yes |
| parent_ | The line it followed | If seq > 1 |
| authorised_ | An identity, not a role | Yes |
| authorised_ | 2026-04-14 09:30 | Yes |
| justification | Why this was acceptable | If use as is |
| concession_ | Customer or internal permit | If use as is |
| expires_ | Or expires_ | If use as is |
| rework_ | The job that does the work | If rework |
| reinspection_ | Proof it conforms now | If rework |
| scrap_ | From the shared taxonomy | If scrap |
| stock_ | The ledger transaction | If scrap |
| cost_ | Who carries the loss | Yes |
Three fields there are the ones nobody has: disposition_
Return to NCR‑2026‑0412 with its affected quantity settled at 480 units. On 14 April the material review board split it four ways.
| Disposition (seq 1) | Units |
|---|---|
| Rework | 300 |
| Scrap | 90 |
| Use as is (concession) | 72 |
| Return to supplier | 18 |
| Total | 480 |
Those reconcile: 300 plus 90 plus 72 plus 18 equals 480. Then the rework happened, and it did not all work.
Of the 300 reworked units, 288 passed reinspection and were released, and 12 failed and were scrapped. That second decision is a disposition line too, with disposition_
This is the only integrity check the record really needs. The sum of quantities on terminal disposition lines must equal the affected quantity.
| Terminal line | Units |
|---|---|
| Released after rework | 288 |
| Scrapped after rework | 12 |
| Scrapped directly | 90 |
| Use as is | 72 |
| Returned to supplier | 18 |
| Total | 480 |
Check it: 288 plus 12 plus 90 plus 72 plus 18 equals 480, the affected quantity exactly. Now total every disposition line instead, terminal or not.
| All lines | Units |
|---|---|
| Rework (seq 1) | 300 |
| Scrap (seq 1) | 90 |
| Use as is (seq 1) | 72 |
| Return (seq 1) | 18 |
| Scrap (seq 2) | 12 |
| Total | 492 |
That total is 492, and 492 minus 480 equals 12. Only 480 pieces ever existed, so 12 have been counted twice, which is 2.5% of the record.
is_
Take a scrap standard cost of €14.20 per unit and a rework cost of €3.75 per unit. The return to supplier is a supplier recovery, so it is excluded here.
The scrapped quantity is 90 plus 12 = 102, and the rework quantity stays 300 because all 300 were physically reworked. So the correct direct cost is 102 × 14.20 = €1,448.40 plus 300 × 3.75 = €1,125.00, which is €2,573.40.
| Version | Result |
|---|---|
| Terminal lines, both activities | €2,573.40 |
| Rework billed on 288 only | €2,528.40 |
| The 12 scrapped in two places | €2,743.80 |
The middle row drops the rework labour on the 12 that failed: 12 × 3.75 = €45.00 understated. The bottom row charges those 12 units of material twice: 12 × 14.20 = €170.40 overstated.
Check both: 2,573.40 minus 2,528.40 equals 45.00, and 2,743.80 minus 2,573.40 equals 170.40. The spread between the two wrong answers is €215.40 on one record.
The same defect on the same part costs different money depending only on where it was found. Take the same 480 units and assume, for a clean comparison, that all were scrapped at each point.
Every input below is an assumption you must replace with your own numbers.
| Input | Value |
|---|---|
| Material per unit | €6.40 |
| Conversion to operation 30 | €2.10 |
| Full conversion | €7.80 |
| Outbound freight | €1.10 |
| Return freight | €1.90 |
| Fixed event cost at customer | €420.00 |
Unit cost at the machine is 6.40 plus 2.10 = €8.50. At final inspection it is 6.40 plus 7.80 = €14.20, and at the customer it is 14.20 plus 1.10 plus 1.90 = €17.20.
| Found at | Sum | Cost |
|---|---|---|
| The machine | 480 × 8.50 | €4,080.00 |
| Final inspection | 480 × 14.20 | €6,816.00 |
| The customer | 480 × 17.20 + 420 | €8,676.00 |
Final inspection costs 1.67 times the machine, and the customer costs 2.13 times it. Moving the catch from the customer to the machine is worth €4,596.00 on this one event.
The gap between the machine and final inspection alone is €2,736.00, which is 6,816.00 minus 4,080.00. That is the number that pays for a gauge at operation 30, and it is computable only if detection point is a field.
Say what the customer figure leaves out, because that matters more than the figure. It contains no price concession, no lost order and no line stop charge, so treat it as a floor rather than an estimate.
The softest input is the €420.00: a containment visit, a sort at the customer, credit note administration. The real disposition on NCR‑2026‑0412 cost €2,573.40 against the €6,816.00 ceiling, so the board's work was worth €4,242.60.
One machining cell, MCH‑04, September 2026. The line produced 58,400 units across 412 production lots.
34 nonconformance records were raised, covering 1,868 affected units. 27 were closed inside the month and 7 were still open on the last day, and 27 plus 7 equals 34.
| Affected quantity | Events | Units |
|---|---|---|
| 1 to 10 units | 21 | 102 |
| 11 to 100 units | 8 | 338 |
| Over 100 units | 5 | 1,428 |
| Total | 34 | 1,868 |
Both columns reconcile: 21 plus 8 plus 5 equals 34, and 102 plus 338 plus 1,428 equals 1,868.
The 21 smallest events are 61.8% of the event count and only 5.5% of the affected quantity. The 5 largest are 14.7% of the count and 76.4% of the quantity.
| detection_point | Events | Units |
|---|---|---|
| In process | 19 | 402 |
| Final inspection | 11 | 1,241 |
| Customer | 4 | 225 |
| Total | 34 | 1,868 |
Both columns add up again: 19 plus 11 plus 4 equals 34, and 402 plus 1,241 plus 225 equals 1,868. Final inspection is a third of the events and two thirds of the quantity, which is what a batch hold looks like.
| Terminal outcome | Units |
|---|---|
| Released after rework | 719 |
| Scrapped after rework | 23 |
| Scrapped directly | 611 |
| Use as is | 402 |
| Returned to supplier | 78 |
| Regraded | 35 |
| Total | 1,868 |
They reconcile: 719 plus 23 plus 611 plus 402 plus 78 plus 35 equals 1,868. Total every line rather than the terminal ones and you get 1,891, because 742 units went to rework and 23 of them were dispositioned a second time.
The surplus is 1,891 minus 1,868 = 23 units, the same trap at monthly scale. Units actually scrapped are 611 plus 23 = 634, which is 1.1% of the 58,400 produced.
Here is the number a scrap only plant never sees. Released back into the flow are 719 plus 402 plus 35 = 1,156 units, which is 61.9% of everything the records touched.
Put the other way, 1,868 minus 634 = 1,234 units were held and then not scrapped. That is 2.1% of production, invisible to a scrap code, and it is where the inspection hours and the arguments actually go.
Both definitions below are honest, both are in use, and both are computed from exactly the same 34 records.
| Definition | Sum | Result |
|---|---|---|
| By event count | 34 ÷ 412 | 8.3% |
| By affected quantity | 1,868 ÷ 58,400 | 3.2% |
The gap is 5.1 percentage points, which is 8.3 minus 3.2. In counts, it is the 21 tiny events carrying 102 units between them against the 5 batch holds carrying 1,428.
Neither rate is wrong and a plant needs both. Event count tells you how often the process surprises somebody, and affected quantity tells you how much material it puts at risk.
The failure is publishing one of them as the nonconformance rate. Publish the numerator and the denominator beside every percentage, the same discipline our OEE calculation guide applies to availability.
Read the quantity rate next to first pass yield, because a plant low on both is finding its problems somewhere other than in this record.
| Field | Sits on |
|---|---|
| scrap_ | The disposition line |
| nc_ | The scrap transaction |
| stock_ | The disposition line |
A scrap disposition writes a stock transaction and carries a reason code from the same taxonomy the shop floor uses. A scrap transaction raised without a nonconformance leaves nc_
The reconciliation is then one query. Scrap units carrying an nc_
Do not build a second reason list inside the quality record: that list lives in our scrap reason code taxonomy. Batches are in the batch process data model and the maintenance tables in the CMMS data model.
Ask for a demonstration in their system rather than a yes.
Before a shortlist, read what is a CMMS, statistical process control, downtime reason code design and the asset hierarchy data model.
Fabrico is an OEE platform with a full CMMS built in, and the data foundation underneath an investigation. It is worth being exact about which half of this article it touches.
What Fabrico does today: machine history per asset, downtime and micro stop capture from PLC connections, IoT sensors and AI cameras, real time OEE context around the moment the event happened, parts consumed per work order, and MTTR and MTBF by machine.
Your team works from the iOS, Android or web app and scans a QR code on a machine or part to open the right card. The AI assistant answers questions about one machine or one failure in plain language, and analytics export to Excel.
Now the honest boundary, stated plainly. Fabrico has no root cause workflow: no cause tree, no auditor ready investigation dossier, and it does not force structured Problem, Cause and Remedy codes before a work order can be closed.
Fabrico also does not advertise a nonconformance record, a disposition workflow or a quality module. Treat everything in this article about headers, dispositions and quantity balances as a specification to test your shortlist against, not as a feature list.
Three more boundaries worth saying out loud. A work order in Fabrico is always created and confirmed by your team, failure forecasting is not a standard feature, and production planning and scheduling are not part of the product.
Want the machine side of your quality events measured instead of remembered? Book a 30 minute demo with a Fabrico consultant, no commitment, or contact us with your questions.
A header with nc_id, raised_at, raised_by, item_id, batch_id, requirement_ref, requirement_text, observed_text, defect_code, detection_point, severity, status and owner. Then three child tables: affected quantity, containment action and disposition decision.
A scrap code says why one piece was lost and is closed the moment it is written. A nonconformance says a defined requirement was not met on a defined quantity, and it stays open until somebody with authority chooses a disposition.
Use as is, rework, repair, regrade, return to supplier and scrap. Use as is and repair both need a named approver with authority over the unmet requirement, and where that requirement is the customer's, only the customer can approve it.
Give every disposition line a sequence number and an is_terminal flag, and report quantities only from terminal lines. In the example above 480 affected units produce 492 units of disposition lines, and the 12 unit surplus is the rework that later failed.
Either events divided by production lots, or affected quantity divided by units produced. The month above gives 34 ÷ 412 = 8.3% by event and 1,868 ÷ 58,400 = 3.2% by quantity, so always publish which one you used.