SoftPartners logoSoftPartners
Guide10 min read

Finding out which jobs actually made money

Most contractors know their annual margin and almost nothing about which work produced it. Job costing is not an accounting exercise — it is a pricing tool, and it only works if it is current.

  • The four cost buckets and the one everyone gets wrong
  • Why last quarter's job costing is a history lesson, not a tool
  • A cost code structure small enough that people use it

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.

FIG. 01SCALE 1:1JOB COSTINGWHAT YOU RUN NOWWHAT COMES OUTLabour hoursMaterialsSubs + overheadMargin per jobCodes people useDecisions youcan act onCOST PER JOBcurrent beats preciseONE SYSTEMDRAWN FORYour jobsMETHODFour buckets, honestlyTERMSCurrent, not precise

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.

QuestionAnswered byTiming that matters
What did we earn last quarter?Accounting, exactMonth end is fine
Is this job going to make money?Job costing, approximateWhile the job is open
Should we bid this kind of work again?Job costing, by typeBefore the next bid
Which customer is quietly unprofitable?Job costing, rolled upBefore the renewal
Is this crew's hours estimate reliable?Estimated vs actual hoursWeekly
Two different jobs for two different systems

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.

  1. Start with under a dozen codes. Labor, material, subcontractor, equipment, permits and fees, callback. That is enough to answer the questions that change decisions.
  2. 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.
  3. 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".
  4. Default aggressively. A service call should arrive pre-coded from the job type. The tech should confirm, not classify.
  5. 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.