A contractor material cost software stack has five layers: capture (getting the ticket out of the truck), the item master (a part number with a price you can compare to last time), commitment (the PO), the match (invoice against PO and packing slip), and job cost and the general ledger. Most shops own layer one badly, own layer five well, and own nothing in between. That is why the P&L is accurate to the penny and still cannot tell you what you paid for a 3/4 inch copper 90 last March.
The accounting package is not the problem. QuickBooks, Sage, Foundation and the rest do layer five correctly. They record what you spent. The question they were never built to answer is whether the unit price on the line was the price you agreed to, and answering that requires the three layers in the middle that almost nobody staffs or buys.
This post maps the whole chain, names what genuinely owns each layer, and is honest about which layers a fifteen-person shop should skip. If you want the paper-only version of the same control, the contractor’s invoice control system covers it without software, and if you want these layers sequenced by week rather than mapped, that is the thirty-day plan for getting control of material costs.
The five layers, counter ticket to general ledger
| Layer | What it produces | What usually owns it | How it fails |
|---|---|---|---|
| 1. Capture | A legible record of every purchase, including counter runs | Truck cab, glovebox, a shoebox, sometimes email | Tickets arrive weeks late or never |
| 2. Item master | A part number, a unit of measure, a unit price, a date | Nothing, in most shops | Material is entered as one lump sum, so there is no unit price to compare |
| 3. Commitment | A PO with quantities and agreed prices | Estimating software, or a pad in the truck | POs are cut for gear only, not for counter runs |
| 4. Match | Invoice checked against PO and packing slip | The bookkeeper, by eye, on the total | Line-level checks get skipped when volume rises |
| 5. Job cost and GL | Cost by job and cost code, then financial statements | QuickBooks, Sage, Foundation, Vista | Accurate totals built on unverified unit prices |
Read the failure column top to bottom and you get the actual disease. Every layer below two is downstream of a number nobody verified. A wrong unit price becomes a wrong job cost, becomes a wrong bid on the next job of the same type. That chain is the reason this matters past the AP department.
Layer 1: capture, and why it decides everything after it
You cannot audit what you never received. The single biggest hole in a trade contractor’s stack is not a missing feature, it is a will-call ticket that reached the office in November for material bought in September.
Capture has three viable paths and most shops need all three running at once.
Supplier email. Ask your distributor to email invoices to a single address that is not a person’s inbox. This is the cheapest change on this list and the highest leverage. Nothing gets lost in a truck if it never went in one.
Portal export. Every large distributor runs a customer portal with purchase history in it. Pulling that history monthly gives you a second copy of the record, which matters when a paper ticket goes missing.
Photographs. Counter runs are paper and always will be. A photo taken at the counter is a better record than a ticket that survives three weeks in a door pocket. What OCR actually gets right and wrong on a crumpled thermal ticket is its own subject, covered in scanning paper supply-house invoices from the truck.
The test for this layer is not sophistication, it is latency. If your average gap between purchase and the office having the document is more than a week, fix that before buying anything else. Credit requests on fresh invoices get honored routinely, and the same request on a ninety-day-old invoice gets an explanation instead of a credit.
Layer 2: the item master, the layer nobody owns
This is the gap. It is also the least visible one, because nothing errors out when it is missing.
An item master is just a list: part number, description, unit of measure, and every price you have paid for it with a date attached. That is the whole artifact. With it, “did this price move” is a two-second lookup. Without it, the question is unanswerable no matter how good your accounting is.
Most shops destroy this data at the point of entry. The bookkeeper opens a $2,140 supply-house bill and types one line: Materials, $2,140, job 2418. The totals are correct. The general ledger is correct. The job cost is correct. And forty-one unit prices just went into a filing cabinet instead of a database.
Three things have to be true for this layer to work.
The part number has to be stable. Distributors carry their own catalog number, the manufacturer’s catalog number, and sometimes a short counter code. Pick one and use it everywhere. The manufacturer’s catalog number is usually the safest because it survives a change of supplier.
The unit of measure has to be recorded. Per each versus per bag of 100 versus per hundred feet is the single most common false alarm in unit price tracking, and the single most common real overcharge. A price history without a UOM column produces noise you will stop trusting within a month.
The date has to be the purchase date, not the entry date. Otherwise your price trail reflects your bookkeeper’s schedule instead of the market.
Building this by hand from twelve months of invoices is a real project but a finite one, and it is laid out step by step in how to build a unit price history from twelve months of supply-house invoices. Doing it inside QuickBooks rather than a spreadsheet is a specific setup problem, covered in QuickBooks material items setup.
Layer 3: commitment, or what a PO is actually for
A purchase order is the only document that states the price before the material ships, which makes it the only thing an invoice can be checked against.
It also changes what you can see mid-job. Foundation Software notes that purchase orders let contractors track committed cost and remaining committed cost at the job, cost code or cost class level, and that without them contractors risk thinking a job is more profitable than it really is. That distinction between money spent and money already promised is worth understanding on its own terms: see committed cost vs actual cost.
The honest version for a small shop: you are not going to cut a PO for a box of wire nuts. Nobody does. Put POs on gear, on anything quoted, on anything over a dollar threshold you set, and accept that counter runs will be controlled a different way, which is by unit price history rather than by prior authorization.
Layer 4: the match, and the tolerance question
Three-way matching cross-checks the invoice, the purchase order and the delivery receipt. Stampli describes tolerance rules set by value threshold, discrepancy percentage, or vendor quality rating, and notes that two-way matching applies when shipping receipts are unavailable, which is most of the time in a trade shop.
Tolerances are where this gets practical rather than theoretical. Tipalti describes typical practice as invoices within 2% to 3% of the PO passing automatically, or full matching applying only above a dollar cutoff such as $5,000. Published institutional policies work the same way: the University of Georgia uses two-way match for goods POs at or below $2,499.99 and three-way match above $2,500. Those numbers come from organizations with an AP department, so treat them as a shape rather than a rule, but the shape is right. Chasing every $4 variance costs more than it recovers, so pick a threshold, write it down, and stop relitigating it.
When something does not match, the standard response is straightforward: Bill.com describes withholding payment and requesting a corrected invoice or a credit note. The version of this that a two-person office can actually run is in three-way match for contractors.
Layer 5: job cost and the general ledger
This layer is well served by software you probably already own, and it is not where your problem is. What matters is what it can tell you once layers two through four are feeding it real data.
The payoff is variance analysis that means something. The standard definition is that materials price variance equals (actual price minus standard price) times actual quantity, and the named causes of an unfavorable variance include rush delivery charges, commodity swings and supplier pricing power. That formula is useless without a unit price, which is the whole argument for layer two. Split out properly, “we lost money on material” becomes two different problems with two different fixes: a price variance you take to your rep, and a quantity variance you take to the field.
The distributor is running a bigger stack than you are
It helps to know what is on the other side of the counter, because it explains why prices move without anyone deciding they should.
Epicor’s electrical distribution platform ships discrete modules for counter sales, contract pricing with customer-specific rates, rebate and financial management across dozens of manufacturers’ programs, and job management with bid schedules and lot costs. The price on your invoice is the output of several of those modules resolving against each other.
The catalog data underneath is bought in. Trade Service, now part of Trimble, supplies managed pricing and product data from major manufacturers including manufacturer catalog number, list price and unit of measure, synced into distributor ERPs. And the pricing your own estimating software sees is fed from the same direction: NetPricer provides electronic pricing to estimating packages, but only for the products your distributor feeds to the service on your behalf.
Sit with that last one. Your estimating price file is populated by your supplier. It is a good file and it is usually accurate, but it is not an independent check on your supplier, and treating it as one is a category error. The only independent record of what you pay is the record of what you paid.
What a real stack looks like at three sizes
Nobody needs all five layers instrumented with software. Here is the honest version.
Under about $2M in revenue, one or two suppliers. Supplier email to a shared inbox, a phone camera for counter tickets, QuickBooks for the ledger, and a spreadsheet of your top thirty SKUs with a price per month. That spreadsheet is layer two and it takes about an hour a month. Skip POs except on gear.
$2M to $20M, multiple crews, multiple branches. Same capture, but now item-level entry into the accounting package rather than lump sums, POs on anything quoted, and a monthly unit price review. This is the band where the middle layers stop being optional, because the volume of counter runs exceeds what one person can hold in their head.
Above that, or multi-location. Real PO discipline, tolerance thresholds written down, and a match step that happens before payment rather than after. At this size the question stops being tooling and becomes ownership: somebody’s job description has to include it.
One contractor on the Mike Holt forums put the staffing math plainly: “If you purchase over $300,000 a year in electrical materials from supply houses it is almost worth the expense to have a person go over the invoices and quotes to see where you were overhcarged. At least a part time person for sure.” (The typo is his, and it is left in so the quote can be checked against the source thread.) That is the correct instinct. The only question is whether you staff it, tool it, or hand it off.
What to fix first, in order
- Cut the capture lag. Supplier email to one address, photos at the counter, and a hard rule that tickets do not sleep in the truck.
- Pick thirty SKUs. Your highest-volume, highest-dollar parts. Not all of them, thirty.
- Record a unit price and a date for those thirty, every month. Spreadsheet is fine. This is layer two and it is the layer everyone skips.
- Put POs on everything quoted. Gear, fixtures, anything with a quote number. Not on counter runs.
- Set one tolerance and write it down. Above it you call the rep, below it you let it go. Pick a number and stop relitigating it every week.
- Check the price trail before you check the total. Totals are what your bookkeeper already checks. Unit prices are what nobody checks.
- Review monthly, not annually. The whole system runs on the fact that fresh invoices get credited and old ones get explained.
Sources
- Purchase Orders and Job Costs, Foundation Software
- 3-Way Invoice Matching, Stampli
- 3-Way Match, Tipalti
- 3-Way Matching, Bill.com
- Purchase Order Match Requirements, University of Georgia Business and Finance
- Materials Price Variance, AccountingTools
- Electrical Distribution Software, Epicor
- Product Pricing Information (Trade Service), Trimble
- NetPricer Service FAQ, ElectricSmarts
- Ethics of sharing competing supply house prices, Mike Holt forums