Questions

What job cost codes should a small contractor use?

Use the smallest set you will actually apply the same way every time. A list of eighty codes that gets used inconsistently produces worse information than a list of eight that gets used correctly, because inconsistent coding looks exactly like real variation.

Written by JD Davenport, who still sells for a living. Updated 4 November 2026.

Cost codes are the buckets you drop a cost into so that a job's total can be read by part rather than as one lump.

How to size the list

One test. A code earns its place if a change in that number alone would change a decision you make.

Disposal passes. If disposal doubled you would price it differently next year. A code splitting ridge cap from field shingle probably fails, because you are not going to buy those separately, bid them separately or renegotiate one without the other.

Codes that fail that test do not cost nothing. They cost the accuracy of every code around them, because under time pressure somebody picks one of the two and it is not always the same somebody and not always the same one.

A starting set for a small roofing or exteriors business

Material. Labor. Subcontractor. Equipment and rental. Disposal. Permits and fees. Warranty and callback. Other.

Eight. Every one of them passes the test, and every one of them is a thing you would renegotiate, re-price or chase independently of the others.

Two of those are load-bearing and get skipped most often.

Disposal. It hides inside labor invoices constantly. When it does, labor looks high, disposal looks free, and next year you price both wrong off your own history.

Warranty and callback. Almost nobody codes this, so the cost of going back lands on overhead and disappears. Coded to the job, it tells you which crews, which products and which job types actually cost you after the check cleared.

Split only when you have a reason

Labor into crew and supervision, once you have more than one crew and are deciding where to put a lead. Material into shingle, underlayment, metal and accessories, once you buy them from different suppliers or are negotiating one of them. Subcontractor by trade, once you use more than two.

Add a code when a specific decision needs it. Never add one because a template had it.

The part that actually breaks

Not the list. The moment of coding.

A supplier invoice arrives two weeks after the crew left. Somebody in the office decides which job and which code, from a document that often names neither. That is not a discipline problem and it is not fixed by a longer list or by reminding people. It is fixed upstream, at the point the order is placed, by making the job number a required field on the purchase order rather than something to be reconstructed later from an address.

If somebody has to remember to code it right, the fix is not finished. If the order cannot be placed without the job on it, the problem has no route in.

How to tell yours are working

Pull the same code across your last twenty jobs and look at the spread. If disposal runs from nothing to a large number on jobs of similar size, you do not have variable disposal. You have inconsistent coding, and every other code on those jobs is carrying the difference.

The code set, the tests that catch inconsistent coding, and the workbook are The Job Cost Standard. Making the job number impossible to omit at the order is The Production Standard. More answers on the questions page.