Most specialty subs have one of two cost code problems.
The first is too few codes. One “labor” code for the whole job. One “material” code. Maybe a “subcontract” code if they’re running a big job. At the end of the month, the job cost report tells you what the job cost — nothing else. You can’t tell which phase ran over, which crew was efficient, or where you left money on the table. The next bid is a guess based on a number with no explanation behind it.
The second problem is too many codes. A code for every worker, a code for every day, a code for every subsystem and floor and zone on a multi-building project. The field crew can’t keep track of which code applies at any given moment, so they pick the wrong one, or they stop using codes at all. The data that comes back is noise.
The right structure is in the middle: phase-based codes by trade, matched to how the work actually flows. Enough codes to tell you what happened by phase. Few enough that a foreman can remember them without a cheat sheet.
Here’s how to set that up for a specialty trade.
What a Cost Code Actually Does
A cost code is a label you attach to a labor hour, a material charge, or an equipment cost. When every entry has a code, you can group costs by code and compare them against your estimate — by phase, by trade, by pour type, by whatever dimension you coded for.
The comparison between actual and estimated cost — by code — is job costing. It’s how you know in week two whether forming is running over before you’ve committed the placement crew. It’s how you know at closeout whether your rough-in labor estimate was right or whether you’ve been systematically underpricing that phase for three years.
Time tracked by phase and cost code is the input. The estimate is the baseline. The comparison is the output. Cost codes are the bridge between hours worked and hours budgeted.
Without codes, you have payroll. With the right codes, you have job costing.
The Phase-Based Structure
Cost codes work best when they map to the natural phases of the work — the points where scope, crew, and productivity rate change. For specialty trades, that means phase by work type, not phase by calendar.
Here’s how that structure looks for the three trades where phase-based coding matters most.
Electrical
Electrical labor has three distinct phases with three distinct productivity rates:
Rough-in. Conduit, wire pull, boxes. Production-rate work — the crew moves fast, measures in feet of conduit and circuits run. A rough-in hour is predictable once you’ve done enough jobs.
Trim-out. Devices, covers, panels, connections. Slower, more precise. A trim-out hour costs more in labor because the skill level is higher and the pace is slower.
Service/commissioning. Troubleshooting, testing, final connections. Variable. On a smooth job, it’s a small percentage of total labor. On a problem job, it expands.
Three codes minimum: ELEC-ROUGHIN, ELEC-TRIM, ELEC-SERVICE. On a multi-floor job, you might add a floor or zone suffix — ELEC-ROUGHIN-FL3 — but only if you’re actually tracking progress by floor and comparing floor-by-floor against the estimate. Don’t add codes you won’t use.
The electrical rough-in phase is where most electrical jobs win or lose their labor margin — rough-in labor per circuit or per linear foot of conduit is the number that tells you whether the estimate was right.
Plumbing
Plumbing phases have different risk profiles, not just different productivity rates:
Underground. Below-slab work — the highest-stakes phase because it’s irreversible once the concrete goes. Underground labor is slower and harder to estimate because every job’s conditions are different (soil type, slab depth, conflict with structural members). A dedicated underground code lets you track how your underground estimates compare to actuals across multiple jobs.
Above-slab rough-in. Wet walls, mechanical rooms, overhead vent. Faster than underground, more predictable. Different crew composition than underground in many cases.
Fixtures/trim. Device installation, fixture setting, final connections. Different skill set, different rate.
Three codes: PLUMB-UNDER, PLUMB-ROUGH, PLUMB-TRIM. The plumbing phases have built-in inspection gates between them — underground inspection, rough-in inspection, final — which makes the phase boundaries natural breakpoints for cost code tracking.
Concrete
Concrete has more phases than most trades, and the phases have the most different labor costs:
Forming. Form carpentry is skilled work — forming labor per square foot of deck or linear foot of wall is the efficiency metric. It’s also where the formwork cycle drives the schedule.
Placement. Pour day is crew-intensive and time-compressed. Placement labor is a different cost than forming labor.
Finishing. Flatwork finishing and elevated deck finishing are different skill sets and different rates. Broom finish is not the same labor unit as trowel finish.
Stripping/patching. Strip and patch after cure is often overlooked in estimates because it’s assumed to be minor. On a multi-floor building, it’s a real labor line.
Four codes minimum: CONC-FORM, CONC-PLACE, CONC-FINISH, CONC-STRIP. Concrete labor by pour type — footings vs. elevated decks vs. flatwork — benefits from a pour-type dimension as well: CONC-FORM-DECK vs. CONC-FORM-WALL if you want to compare unit costs across pour types.
What Happens When You Don’t Code by Phase
The failure mode is always the same: the job closes and the cost report tells you the total was $X over or under budget. You don’t know which phase caused it.
Was the concrete job over budget because forming ran long, or because placement was inefficient, or because the finishing crew ran two days over on the flatwork? Without phase-based codes, you don’t know. The next bid is a percentage adjustment on the total — you add a contingency because you’re not sure where the last job went wrong.
With phase-based codes, the report shows you: forming ran 12% over, placement was 3% under, finishing was on budget. Now you know the next forming estimate needs to be revised, and you know why.
Phase-by-phase time tracking is only as useful as the codes you’re tracking against. A single “labor” code tracks payroll. Phase codes track the job.
How Many Codes Is Too Many
The test is simple: can your foreman remember the code for each phase without looking it up? If yes, the structure is right. If the foreman has to consult a list every time he clocks in, the codes will get misapplied or abandoned.
Five to eight codes per trade is the practical limit for field use. More than that, and the crew starts coding to whatever seems closest rather than what’s accurate. The cost data degrades.
If you need more granularity — floor-by-floor tracking on a multi-story building, pour-type tracking on a concrete job with six pour types — add a job-specific suffix to the phase code rather than creating separate base codes for each project. CONC-FORM is the base code that works across all concrete jobs. CONC-FORM-T2 adds a project-specific tower designation when you need it.
The base codes stay consistent. Job-specific suffixes are added only when the estimate is detailed enough to compare against.
What the Data Looks Like When It Works
On a four-week electrical rough-in phase, weekly time tracking by cost code produces a running comparison against the estimate:
- Week 1: Rough-in 320 hours actual vs. 290 hours budgeted — 10% over. Investigate before week 2.
- Week 2: Rough-in 290 hours — back on pace. Week 1 overage was the first-floor learning curve.
- Week 3: Rough-in 270 hours — 7% under budget. The crew has the building figured out.
- Week 4: Rough-in 280 hours — on budget.
Total rough-in labor: 1,160 hours actual vs. 1,180 budgeted. The job finished within 2% of estimate on rough-in. That’s a number that goes into the next bid with confidence.
Without phase codes, you have 1,160 hours of “labor.” The week-by-week visibility — and the ability to catch week 1’s overage before it became a week-2 problem — doesn’t exist.
Setting It Up Before the Job Starts
Cost codes need to be in the system before the first clock-in. If the crew starts logging hours before the codes are set up, those hours are uncoded and can’t be reassigned after the fact.
Setup sequence:
- Define phase codes for the trade and job type before mobilization
- Set default codes by phase so one-tap clock-in assigns the right code automatically for each crew member’s expected work
- Confirm the estimate is broken out by the same phases — a rough-in budget and a rough-in cost code only produce useful data if both exist
The time tracking setup should happen on the same day as the project kickoff — not after the first week of labor is already logged uncoded.
Running a Job Where the Numbers Mean Something
Phase-based cost codes turn a payroll system into a job costing system. The hours were going to be logged anyway. The code is the difference between a number and an answer.
Once the code structure is right, the next step is getting those cost codes to flow into your accounting system automatically — without re-keying into QuickBooks or Sage on Friday afternoon.
See how LogLoon handles cost codes and time tracking for specialty contractors, or check the pricing — it’s on the website.