Material shrinkage on a construction job means you bought more material than the job can account for. Before you conclude anyone is stealing, split the gap into two numbers: how much of it is price and how much is quantity. Price gaps are never theft. Quantity gaps are usually coding, meaning material that went to a different job, got entered as a lump sum, was counted in the wrong unit of measure, or was bought and never returned. Actual theft is real and it does happen, but it looks different in the data than a coding problem does, and you can tell them apart in about an hour with invoices you already have.
That is the sequence. What follows is how to run it: the arithmetic that separates price from quantity, the six ordinary causes that account for most of what shops call shrinkage, the four tests in the order that eliminates the most suspects fastest, and what the data actually looks like when material is walking off.
One reason this matters beyond the money: accusing a crew wrongly is very hard to walk back, and doing the arithmetic first is also the only way to make the accusation stick when it is warranted.
Shrinkage is a gap between two records, not a fact about the world
Nobody observes shrinkage directly. What you observe is that the material charged to a job exceeds the material the job should have consumed. That is a comparison of two records, the purchase record and the estimate or takeoff, and either record can be wrong.
So the first honest statement is that “we have shrinkage” is a hypothesis about your paperwork, not a finding. The gap has to be decomposed before it means anything.
Standard cost accounting already does this decomposition, and the formulas are worth having in front of you. Materials price variance is actual price minus standard price, times actual quantity. Materials quantity variance is actual quantity used minus the standard quantity expected, times the standard price, and the total direct materials cost variance is actual quantity times actual price, minus standard quantity times standard price.
The reason to bother: those two variances have completely different suspect lists. Price variance is caused by what you paid, and named causes include rush delivery charges, commodity price swings, and supplier pricing power. None of those involve anybody carrying anything out of the yard. Quantity variance is the only half where theft is even a candidate, and it shares that half with five or six far more likely explanations.
Run this split first. On a lot of jobs it ends the investigation, because the gap turns out to be price, and price gaps are a purchasing problem. If the same parts have been drifting up month over month without anyone telling you, that is material price creep and it is not a shrinkage issue at all.
The six ordinary causes of an apparent quantity gap
Assume the quantity variance is real and you still have six explanations to clear before theft.
Material coded to the wrong job. The single most common one. A tech picks up material for Tuesday’s job on the Monday ticket. A counter run covers three jobs and gets coded to one. A will-call pickup gets coded to whatever job was open in the system. The material was consumed, just not where your report says.
Material entered as a lump sum. If supply house invoices post to the ledger as one “materials” line per job, there is no quantity at all in your records, only dollars. You cannot compute a quantity variance against a number that has no quantity in it. Shops in this state frequently believe they have shrinkage when what they have is an absence of data.
Unit of measure mismatches. The estimate is in feet, the invoice is in hundreds of feet. The takeoff counts pieces, the invoice bills bags of 100. Unit of measure travels with the catalog number in distributor pricing data, alongside list price and manufacturer catalog number, and it changes when a part changes. A UOM error produces a quantity variance that is off by exactly a factor of ten, twelve or a hundred, which is also the easiest signature to spot.
Surplus bought and never returned. Overbuying is not shrinkage, it is inventory, until it becomes shrinkage by sitting on a shelf for a year. And returning it is harder than most crews assume: published distributor policies carry a minimum 25% restocking fee with no returns on wire cuts or non-stock items at one supplier and a minimum 15% fee with no credit on cut wire or made-to-order material at another, with return windows commonly measured in 30 days from delivery. Material that missed the window is a real loss, but it is a purchasing loss, not a theft loss. See supply house restocking fees for how those terms actually work.
Substitutions and split shipments. When part of an order backorders and the counter substitutes, the piece count and pack size both move, and the job cost record stops lining up with the takeoff. That is its own failure mode, covered in backorders, substitutions and job cost.
Billing errors you paid. An invoice billed for twelve when ten were delivered looks identical to twelve delivered and two stolen. So does the same invoice paid twice, which is common enough to have its own diagnostic in duplicate supply house invoices. Neither is theft by anyone on your payroll, and both are recoverable if you catch them while they are fresh.
Symptom to cause to test
| What you are seeing | Most likely cause | The test that settles it |
|---|---|---|
| Gap is in dollars, piece counts look right | Price variance | Compare unit price to your last purchase of the same SKU |
| Gap is exactly 10x, 12x or 100x | Unit of measure | Read the UOM column on the invoice line |
| One job over, a neighboring job under by a similar amount | Coding | Pull both jobs’ tickets for the same week and check dates |
| No quantities anywhere in the ledger | Lump-sum entry | Look at how one invoice posted, line by line |
| Same invoice number appears twice | Duplicate billing | Match invoice numbers across two months of AP |
| Quantity billed exceeds the packing slip | Supplier quantity error | Compare invoice to delivery ticket |
| Consistent small gaps on one material, across many jobs, no pattern in dates | Possible theft or consistent waste | Physical count, then narrow by who picked up |
Note what the last row requires. Theft is the residual category, the one you land on after the others fail, and even then the first move is a count and not an accusation.
The four tests, in order
Run them in this sequence, because each one eliminates the largest remaining group of suspects.
Test one: split price from quantity. Take one job that ran over on material. For the three or four biggest material lines, pull the actual unit price paid and the actual quantity, and compare each against the estimate separately. If most of the overage is price, you have a purchasing problem and you are done with the shrinkage question.
Test two: check the coding window. For the quantity gap that remains, pull every supply house ticket in the date range for the job that ran over and for the jobs running at the same time. Look for material on one job’s tickets that could only have gone on another. Crews buy for the week, not for the job, and the dates give it away.
Test three: match invoice to PO to delivery ticket. Three-way matching cross-checks the invoice, the purchase order and the delivery receipt, and the named failure modes include quantity mismatch, missing receiving documentation and misaligned line-item descriptions. This is the test that separates “we never received it” from “we received it and lost it,” and those are very different problems. Two-way matching applies when shipping receipts are not available, which is worth knowing because most small contractors do not keep delivery tickets. If you are not doing this yet, three-way matching for contractors covers the setup.
Test four: count what is left. Only now do you count the yard, the shop shelf and the trucks. Do it because up to this point every number you have been arguing about was a record rather than an object. A count converts the question from accounting to physical fact. If the material is on a truck, it was coding. If it is genuinely gone and steps one through three cleared, you have a real loss to explain.
Most shops stop after test two, because test two answers it.
What theft actually looks like in the data
Theft has a signature, and it is not “a job ran over.”
It tends to concentrate on material with resale value: copper wire, fittings in bulk, tools and consumables, gear that fits in a truck. It tends to be consistent across jobs rather than concentrated on one, because the driver is opportunity rather than a specific job’s conditions. It survives a coding audit, meaning the material does not turn up on any other job. And it usually survives a physical count, because the material is not on any truck or shelf either.
A coding problem, by contrast, is lumpy. It appears on one job and disappears on the next. It correlates with a specific week, a specific crew’s buying pattern, or a specific supplier branch. And the missing material generally turns up somewhere, coded to something.
Waste and breakage sit in between and deserve their own line rather than being folded into either bucket. Cut wire, damaged fittings, material buried in a slab, and the last eight feet of a stick that could not be used are ordinary and should be in your estimate as an allowance. If your takeoff assumes zero waste, your quantity variance is not measuring shrinkage. It is measuring the optimism in the takeoff.
Fix the coding before you fix anything else
Every control below makes your records match reality. That is the whole objective, and it also happens to be what makes a real theft case provable.
- Enter material by line, not as a lump sum. Quantity and unit price per SKU, or you have no ability to compute a quantity variance at all. This is the highest-value change on the list and it is also the one shops resist most, because it is more typing.
- Code the ticket at the counter, not at the office. Whoever picked it up knows what job it is for. Two weeks later, nobody does. Photographing the ticket at pickup preserves both the paper and the moment when the answer was still known, which is the practical case for scanning paper supply house invoices.
- Use purchase orders on anything material-heavy. POs let you track committed cost and remaining committed cost at the job, cost code or cost class level, and without them a contractor can genuinely believe a job is more profitable than it is.
- Keep the delivery ticket. It is the third leg of the match, and without it you are limited to two-way matching and cannot distinguish a short delivery from a loss.
- Set a tolerance and enforce it. Common practice is to pass invoices automatically within a small percentage of the PO, or to apply full matching only above a dollar cutoff. Pick a threshold, write it down, and check everything above it. A tolerance you have not decided on is a tolerance of infinity.
- Chase credits to the point where they post. The standard response to a mismatch is to withhold payment and request a corrected invoice or a credit note, and a credit memo can typically be entered against an open PO or offset against a future payment. One published institutional policy escalates uncollected credit balances at 45 days and again at 90 days. Promised credits that never post look exactly like shrinkage on a job cost report.
- Run a tally against your quote while the job is live. One contractor on the Mike Holt forums described gear quoted at one number on bid day and totalling materially higher across the invoices by project completion, and gave the control in one sentence:
"keep a running tally on what has been invoiced and when it hits the quote amount flag it."That is the cheapest shrinkage detector there is, and it works during the job instead of after it.
If it really is theft
Then the coding work you just did is what makes the case. You can show the material was purchased, show it was not consumed on any job, show it did not come back, and show who signed for it. That is a document trail, not a suspicion, and it is the difference between a conversation that goes somewhere and one that poisons a crew.
Narrow it with access rather than with accusation. Who can pick up on the account, at which branches, and with what approval. Getting every buyer onto the account under their own name is a control that improves your pricing accuracy and your accountability at the same time, which is a rare two-for-one.
And keep the base rate in mind. Most gaps are records. The shops that find real theft are usually the ones who cleaned up their coding first, because everyone else’s data was too noisy to see anything in.
The short version
- Split the gap into price variance and quantity variance before anything else. Price is never theft.
- Clear six ordinary causes first: wrong job coding, lump-sum entry, unit of measure, unreturned surplus, substitutions, and billing errors you paid.
- Run the tests in order: split the variance, check the coding window, match invoice to PO to delivery ticket, then count.
- Theft is consistent across jobs, concentrated on resellable material, and survives both a coding audit and a physical count. Coding problems are lumpy and the material turns up.
- Put waste in the estimate as an allowance so it stops contaminating the shrinkage number.
- Enter material by line with quantities, code the ticket at the counter, keep the delivery ticket, and chase credits until they post.
Sources
- Materials Price Variance, AccountingTools
- Direct Materials Variances, Penn State ACCTG 211
- 3-Way Invoice Matching, Stampli
- 3-Way Match, Tipalti
- 3-Way Matching, BILL
- Credit Memo Policy, Miami University Accounts Payable
- Job Costs and Purchase Orders, Foundation Software
- Product Pricing Information (Trade Service), Trimble
- Return Policy, Colonial Electric Supply
- Return Policy, Main Electric Supply
- Return Policies, Electrical Wholesalers
- Ethics of Sharing Competing Supply House Prices With Each Other, Mike Holt forums