TL;DR
- A cost code names the phase of work, and a cost type (L, M, S, E or O) names the kind of spend.
- Roughly 15 to 30 codes per trade is a workable range if each has a one-line definition. Service work stays off project jobs.
- Write the estimate in those codes so the won estimate becomes the original job budget, then lock it before work starts.
- Track committed costs from POs, give each change order its own code, and compare to the budget by code every week.
The foreman blames the rough-in, the PM blames the equipment set and the estimator swears the bid was fine. None of them can prove it, because every dollar they're arguing over sits on one cost code called Labor.
A cost code structure built for trade work ends that argument before it starts. When the estimate is written in the same codes your crews clock into, the won estimate becomes the job budget with no re-entry. An overrun then shows up the week the rough-in slips instead of at closeout.
That only works when the foreman, the PM and the estimator mean the same thing by a code, which means somebody has to write the definitions down.
What Is a Cost Code?
A cost code is a short label that pins each dollar on a job to the piece of work it paid for, whether that's rough-in, equipment set or trim-out. Pair it with a cost type, and you can hold actual spend against the estimate, phase by phase, while the crew's still on site.
Project management and accounting ask different questions, and your general ledger and your cost codes answer them separately. The ledger tells your bookkeeper what kind of money moved, and cost allocation by code tells your PM which part of the job moved it.
How to Structure Cost Codes for Trade Work
A workable list for a trade shop pairs a phase or activity with a cost type suffix. So 23-200-L is labor on the equipment set, and 23-200-M is the material for it. A few rules keep the list honest:

- Use the five direct job cost types from ABC and CFMA's construction accounting training: labor (L), material (M), subcontract (S), equipment (E) and other (O), which covers permits and bond premiums.
- Follow the GAO cost estimating guide, which asks that cost elements be neither omitted nor double-counted. In practice, skip the lump "misc" bucket. Give each code a one-line definition, so standardized cost codes mean the same thing to a tech on the truck and a PM at the desk.
- The NRC's cost estimating guidance makes it a 100% rule: the breakdown covers all of the work, and a dictionary defines each element.
- Treat the Construction Specifications Institute's CSI MasterFormat as an optional prefix (22 Plumbing, 23 HVAC, 26 Electrical) if your GC customers bill that way.
- Keep the list to roughly 15 to 30 codes per trade. That's a rule of thumb with no published benchmark behind it.
- Give each change order its own code, such as CO-001.
- Separate service codes from project codes, so a callback ticket never lands on a rooftop install budget.
Related: Service tickets carry their own billing logic, so our T&M vs fixed price guide helps you choose between hourly and flat pricing before you set up service codes.
A plumber's rough-in and an electrician's rough-in share a name and little else, so each trade gets its own list.
Cost Code Examples for HVAC, Plumbing and Electrical Contractors
These lists are illustrations to adapt to the way your crews sequence the work.
For HVAC, the equipment set usually carries the largest material line and can include a crane or lift rental, so it includes equipment, labor and material.
| Code | HVAC Phase | Typical Cost Types |
|---|---|---|
| 23-100 | Mobilization | L, E, O |
| 23-110 | Demo | L, S, O |
| 23-200 | Equipment set (RTU/AHU) | M, L, E |
| 23-300 | Ductwork | M, L |
| 23-400 | Piping (refrigerant, hydronic) | M, L |
| 23-500 | Controls | M, L, S |
| 23-600 | Insulation | M, L, S |
| 23-700 | Startup and test/balance | L, S |
| 23-800 | Closeout and O&M docs | L |
| CO-001 | Change order 1 | M, L, S, E |
For plumbing, underground work gets its own code because it's finished and inspected before the walls exist.
| Code | Plumbing Phase | Typical Cost Types |
|---|---|---|
| 22-100 | Mobilization | L, E, O |
| 22-200 | Underground | M, L, E |
| 22-300 | Rough-in (DWV) | M, L |
| 22-400 | Water supply rough | M, L |
| 22-500 | Gas piping | M, L, S |
| 22-600 | Water heater and equipment | M, L |
| 22-700 | Fixtures and trim | M, L |
| 22-800 | Testing and inspection | L, O |
| 22-900 | Closeout | L |
| CO-001 | Change order 1 | M, L, S, E |
For electrical, temp power gets a code so the cost of running the site doesn't vanish into rough-in.
| Code | Electrical Phase | Typical Cost Types |
|---|---|---|
| 26-100 | Temp power | M, L, E |
| 26-200 | Underground and conduit | M, L, E |
| 26-300 | Rough-in | M, L |
| 26-400 | Service and distribution (panels, switchgear) | M, L, S |
| 26-500 | Branch wiring | M, L |
| 26-600 | Lighting | M, L |
| 26-700 | Low voltage | M, L, S |
| 26-800 | Trim-out | M, L |
| 26-900 | Testing and commissioning | L, S |
| CO-001 | Change order 1 | M, L, S, E |
Related: For larger electrical jobs, our commercial electrical PM guide covers twelve controls, from estimate handoff through final billing.
A cost code list does nothing until the estimate uses it.
How the Estimate Becomes the Job Budget
Your cost code system only pays off through a seven-step handoff, and each step depends on the last.

Build the Estimate in the Same Codes You'll Track
Every estimate line carries a code and a cost type, 23-300-L for duct labor and 23-300-M for the duct itself. ABC and CFMA say "Direct Job Costs Allow You to Measure Your Actual Performance Against Your Estimate," and that only holds if the estimate lines carry the codes the field uses.
Related: Estimates start from your price book, and our HVAC price book, plumbing price book and electrical price book guides cover building one for each trade.
A lump-sum estimate leaves you nothing to compare against later, so a job that lost money has no line to point at.
Convert the Won Estimate into the Original Budget
When you win the bid, the cost side of the estimate, by code, becomes the original budget. Margin and markup stay on the revenue side. How you bill the job doesn't change the cost side, so that side becomes the budget either way. Take a rooftop unit replacement, with illustrative figures:
| Code | Material (M) | Labor (L) | Budget |
|---|---|---|---|
| 23-200 Equipment set | $62,000 | $14,000 | $76,000 |
| 23-300 Ductwork | $21,000 | $18,000 | $39,000 |
| Subtotal | $83,000 | $32,000 | $115,000 |
Every other phase in the bid gets the same treatment.
Lock the Original Budget Before Work Starts
Freeze those numbers the day the job is awarded. Keep the original and revised budgets separate, so each project cost variance is measured against what you bid. Say ductwork labor is budgeted at $18,000 and the crew runs long, so someone nudges the line to $22,000 to keep the report green. The job reads on budget. Meanwhile, $4,000 of margin is gone, and your estimator never finds out the bid was short.
Track Committed Costs as POs Go Out
A committed cost is spend that exists on paper before it exists on an invoice, like the equipment PO or a signed subcontract, while actual cost is what has posted so far. When the $62,000 equipment PO goes out against 23-200-M, actual cost sits at zero for weeks while committed cost jumps to $62,000. Committed plus actual against budget is your early-warning number for cost control. If the PO comes back at $68,000 against that $62,000 line, you learn about the $6,000 gap on PO day instead of when the invoice posts.
Code Every Hour and Every Receipt in the Field
Techs choose the code when they clock in, so labor hours land on the phase they used, and materials are received against the job and the code. Short lists and plain names keep the picks accurate, because a tech choosing among the few codes active on a job beats one scrolling the whole company list. Cut each job's clock-in list to the codes that job uses.
Feed Change Orders into a Revised Budget
Each change order gets its own code, CO-001 then CO-002, so the original estimate stays intact, and the margin on extras shows up on its own line. On construction projects, AIA's guide to change orders under the A201 describes a change order as a written agreement among the owner, contractor and architect that changes the work. It may also change the job cost and the schedule. Your revised budget is the locked original plus approved change orders, with the original still printed beside it.
Compare Estimate vs. Actual While the Job Is Open
Put tracking costs by code on the weekly PM agenda, and set a threshold that triggers a conversation, such as 10% over on any code with real dollars behind it. In an article on WIP accounting, CFMA reports an average profit bleed of a little over 1% between WIP-projected and final job profit. If your jobs fade more than that, the weekly review will show which code did it. If they fade less, it's probably already working. When the job closes, post the final actuals by code back to your estimating database, so the next bid starts from what the work cost.

Related: When a code crosses your threshold, our job cost variance guide covers how to work out why.
Jobs that still fade after weekly reviews tend to share a few coding habits.
Common Cost Code Mistakes Trade Contractors Make
Seven coding habits break a job budget:
- One lump "materials" or "MEP labor" code that hides which phase ran over.
- Too many codes, so techs guess.
- Codes that mirror GL accounts built for financial reporting instead of work phases.
- Re-keying the estimate into a spreadsheet for cost tracking.
- Change-order costs mixed into base codes.
- Service tickets coded to project jobs.
- Undefined codes that two PMs read two different ways.
Plenty of construction firms still run job costs through QuickBooks classes or a single materials line, which total a job without saying which phase ran long.
Related: If your jobs live in QuickBooks today, our QuickBooks job costing guide is the place to check how far that setup gets you.
Implementing cost codes starts with a short list. Keeping the estimate, the POs and every timesheet on it across every open job takes real discipline.
The operational fix: Ensuring consistent coding comes down to a one-page dictionary in every truck, with one plain-English line per code.
Run the Budget from the Estimate, Not from a Spreadsheet
If the code list is drafted and the dictionary is in the truck, the remaining risk sits in the handoff. Someone retypes the won estimate into a spreadsheet. The two drift apart at the first change.
In Simpro®, a won quote converts into a project job, so the estimate's costs carry over instead of being keyed in again. The job tracks separate operational costs for each phase and shows estimated against actual project costs. 24,000+ businesses run their jobs on Simpro, which was built for the trades.
Related: Simpro's project management tools also add progress billing and WIP reports.
Middlebury Electric, a 40-employee electrical contractor in Goshen, Indiana, has around 200 ongoing jobs. President Jason Wogoman said he knows his cost on every job to date within seconds.
Every job you bid carries a margin, and the budget protects it only when it starts from the estimate and stays locked. See that handoff run on a job like yours: Schedule a demo today.
FAQs
What's the Difference Between a Cost Code and a Cost Type?
A cost code names the part of the work, and a cost type names the kind of cost. Ductwork is a code (23-300). Labor, material, subcontract, equipment and other (L, M, S, E, O) are cost types. Combine them, and 23-300-L reads as ductwork labor, the level where estimate and actual get compared.
Should I Use CSI MasterFormat Codes?
Use MasterFormat as an optional baseline for your code structure. CSI organizes it by work result, so it can supply your division prefix, but the phases underneath should follow the sequence your crews work. The 2026 edition added 2,185 new and 617 reorganized listings and made maintenance updates to Division 26, so check the edition before you revise any prefix.
How Many Cost Codes Should a Trade Contractor Have?
Roughly 15 to 30 per trade. Ten phases carrying two or three cost types each land in range. Detailed cost coding stops helping once techs start guessing, so merge or retire codes nobody used last quarter.
What's the Difference Between an Estimate and a Job Budget?
An estimate is the priced proposal you hand the customer, margin included. A job budget is the cost side of that estimate, split by code and locked once the job is won.