Guide · Job costing

Job costing for contractors, in plain English.

Your P&L says you made money. Job costing tells you where — and which jobs have been quietly eating it.

Updated July 2026 · 6-min read

One number, hiding twenty stories

Your P&L says you made money last year. Good. Now answer this: which jobs made it? Most contractors can’t. The year-end profit figure is one number hiding twenty stories — a couple of jobs that printed money, a bunch that broke even, and two or three that quietly ate most of what the winners earned. The annual number averages all of that into a comfortable blur.

This is why “profitable on paper” contractors still feel broke. Cash follows individual jobs, not annual averages. If your two biggest jobs of the year ran fifteen points under bid, you funded that loss out of the good jobs and out of your own pocket — and the year-end P&L never told you it happened, because the total still came out black.

It also means you’re bidding blind. Without job-level numbers, next year’s bids get priced off the same instincts that produced this year’s losers, and you keep winning the wrong work at the wrong price — politely, repeatedly, and with a full schedule. Job costing is how you break that loop.

What job costing actually is

Strip away the software-vendor language and job costing is one discipline: every dollar that leaves the company gets tagged to the job that caused it. Materials, subs, equipment, permits, dump fees — and labor at its true cost, not just the wage. When every cost carries a job name, each job produces its own small P&L, and the guessing stops.

The labor piece is where most contractors understate. A $28-an-hour hand doesn’t cost you $28. Payroll taxes, workers’ comp, insurance, paid time off, the truck he drives, the phone in his pocket — loaded cost usually lands around 1.3 to 1.5 times the wage. If you cost jobs at raw wages, every labor-heavy job looks more profitable than it really is.

That’s the whole concept. No exotic software required, no new office hire. It’s a tagging habit plus a monthly reading habit, enforced consistently. The rest of this guide is about making that habit cheap enough that your crew actually keeps it when the schedule gets ugly.

A setup that survives a busy week

Keep the structure small enough to survive contact with a real week. A short list of cost codes — labor, materials, subs, equipment, other — covers most crews under fifteen people. Phases (demo, rough-in, finish) only earn their keep if you’ll actually change behavior based on phase-level numbers. If you won’t, skip them without guilt.

Set it up where the data already lives. The field crew tags hours to jobs in whatever time app you already use. Vendor bills and card charges get a job name the day they hit the books, not at year-end. The rule is simple and non-negotiable: nothing posts without a job attached, and “overhead” is a real destination — not a dumping ground for whatever nobody felt like tagging.

Resist the urge to build the perfect system. Contractors kill job costing far more often by over-engineering it — forty cost codes, sub-sub-phases, allocation formulas — than by keeping it crude. A crude system that runs every single week beats an elegant one your office quietly quit updating in March.

One benchmark for whether it’s right-sized: if tagging costs to jobs adds more than a few minutes to anyone’s day, it’s too heavy. Done right, the system is nearly invisible in the field and only visible in the monthly report — which is the only place it needs to show up.

Change orders: where margin dies

Change orders are where contractor margin actually dies. Not in the bid, not in the labor rate — in the extra work you did and never billed. The pattern is always the same: the client asks for “one small thing” verbally, your crew does it because they’re standing right there, and the paperwork never happens. Multiply that by a season and it’s a truck payment. Sometimes a truck.

Job costing makes the bleeding visible. When actual costs run past the bid and revenue doesn’t move, that gap is usually unbilled changes. Seeing it monthly, per job, with a dollar figure attached is what finally makes the discipline stick — because now it isn’t a paperwork nag from the office, it’s a number with your name on it.

The fix is procedural, not motivational. No change work starts without written approval — a text message counts if it states scope and price. Changes get priced at full margin, not at cost plus a handshake. And someone reconciles approved change orders against job costs every month, so nothing dies on a clipboard behind the seat of a truck.

If a client balks at putting an extra in writing, that’s information too — you’ve learned it before doing the work instead of after financing it. The contractors with the best margins aren’t the best negotiators we see. They’re the ones who never do unpriced work.

The monthly ten-minute read

The report that matters is per-job margin versus bid, run monthly while jobs are still open — not at year-end, when it’s history. A job trending five points under bid in month two can often be saved: re-price the remaining work, bill the changes, tighten the crew. The same discovery in December is just a tuition bill for a lesson you paid retail for.

Three questions, every month, for every active job. Is this job’s margin tracking to what we bid? If not, is the gap on the cost side — we’re spending more than planned — or the revenue side, meaning we’re not billing for changes? And what does this teach the next bid: was the estimate wrong, or the execution?

Then the yearly question: rank the finished jobs by margin and look for patterns. Certain job types, certain GCs, certain neighborhoods, certain crews. Most contractors discover their profit is concentrated in a narrow slice of what they do — and that single discovery is worth more than any individual job on the list, because it changes what you chase next year.

The traps that kill the system

Trap one: forcing overhead into jobs. Rent, office wages, your own salary — spreading them across jobs with an allocation formula mostly makes the job reports muddier and the arguments longer. Track jobs at gross margin, keep overhead in one visible bucket, and simply know the monthly total your combined gross margin has to clear. That’s cleaner and just as true.

Trap two: raw wages instead of loaded labor. It came up earlier and it earns a second mention, because it’s the most common distortion in contractor books we take over. Cost labor at raw wages and every labor-heavy job flatters itself, every sub-heavy job looks worse than it is, and you steer the company toward exactly the wrong work with total confidence.

Trap three: detail that outlives the will to maintain it. Every code you add is a decision your crew has to make correctly on a Friday afternoon. When the system gets tedious, they default everything to “miscellaneous” — and now the data is worse than nothing, because you trust it. Small, consistent, boring. That’s the system that survives.

The real test of job costing isn’t precision — it’s whether it changed a decision. If this month’s report made you re-price a service, walk away from a job type, or chase an unbilled change order, it’s working. If it’s just a prettier report you nod at, simplify it until it isn’t.

Related: Fractional CFO · Monthly Bookkeeping