Why the Default Setup Fails You
Open QuickBooks, choose a generic business template, and you get a chart of accounts built for a company that buys things and sells things. Revenue. Cost of goods sold. Expenses.
A construction company does not work that way. You need to know the cost of each job, broken into categories you can compare against an estimate, with direct costs separated from the overhead that has to be absorbed across everything. The generic chart cannot produce that, so contractors end up with a single "Job Materials" account holding $600,000 and no ability to tell which job or which phase it belongs to.
Everything downstream depends on this. Job costing, WIP schedules, estimate-versus-actual analysis — all of it is assembled from the structure underneath. Get the chart wrong and every report built on it is approximate.
Two Dimensions, Not One
The key idea that fixes most contractor bookkeeping: the chart of accounts answers what kind of cost, and the job and cost code answer where it went. They are separate dimensions and should not be collapsed into one.
You do not need an account called "Materials — Johnson Residence". You need an account called "Job Costs — Materials", and a job dimension recording Johnson Residence, and a cost code recording framing. Three fields, each doing one thing.
Contractors who create accounts per job end up with charts running to hundreds of lines that become unusable within two years. Contractors who use one account and no job dimension can produce a P&L but never a job cost report. Both problems come from the same confusion.
Direct Costs Belong in Their Own Section
Structure your cost of revenue around the categories you estimate in, because the whole purpose is comparing actual to estimate:
- Direct labour — field wages charged to jobs
- Labour burden — the taxes and insurance carried on that labour, kept separate so you can see it
- Materials
- Subcontractors
- Equipment — rental, and an allocation for owned equipment
- Other direct costs — permits, dumpsters, job-specific insurance, temporary utilities
Keeping burden visible as its own line rather than buried in wages is one of the higher-value choices here. It is a large number and it belongs where you can watch it.
Indirect Costs Are Not Overhead
There is a third category between direct job costs and general overhead: costs that support production but cannot be traced to one job. Your superintendent covering four sites. Yard and shop costs. Small tools consumed across jobs. Vehicle costs for field staff.
Treating these as general overhead understates the true cost of production and makes your gross margin look better than it is. Most contractors allocate them to jobs on a reasonable basis — labour hours or labour dollars are common — so that job-level margin reflects what production actually costs.
General and administrative costs stay where they belong: office rent, administrative salaries, professional fees, marketing. Those are the cost of being in business, not the cost of building.
Cost Codes and the NAHB Framework
Cost codes break job costs into phases — excavation, foundation, framing, roofing, electrical, and so on — so you can compare actual against estimate at a level detailed enough to act on.
The NAHB chart of accounts provides a standard framework many residential builders use, and adopting an established structure has real advantages: it is already complete, your estimator and bookkeeper are working from the same list, and industry benchmarks become comparable.
Whatever you adopt, the rule that matters is that cost codes match your estimating structure. If you estimate in eleven categories and cost in six, you cannot compare the two, and the entire feedback loop from job performance back into bidding is broken.
How Much Detail Is Too Much
The failure mode at the other end is a hundred and forty cost codes that nobody uses correctly. Codes only work if the person coding an invoice in the field picks the right one consistently — and past a certain point, they will not.
The test is whether you would act differently based on the distinction. If separating "framing lumber" from "framing hardware" would change a decision, split them. If it would not, one code is better.
Start with fewer codes than you think you need. Adding a code later is easy; re-coding two years of history because the structure was unusable is not.
Restructuring an Existing Set of Books
If your chart is already a mess, the work is real but bounded — typically a few days, best done at a period end so history stays clean on one side of the line. Map old accounts to new, decide whether to restate prior periods or draw a line, and make sure whoever codes daily is trained on the new structure before it goes live.
It is the single highest-leverage cleanup available to most contractors, because everything else you want from your numbers depends on it. If you want help scoping what it would take with your existing books, that is a conversation worth having.
Ready to get your finances in order?
Book a free 30-minute consultation with FinRise Advisors — no obligation.