Construction Job Costing: Why Your Company Made Money and You Still Cannot Tell Which Jobs Did

On this page

How contractors assign cost to the job instead of the company, why company-level books hide losing work, and the cost categories most estimates miss. Reference content for trade business owners and the teams who keep their books.


An average is a comfortable thing to read and a dangerous thing to run a business on. A contractor whose company books show a healthy year-end profit is reading an average: the strong jobs and the weak jobs blended into one number that feels like the truth about the business. It is not. It is the truth about the blend. Underneath it, some jobs earned well and some lost money, and the company-level statement is built precisely so that you cannot tell which was which. When the mix of work shifts next year toward the jobs that were quietly losing, the comfortable average shifts with it, and the contractor never sees the cause because he was never shown the parts.

That is the gap job costing closes. Company-level accounting tells you whether the business made money. Job costing tells you which work made it and which work quietly drained it. For a contractor running several projects at once, those are different questions, and only the second one tells you what to bid, what to drop, and which crews and jobs are worth repeating. Every other financial report a contractor relies on, the WIP schedule, the bid model, the equipment decision, is only as honest as the job cost data feeding it. Get job costing wrong and everything downstream inherits the error.

Quick Answer: Company-Level vs Job-Level, Same $100,000

The difference is easiest to see on one number split two ways. Take a contractor with $100,000 of revenue across two jobs in a period.

What company-level books show:

Line Amount
Total revenue $100,000
Total costs $82,000
Profit $18,000

Looks like an 18% margin. Healthy. Nothing to fix.

What job-level costing shows:

Job A Job B
Revenue $55,000 $45,000
Assigned cost $38,000 $44,000
Profit / (loss) $17,000 $1,000
Margin 31% 2%

Same $18,000 total. But now you can see Job A is the business and Job B barely broke even. The $44,000 assigned to Job B already includes its share of overhead, the labor burden, the equipment time; once all of that lands on the job, a 2% margin is one bad week from a loss. The point is not that every low-margin job is bad; it is that job costing shows whether the low margin was intentional, underbid, or caused by missed costs. Bid more like Job A, fewer like Job B unless you know why Job B came in thin. The company-level statement could never tell you any of that, because it averaged a strong job and a weak one into a single comfortable number. Job costing is the discipline of assigning every cost to the job that caused it, so the average stops hiding the spread.

What Job Costing Actually Is

Job costing assigns each dollar of cost to the specific project that incurred it, rather than pooling all costs at the company level. The result is a profit-and-loss picture for every job, not just for the business as a whole.

The principle sounds obvious. The discipline is not, because costs do not arrive labeled by job. A lumber delivery covers three projects. A foreman splits the week across two sites. The excavator runs on one job Monday and another Wednesday. Office rent and the owner’s truck touch every job and belong to none. Job costing is the system of rules and habits that decides, for each of those dollars, which job carries it. Done consistently, it produces the job-level P&L. Done loosely, it produces numbers that look precise and mislead anyway.

This is why job costing is the substrate under the rest of a contractor’s financials. The WIP schedule that tells you whether you are overbilled or underbilled runs entirely on costs-to-date by job. The bid on the next project is only as good as the cost history from the last one. The decision to buy or lease a piece of equipment depends on knowing what that equipment actually costs per hour across the jobs it runs on. Each of those depends on cost data assigned correctly at the job level first. Garbage in at the job-cost stage becomes garbage out everywhere downstream.

The First Layer: Cost Codes

The mechanism that makes job costing work is the cost code. A cost code is a category you assign every expense to, so costs can be compared across jobs in a consistent language. Without codes, a job’s costs are just a pile of receipts; with them, you can see that framing labor ran over on three jobs in a row, or that one supplier’s material costs are climbing.

Most systems organize costs into a small number of top-level categories, then sub-divide as needed. A common structure runs along these lines:

Code Category Captures
100 Labor Field wages, burden, by trade or activity
200 Materials Lumber, concrete, steel, fixtures, finishes
300 Equipment Owned-equipment usage, rentals
400 Subcontracts Sub labor and materials by trade
500 Overhead Indirect costs allocated to the job

Contractors who want more detail break these into sub-codes (labor by trade, or by activity such as layout, installation, cleanup). You can adopt an industry framework like CSI MasterFormat or build your own. What matters is not which system you choose but that you use it consistently, because the value of a cost code comes entirely from comparing the same code across jobs and across time. A code structure that changes every project tells you nothing.

There is a real trap on the other side, though. It is tempting to track everything in fine detail, but this is exactly where job costing breaks in the real world: crews guess at codes in the truck, the office cleans them up later, and the data quietly becomes fiction. Too many codes overwhelm the field crews who have to assign them, and tracking labor by trade is often more practical than tracking every individual worker. The best cost code structure is the one the field will actually use correctly; a detailed structure that gets guessed at is worse than a simpler one applied consistently.

The Layer Most Estimates Miss: Labor Burden

Here is where job costing stops being bookkeeping and starts being the thing that decides whether a bid was profitable. The base wage you pay a worker is not what that worker costs you. The real number is the burdened rate, and contractors who cost jobs on base wage alone understate every job and underbid the next one.

The burdened rate adds to the base wage everything else an employer pays to keep that worker on the crew:

Burdened Rate = Base Wage + Payroll Taxes + Workers’ Comp + Benefits

Payroll taxes include the employer share of FICA, which is 7.65% (6.2% Social Security up to the annual wage base, plus 1.45% Medicare), and federal and state unemployment tax. Workers’ compensation is the big variable, because the premium is set by trade risk class and a roofer’s rate is far higher than an office worker’s. Benefits, paid time off, and training stack on top.

There is no single correct burden percentage, and any guide that gives you one number is misleading you. Reported ranges vary widely from one source to the next, commonly landing somewhere around 30% to 60% of base wage. The number depends heavily on trade, workers’ comp class, location, union status, and the benefits a contractor offers, so treat any published range as a rough illustration, not a figure to plug into your own bids. High-risk trades like roofing and framing land at the top of that range; lower-risk trades sit lower. The point is not to borrow a percentage from an article. It is to calculate your own, by adding your actual annual payroll taxes, workers’ comp, and benefits, then dividing by productive hours, and to recalculate it as those costs move (insurance premiums in particular shift year to year). Because labor is widely reported to run on the order of 30 to 50% of total project cost, an error in the burden rate is an error in one of the largest lines on most jobs.

Walk it through. Suppose a carpenter earns a $30 base wage and your calculated burden is 40%. The job costing system should charge that carpenter to the job at $42 an hour, not $30. On a job with 500 carpenter hours, costing at base wage understates the labor cost by $6,000. Do that on every job and every bid, and a business that looks like it runs a thin profit may be losing money on labor-heavy work and never see it, because the gap is buried in a wage number that looked right.

The Layer That Reveals Trouble Early: Committed Costs

A job’s costs are not only what has been invoiced. They include what you have promised to spend but have not been billed for yet. Those are committed costs, and a job costing system that ignores them is always reporting a job as cheaper than it actually is.

When you write a purchase order for $40,000 of material, or sign a subcontract for $80,000, that money is committed the day you sign, even though no invoice has arrived. A budget that only counts invoiced costs shows room that is not really there. The contractor sees $60,000 left in the budget, keeps spending, and discovers the overrun only when the committed invoices land weeks later. Tracking committed costs alongside actual costs keeps the budget grounded in reality, because it counts the obligations you have already made, not just the bills that have already arrived.

This is the difference between job costing that reports the past and job costing that manages the job. Actual costs tell you where you have been. Committed costs tell you where you are already headed. A contractor watching both can catch an overrun while there is still time to do something about it, instead of reading about it after closeout.

The Layer Everyone Argues About: Equipment and Overhead

Two kinds of cost do not belong cleanly to any single job, and how you handle them separates rough job costing from accurate job costing.

Owned equipment is the first. If you own an excavator and use it across several jobs, charging its full cost to whichever job happens to be running when the payment clears is wrong, and leaving it in general overhead is just as wrong, because then equipment-heavy jobs look more profitable than they are while light jobs subsidize them. The fix is an internal equipment rate. Calculate what the machine costs to own and operate over a year (purchase or financing cost, maintenance, fuel, insurance), divide by its expected annual usage hours, and charge each job an hourly rate for the time the machine spends on it. To make the mechanics concrete with illustrative numbers: a skid steer you have worked out to cost roughly $11.50 an hour to own and run, sitting on one job for 40 hours, would owe that job about $460 in equipment cost (your own machine and usage will produce a different rate). Skip this and you are giving equipment away for free on your books, and your job costs are wrong in favor of the jobs that used the most equipment.

There is a distinction worth holding here. Whether to own the machine at all is one question. Charging the machine you do own to the jobs that use it is a different one, and it is the job costing question. Owning equipment you cannot charge out to enough billable job hours is how a machine quietly becomes a loss, and only job-level equipment costing makes that visible.

Overhead is the second, and the messier one. Office rent, the owner’s time spent managing rather than building, administrative salaries, general insurance: these are real costs that touch every job and belong to none. Leave them out of job costing entirely and every job looks more profitable than the business actually is, which is exactly how a company full of jobs that each look fine still loses money overall. The common fix is to allocate overhead across jobs by a consistent method, often as a percentage of direct costs or a rate tied to project size. The method matters less than applying it consistently and knowing you are estimating, not measuring, when you do it. The owner who spends ten hours a week managing a project and never logs that time against the job is understating its cost and inflating its margin, the same way unburdened labor does.

How the Layers Stack Into a Number You Can Use

Put the layers together and a job’s true cost is the sum of them, not just the visible ones:

Total Job Cost = Direct Labor (burdened) + Direct Materials + Equipment (at internal rate) + Subcontracts + Allocated Overhead

Each layer this article walked through is one term in that line, and dropping any term understates the job. Leave labor unburdened and the largest term comes in low. Ignore equipment rates and the machine-heavy jobs read cheaper than they ran. Omit overhead and every job looks better than the business that houses it. Miss committed costs and the job appears to have room it has already spent. The reason job costing takes discipline is that every one of these is easy to skip and invisible when skipped, until the company-level number and the job-level reality drift apart.

That same total cost feeds the one ratio that catches trouble fastest on an active job: percent complete against percent spent. If a job is 40% through the work but 60% through its budget, costs are running ahead of progress and the margin is eroding while there is still time to react. That comparison only works if the cost side is honest, which means burdened, committed, and fully allocated. A percent-spent figure built on unburdened labor and ignored equipment is comparing real progress against a fake budget, and it will tell you the job is fine right up until it closes at a loss.

Why This Feeds Everything Else

Job costing is worth the discipline because almost every other financial decision a contractor makes draws on it. The WIP schedule that surety underwriters and banks read at every bond renewal is built from costs-to-date by job; if those costs are wrong, the WIP is wrong, and the bonding capacity that depends on it rests on bad data. Picture the underbid that starts the chain: a contractor wins a $400,000 job priced off last year’s similar project, where labor was costed at the base wage instead of the burdened rate. The old job looked like it cleared 15%; it actually cleared 4%, and nobody knew because the burden never hit the books. The new bid inherits the same blind spot, the new job comes in at a loss, and the loss looks like bad luck rather than a costing error repeated on purpose. The equipment decision, the hiring decision, the question of which kind of work to chase and which to walk away from, all of them are answered well only by a contractor who knows, job by job, where the money was actually made.

This is the throughline across a contractor’s whole financial picture. The bank balance tells you cash moved. The WIP schedule tells you whose cash it is. Job costing tells you which work earned it. A contractor with clean job costing can look at a year of completed projects and say, with evidence, which jobs to repeat and which to never bid again. A contractor without it is running on a company-level average that feels like knowledge and is actually a blindfold, profitable until the mix of work shifts and the hidden losing jobs become the whole year.

What Clean Job Costing Requires

Most job costing failures are not accounting failures. They are field-data failures. Labor hours charged to the wrong job, equipment time that never gets recorded at all, and costs entered long after the work happened can make a sophisticated costing system less accurate than a simple one maintained consistently. The accounting logic in this article is the easy half; the hard half is getting the right number into the right job code on the day the work happens, in the field, by the people doing it. A costing method is only ever as good as the data entered into it, and the data is entered on the jobsite, not in the office.

The mechanics are not complicated, but they have to be deliberate, and they have to happen in real time rather than reconstructed at month-end. Set up a consistent cost code structure and use it on every job. Charge labor at the burdened rate, not the base wage, and recalculate that burden as your costs move. Track committed costs the day you sign a purchase order or subcontract, not the day the invoice arrives. Set an internal rate for owned equipment and charge it to jobs by usage. Allocate overhead by a consistent method so every job carries its share. And code costs to the right job as they happen, because a cost reconstructed from memory at the end of the month is a guess wearing the costume of data.

Done this way, job costing stops being paperwork and becomes the report that answers the question company-level books cannot: not whether the business made money, but which work made it. That is the difference between two contractors at year-end. One knows why a profitable year was profitable and can repeat it. The other had a good year, cannot say why, and finds out the hard way when the mix of jobs shifts and the average stops being kind.


This article is general information, not legal, tax, or accounting advice. Construction tax, sales tax, payroll, and classification rules are complex, fact-specific, and change over time. Tax figures, statutory limits, and regulatory rules cited here reflect the law as understood at the time of writing and may since have changed; rates and thresholds in particular are commonly updated year to year. Nothing here creates a professional relationship or should be acted on without confirming how the current rules apply to your specific situation with a licensed CPA, tax professional, or attorney familiar with construction accounting. Where a number or rule drives a real decision, verify it against the primary source (the IRS, the relevant state authority, or your own advisor) before relying on it.

Leave a comment

Your email address will not be published. Required fields are marked *