The short answer: a QuickBooks contractor material items setup that actually tracks prices means creating purchase-side items for the parts you buy most, entering supply-house bills line by line against those items instead of as one Materials lump sum, and assigning each line to a customer and job. Do that and QuickBooks will tell you what you paid for a 3/4 inch copper 90 in March, June and September. Skip it and no report in the software can answer that question, because the data was never captured.
The failure is not in QuickBooks. It is in how material gets entered. A bookkeeper opens a $2,140 supply-house bill and types one line: Materials, $2,140, job 2418. The bank reconciles. The P&L is right. The job cost is right. And forty-one unit prices went into a filing cabinet instead of a database.
That is where material price creep hides. Not in the totals, which everyone checks, but in the per-unit numbers that were never recorded in a comparable form. What to set up, what not to bother setting up, and the exact reports that pay you back, in that order.
Items and accounts are not the same thing, and this is the whole trick
QuickBooks has two parallel structures and shops routinely use only one of them.
An account is a bucket in the general ledger. Job Materials, Cost of Goods Sold, Subcontractors. Accounts answer “how much did we spend on material this quarter.” Every shop uses accounts, because you cannot enter a bill without one.
An item is a thing, with a name, a description, a cost, and optionally a price you sell it at. Items answer “what did we pay for this thing, each time we bought it.” Items post to accounts, so using items costs you nothing on the financial statements. You get the same P&L plus a price history.
For material you need items configured on the purchase side. In QuickBooks Desktop that means checking the box on a service or non-inventory item that reveals separate purchase and sales fields (often called a two-sided item). In QuickBooks Online it is the “I purchase this product/service from a vendor” checkbox on a product or service. Same idea in both: one record, a cost field, a sales field, and both halves reportable.
Inventory items are a different animal and most trade shops should avoid them. Inventory tracking implies you know what is on the shelf and in the truck at all times. If your truck stock is honestly unknown, an inventory item will produce quantity-on-hand numbers that are confidently wrong, which is worse than no number. Non-inventory items, purchased for a specific customer or job, are the right choice for the way a service or install shop actually buys. What unallocated truck and shop stock does to job costing is a separate problem, and it is not one an inventory item solves.
Do not create four thousand items
The single most common way this project dies is trying to mirror the distributor’s catalog. Nobody finishes that, and the half-finished version is worse than nothing because entry becomes a search problem and the field starts guessing.
Build the short list instead. Pull your last twelve months of supply-house invoices and rank lines by total dollars. In most shops, a few dozen part numbers carry the majority of the material spend, because you install the same fittings, the same wire, the same fixtures, week after week.
Start with thirty to fifty items covering:
- Your top twenty SKUs by annual dollar volume
- Anything copper, because copper moves fastest and moves the most
- Anything you buy at least monthly, even if the dollars are small, because those are where creep compounds quietly
- Two or three generic catch-alls, honestly named: Misc Electrical, Misc Fittings, Misc Consumables
Everything else goes into a catch-all. That is not a failure, it is the design. A catch-all with a real description is fine. A catch-all called Materials that absorbs 90% of your spend is the problem you are fixing.
How to set up one item so it stays useful
The fields matter less than the conventions. Here is what to put where.
| Field | What to put in it | Why |
|---|---|---|
| Item name or number | Manufacturer catalog number, not the distributor’s | Survives a change of supplier or branch |
| Description | Plain trade language plus size and pack | The field searches on this, not on the catalog number |
| Unit of measure | Each, bag of 10, 100 ft, roll | The most common false alarm in price tracking is a UOM change |
| Cost | Your most recent actual cost | Gets prefilled on bills, so a change is visible during entry |
| Preferred vendor | Your primary supply house | Makes the vendor-by-item reports readable |
| Account (purchase side) | Job Materials or your COGS material account | Keeps the P&L identical to what you have today |
| Sales price or markup | Whatever you actually bill at | Optional, but it makes margin visible per part |
Two conventions are worth being rigid about.
Put the pack size in the item name. “1/2 EMT set screw connector, bag of 100” and “1/2 EMT set screw connector, each” are two items, not one. If your edition has no unit of measure field, the name is where it lives. Merging them produces a price history that looks like wild volatility and is actually arithmetic.
Use the manufacturer’s catalog number. Distributor catalog numbers change when you change branches or suppliers, and the whole point of this exercise is to be able to compare a price across suppliers.
Entering a supply-house bill so the price survives
This is the part that costs time, so be deliberate about where you spend it.
Enter bills on the Items tab, not the Expenses tab. The Expenses tab writes a dollar amount to an account and nothing else. The Items tab writes a part, a quantity, a rate and a total. Same GL result, completely different data.
Enter quantity and rate separately. If you type the extended amount and let QuickBooks back into a rate, you get a rate but not a checked one. Typing the quantity from the invoice and the unit price from the invoice means the extended total either matches the supplier’s total or it does not, and a mismatch is a finding.
Apply the 80/20 rule out loud. Line-item the parts on your short list. Roll the rest into a catch-all line for that invoice with the invoice number in the memo. A fifteen-line supply-house bill usually becomes five item lines and one catch-all, which is about ninety seconds of work, not fifteen minutes.
Put the supplier’s invoice number in the bill reference field, every time, no exceptions. This is what makes duplicate detection possible at all: QuickBooks will warn on a repeated bill number, and it cannot warn on a number you did not enter. That check is worth more than it sounds, and the mechanics are in how to spot a duplicate supply-house invoice.
Counter runs paid on a card are still bills in this sense. Enter the credit card charge with the same items on the Items tab. Skipping card purchases is how half a shop’s material spend becomes invisible.
Job costing without slowing the field down
Every item line takes a customer and job. Fill it in, including on card charges and counter tickets. An unassigned material line is not neutral, it lands in overhead and quietly makes the jobs that did get coded look worse than they are.
Two practical rules.
Code at entry, not at month end. By the fifteenth nobody remembers which job the two boxes of MC went to. Coding at entry means the tech has to write a job number on the ticket at the counter, which is a field habit, not a software feature. Ways to make that stick without adding paperwork are in coding supply-house invoices to jobs.
Decide your billable convention once. On time and materials work, marking lines billable is what feeds an invoice later. On fixed price work it usually just creates unbilled clutter. Pick a rule per job type and write it on the wall over the bookkeeper’s desk.
The three reports that pay for the whole exercise
Once bills carry items, the reports below stop being decorative.
Purchases by item detail. Every purchase of every part, with date, vendor, quantity and rate. Filter to one item, sort by date, and you are looking at a price trail. This is the report that answers the only question that matters: same part, same supplier, is the number moving. It is also the number a flat rate pricebook stops rechecking the day you build it, so if you sell flat rate, run it against your task costs too.
Item purchase history for a single part. Desktop calls it a QuickReport, Online reaches it through the product or service record. Same data, one part, fastest way to check something a tech flagged.
Purchases by vendor detail. Useful for the branch problem. If you buy the same SKU at two branches of the same distributor, this is where the difference shows up, and branch-level pricing differences are ordinary rather than sinister.
Run the first one monthly on your top ten items. Ten minutes. Anything that moved more than a few percent since last time is either a market move or a lookup that fell through, and telling those apart is a matter of comparing to published data rather than guessing. The producer price index for plumbing fixture fittings and trim, for instance, read 410.669 in January 2025 and 451.310 in January 2026, about 10% over the year. Copper and brass mill shapes ran harder, 645.990 in January 2025 against 747.384 in January 2026, roughly 16%. Those are national index moves, not your prices. They tell you what direction is defensible. Your item report tells you your actual number, and the gap between the two is the conversation to have with your rep.
Credits, returns and the ones that never post
Enter vendor credits as credits against the same items, not as a negative expense line. A credit booked to an account reduces your spend and leaves your price history untouched, which is what you want. A credit booked as a negative quantity of the item corrupts the price trail.
Track open credits separately, because a promised credit is not a posted credit. Published credit memo policies show how formal this gets on the other side of the counter: one institutional policy applies a credit memo against an open PO or offsets it against a future payment to the same vendor, with balances uncollected past 45 days triggering vendor contact and past 90 days going to collections. Your shop needs the small version of that: a list, with dates, that somebody looks at monthly. The reason it matters is in the credit they promised and never issued.
What QuickBooks will not do for you
Be clear-eyed about the boundary, because it decides whether you need anything else.
It will not compare an invoice to a quote. There is no quote object in the purchase-side workflow that an incoming bill is matched against, so checking an invoice against the quote stays a manual job.
It will not tell you a price moved. It will store every price faithfully and wait to be asked. Nothing alerts. If nobody runs the report, the data may as well not exist.
It will not read a paper ticket. Capture is a separate problem and a real one, covered in scanning paper supply-house invoices from the truck.
It will not flag a unit of measure change, a substituted part number, or a quantity that does not match the packing slip. Those are eyeball checks, and where they sit in the wider chain is mapped in the contractor’s material cost software stack.
The setup checklist
- Pull twelve months of supply-house invoices and rank lines by total dollars.
- Create thirty to fifty purchase-side items from the top of that list, plus two or three honestly named catch-alls.
- Name every item with the manufacturer catalog number and put the pack size in the description.
- Set the purchase account to the same material account you already use, so the P&L does not change.
- Switch bill entry to the Items tab, with quantity and rate typed separately from the invoice.
- Enter the supplier invoice number in the reference field on every bill and every card charge.
- Assign customer and job on every line at entry.
- Enter vendor credits against items, and keep a dated list of credits promised but not yet posted.
- Run purchases by item detail on your top ten parts, monthly, and compare against your own last price.
- Leave the rest in the catch-all and do not feel bad about it.