A contractor doing several million a year can usually tell you their net margin to a decimal place and cannot tell you which half of the work produced it. The books close monthly, the accountant reports a number, and the number is real — but it is an average across service calls, remodels, warranty returns, and one commercial job that quietly ate the year.
The dangerous version of this is a business that is profitable overall while losing money on its largest customer, and grows itself into trouble by selling more of exactly the wrong work. Job costing exists to prevent that. Most implementations fail because they answer the question far too late.
The four buckets
Everything that hits a job falls into one of four, and businesses reliably get the first one wrong and forget the fourth entirely.
1. Labor — at burdened cost, not wage
The most common and most expensive mistake in small-contractor job costing is costing labor at the hourly wage. A tech at $32 an hour does not cost $32 an hour. Add employer payroll taxes, workers' compensation at your trade's rate, health benefits, paid time off, training and license renewals, phone, and the vehicle they drive to the job. The burdened figure is meaningfully higher than the wage, and the multiplier differs by trade, state, and comp classification.
The consequence is direct: if you price off unburdened labor, every job you win at a "good" margin is thinner than you believe, and the ones you priced tightest may be underwater. Compute the burden once with your accountant, store it as a rate per employee or per class, and revisit it annually.
2. Material — at what you paid, including the trips
Material is the bucket everyone tracks and still gets wrong, because of what does not get attached to the job: the supply house run at 7am, the returns nobody credits, the truck stock consumed and never recorded, and the small consumables that never make it onto a ticket. Truck stock in particular tends to be invisible until someone counts it, which is why the material number on a service call is usually the least trustworthy figure in the whole job.
3. Subcontractors and equipment
Sub invoices usually arrive weeks after the work, which is why a job can look profitable at close and change its mind in November. Equipment is worse: rentals get charged to a job, but owned equipment often gets charged nowhere, so the jobs that consume the most machine time look like your best ones.
4. The overhead that is really job-specific
Permits, inspections, dump fees, mobilization, and the callback. Callbacks are the one worth singling out. A warranty return is nearly always booked as overhead and almost never charged back to the job that caused it — which means the job types that generate the most rework score as your most profitable. That single mis-assignment has steered more bad pricing decisions than any other.
Current beats precise
Accounting is retrospective and exact by design. Job costing has to be current and approximately right, because its purpose is to change what you do next — which job to bid, which customer to renegotiate, whether the crew on that site needs help this week.
| Question | Answered by | Timing that matters |
|---|---|---|
| What did we earn last quarter? | Accounting, exact | Month end is fine |
| Is this job going to make money? | Job costing, approximate | While the job is open |
| Should we bid this kind of work again? | Job costing, by type | Before the next bid |
| Which customer is quietly unprofitable? | Job costing, rolled up | Before the renewal |
| Is this crew's hours estimate reliable? | Estimated vs actual hours | Weekly |
A job cost that is 90% right today is worth more than one that is exact six weeks after the customer paid. The exact one is a history lesson. The current one is a decision.
A cost code structure people will actually use
The classic failure is importing an industry-standard code list with hundreds of entries. Techs cannot navigate it, so they pick the first plausible code, and now you have precise-looking garbage. Precision that nobody can enter correctly is worse than a coarse structure everyone gets right.
- Start with under a dozen codes. Labor, material, subcontractor, equipment, permits and fees, callback. That is enough to answer the questions that change decisions.
- Split a code only when a decision depends on it. If knowing rough-in labor separately from trim labor would change how you bid, split it. If it would only make a report longer, do not.
- Make phase optional, not required. Phases help on projects and get in the way on service calls. One structure that forces both is how you end up with everything coded to "general".
- Default aggressively. A service call should arrive pre-coded from the job type. The tech should confirm, not classify.
- Review the codes annually. Any code that receives almost nothing, or almost everything, is telling you the structure is wrong.
What to build
01
Capture hours against jobs, at the job
Clock in and out per job on a phone, with the job list filtered to what that person is actually assigned to today. Weekly timesheets reconstructed from memory produce numbers that feel accurate and are not.
02
Attach material at the point of use
Pulled from truck stock, picked at the warehouse, or bought at the counter with a photographed receipt. If the attaching happens in the office a week later, most of it will not happen.
03
Store the burdened rate as configuration
Per employee or per labor class, editable by the office, versioned so historical jobs keep the rate that was true when they ran.
04
Show estimate versus actual while the job is open
Hours and dollars, side by side, with a variance percentage. This is the screen that changes behavior, because a supervisor can see a job going wrong on day three rather than at invoicing.
05
Roll up by type, customer, and crew
The three cuts that drive decisions: which work to sell, which customers to renegotiate, and where the estimating assumptions are wrong.
06
Charge callbacks back to the original job
One field, enormous consequences. It is the fastest way to find out which job types are quietly expensive.
You do not need job costing to know you are profitable. You need it to know which work to sell more of.
What to expect when it first works
The first month of honest job costing is uncomfortable. Businesses routinely discover that a customer they are proud of is their thinnest, that a job type they have been chasing loses money at current pricing, or that estimated hours on one crew's work are consistently 30% optimistic while another's are accurate.
That discomfort is the return on the project. It is also why the rollout matters: if the first use of job costing data is blaming a crew for their variance, hours capture quality collapses within a week and never recovers. Frame it as pricing feedback, not surveillance, and make the estimating assumptions the first thing that gets corrected.
Frequently asked questions
What is labor burden and why does it matter so much?
Burden is everything an employee costs beyond their wage: payroll taxes, workers' compensation at your trade's rate, benefits, paid time off, training, phone, and vehicle. Costing labor at the raw wage makes every job look more profitable than it is, and it is the single most common reason a contractor prices tight work into a loss.
Can our accounting software do job costing already?
Most can produce job cost reports, and if yours is set up well it may be enough. The usual gap is timing and capture: the data arrives at month end, hours are entered weekly from memory, and material never gets attached at the point of use. Job costing changes decisions only when it is current, which is a capture problem rather than a reporting one.
How detailed should cost codes be?
Far less detailed than most people start with. Under a dozen codes that field crews use correctly beats a hundred-code industry standard that everyone guesses at. Split a code only when knowing that split separately would actually change a bid or a decision.
How do we handle warranty callbacks in job costing?
Charge them back to the job that caused them. Booking callbacks to general overhead is extremely common and it systematically makes your most rework-prone job types look like your most profitable ones. One field linking a callback to its original job usually changes the profitability ranking of your work.