The takeoff to purchase order material price gap is almost never one big miss. It is five small leaks that all drain in the same direction: a price that went stale between bid and release, a substituted part that lost its negotiated rate, a quote that was never as complete as it looked, quantities released above what was taken off, and counter purchases that fell off contract pricing entirely. Close them with three things: a release checklist that every PO passes through, a running tally of invoiced material against each quoted package, and a monthly match of PO to packing slip to invoice.
That is the answer. What follows is each leak, the check that catches it, and where the tolerance should sit so your PM is not chasing four dollars.
The estimate itself is a separate discipline, covered in estimating material costs under price volatility. This post starts the moment you win and stops at closeout, where measuring the gap between bid and actual material takes over.
Why the gap opens after you win
Between bid day and release, four things change and none of them announce themselves.
Time passes. The quotes that priced your estimate had validity periods, and some of them lapse before the release. Scope firms up, so quantities move. Availability bites, so parts get substituted. And the buying shifts from an estimator working off quotes to a field team working off need, which is a different transaction path with a different price attached.
That last one is the underrated leak. Your negotiated rate is not attached to you as a person, it is attached to a join between your account, the SKU, and the branch, and the ways that lookup silently fails are catalogued in contract price versus counter price. An estimator’s price and a counter ticket’s price can differ on the same part on the same day, at the same supplier, with nobody doing anything wrong.
The five leaks, and what catches each one
| Leak | Where it shows up | The check that catches it |
|---|---|---|
| Stale price | PO unit price above the estimate unit price on the same SKU | Date column in the estimate, refreshed on volatile classes before release |
| Substitution | Different manufacturer catalog number on the invoice than on the quote | Line-level comparison of quote SKU to PO SKU to invoice SKU |
| Quote incompleteness | Items you assumed were included, bought separately at full price later | Scope audit of the quote against the takeoff before award |
| Quantity drift | Invoiced quantity above the released quantity | Running tally per package, plus packing slip verification |
| Contract price fall-off | Counter runs priced above your agreement | Unit price compared to your own last purchase of the same SKU |
Notice that four of the five are invisible on a totals-level review. If you compare the material total on the invoice to the material total on the PO, only gross errors surface. All of this lives at the line.
The release checklist
Every PO passes through this before it goes out. It takes about four minutes per package and it is the highest-return four minutes in the buyout.
- Quote number and expiration on the PO. If the price came from a quote, the quote number belongs on the PO document. When the invoice arrives without that reference, you have your first clue.
- Unit price, not extended price. Extended totals hide unit price changes behind quantity changes. Release at unit prices and both stay visible.
- Unit of measure, spelled out. Per each versus per bag of 100 versus per hundred feet is a routine, expensive error, and it reads exactly like an overcharge until someone checks the UOM column.
- Manufacturer catalog number, not a description. “3/4 in copper 90” matches four SKUs at three price points. The catalog number matches one.
- Quantity, tied to the takeoff quantity plus a stated waste factor. Write the waste factor down. An unwritten waste factor becomes an unexplained variance.
- Cost code on every line. Coding at release is thirty seconds. Coding after the invoice arrives is a research project, and uncoded material is the single most common reason a job costing report is wrong.
- Branch and freight terms. Which branch fills it, who pays freight, and whether it is will-call or delivered. Those three fields explain most of the price differences you will chase later.
Audit the quote for completeness before you audit it for price
A low quote can be low because the price is good or because the scope is short. The second is more common than most estimators want to believe, and it does not surface until the material is on site.
Contractors describe this directly. On the Mike Holt forums, a long-time contractor described the pattern on gear packages: "One trick they play is to \" forget\" to put fuses in disconnects, include lamps and other things. This way they look lower at first but when you build the job when you add in the fuses or lamps they are higher."
Read that as a scope discipline rather than an accusation. Gear quotes are assembled fast, from manufacturer configurations, under time pressure, and accessories genuinely fall out. The defense is the same either way: before you compare two quotes on price, compare each one against your takeoff line by line and list what is not on it. Fuses in disconnects, lamps, trims, mounting hardware, terminations, connectors, wire pulling accessories. Then ask each supplier to price the missing items so you are comparing the same package. Reps do this without complaint, because the alternative is losing the job on a technicality they did not intend.
The running tally is the whole control
This is the single most useful practice in the cluster and it costs one spreadsheet tab per quoted package.
The problem, as described by a contractor on the same forum thread: "They may quote the stuff on bid day at say $87,000 but when you add all the total invoices up at the completion of the project they can be from $87,000 to $100,000 or more." The control the same poster recommends is exactly right: "keep a running tally on what has been invoiced and when it hits the quote amount flag it."
Build it as three columns per package: quoted amount, invoiced to date, and remaining. Update it when invoices are coded, which is work you are already doing. The flag fires when invoiced-to-date crosses roughly 90% of the quoted amount, which gives you room to ask why before the money is spent rather than after.
What makes this powerful is not the arithmetic, it is the timing. A package that lands 15% over is a conversation you can still have while the job is running, with the quote in front of you and the invoices fresh. The same conversation eight months later is an argument about memory.
Committed cost is the number your PM should be watching
The reason POs exist in a job cost system is not paperwork. Purchase orders let you track committed cost and remaining committed cost at the job, cost code or cost class level, and without them contractors risk thinking a job is more profitable than it really is.
That is the difference between knowing and guessing. Actual cost tells you what has been invoiced. Committed cost tells you what you have already agreed to spend but have not been billed for yet. On a material-heavy job released in three waves, those two numbers can differ by a large fraction of the material budget for weeks at a time, and only one of them is the truth about where you stand.
Set tolerances, or nobody runs the check at all
A matching process that flags every penny gets abandoned in about three weeks. Published practice gives you sensible anchors.
Three-way matching cross-checks invoice, purchase order and delivery receipt, and tolerance rules can be set by value threshold, discrepancy percentage, or vendor quality rating. Typical practice runs invoices within 2% to 3% of the PO passing automatically, or full matching applied only above a dollar cutoff such as $5,000, with named failure modes including quantity mismatch, price over tolerance, missing receiving documentation, wrong vendor, and misaligned line-item descriptions. A published institutional example sets two-way match for goods POs at or below $2,499.99 and three-way match at or above $2,500.
Pick one and write it down. A workable starting point for a contractor: any line where unit price exceeds the PO unit price by more than 3%, or any invoice exceeding the PO total by more than $100, gets held. Everything else passes and gets caught, if it matters, by the monthly unit-price review instead.
When a line does fail, the standard response is to withhold payment and request a corrected invoice or a credit note rather than to argue. Send the invoice number, the line, the SKU, the PO price and the invoiced price. That is a three-line email and it is very hard to dispute. The full mechanics of running this without an AP department are in three-way match for contractors, and the specific case where the invoice contradicts the quote is in quote versus invoice mismatch.
Split the variance before you explain it
When the gap is real, resist reporting it as one number. “We went $9,400 over on material” is not a finding, it is a mood.
Split it. Materials price variance is (actual price minus standard price) times actual quantity, with named causes including rush delivery charges, commodity price swings, supplier pricing power, and volume differing from the estimate. Materials quantity variance is (actual quantity used minus standard quantity expected) times standard price, and the total direct materials cost variance is actual quantity times actual price, less standard quantity times standard price.
The reason to bother is that the two have different owners and different fixes. Price variance is a purchasing and estimating problem: refresh prices, buy earlier, verify contract pricing applied. Quantity variance is a field and takeoff problem: waste factors, over-ordering, theft, or a takeoff that was short. A single blended number sends both teams to the wrong meeting.
Over-buying at release is not a free hedge
The instinct when prices are moving is to release long and hold the extra. Sometimes that is right. Just price the exit before you do it, because returning material is not neutral.
Published distributor return policies are concrete on this. One names a minimum 25% restocking fee, no returns on wire cuts or non-stock items, special and custom orders non-returnable, and a $25 minimum return value. Another sets a minimum 25% restocking fee with prior approval required and a 30-day window from delivery. Others publish a minimum 15% fee with no credit on cut wire or made-to-order material, 60 days on account and 30 days on cash sales, which is why the restocking minimum is a range rather than a single number.
Read that against a hedge. Buying an extra 15% of copper wire to beat a price move is a bet that the price rises more than the cost of being wrong, and if it is cut wire, being wrong means you own it. The details of what suppliers can and cannot charge are in supply house restocking fees. Buy long on things that return cleanly, in original packaging, and stay short on cut goods and specials.
Run it monthly, on the twenty SKUs that matter
You are not auditing everything. You are auditing the material that carries the money.
Once a month, pull your top twenty materials by spend across open jobs and compare three numbers per SKU: the estimate unit price, the PO unit price, and the invoiced unit price. Three columns, twenty rows, one hour. Where all three agree, you are done. Where the PO is above the estimate, you have a pricing or timing issue in the buyout. Where the invoice is above the PO, you have a billing issue, and it is the kind that gets corrected quickly if you raise it while the invoice is fresh.
Fresh matters more than thorough here. Recent lines get credited. Old lines get explanations, because by then the branch has closed the period and the person who wrote the ticket has moved on.
The short version
- The gap is five leaks: stale price, substitution, incomplete quote, quantity drift, and contract price fall-off. Each has its own check.
- Put the quote number, unit price, UOM, catalog number, quantity, cost code, branch and freight terms on every PO.
- Audit gear and package quotes for scope before you compare them on price.
- Keep a running tally of invoiced material against each quoted package, and flag it at 90%.
- Watch committed cost, not just actual cost. POs are what make committed cost visible.
- Set a written tolerance so the match actually gets run, and hold only what breaks it.
- Split the variance into price and quantity before you report it. They have different fixes.
- Price the exit before you over-buy. Restocking minimums are real and cut wire usually cannot go back at all.
Sources
- Job Costs and Purchase Orders, Foundation Software
- Materials Price Variance, AccountingTools
- Direct Materials Variances, Penn State Accounting 211
- 3-Way Invoice Matching, Stampli
- 3-Way Match, Tipalti
- 3-Way Matching, BILL
- Purchase order match thresholds, University of Georgia Business and Finance
- 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