Field Service Software

Roofing Job Costing: Why Two Similar Roofs Can Have Very Different Margins

Roofing Job Costing Why Two Similar Roofs Can Have Very Different Margins

Quick Links

Pull up two roofing jobs from last month. Same square footage. Same pitch, roughly. Same material package. Priced within a few hundred dollars of each other on the bid. 

Now pull up what they actually made. 

If you’ve run more than a handful of roofs, you already know what you’ll find. One job came in close to the number you expected. The other one, the one that looked almost identical on paper, ate into margin in a way you can’t fully explain just by looking at the invoice total. Nothing on the surface tells you why. The bid looked right. The crew showed up. The job was done. 

This is one of the most common blind spots in roofing job costing software: two jobs that look the same on a bid rarely play out the same in the field. If you’re only tracking margin at the company level or the month level, you’ll never catch which jobs and which conditions are actually the problem. 

Here’s where the difference usually comes from. 

Material Waste Doesn’t Scale the Same Way on Every Roof 

Every roofer price in some amount of waste. The problem is that waste percentage isn’t a fixed number; it moves with the roof. 

A simple gable roof with few penetrations wastes less material than a cut-up roof with multiple valleys, dormers, skylights, and chimneys. A steep pitch wastes more than a low-slope roof because of handling, cutting, and setup. A roof with a lot of hips and ridges eats more cap shingle and starter than a straightforward rectangle. The National Roofing Contractors Association publishes technical guidance on installation practices that back up: complexity of roof geometry is a recognized driver of material consumption, not just square footage. 

If your estimating process uses one waste factor across every job, or a factor that was accurate for the last few easy roofs you did, you’re going to underestimate material cost on the complex ones without ever seeing it clearly. The invoice from the supplier will just look “a little high” and get written off as a one-time thing. It isn’t a one-time thing. It’s a pattern tied to roof complexity, and it only becomes visible when you compare estimated material cost to actual material cost job by job, not averaged across your whole roofing book.

Crew Productivity Isn’t the Same on Every Job Even at the Same Bid Price 

Crew Productivity Isn't the Same on Every Job Even at the Same Bid Price

Two roofs priced at the same labor hours can take very different amounts of actual crew time. A roof with easy access, a clear driveway for the dumpster, and simple tear-off moves faster than a roof with limited access, multiple layers of old shingles, or tricky staging for material delivery. 

Add things like steep pitch requiring extra safety setup, HOA restrictions on work hours, or a job site where the crew has to hand-carry materials because a truck can’t get close. None of that shows up on a bid that’s built around square footage and a standard labor rate. It shows up in actual hours worked, and if you’re not tracking labor hours by job against what was estimated, you’re absorbing that difference into your overall labor cost without knowing which job caused it. 

This is the core reason why “we made X margin on roofing this quarter” tells you almost nothing useful. It blends the roofs that ran efficiently with the ones that didn’t, and it hides the second group inside the average.

Weather Delays Add Labor Days Without Touching the Contract Price 

Roofing is one of the few trades where weather doesn’t just push the schedule; it directly adds cost. A rain delay midway through tear-off means the crew must re-secure the roof, sometimes with temporary dry-in materials that weren’t part of the original bid. A delay of a day or two means the crew comes back to a job that isn’t quite where they left it, and there’s setup time to get back to where they were. 

None of these changes what the customer owes. The contract price is fixed. But the labor cost on that job just went up, sometimes by a full day or more depending on how bad the delay was and how much re-securing was needed. If a roofing company runs a lot of jobs in a region with unpredictable weather, this can be one of the biggest single factors separating a job that hit target margin from one that didn’t, and it’s almost invisible unless you’re tracking actual labor days against the original estimate for that specific job.

Disposal and Dumpster Costs Vary More Than Most Bids Account For 

Tear-off weight is not the same on every roof. A single-layer tear-off generates a lot less debris than a roof with two or three layers of old shingles. Wood shake tear-offs, roofs with old wood shingle underlayment, or roofs where you find rot and must replace decking all generate more disposal weight and often mean an extra dumpster pull or a heavier haul fee. 

Most roofing bids use a standard dumpster allowance based on typical square footage. When a job comes heavier than typical, that extra disposal cost usually doesn’t get billed back, especially on a fixed-price replacement job. It just becomes a cost overrun that gets absorbed the same way labor overruns do, quietly, and without anyone connecting it to the specific job that caused it.

The Fix Is Job-Level Tracking, Not Company-Level Averages

None of these four factors are unusual. Material waste, crew productivity, weather, and disposal costs are all normal parts of running roofing jobs. The problem isn’t that they exist. The problem is that most roofing companies only see their combined effect at the end of the month or the end of the quarter, as one blended margin number across every job. 

That number can look fine even when several jobs underneath it is losing money, because the jobs that ran well are covering the ones that didn’t. You end up bidding the same way next quarter, running into the same problems, and never quite figuring out why some jobs feel harder to make money on than others. 

Tracking estimated versus actual cost at the individual job level changes that. When you can see material cost, labor hours, and disposal cost for one specific job against what was bid for that job, patterns start to show up fast. You’ll notice that jobs with more than a certain number of roof penetrations consistently run over on material. You’ll notice that jobs in certain neighborhoods or certain times of year consistently run into more weather delays. You’ll notice that certain tear-off conditions consistently mean an extra dumpster pull that never gets built into the bid. 

Stop Treating “Roofing Jobs” as One Category

The practical takeaway here is simple: your roofing jobs aren’t one uniform category, and your job costing shouldn’t treat them like one. A steep, cut-up roof with multiple layers of old shingles is a different kind of job than a simple gable re-roof, even if they’re priced similarly on the surface. 

Start reviewing your job costing data by roof type and complexity instead of by month or by crew. Group jobs by number of penetrations, pitch, layers of tear-off, or access difficulty, and look at estimated versus actual cost within those groups. That’s where you’ll find which conditions are quietly eating your margin, and it’s the only way to fix your bidding for the next job that looks the same on paper. 

MyWorkbelt’s Budget vs. Actual tracking builds this comparison in at the job level, so you see the gap while the job is still open, not three months later a P&L. For a broader look at how job costing tools fit different trades, book a demo to see it against your own job mix. 

Related reading: MyWorkbelt vs. Housecall Pro , for a look at how job-level profit tracking compares to standard scheduling-first field service software. 

Related Posts

Leave a Reply

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