To bid using historical material costs, you need one thing before anything else: a table with one row per catalog number, holding the last price you actually paid, the date, the branch, the quantity and the unit of measure. Everything else in this post is downstream of that table. You build it from twelve months of your own invoices, you escalate the older rows forward using a published index, you price the bid off it, and you feed every new invoice back in.
That is the method. It is not complicated and it is not new. The reason most shops do not do it is not that they disagree, it is that nobody has an afternoon to key in a year of invoices, so the estimate gets priced off a catalog number or off what the last guy remembered.
The payoff is worth the afternoon, and it compounds. Once the table exists, you stop guessing at material, you can tell price drift from a market move, and you have receipts the next time you sit down with your rep.
Why your invoices beat a catalog price
A catalog price is a general number. Your invoice is a specific one, and every layer of specificity is a layer of error you are removing from the bid.
Distributor pricing in the trades is customer-specific by design. One contractor on the Mike Holt forums described supply houses charging “everything from 15% of list all the way up to list price for the same item to different customers” (thread). Vision InfoSoft, which publishes pricing data for the electrical trades, defines list or trade price as the non-discounted wholesale price published by the manufacturer and describes the alternative “target” price as an average of prices actually paid by contractors with a cushion built in. Neither of those is your cost. One is a number almost nobody pays, the other is an average plus padding.
Your sharpest pricing is also the least visible to any catalog. Special pricing agreements between manufacturer and distributor are rebates returning money up the supply chain after the sale, and they are static and negotiated per product and per customer rather than applying across a category. Your invoice reflects all of it automatically, because the invoice is the output of the whole pricing stack. The mechanics of that stack are worked through in contract price versus counter price, and the fuller argument against catalog feeds is in live pricing feeds versus your own invoices.
Building the unit-cost table
Twelve months is the right window. Shorter and you miss the seasonal moves. Longer and the old rows need so much escalation that they stop being evidence.
Fields to capture, per invoice line.
| Field | Why it is there |
|---|---|
| Manufacturer catalog number | The join key. Descriptions vary, catalog numbers do not |
| Description | For the parts where the catalog number got mis-keyed |
| Unit of measure | Per each versus per bag of 100 is the single most common false alarm |
| Quantity on the line | Prices attach to quantity breaks |
| Unit price | The number you are actually collecting |
| Extended price | So you can re-derive unit price when the unit price column is blank |
| Invoice date | For escalating forward |
| Invoice number | So every row is traceable back to paper |
| Branch | Same company, different branch, different price is normal |
| Supplier | Obvious, and frequently forgotten in a merged table |
Where the data comes from. Emailed PDF invoices are easiest. Accounting software exports work if the detail lines survived the import, which is worth checking, because many setups post supply house invoices as a single expense line and throw the detail away. Paper invoices in the truck are the common case, and photographing them at the counter is a workable habit; the practical version of that is covered in scanning paper supply house invoices.
Start with the top fifty. Do not try to capture every catalog number you have ever bought. In most shops a small set of parts carries most of the material spend: wire, conduit and fittings, boxes, devices, valves, fittings by size, common fixtures. Fifty rows covers a surprising fraction of a typical bid and takes an afternoon rather than a month. Add the long tail later, or never.
Escalating an old price forward
A price from eleven months ago is not today’s price. You have two ways to bring it forward, and you should use both.
Index escalation. Pick the BLS producer price index series that matches the material and apply the ratio between the index at the invoice date and the index today. Useful series for the trades:
| Material | Series |
|---|---|
| Copper fittings, copper tube | Copper and brass mill shapes (WPU102502) |
| Wire and cable | Copper wire and cable (WPU10260314) |
| PVC and CPVC pipe and fittings | Plastics pipe (WPU07210603) and plastics pipe fittings and unions (WPU07210604) |
| Steel conduit, strut, hangers | Steel mill products (WPU1017) |
| Ductwork and sheet metal | Sheet metal products (WPU1073) |
| HVAC equipment | Unitary air-conditioners, except air source heat pumps (WPU114802) or heat pumps (WPU11480734) |
| Plumbing fittings and trim | Plumbing fixture fittings and trim (WPU1054) |
Worked example, and the arithmetic is the same for any series. Copper and brass mill shapes read 747.384 in January 2026 and 803.275 in June 2026 (BLS marks 2026 months preliminary). A copper fitting you bought in January at $16.10 escalates to roughly $17.30 for a June bid: 16.10 times 803.275 divided by 747.384. Not exact, because your discount structure is not the commodity market, but far better than carrying the January number unchanged.
Two cautions. Some categories move far less than the headline metals: plumbing fixture fittings and trim sat at 453.198 from March through June 2026 (preliminary), flat across four months, against 410.669 in January 2025. Escalating a flat category by a copper number overprices your bid. Wire has a proper commodity series, WPU10260314, so escalate wire off that rather than an industry manufacturing proxy, keeping in mind it covers the category and not THHN versus MC versus NM-B. HVAC splits two ways rather than one: unitary air-conditioners (WPU114802) went 280.520 in January 2026 to 297.025 (P) in May, while heat pumps (WPU11480734) went 146.923 to 141.564 (P) in June. Escalating a heat pump off the air-conditioner series, or off a blended industry index, moves your bid the wrong direction. WPU114802 also publishes about a month behind the other series here, so its latest month will be one short. Plastic pipe splits the same way, pipe under WPU07210603 and fittings under WPU07210604, and neither separates PVC from CPVC from PEX. And re-pull every value before it goes in a bid you will have to defend, because preliminary months get revised.
Your own second data point. If you bought the same part twice in the window, the change between your own two prices is better evidence than any index, because it includes your discount, your branch and your quantity. Where your own delta and the index disagree sharply, you are looking at something specific to your account rather than to the market. That distinction is the whole subject of material price creep, and it is the most valuable thing this table produces beyond the bid itself.
Pricing the bid off the table
- Take off quantities as usual. Nothing about this changes the takeoff.
- Match each line to the table by catalog number. Not by description. Descriptions drift and abbreviate.
- Escalate to the bid date using the material’s index and the invoice date on the row.
- Apply a quantity adjustment where the bid quantity differs materially from the historical quantity. Contract and SPA pricing frequently attaches to purchase thresholds and qualifying criteria, so a price captured on a two-box purchase is not the price for forty boxes, in either direction.
- Mark every line with no history. Those are the risk lines. Price them off a catalog number or a quote, and keep the flag visible so you know where the uncertainty is concentrated.
- Get written quotes for gear and engineered items and record the quote number and the covered quantities. Quoted packages are where the biggest surprises live.
- Carry escalation as a separate visible line, not blended into unit costs, so you can tell afterwards whether you bought well or just guessed high.
On that last point, one contractor’s warning is worth keeping in front of you: a package quoted at “$87,000 on bid day” can total materially higher by project completion, with the suggested control being simply to “keep a running tally on what has been invoiced and when it hits the quote amount flag it” (thread). A historical cost table makes that tally almost free, because you already have the expected number per line.
Closing the loop: variance, not vibes
The table is only worth building if the actuals come back into it, which in practice means a bid versus actual comparison on closed jobs. Two standard formulas do all the work.
Materials price variance is (actual price minus standard price) times actual quantity, where your “standard” is the price you carried in the bid. Named causes of an unfavorable result include 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. Keeping them apart is the point: a job can lose money on material because you bought badly, or because you used more than you took off, and the fix is completely different.
Purchase orders make this measurable in flight rather than at closeout. POs let you track committed cost and remaining committed cost at job, cost code or cost class level, and without them there is a real risk of thinking a job is more profitable than it is. Pairing the PO with a three-way match against the invoice and the receiving document is what keeps the actuals honest enough to feed back into the table. When the invoice does not match what was quoted, that is a quote versus invoice mismatch and it is a correctable event, not just a variance to absorb.
Then, monthly or per job, update the table with the latest price paid for every catalog number that appeared. Next bid is priced off better data than this one was.
A market check, so you know which way the wind blows
Historical cost tells you where you have been. A market index tells you what to expect while the job runs. AGC of America reported that in May 2026 the producer price index for inputs to new nonresidential construction rose 8.4% year over year while contractors’ bid prices rose only 3.5%, with aluminum mill shapes up 48.8% and copper and brass mill shapes up 26.8% over the year. For full-year 2025 the same organization reported aluminum mill shapes up 30.5%, steel mill products up 17% and copper and brass up 11.8%.
Use that for the escalation decision and for the conversation with a GC or owner about who carries the risk. Do not use it for unit pricing. Nobody buys the index.
The checklist
- Pull twelve months of invoices from your top one or two suppliers.
- Capture the top fifty catalog numbers with price, date, quantity, unit of measure, branch and invoice number.
- Verify the unit of measure on every row. It is the most common false alarm and the most common real error.
- Pick a BLS series per material category and record where it stood on each invoice date.
- Escalate old rows to the bid date, and cross-check against your own second purchase of the same part where you have one.
- Price the bid off the table, flag the no-history lines, and keep escalation as its own line.
- Quote gear in writing and record the quote number and covered quantities.
- Run a running tally of invoiced material against the quote during the job.
- At closeout, compute price variance and quantity variance separately, and push the actual prices back into the table.
Sources
- A Complete Guide to Electrical Materials Pricing Strategies, Vision InfoSoft
- Understanding Special Pricing Agreements, Enable
- Introduction to Special Pricing Agreements, Enable
- Pricing Strategy Starts With Experience, Electrical Trends
- PPI: Copper and brass mill shapes (WPU102502), BLS
- PPI: Copper wire and cable (WPU10260314), BLS
- PPI: Plastics pipe (WPU07210603), BLS
- PPI: Plastics pipe fittings and unions (WPU07210604), BLS
- PPI: Plastics pipe and pipe fitting manufacturing (PCU326122326122), BLS
- PPI: Steel mill products (WPU1017), BLS
- PPI: Sheet metal products (WPU1073), BLS
- PPI: Unitary air-conditioners, except air source heat pumps (WPU114802), BLS
- PPI: Heat pumps (WPU11480734), BLS
- PPI: Air-conditioning, refrigeration and forced air heating equipment manufacturing (PCU333415333415), BLS
- PPI: Plumbing fixture fittings and trim (WPU1054), BLS
- Prices for Construction Materials Climb at Highest Rate Since the Pandemic, AGC of America
- Double-Digit Increases in Aluminum, Steel and Copper Costs, AGC of America
- Materials Price Variance, AccountingTools
- Direct Materials Variances, Penn State ACCTG 211
- Job Costs and Purchase Orders, Foundation Software
- Ethics of sharing competing supply house prices with each other, Mike Holt forums