The Short Version
I have set up QuickBooks job costing for more than 80 residential builders in the Go First program. The pattern is almost always the same: someone turned on the Projects feature, used whatever default categories came with the software, and now the reports either show everything lumped under "Construction" or are so fragmented across 40-plus codes that nobody uses them. The fix is straightforward, but it requires rebuilding the cost code structure from scratch with your actual workflow in mind. This post covers the structure that works, the codes that matter, and how to set it up so the reports actually tell you something.
Sound Familiar?
Signs your QuickBooks job costing setup is not working:
- Your job cost reports show gross revenue and total expenses but not a clear breakdown by phase or trade, so you cannot tell where margin is going
- You have more than 25 cost codes and most of them get used on fewer than 30% of jobs, which means the structure does not match your actual workflow
- You coded expenses manually at month end rather than coding them at the time of entry, so the data is always 30 days behind
- Your subcontractor costs are all coded to a single "Subcontractors" line item rather than by trade, so you cannot see which trades are running over budget
- You use QuickBooks Projects but your project actuals never match your estimates because the estimate lives in a spreadsheet and the job costs live in QuickBooks with different code structures
- You have tried to use job costing reports to identify your most profitable job types and come up empty because the codes are inconsistent across jobs
What We Found
Why Default QuickBooks Cost Codes Fail Construction Businesses
QuickBooks Online was built for service businesses, retail, and professional services. The job costing feature is a retrofit. The default categories, the way the Projects interface is structured, and the report formats were designed for businesses where a "job" is a client invoice, not a 90-day construction project with 15 trade contractors, material deliveries, and permit fees.
When builders use QuickBooks out of the box, they inherit a cost structure built for someone else. The defaults tend to be either too broad ("Construction Costs," "Labor," "Materials") or misaligned with construction trade categories. Neither produces a report that helps a builder understand where margin went on a specific job.
The second problem is the disconnect between estimates and actuals. Most builders estimate in a spreadsheet, in JobTread, in Buildertrend, or in some other tool, and then enter actual costs in QuickBooks as bills and expenses. If the categories in the estimating tool do not match the cost codes in QuickBooks, you cannot compare your estimate to your actuals at the line-item level. You can only compare total job revenue to total job cost. That comparison tells you whether you made money β not where you made it or lost it.
The third problem is coding discipline. Job costing only works when every expense gets coded to the right project and the right cost code at the time of entry. Most construction companies do not have this discipline because nobody set up a consistent system or trained the person doing the books. Expenses pile up uncoded, get assigned to the wrong project, or get coded to catch-all categories that obscure what actually happened on the job.
The fix for all three problems starts with rebuilding your cost code structure from the ground up β not customizing defaults, but designing a structure that maps to how you actually build.
The 15-Code Structure That Works for Residential Builders
After running this exercise with dozens of builders, here is the cost code structure I build for residential general contractors doing $750K to $3M. It covers the trades and phases that appear on most residential jobs without creating so many categories that coding becomes a burden.
Site Work and Demolition
Excavation, demolition, temporary utilities, site prep. On new construction, this is a substantial early cost. On renovations, demo costs often run over because concealed conditions were not fully scoped. Tracking this separately lets you see whether your demo estimates are accurate over time.
Foundation and Concrete
Footings, foundations, slabs, concrete flatwork. Concrete pricing is volatile and subcontractor bids in this category have run 15-25% over estimate in the current market. Tracking it separately lets you see the variance and adjust future bids.
Framing and Structural
Rough framing, structural steel, engineered lumber. This is often the largest single cost category on a new build. A dedicated code lets you track framing labor and materials separately from other rough trades.
Roofing and Exterior
Roofing, flashing, gutters, exterior trim, siding. Group these because they are typically one sub package or closely related scopes. If you break them into individual codes, most jobs will have several of these empty.
Windows and Doors
Material cost of windows and exterior doors is significant and price-volatile. Track separately from framing so you can see actual cost against your window allowance or material budget.
Rough MEP (Mechanical, Electrical, Plumbing)
Rough-in work for HVAC, electrical, and plumbing. These three trades together often represent 20-30% of total project cost on a full renovation or new build. Some builders prefer a code per trade (Plumbing Rough, Electrical Rough, HVAC Rough) β that works well if you have consistent subs in each trade and want to benchmark by trade over time.
Insulation
A small but distinct cost category. Spray foam and blown-in insulation costs have increased significantly since 2021 and are worth tracking separately from framing and drywall.
Drywall
Labor and materials for drywall, taping, and texture. Drywall subcontractors often hold the price until the rough walkthrough and then add charges for blocking, patching, and ceiling conditions. Tracking this separately shows you where the change order exposure is highest.
Finish Carpentry and Millwork
Trim, cabinets, built-ins, stairs. This is a category where client-selection-driven cost growth is most common. Allowances get exceeded, upgrades get added, and the cost overrun ends up in this code. Separate tracking makes the client conversation easier.
Flooring
All finish flooring trades and materials. High allowance variance category on residential jobs. Track separately to see allowance accuracy over time.
Tile and Stone
Bathrooms, kitchen backsplash, hearths. Often a separate sub from flooring. Labor costs here run higher than most builders estimate, especially on custom tile work with complex patterns.
Paint and Finishes
Interior and exterior painting, stain, specialty finishes. One of the most consistent overage categories on renovation projects because scope creep is hard to see until everything needs to be painted.
Finish MEP
Finish plumbing fixtures, trim-out, final electrical, HVAC startup and commissioning. Separate from rough MEP so you can see the cost split between rough-in and finish phases.
Appliances and Fixtures
Appliances, light fixtures, plumbing fixtures β items purchased by you rather than by the sub. Tracking separately from MEP labor shows whether your fixture procurement costs are in line with allowances.
Site Cleanup and Punch
Final cleaning, punch list labor, site restoration. A small but consistently underestimated category. Most builders spend 0.5-1.5% of project cost on final cleanup and punch. Track it to know your actual cost and build a realistic reserve into bids.
That is 15 codes. If your project type includes consistent additional categories β landscaping, pools, custom metalwork β add them. If some of these categories are always zero on your jobs, remove them. The goal is a structure that produces a meaningful report on every job without requiring codes you almost never use.
How to Connect QuickBooks Cost Codes to Your Estimating Workflow
The cost code structure only produces useful data if your estimates and your actuals use the same categories. Here is how to align them.
If you estimate in a spreadsheet
Build your estimate template with the same 15 codes as your QuickBooks structure. Name them identically. When you win a job, your estimate subtotals by code become your budget target in QuickBooks. When you enter bills and expenses, code them to the matching category. Your job cost report now shows budget versus actual by code β and you can see immediately which trade is running over and by how much.
If you estimate in JobTread
JobTread has a cost code system that can mirror your QuickBooks structure. Set up matching codes in both tools. When you export cost data from JobTread or when expenses flow through your QuickBooks integration, they land in the right buckets. The JobTread-QuickBooks sync does not automatically map cost codes between tools β you need to configure it. But once configured, the actuals flow through without manual reclassification.
The Go First JobTread setup process includes aligning cost codes between JobTread and QuickBooks as a standard step β most builders who have gone through it tell me it is one of the most immediately useful changes they make, because their job cost reports suddenly make sense for the first time. You can learn more at the JobTread Setup service page.
Coding discipline: the make-or-break factor
The best cost code structure fails if expenses are not coded consistently. Three practices that build coding discipline:
- Code at entry, not at close. Every bill, every expense, every subcontractor invoice gets coded to the right project and cost code when it is entered β not batched at month end. This requires whoever enters bills to know the code structure. Print a one-page reference sheet and post it near the bookkeeper's workspace.
- Review weekly, not monthly. Pull a job cost report for every active job once a week. Look for unclassified expenses and expenses coded to the wrong category. Fix them immediately. Monthly cleanup takes longer and produces less accurate data.
- Lock job records at close. Once a job is complete and the final bill is entered, restrict who can add or modify entries to that project. This prevents retroactive cost allocation and keeps your historical data clean for benchmarking.
Builders who have clean, consistent cost code data for 12 or more jobs have something valuable: a benchmark database. They know their average framing cost per square foot, their typical MEP variance, their actual cleanup and punch cost. Every future bid gets informed by real data, not gut estimates. That compounding advantage is the real payoff of setting up job costing correctly β not just the report on the current job, but the intelligence it builds over time.
If your QuickBooks job costing is producing reports you do not use because they do not reflect reality, the fix is not a new accounting tool. It is a 3-hour restructuring exercise and a week of retraining on coding discipline. Most builders who do it tell me they wish they had done it two years earlier.
See how your QuickBooks setup compares to what actually works
Get the Free Cost Code ChecklistFrequently Asked Questions
For a residential general contractor doing $750K to $3M in revenue, 12 to 18 cost codes is the right range. Fewer than 12 and your reports lack the detail to diagnose margin issues by trade. More than 20 and coding discipline breaks down because there are too many categories to apply consistently. The goal is a structure where every expense on a typical job has an obvious code, with no ambiguity about where it belongs.
Use Projects for job costing, not Classes. Projects in QuickBooks Online were designed for job-level profitability tracking and connect expenses, income, and time directly to a specific job. Classes are better for tracking business segments across jobs, such as new construction versus renovation, or tracking multiple revenue streams in a single company. Many construction businesses use both: Projects to track individual job profitability and Classes to analyze profitability by project type or division.
Yes, but with limitations. You can build a simple estimate in QuickBooks using the Estimate feature and then convert it to a project budget. For builders who do 5 to 10 jobs per year with relatively consistent scopes, this works. For builders with complex estimates, lots of custom scope, or high quote volume, a dedicated estimating tool is more practical. The key is that whatever tool holds your estimate uses cost codes that match your QuickBooks cost codes.
Start with the cost code structure β rebuild it to match your actual workflow before touching historical data. For active jobs, reclassify expenses from the current period to the new codes. For closed jobs, decide whether historical correction is worth the effort: if you need the historical data for benchmarking, reclassify it; if the jobs are closed and you are moving forward, accept that historical data is imperfect and build clean data from here. Do not let the pain of fixing history stop you from building a correct structure going forward.
Yes, and subcontractor costs are particularly important to track by code because subs are often the largest single cost category on a project and the most common source of over-budget surprises. Code every subcontractor bill to the trade and phase it belongs to, not to a generic "Subcontractors" account. This lets you see, at the job level, which trades ran over and by how much β and over time, which subs consistently bid low and invoice high.