Job Costing for Contractors: How to Know Which Jobs Actually Make Money

TL;DR: A contracting company’s P&L can show a healthy year while a third of its jobs quietly lost money — company-level totals average the winners and losers together and hide both. Job costing fixes that: every labour hour, material dollar, sub invoice, and equipment charge lands on the job that caused it, labour carries its full burdened cost, and overhead gets allocated deliberately. The payoff isn’t prettier reports. It’s knowing which work to chase, which to reprice, and which to walk away from.

Ask a contractor which of last year’s jobs made money and you’ll usually get a confident answer based on how the jobs felt. The big commercial one felt good. The renovation from hell felt bad. Then you build actual job-level numbers and the feelings turn out to be about half right — which is roughly the accuracy of a coin flip, applied to pricing decisions worth hundreds of thousands of dollars.

Company-level profit is an average, and averages hide everything useful. Here’s how to see through them.

The core discipline: every cost gets a job number

Job costing isn’t software — it’s a habit the software enforces. The habit: no cost enters the books without answering “which job?”

  • Labour: time tracked by job (and ideally by phase), every day, including the drive-and-shop hours that vanish in most shops
  • Materials: supplier invoices coded to jobs at entry — which means POs or invoice notes that say which site, not a monthly pile of lumber-yard bills coded to “Materials”
  • Subcontractors: by job, matched against what was quoted
  • Equipment: owned equipment charged to jobs at an internal rate, so machine-heavy jobs carry their true cost
  • Everything else with a cause: permits, disposal, rentals, site-specific insurance

The failure mode is always the same: coding gets done weekly-ish, from memory, by whoever has time. The result is job costs that are 80% right — which sounds fine until you remember most contracting margins live inside that missing 20%.

Labour costs more than the wage

The most common and most expensive job-costing error is charging labour at the pay rate. An employee at $35/hour doesn’t cost $35/hour. Add CPP and EI employer portions, WSIB premiums, Ontario’s Employer Health Tax where it applies, vacation pay, stat holidays, benefits, small tools, and training — the burdened rate typically runs 25% to 40% above the wage.

Price jobs assuming $35 labour that actually costs $46, and every labour-heavy job is quietly bidding away margin. Calculate your true burden percentage once a year, apply it to every hour, and rebid accordingly. For many contractors, this single fix reframes which types of work are worth taking.

Overhead: allocate it on purpose

Rent, office wages, trucks, insurance, software, estimating time on jobs you didn’t win — none of it codes to a job, and all of it must be paid by the jobs collectively. Two workable approaches:

  • Track contribution margin per job (revenue minus direct costs) and know the total overhead those margins must cover monthly. Simple, honest, good enough for most.
  • Allocate overhead to jobs via a rate on labour hours or direct costs, giving each job a fully-loaded profit number. More effort, more precision, standard on bigger work.

Either works. What doesn’t work is knowing neither — because then a job with a 15% contribution margin feels profitable in a company whose overhead consumes 18%.

Watch the job while it’s alive, not at the post-mortem

The report that changes behaviour isn’t the final job profit — it’s cost-to-date versus budget at percent-complete, while the job is running. A job 50% complete that’s consumed 70% of its labour budget is telling you something you can still act on: tighten the crew, flag the scope creep, get the change order signed before the extra work happens.

Which is the other half of this: change orders are where good jobs go to die. Work performed outside the original scope, done on a handshake and billed never, is invisible in company-level books and painfully visible in job-level ones. A job-costing system that tracks budget versus actual makes unbilled scope impossible to ignore — and contractors who implement it are consistently shocked at what they’d been giving away.

What to do with the answers

Run clean job costing for six months and patterns emerge that reshape the business:

  • By job type: the service work might out-margin the glamorous new builds — or vice versa. Chase what the data says, not what the ego says.
  • By customer: some clients’ jobs always blow the labour budget. That’s not bad luck; that’s a pricing adjustment (or a goodbye) with a name on it.
  • By estimator assumption: compare estimated versus actual by cost category across many jobs. If labour consistently comes in 15% over estimate, your bids have a systematic error — fixable in the template, permanently.
  • By size: many contractors discover their sweet spot is smaller or larger than the work they pursue hardest.

This connects directly to cash flow, which we covered in our post on why profitable contractors run out of cash: job costing tells you which jobs earn, and job-level cash tracking tells you which jobs are financing whom. Together they’re the instrument panel; separately each is half-blind.

Frequently asked questions

What’s the easiest way to start job costing?
Start with the discipline, not a software search: job numbers on every timesheet and every supplier invoice, this week. QuickBooks Online with projects, plus a time-tracking app crews will actually use, covers most contractors up to substantial size. The system matters far less than the consistency.

How do I calculate my labour burden rate?
Total annual labour-related costs (wages plus CPP/EI employer portions, WSIB, EHT if applicable, vacation and stat pay, benefits, small tools, training) divided by wages, minus one. Most Ontario contractors land between 25% and 40%. Recalculate yearly — WSIB rates and payroll thresholds move.

Should I charge my own equipment to jobs?
Yes, at an internal hourly or daily rate covering ownership and operating cost. Otherwise equipment-heavy jobs look artificially profitable and you’ll systematically underbid exactly the work that wears out your machines.

What about work in progress at month-end?
WIP is where contractor financials most often mislead: costs paid on jobs not yet billed (underbilling) or billings ahead of work performed (overbilling) distort any single month. A monthly WIP schedule — percent complete, costs, billings, over/under — is the adjustment that makes contractor statements true. Lenders and bonding companies will expect it anyway as you grow.

My jobs are small and fast. Is this overkill?
Scale it down, don’t skip it: even high-volume small-job shops benefit from costing by job type and tracking labour against quoted hours. The question “which work makes money?” doesn’t get less valuable because the jobs are quick — it gets harder to answer without a system.


If you’re pricing next year’s work off this year’s feelings, job costing is the highest-ROI fix in your business — and it’s a setup problem, not a heroics problem. YBL builds job costing for contractors and trades across Ontario: the accounts, the burden rates, the WIP schedule, and monthly reporting that shows margin by job while you can still act on it. Let’s talk before your next bid goes out.

Get financial strategy insights for growing Canadian businesses including cash flow, tax planning, and operational finance. Delivered monthly.