Roofing job costing: did you actually make money?
Most roofers can tell you what a job was supposed to make. Far fewer can tell you what it actually made. The estimate said 20% margin, the check cleared, the crew moved on — and whether that job earned what it was supposed to earn quietly stays a mystery.
Roofing job costing is how you answer the question. It is the discipline of tracking the real labor, material, disposal, and other costs on each roof and comparing them to what you bid. Do it consistently and two things change: you stop guessing which jobs carry the company, and every completed job makes your next estimate sharper. Here is a practical way to run it in a one-to- five-crew shop.
1. Make the estimate your baseline, not a memory
Job costing needs something to cost against. That something is the cost side of the estimate you already built — the labor hours, material quantities, disposal, permits, and equipment you priced the job on. If the number you bid against lives only in your head or on a supplier quote you threw away, there is nothing to compare the real spend to at the end.
So before the crew starts, capture the estimated cost of the job as a fixed baseline: what you expected to spend to deliver the scope the customer signed. Approved change orders adjust that baseline; a verbal "while you're up there" that never became a change order does not.
2. Track cost as it happens, not from a shoebox at year-end
The costs that sink a roofing job rarely arrive as one big surprise. They accumulate — an extra crew day, a second dumpster, decking that ran higher than the allowance, a supplier delivery you forgot to log. Costed one at a time as they happen, each is visible and fixable. Swept into a shoebox and reconciled in January, they are just a smaller bank balance you can no longer explain.
Record every job cost against the job while it is fresh: material invoices, labor (your real loaded cost, not just the crew's take-home), subcontractor payouts, disposal, permits, equipment, and commissions. A simple typed ledger — one line per cost, categorized — is enough. What matters is that the cost lands on the specific job it belongs to, the day you know about it.
3. Watch for margin drift while you can still act on it
A roofing job that looked fine at the framing-out stage can lose much of its planned margin before the final invoice, with the damage spread quietly across a few cost categories that nobody flagged in time. The point of costing during the job — not just after — is to catch that drift while the job is still open and you can still do something: convert the extra work into a change order, tighten the schedule, or at minimum know the hit is coming so it doesn't blindside payroll.
The check is simple: how does spend-so-far compare to what you baselined? If the labor line is already past estimate and the roof is half done, that is a signal today, not a lesson in hindsight.
4. Cost against collected money, not just contract value
A job is not profitable because it was expensive to sell. It is profitable when the money is collected and exceeds what you spent. A large contract with a balance still outstanding can read as a winner right up until it becomes a collections problem.
When you close out the numbers, separate three things: what you have actually collected, what is still owed, and what you spent. Profit so far is collected minus spent. Framing it this way keeps an unpaid job from masquerading as a profitable one and puts a spotlight on the balance you still need to chase.
5. Compare actual to estimated on every completed job
This is the step that turns costing from bookkeeping into an edge. When the job is done, put the two numbers side by side: what you estimated it would cost, and what it actually cost. The gap is your variance, and it is the most honest feedback a roofing business gets.
Read it two ways. Costs versus the estimate tells you whether your bid was accurate — lower actual cost is good, higher means something in your estimating assumptions was off. Profit versus what you expected at signing tells you whether the job earned the margin you sold it for. A shop that reviews this on every job stops repeating the same estimating mistakes, because the roof that overran on labor last month becomes a corrected labor assumption on the next bid for a similar roof.
6. Feed the lessons back into the next estimate
The whole loop only pays off if the variance changes behavior. If steep-pitch tear-offs consistently run over on labor hours, your production rate for steep pitch is wrong — fix the number, not just this one bid. If a particular shingle line keeps generating more waste than you allowed, adjust the waste factor for that product. Job costing without a feedback loop is a report nobody reads; job costing that updates your estimating assumptions is how a small shop builds a bid it can trust.
None of this requires an accountant on staff. It requires an estimate you can baseline against, costs recorded on the job as they happen, a look at the drift while the job is open, and an honest actual-versus-estimated comparison when it closes.
Rooferan is built to carry that loop for a small shop. Every job has a Financials view that starts from the signed estimate and approved change orders as the cost baseline, a typed expense ledger for recording material, labor, disposal, permits, equipment, and commissions against the job as you go, and an admin-and-manager per-job P&L that lays out money in, still owed, money out, and profit so far — with variance bars showing your actual costs against the estimate and your profit against what you expected at signing. Costs coded to the job in QuickBooks flow back in automatically, so the P&L reflects what your books actually show. The financial detail stays office-only; your reps and crews never see it. Start a free Rooferan account and cost your next roof against the bid instead of against a hunch. Some features and integrations vary by plan.
