Job Costing
Cost Codes and the WBS: Structuring Job Costing So It Actually Works
Job costing only works if the costs land in the right buckets, and the buckets are defined by your cost codes. Get the structure right and your reports tell you which scopes make money and which bleed. Get it wrong and you end up with a pile of charges nobody can interpret, which is worse than no system at all because it gives false confidence.
Published June 22, 2026 · 8 min read
Key takeaway
A work breakdown structure divides a job into manageable scopes, cost codes track cost against each scope, and cost types (labor, material, equipment, sub) split each code. Use MasterFormat as a starting skeleton, then make codes granular enough to be useful but coarse enough that the field will code them correctly.
WBS versus cost codes
A work breakdown structure, or WBS, breaks the whole project down into progressively smaller chunks of scope: project, then phase or area, then work package. It is the map of what gets done.
Cost codes are the accounting labels you attach to those work packages so every hour and dollar can be charged to a specific scope. The WBS answers what work exists; the cost code answers where this cost belongs. In practice the two are usually merged into a single numbered list that everyone calls the cost-code structure.
Start from MasterFormat, do not stop there
The CSI MasterFormat divisions are the most common starting skeleton in US commercial work. Division 03 is concrete, 04 is masonry, 05 is metals, 26 is electrical, and so on. Using a recognized framework means your codes line up with how specs, submittals, and subcontracts are already organized.
But MasterFormat is a filing system for specifications, not a job-costing plan. A self-perform contractor needs to break a single division into the activities they actually manage by the hour. Division 03 concrete is far too broad to be useful on its own.
- •Form work as one code
- •Rebar and reinforcement as another
- •Place and finish as another
- •Cure and strip as another
How granular is granular enough
There is a real tension here. Too few codes and your reports cannot tell you why a job lost money, only that it did. Too many codes and the field gives up: a foreman staring at sixty options on a time card will pick whatever is closest, and your data turns to noise.
A workable rule of thumb is that a cost code should map to a chunk of work a foreman can recognize and a quantity you can measure, such as square feet placed or linear feet installed. If you cannot tie a code to a unit of production, it is probably too vague. If two codes always get the same hours because nobody can tell them apart, they should be one code.
Split every code by cost type
Within each cost code, separate the four standard cost types. This is what lets you see that a scope went over on labor while material came in fine, which points to a productivity problem rather than a buyout problem.
- •Labor: your own crews' wages and burden
- •Material: permanent materials installed in the work
- •Equipment: rented or owned equipment time charged to the scope
- •Subcontract: work you bought out to others
Practical setup tips
Build one standard cost-code template and reuse it across jobs so estimating, the field, and accounting all speak the same numbers. When the estimate, the budget, and the actuals share a code list, budget-versus-actual reporting becomes automatic instead of a reconciliation chore.
Keep the active list short on any given job by turning off codes that do not apply, rather than maintaining one giant master that overwhelms the crew. In Field PM, time-clock entries and daily report quantities post against the same cost codes that drive the budget, so the production data the field captures flows straight into the job-cost reports without rekeying.
Frequently asked questions
Should I use MasterFormat or build my own codes?+
Most contractors use MasterFormat divisions as the top-level framework, then add their own sub-codes for the specific activities they self-perform. That keeps you aligned with specs and subs while still tracking work at the level you manage it.
How many cost codes should a typical job have?+
There is no fixed number, but the right count is the smallest set that still lets you explain a cost overrun. If a code never gets used or never gets coded correctly, drop it.
What is the difference between a WBS and a schedule?+
The WBS defines the scope hierarchy, the what. The schedule sequences that scope in time, the when. A good schedule is usually built on top of the WBS so activities and cost codes line up.
Why split costs into labor, material, equipment, and sub?+
Because the fix is different for each. A labor overrun signals a productivity issue; a material overrun signals a pricing or waste issue. Lumping them together hides the actual problem.
Run the numbers in the field, not the spreadsheet
Field PM turns daily reports into live job costing, productivity, and billing — built for self-perform contractors. 30-day free trial · no credit card · unlimited foremen, QA/QC, safety & subs always free.
Start free trial →