HomeGuidesJob costing for commercial roofing
Guide

Job costing for commercial roofing

Commercial roofing runs on thin margins and volatile labor. Job costing is how you know (while the job is still running) whether you are making money on it. Here is how to set it up and read it.

What job costing is, and why roofers lose money without it

Job costing is the practice of tracking every dollar a project consumes (labor, material, equipment, subcontractors) against that specific job, and comparing it to what you budgeted and what you have billed. Done well, it answers the only question that matters mid-project: are we still going to make money on this?

Commercial roofing is unusually punishing when you get this wrong. Margins are thin, so a few points of slippage erases the profit on a job. Labor is the most variable cost you have. Weather, crew productivity, and rework can swing field hours dramatically from the estimate. Material prices move between bid and buyout. And projects run for months, which means an overrun you don’t catch in week three is baked in by the time you see it in the P&L. Contractors who "find out at the end" aren’t running job costing; they’re running a post-mortem.

Real job costing is a live, running comparison (budget versus committed versus actual versus forecast) updated from source documents as the job moves. That’s what lets you act while you still can.

Cost codes and cost types: the backbone

You can’t cost a job you can’t categorize. The backbone of job costing is a consistent structure of cost codes and cost types, and every document you generate gets coded to them.

Cost codes are the buckets of work: tear-off, membrane, flashing and metal, insulation, and so on, often numbered in a standard scheme. They tell you where money is going within a job. Cost types classify the nature of each dollar: commonly Labor, Materials, Equipment, Subcontractor, and general requirements. They tell you what kind of cost it is.

The discipline is simple and non-negotiable: every purchase order, every bill, every timecard, every material issue carries a cost code. When a foreman logs hours, they’re coded to a cost code and department. When a PO is cut, its lines are coded. If a document isn’t coded, it can’t land in the right bucket, and an uncoded cost is a hole in your job cost you’ll only notice when the totals don’t reconcile. A good system forces the code at entry rather than letting costs pile up in a miscellaneous pile.

Committed vs. actual: the gap most contractors miss

Here is the single most important distinction in construction job costing, and the one most spreadsheets get wrong: the difference between committed cost and actual cost.

Committed cost is money you’ve promised to spend but haven’t paid yet. The moment you issue a purchase order or sign a subcontract, that money is spoken for. The obligation exists even though no invoice has arrived. Actual cost is money that has actually hit the job: bills you’ve received and burdened labor you’ve incurred.

The trap is watching only actuals. Early in a job, actual costs look reassuringly low, but you may have already committed 80% of a cost code through open POs and subcontracts that simply haven’t been billed yet. If you budget against actuals alone, you’ll happily approve more spending on a code that’s already fully committed, and the overrun only surfaces when the bills land. The open commitment (committed minus what’s been billed against it) is the exposure you have to watch. A proper job cost view shows all of it: original and revised budget, committed to date, actual to date, and the unbilled commitment still coming.

Labor burden: the true cost of an hour

Field labor is your biggest lever and your biggest risk, and it’s where contractors most often understate cost. The wage on the paycheck is not what an hour of labor costs you. The true cost is the burdened rate: base wage plus everything that rides on top of it.

That burden typically includes the employer share of payroll taxes, workers’ compensation insurance (which is expensive in roofing), general liability, and any benefits: health, retirement, training. Add it up and the burden can be a substantial percentage on top of base pay.

A worked example. Say a roofer’s base wage is $30/hour. Add employer payroll taxes, workers’ comp, liability, and benefits, and the loaded burden comes to, say, roughly 40% on top. The burdened rate is about $42/hour, the number your job cost should use. If your estimate and your job cost both used $30, every labor hour is understated by $12, and a job that "looks" on-budget is quietly bleeding. Always cost labor at the burdened rate, and make sure the rate you estimate with matches the rate you cost with.

The lifecycle: budget → committed → actual → forecast

Job costing is really four views of the same cost code that together tell you where you stand and where you’re headed.

🎯

Budget

What you estimated for each cost code, plus approved change orders. This is the baseline everything measures against: the revised budget, not the stale original.

📝

Committed

What you’ve obligated through purchase orders and subcontracts, whether or not it’s been billed. Your forward exposure.

📊

Actual

What’s actually hit the job (received bills plus burdened labor), moved between codes only by real documents.

🔮

Forecast

Cost-to-complete and estimate-at-completion: actual plus open commitments plus remaining uncommitted budget. This is where overruns show up early enough to act on.

Why the ledger should be source-document-only

There’s a temptation to "help" a job cost report along with estimates: proration, percentage guesses, an accrual to smooth things out. Resist it. The value of a job cost ledger is that it’s true: every number traces to a real purchase order, a real bill, a real timecard, a real material issue. When you mix estimates into actuals, you lose the one thing the ledger is for, the ability to reconcile to the penny and trust what you’re looking at.

Keep the actuals ledger source-document-only, and put projections where they belong: in a clearly-labeled forecast view alongside it, never blended in. This is exactly how SitewideOps’ job costing is built (a source-document cost ledger by cost code and cost type, with a separate, labeled cost-to-complete forecast) so the numbers your controller signs off on always tie out.

How job costing feeds the WIP schedule

Accurate job cost feeds more than the project manager; it’s the raw material for your work-in-progress schedule. WIP compares cost incurred to total estimated cost to figure percent complete, then compares earned revenue to what you’ve actually billed to reveal over- and under-billing. If your job cost is wrong, your WIP is wrong, and your controller and bonding company are reading a fiction.

That’s why the two are inseparable: clean, source-document job costing by cost code rolls straight into a defensible WIP. For the other half of the picture, see our guide on how to build a WIP schedule.

Labor productivity: the signal that arrives before the cost

Job cost tells you what you’ve spent. But it’s a trailing number on labor (your most volatile cost) because the dollars don’t land until payroll is run and the bill is posted. By then the week is over. There’s an earlier, sharper signal available: whether your crews are installing at the man-hour rate you budgeted. That productivity is visible the day the work is done, and it’s what a WIN log (a labor-productivity, earned-value log) is built to surface.

It works in units and hours, not just dollars. For each scope of work you set a budget in man-hours per unit: the hours it should take to install a square of membrane, a linear foot of flashing, a detail. Crews then log, day by day, how many units they put in place and how many hours it took. From those two numbers the log earns hours against the units actually installed and compares them to the hours actually burned, ahead of the labor budget or behind it, per crew, per activity, updated daily.

The output is a set of leading indicators no dollar report gives you this early:

A membrane crew trending 12% over its man-hour budget shows up this week (while you can still reslot the crew, fix the staging, or get ahead of a change order), not next month, when the labor cost finally posts to the ledger and the margin is already gone.

In SitewideOps this is the WIN Log, and it’s fed by the same daily field reports that hit job cost, so labor productivity and labor cost come out of one entry, not two. It sits in front of your job cost as the leading indicator: the WIN Log warns you a cost code is going to run hot; the job-cost ledger confirms it in dollars a few weeks later.

How to set up job costing

You don’t need a complicated system. You need a consistent one. This is the sequence.

1. Define your cost codes and cost types

Adopt a standard set of cost codes for the work you do and a fixed list of cost types (Labor, Materials, Equipment, Subcontractor, general requirements). Use the same structure on every job so you can compare and learn across projects.

2. Budget by cost code

When a job is set up, load the estimate as a budget broken out by cost code and cost type. This is the baseline; approved change orders adjust it into a revised budget as the job moves.

3. Code every document

Require a cost code on every PO, bill, timecard, and material issue at the moment it’s entered. No uncoded costs. Cost labor at the burdened rate.

4. Track committed cost

Capture obligations as they’re made: issue POs and subcontracts through the system so committed cost is visible before any bill arrives.

5. Review actual vs. budget regularly

On a set cadence (weekly on active jobs), pull the cost code view: budget, committed, actual, and percent used. Look for codes trending hot before they blow.

6. Forecast cost-to-complete

Layer a forecast on top: actual plus open commitments plus remaining budget equals estimate-at-completion. Compare EAC to the contract to see your projected margin and act while you still can.

Common mistakes

The failures are predictable, which is good news. You can design them out:

The point of job costing is the decision it drives. A cost code trending 15% hot in week four is a conversation you can still win: reslot a crew, tighten buyout, submit a change order. The same overrun discovered at closeout is just a loss you get to explain. Speed of information is the entire value.

Frequently asked questions

What’s the difference between a cost code and a cost type?
A cost code is the bucket of work (tear-off, membrane, flashing, insulation) that tells you where money is going within a job. A cost type classifies the nature of the dollar: Labor, Materials, Equipment, Subcontractor, general requirements. Every cost carries both, so you can slice a job by phase of work and by kind of spend.
What is the difference between committed and actual cost?
Committed cost is money you’ve obligated but not yet paid, the moment you issue a PO or sign a subcontract. Actual cost is money that has hit the job: received bills and burdened labor. The open commitment (committed minus billed) is the forward exposure most contractors miss by watching only actuals.
What is labor burden?
Labor burden is everything that rides on top of a worker’s base wage: the employer share of payroll taxes, workers’ compensation, general liability, and benefits. The burdened rate (base plus burden) is the true cost of an hour, and it’s the rate you should both estimate and cost with.
How often should we review job costs?
On active projects, weekly. Job costing only pays off if it’s current enough to change a decision. A cost code trending hot is actionable mid-job and merely explanatory at closeout. Set a fixed cadence and pull the budget-vs-committed-vs-actual view every time.
What is a WIN log, and how is it different from job cost?
Job cost tracks dollars from documents, which is a trailing number on labor. A WIN log tracks labor productivity in units and hours: you budget man-hours per unit, crews log the units installed and hours spent, and it earns hours against the work actually in place to show win/loss hours, an efficiency index, and percent complete, daily. It’s the leading indicator that flags a crew running over its labor budget this week, before that cost ever posts to the ledger.

Keep exploring

Know where every job stands, while you can still act

SitewideOps costs every PO, bill, and timecard to the job as they post, with a labeled cost-to-complete forecast. See it on your numbers.

Get early access Explore the platform