The Roofing Black Box

Pricing Roofing Jobs When You Run Subcontractors

Roofing Insights · 2026-08-23

There are two ways to lose money on a sub-crew job. The first is obvious: you bid it too low. The second is quieter and more common — you bid it fine, then handed the number to a crew whose price was built on different assumptions than yours. Squares don't match. Waste isn't included. The tear-off layer count nobody verified turns into two extra days you eat.

If you self-perform, your labor cost is a slow bleed you can see in real time and correct on Wednesday. If you sub it out, your labor cost is a contract you signed before the truck rolled. That difference should change how you price.

Your Sub Price Is Not Your Labor Cost

The most expensive habit in sub-based estimating is treating the crew's number as a finished line item. It isn't. It's the biggest input into a line item that also includes everything the crew won't do and everything that goes wrong.

Take a straightforward 38-square architectural tear-off and replace. Your crew quotes $85 a square installed labor, one layer. That's $3,230. Here's what's actually sitting behind that number and is nobody's job until it becomes yours:

Price the job, not the crew's portion of the job. Every one of those bullets is a real dollar amount that lands on your P&L whether or not it lands on your estimate.

Markup on Subs: Stop Using the Same Number as Materials

A lot of contractors run one blanket markup across the whole bid. It's simple, and it's wrong in both directions.

Sub labor carries risk that a bundle of shingles does not. Materials sit in a pile and behave predictably. A sub crew can no-show, install a valley wrong, damage a gutter, walk a job half-finished, or file a lien because their supplier didn't get paid. You carry the general liability. You carry the warranty. You carry the relationship with the customer. That risk has a price and it belongs in your markup.

The math most estimators get backwards: markup and margin are not the same number. If your cost is $10,000 and you want to keep 30% of the sale, you don't multiply by 1.30 — that gets you $13,000 and a 23% margin, seven points light. You divide by 0.70 and bid $14,286. On a hundred jobs that gap is your entire year of profit. Divide by (1 − your target margin). Always.

Practical structure: run a lower markup on materials, where your cost is known within a few percent, and a higher one on sub labor, where your cost is a promise from someone else. Then hold a separate contingency on scope you couldn't verify from the ground — anything you couldn't see, anything hidden by a ceiling, anything on a roof over thirty years old.

Get the Sub on Your Unit of Measure

Half the margin fights in this trade are unit-of-measure fights. You measured 38.4 squares of roof surface. Your crew bids "about 40" because they eyeball it, or they bid off net area while you bid off net plus waste, or you're including a 22-foot double-layer ridge in the square count and they're billing ridge as a separate linear item.

Neither of you is lying. You're just measuring different things, and the difference shows up as a change order on Friday.

Fix it at the source. Send the crew the same takeoff you priced from — total squares, waste factor, eaves, rakes, ridges, hips, valleys, pitch breakdown, and a story count. Make the sub's quote reference that document by name. When the roof turns out to be what the takeoff said it was, there's no argument. When it doesn't, you have a clean baseline to write a change order against instead of a memory contest.

This is where a real bid sheet earns its keep. When the measurement, your cost buildup, the sub's scope, and the client-facing proposal all trace back to one set of numbers, the whole class of "that's not what I quoted" disappears. When they're in three different places — a PDF report, a spreadsheet, and a text message — you're going to lose one of those arguments per month.

Write the Change Order Rates Into the Sub Agreement

Every roof has surprises. The question isn't whether you'll hit unexpected scope, it's whether the price for that scope was agreed on before or after it was discovered. Before, it's arithmetic. After, it's a negotiation you enter with zero leverage, because the roof is open and rain is coming.

Set the rates up front and keep them the same across every job with that crew:

Then mirror those exact rates in your customer contract as unit prices, with your markup applied. Now hidden scope is a pass-through with a known spread instead of a coin flip. The homeowner sees a number they already agreed to. You don't have to decide in the moment whether to eat it or fight about it.

Price for the Cash Gap

Subs get paid on completion. You get paid when the customer pays, or when the insurance carrier releases depreciation, or when the GC processes your pay app on a sixty-day cycle. That gap is financed by you.

On a residential retail job it's a couple of weeks and it's noise. On commercial with a GC, retainage plus a slow pay app can mean you've paid three crews before you see the first dollar of that job. If you're running four jobs like that concurrently, you have a working capital problem that no amount of good estimating fixes — and the correct response is to price it in or restructure the terms, not to hope.

Two moves worth making. First, if you're going to be out of pocket for sixty-plus days, that carry cost is a real line in your overhead and should be reflected in what you bid on slow-pay work. Second, tie your sub payment schedule to milestones you actually control — dry-in complete, final inspection passed — rather than to a date, so the money going out is at least loosely coupled to progress you can bill for.

Track Sub Performance the Way You Track Material Costs

You know what a bundle costs. Do you know what each crew actually costs you once you count callbacks, damage claims, and the two hours you spend on-site fixing what should've been done right?

The cheapest crew per square is frequently the most expensive crew per job. A $75/square crew that generates one callback in five jobs and needs supervision is worse than a $95/square crew that finishes clean and answers the phone. But you'll never know which is which unless you're closing out jobs against the estimate.

Keep it simple. Per job, per crew: bid labor versus actual labor paid, change orders and who caused them, callback hours in the first year, and days from start to completion versus what you scheduled. Six months of that data and your bidding stops being a guess. You'll know which crew to price a steep 12/12 with and which one to keep on walkable ranches — and you'll know exactly what to charge for each.

The Short Version

Running subs converts a variable cost into a fixed one, which is good, but only if the fixed number is built on the same measurements and the same scope you sold. Get the crew on your takeoff. Mark up sub labor harder than materials because it carries more risk. Compute markup by dividing by (1 − margin), not multiplying. Set change-order rates before the roof opens up. Price the cash gap. And close out every job so next quarter's bids are built on what actually happened instead of what you hoped would.

The estimate isn't the hard part. Making sure everyone downstream is pricing the same roof — that's the job.

Stop hand-building bids.
The Roofing Black Box turns your takeoff or measurement docs into a finished bid sheet and client-ready proposal in about a minute. Your first job is free.
Generate a bid →