Ask a contractor how a job went and you'll usually get a feeling, not a number. "That one was tight." "We made decent money on the kitchen remodel." "The deck job was a headache." The bank balance went up, so things must be fine.
Then the year-end financials land, and the picture is uglier than the feelings suggested. The company billed $2.1 million, worked brutal hours, and cleared 4 percent. Somewhere in those forty jobs, money leaked out — but without job costing, there's no way to know which jobs leaked, how much, or why.
Job costing is the discipline that turns "that one was tight" into "we lost $7,400 on the Henderson job because framing labor ran 60 hours over and nobody caught it until closeout." It's the single most valuable accounting practice a contractor or trade business can adopt, and most small shops do it badly or not at all.
What Job Costing Actually Is
Job costing assigns every dollar of cost to the specific job that caused it. Instead of one big bucket labeled "labor" and another labeled "materials," each job gets its own ledger. When a carpenter clocks eight hours, those hours land on a job. When lumber gets delivered, that invoice lands on a job. When you rent a lift for two weeks, the rental lands on a job.
It's the opposite of process costing, which suits businesses that crank out identical units — a bottling plant, a commodity manufacturer. There, every unit costs roughly the same, so averaging works fine. Contractors do the opposite: every project is custom. A bathroom remodel and a deck addition share almost no cost structure. Averaging across them hides everything that matters.
The output of job costing is a job cost report — a running comparison of what you estimated versus what you've actually spent, broken down by category, for each active job. Read correctly, it tells you a job is bleeding while you can still do something about it.
The Four Cost Buckets
Every job-costing system tracks the same four categories. Get these clean and consistent, and the rest follows.
1. Direct Labor
The wages of the people physically doing the work on that job. This sounds simple and is the single most common place contractors go wrong — not because they forget to track hours, but because they track bare wages instead of burdened labor. More on that in the next section, because it deserves its own.
2. Direct Materials
Lumber, fixtures, concrete, wire, drywall — anything physically incorporated into the job. The discipline here is coding every supplier invoice to the right job the day it arrives, not at month-end when nobody remembers which delivery went where. A pile of uncoded invoices is a job costing system that has already failed.
3. Subcontractors and Equipment
Subcontractor costs, equipment rentals, dumpster fees, permits, and other direct project expenses. These ride with the job just like materials. If you own equipment rather than rent it, you'll typically charge jobs an internal rate per hour or per day so each project absorbs a fair slice of ownership cost.
4. Overhead (Indirect Costs)
The costs that keep the company running but can't be traced to one job: the office, the estimator's salary, accounting software, general liability insurance, the owner's truck, marketing. Overhead doesn't disappear just because it's hard to assign — it has to be allocated across jobs, which we'll cover below.
The Labor Burden Trap
Here is the mistake that quietly destroys contractor margins.
A framer earns $30 an hour. The contractor sees $30, bids the job using $30, and tracks job cost at $30 an hour. But $30 is not what that framer costs. On top of the wage sit:
- Employer payroll taxes (Social Security, Medicare, federal and state unemployment)
- Workers' compensation insurance — often 8 to 15 percent of payroll for trades, far higher for roofers
- Health insurance and retirement contributions
- Paid time off, holidays, training, and certification
- Small tools, phone allowance, vehicle costs
Add it up and the fully burdened labor rate typically runs 30 to 50 percent above the base wage. That $30 framer actually costs $42 to $45 an hour.
If your job cost reports use the bare $30, every report lies in the same direction: jobs look profitable mid-stream and disappoint at closeout. You think you're running 18 percent margins; you're actually running 8. You bid the next job off the same bad number and underprice it. The error compounds.
Calculate your labor burden once a year. Take total annual labor-related costs (wages plus all the items above), divide by total productive wages, and you get a burden multiplier — say, 1.38. Apply it to every hour on every job cost report. It's the single highest-leverage fix in contractor accounting.
Allocating Overhead With a Predetermined Rate
Overhead can't be traced to a job, so it gets applied using a rate you set at the start of the year. The standard formula:
Overhead rate = Estimated annual overhead ÷ Estimated annual allocation base
The allocation base is whatever drives your overhead — most contractors use direct labor hours or total direct job cost. Example: you expect $360,000 of overhead next year and 24,000 direct labor hours. Your rate is $15 of overhead per labor hour. Every job absorbs $15 for each hour worked on it.
Because the rate is an estimate, actual overhead will land slightly above or below what you applied. At year-end you'll have a small over- or under-applied balance, which gets closed out to cost of goods sold (or prorated across jobs if it's large). Don't let that small reconciliation scare you off — applying overhead imperfectly all year is far better than ignoring it and "discovering" your true margin only when the tax return is done.
Cost Codes: The Filing System
Cost codes are the categories that turn raw costs into a readable report. Instead of one "materials" line, a remodel might break into concrete, framing, electrical, plumbing, finishes, and so on. The construction industry has a formal standard — CSI MasterFormat, organized into divisions like Division 03 Concrete and Division 09 Finishes — and large commercial builders live by it.
Most small contractors should not adopt the full MasterFormat. A simplified list of 15 to 30 codes covering the work you actually perform beats a 600-line standard you'll never use consistently. Three rules make cost codes work:
- Keep it short. Don't include trades you neither self-perform nor subcontract. Detail you won't maintain is just noise.
- Stay consistent across jobs. The same code structure on every project, even when some codes go unused on small jobs. Consistency is what lets you compare a job this year to a similar one two years ago.
- Use one code set for everything. The classic killer mistake: the estimator bids with one set of codes and the project manager tracks costs with another. That single inconsistency breaks the link between estimate and actual — and the estimate-versus-actual comparison is the entire point.
Committed Costs: Seeing Around the Corner
A job cost report that shows only money already spent is a rear-view mirror. The number that prevents disasters is the committed cost.
A committed cost is money you've obligated but haven't paid yet — a signed subcontract, an issued purchase order, a material order placed but not invoiced. Suppose a job has a $50,000 budget, you've spent $30,000, and you've issued POs for another $25,000. Spent-only reporting says you have $20,000 left. Reality: you've already committed $55,000 against a $50,000 budget. You're $5,000 over, and you can see it today — before the invoices arrive — instead of at closeout.
Projected cost at completion = costs to date + committed costs + estimated cost to finish the remaining work
Track that number weekly and the job stops surprising you.
Reading the Job Profitability Report
A useful job cost report puts five columns side by side for every cost code:
| Column | What it tells you |
|---|---|
| Original estimate | What you bid for this category |
| Costs to date | Burdened actuals incurred so far |
| Committed costs | POs and subcontracts not yet invoiced |
| Cost to complete | Your current estimate of remaining cost |
| Projected variance | Estimate minus projected total — the punchline |
Scan the projected variance column. A code trending over budget while the job is only 40 percent complete is a fire you can still put out — reassign a crew, renegotiate a change order, tighten the scope. The same overrun discovered at closeout is just a loss you get to explain.
Run the report weekly on every active job. Job costing done monthly is a history lesson. Done weekly, it's a steering wheel.
Why Accurate Records Make Job Costing Possible
Job costing only works if the underlying bookkeeping is clean and current. Every payroll run has to split hours by job. Every supplier invoice has to carry a job and a cost code before it's posted. Every change order has to update the affected budget. If transactions pile up uncoded for three weeks, your job cost reports are fiction — and you'll make real decisions off fictional numbers.
This is where disciplined, transparent accounting pays for itself. When each transaction is coded once, correctly, and stored in a format you can actually inspect, the job cost report becomes a by-product of good bookkeeping rather than a painful month-end reconstruction. Contractors who treat bookkeeping as a daily habit — not a quarterly scramble — are the ones whose job costing they can trust.
Keep Your Job Costs Honest From Day One
Job costing isn't a software feature you buy; it's a habit of assigning every cost to the job that caused it, in burdened dollars, against a consistent set of cost codes, while you can still act on what you see. Get labor burden right, apply overhead with a predetermined rate, track committed costs, and read the variance column weekly — and "that one was tight" turns into a number you can manage.
Beancount.io provides plain-text accounting that gives you complete transparency and control over your financial data — every transaction coded, traceable, and version-controlled, with no black boxes and no vendor lock-in. Get started for free and see why developers and finance professionals are switching to plain-text accounting. To dig into the mechanics, browse the documentation or explore reporting with the Fava dashboard.