Job Costing for Small Commercial Contractors: Phases and Margin
.webp)
Your Invoice Ledger Is Not a Job Costing System
Your accounting system records invoices. Your jobs are what make or lose the money. That gap is the entire reason almost every small commercial contractor I have ever sat with keeps a spreadsheet running alongside a perfectly good accounting package.
The P&L tells you the company made money last quarter. It cannot tell you that the rough-in on the third-floor build-out went 11 points under bid while trim-out bled 19, because the ledger never asked which phase the hours belonged to. Level's contractor dataset makes the scale of that blind spot uncomfortably clear: 91% of jobs had revenue logged but no labor, material, or subcontractor cost coded to the same job. Revenue lands. Cost floats somewhere in a general bucket. Margin is then a guess wearing a decimal point.
This post is written for trade contractors doing small commercial work: tenant improvements, build-outs, retrofits, service divisions that also run projects. Not the general contractor on a $50M civil job with a controller and a cost engineer. If you are running six to forty people and three to twelve live projects, the mechanics below are the ones that pay for themselves. For the underlying document that holds all of this per job, start with our guide to the job cost sheet.
Break the Job Into Phases Before Anyone Swings a Hammer
A phase is simply a division of work within a job, which is how Trimble defines it in its job cost documentation, and it is the smallest unit at which cost actually means something. Demo. Rough-in. Equipment set. Trim. Startup and commissioning. Punch.
The rule that makes phases work: every work order on the project is linked to the project and carries its phase. No orphan tickets. No "misc labor" catch-all that eats 14% of the hours by closeout. When each ticket carries a phase, hours and cost roll up per phase without anybody re-keying anything on Friday.
One wedge specific to small commercial: build your phase list so it maps one-to-one to your schedule of values line items. Same structure drives cost tracking and drives billing. Contractors on r/ConstructionManagers ask each other constantly how granular an SOV should be and how to cost-load it, because there is no shared convention and every owner wants it split differently. If your phases and your SOV lines are the same list, that argument only has to be had once per job.
A starter structure a small commercial mechanical or electrical shop can copy: 100 General Conditions, 200 Demo, 300 Material Procurement, 400 Rough-In, 500 Equipment Set, 600 Controls and Wiring, 700 Trim and Devices, 800 Startup and Test, 900 Punch and Closeout. Under each, four cost classes: labor, material, subcontract, equipment.

Committed Cost: Money You Have Already Spent That Is Not in Your Books
This is the section that separates a real job costing view from a lagging one. Trimble's definition is the useful one: committed costs are costs promised but not yet incurred, such as open purchase orders, subcontractor agreements, and field time that has not run through payroll.
Four commitment types show up on small commercial jobs:
- Open purchase orders for material and rented equipment
- Signed subcontractor agreements with work remaining
- Field hours reported but not yet processed through payroll
- On-site material purchases made from a truck account
The arithmetic that most job cost reports never run:
Phase budget minus actual to date minus open commitments equals what is actually left.
Run it on a real phase. Material procurement budget on a $310,000 build-out is $86,000. Invoices posted to date, $41,000. Looks like $45,000 of room. Now subtract the open PO with the gear supplier at $28,500 and the balance of the controls sub agreement at $12,000. Real remaining: $4,500. The version without commitments told you that you had ten times the runway you actually had, and it told you that for the three weeks it took the supplier invoice to arrive.
A useful PO carries state, not just a number: ordered, expected, received, billed, paid. Subcontractor assignments roll up the same way. Committed cost exists the moment the PO is raised. Any job costing view that only counts invoices is structurally behind by the length of your suppliers' billing cycle.
Labor at Its Real Cost, Not Its Wage Rate
Costing a technician at $32 an hour because that is what the check says is the most common margin error I see, and it is never small. The number that belongs on the job is wage plus burden plus a fixed hourly adder for truck, tools, fuel, and phone.
Burden is employer payroll taxes, workers' comp, general liability, and fringes. The adder covers the vehicle and the tools that never generate an invoice, which is the same logic Deltek and others apply to owned equipment: charge a standard hourly rate roughly equivalent to what the market would rent it to you for, because no supplier is ever going to send you a bill for your own van.
One watch-out from the field: unbillable travel and paperwork time. If a two-hour service visit carries 70 minutes of drive and 20 minutes of write-up, and only the two hours hit the job, the phase looks efficient and the week does not.
The full burden calculation, the adder math, and how to turn all of it into a defensible sell rate deserve more room than a pillar page can give them. We cover the pricing side in depth in the guide to pricing HVAC jobs the profitable way, and the mechanics apply to any trade running burdened labor into a commercial phase budget.
Billing the Job: Pay Applications, T&M, Retainage and Change Orders
Cost structure and billing structure have to be the same structure, or you will spend one evening a month reconciling them by hand.
Fixed-price contracts bill against a locked schedule of values through AIA G702 and G703 pay applications. Percent complete per SOV line, work completed previously, work this period, materials stored, retainage held, balance to finish. Time-and-material jobs bill per work order, with an unbilled balance visible per order and new items flagged when an order that was already billed picks up extra labor or parts.
The manual version of this is a genuine pain point. Threads on r/Construction regularly ask how people prepare G702 and G703 applications without paid software, and the answer is always spreadsheets and Word templates rebuilt every period, with the continuation sheet and the summary reconciled by hand. From 14 years of customer conversations, roughly 14% of manually-prepared G702/G703 pay applications in a typical small commercial shop come back for arithmetic or formatting errors, including total mismatches, retainage miscalculations, and missed change orders. Every rejection adds another 30 days or more to a cycle that is already long. Industry data from CFMA and specialty-contractor filings pegs commercial subcontractor DSO at roughly 83 days against a 60-day all-industry benchmark.
Two topics get their own deeper treatment and should not be squeezed in here. Retainage, which owners describe on Reddit as held wrong, held past practical completion, or simply never released, with nobody able to point at a single place showing what is held and when it releases. And change orders, where scope moves faster than paperwork and crews end up doing unbilled work. If you want the front end of that tightened, our post on estimate disclaimers covers the language that keeps unforeseen conditions from becoming your problem, and when to send invoices, before or after the job covers the timing side for T&M work.

Scheduled Versus Actual, While There Is Still Job Left to Fix
The whole point of phase-level cost is that an overrun surfaces while you can still do something about it. Planned hours against actual hours. Planned cost against actual cost. Per work order and per phase.
Here is the arithmetic that makes people move: on a small commercial project, a 10% labor overrun on a $120k labor budget quietly wipes out roughly 27% of the job's gross margin, turning a $45k margin into $33k before anyone notices. From 14 years of customer conversations, the shops that flip from end-of-month spreadsheet reconciliation to real-time labor and PO tracking against the job catch that fade in week one instead of at closeout, which is the difference between adjusting scope and absorbing the loss.
Contractor reporting describes exactly the failure mode this prevents: a mechanical contractor whose rough-in ran 11 points under bid while trim-out bled 19 points, a split that only became visible once phase codes were reconciled weeks after closeout. Same job, same total, two completely different lessons, and neither one available in time to matter.
A verified review from a construction customer captures the operational version of this well. They described managing multi-phase commercial builds as juggling spreadsheets and paper logs before, and said their PMs can now track every job and dispatch crews from one screen, which cut hours off the weekly admin grind.

Cost to Complete, WIP, and Catching Overbilling Early
Work in progress reporting needs five inputs, and you already have four of them if your phases are clean:
- Contract price
- Total cost estimate
- Cost to date
- Billed to date
- Projected cost to finish
If a job is 50% complete on cost and only 30% billed, you are financing 20% of it out of your own account. Flip the ratio and you have billed ahead of production, which feels like cash and reads like a future hole.
The fifth input is the one nobody tells a contractor without a controller how to produce. Three practical sources: phase percent complete reported by the field foreman, the open commitments still sitting against remaining phases, and burn rate on labor over the last two weeks applied to the remaining scheduled hours. Take the highest of those three. Optimism in a cost-to-complete number is expensive.
On margin expectations while you read your WIP: Level's benchmark set reports a median gross margin of 44.3% across 1,747,089 completed jobs with job-level cost data, and separately notes that commercial projects typically run 10 to 20% gross margin because they are pass-through heavy, while time-and-materials work runs 35 to 45%. If your commercial build-outs are penciling at 40%, the number is probably wrong before the job is.
Honest Margin, or No Margin at All
This is the design principle I argue for hardest, and it is unpopular with people who like dashboards.
If too few schedules on a project carry a labor rate, or too many product lines have no cost attached, the correct behavior is to show the cost, withhold the margin, and name the missing items. "Margin unavailable: 6 of 22 work orders have no labor rate, 4 parts have no cost." Not a percentage.
In my 14 years watching owners run these numbers, a confident margin computed from incomplete cost data has done more damage than a blank field ever has, because the blank field sends someone to go find the missing rate and the confident number sends someone to go bid the next job the same way. A margin figure is a claim about completeness. If the data is not complete, the software should not make the claim on your behalf.
Same logic applies at the reporting layer. Per-job margin and per-contract margin are different questions. A service agreement covering twelve sites can carry a healthy contract margin while three of those sites lose money every visit. Report both.
Why Job Costing Breaks in the Field, and the Rhythm That Fixes It
The diagnosis is boringly consistent: field data entered late, cost coded to the wrong job or phase, change orders missing from the forecast, and office and field working from two different numbers. Owners on r/ConstructionManagers describe projects launching without crisply defined deliverables, so change requests blur into the original contract and crews do unbilled work without ever knowing it.
The fix is cadence, not software alone.
- Daily: hours to a work order that carries a phase, materials consumed, field purchases photographed and attached. Digital job cards are how this stops being a paper pile in a truck.
- Weekly: committed versus remaining by phase on every live project, 20 minutes, PM and owner in the same window.
- Each pay app: phase percent complete reconciled to the G703 line, retainage confirmed, approved change orders folded into the SOV before submission.
One composite pattern worth knowing, anchored to the most common version of this across the small multi-trade shops we have worked with, under ten techs covering HVAC, plumbing and light electrical: the owner set a standing Friday afternoon review block, and it collapsed inside a month because Friday afternoons kept getting eaten by emergency dispatch and parts runs. Moving it to 7am Monday, before the huddle, made it hold. The senior tech pushed back on being reviewed in front of the group, so those conversations moved one-on-one. Slower, but the practice survived. Cadence dies on the day it competes with dispatch, so put it where dispatch is not.
What to Require Before You Buy Anything
Skip the feature lists. These are disqualifiers, and any of them alone is enough to walk away.
- Does it capture committed cost, not just invoiced actuals? If open POs and sub agreements do not reduce remaining budget, the numbers are always late.
- Does it cost labor at burdened rates automatically, including the truck and tool adder, without anyone typing a rate per ticket?
- Does the phase structure carry through to the pay application, so the G703 line and the cost report are the same object?
- Does the field app work offline, and does the ticket carry its phase when it syncs?
- Does it push to your accounting system without re-keying?
- Does it withhold margin when cost data is incomplete, or does it print a confident number anyway?
On plans and pricing: most vendors package project-level job costing and AIA billing above their entry tier, so compare on what the tier you can actually afford includes, not the top of the matrix. An electrical division customer put the value plainly in a review, saying the G702/G703 progress billing feature is a lifesaver on bigger commercial jobs because they can pull AIA-formatted pay apps without rebuilding them from scratch every month.
Conclusion
Job costing on small commercial work is not an accounting exercise you do after the fact. It is a structure you set up before the first ticket: phases that match your schedule of values, every work order carrying its phase, purchase orders and subcontract agreements committing budget the day they are raised, labor priced at what it truly costs you to put a person on site, and billing that reads from the same structure the cost does. Do that and an overrun shows up in week one, while you still have job left to fix it. Skip it and you find out at closeout, which is another way of saying you find out too late to do anything except pay for it. If your team is still reconciling phase cost in a spreadsheet on Sunday night, that is the thing to change first.
Frequently Asked Questions
Reviewed by

Content Creator
Bhargavi Halthore is a content writer at Field Promax, a field service management platform serving trades businesses across the USA and Canada. With over a decade of experience writing for business owners, she brings detailed, ground-level insight to every topic she covers. Her research goes beyond search results - she digs into LinkedIn groups, Facebook communities, and Reddit forums to understand what field service business owners are actually dealing with on the ground. She speaks directly with industry professionals, understands their day-to-day challenges, and translates that into content that is practical and actionable. What you read in her articles reflects real industry patterns, not theory.
