Subcontractor or In-House Crew: What a Roofing Contractor Actually Pays Per Square
July 11, 2026
The problem: The subcontractor's price arrives as one number on one invoice, while the in-house crew's real cost is scattered across payroll, insurance, vehicles, and paid downtime, so the two are never compared on the same basis.
The solution: Build a fully loaded cost per square for the in-house crew, counting burden, equipment, and unproductive paid hours, and set it beside the sub price for the same scope.
The math
If an in-house roofing crew looks like $58 a square in wages but really costs about $111 once burden, vehicles, insurance, and paid downtime are counted, a crew installing 3,500 squares a year hides roughly $185k of cost the sub invoice puts in front of you up front.
Every roofing contractor at this size runs both models, usually without deciding to. There is an in-house crew or three, and there are subs for overflow, for the work that is too far out, and for the trades nobody wants to keep on payroll. Which one gets a job is mostly a scheduling answer, not a cost answer.
When cost does come up, the comparison happens quickly and badly. The sub quotes a number per square. The owner compares it against what he thinks his crew costs, which is wages, maybe with something added for burden. The sub looks expensive. The crew stays.
The comparison is not wrong because the owner is careless. It is wrong because one side of it is a single invoice and the other side is fifteen line items in five different places.
The sub's number is complete. Yours is not.
A subcontractor invoice is an unusually honest number. It includes their labor, their burden, their workers compensation, their trucks, their fuel, their equipment, their downtime, their overhead, and their profit. Every cost of getting that roof installed is inside it, and if they underpriced it, that is their problem and not yours.
Your crew's number, as normally quoted inside the business, includes wages. Sometimes payroll taxes. Almost never the rest.
The rest is substantial in roofing specifically. Workers compensation in this trade is among the highest of any classification, and it is charged on payroll, so it scales directly with every in-house hour. General liability, vehicles, fuel, trailers, compressors, nail guns, ladders, safety equipment, phones, and paid time off all attach to the crew and none of them appear on a job cost report as crew cost. They sit in overhead, where they get spread across every job including the ones the sub did.
That last point is worth stopping on. When in-house crew costs live in overhead, the sub-run jobs absorb a share of them. Which makes subcontracted work look more expensive than it is and in-house work look cheaper than it is, in the same calculation, in the same direction.
Then there is the time you pay for and do not sell
The other half of the gap is unproductive paid hours, and it is the half owners most often leave out entirely.
An in-house crew is a fixed obligation on a schedule that is not fixed. It gets paid on rain days. It gets paid in the slow weeks between projects. It gets paid for travel, mobilization, and material runs. It gets paid while a permit is late and while a delivery does not show. None of those hours install squares, and all of them are real payroll.
A sub costs nothing on a rain day. That is the actual trade being made: you pay a premium per square in exchange for a cost that goes to zero when there is no work. Whether that premium is worth it is a real question with a real answer, and it depends entirely on how full your schedule stays. But you cannot answer it until the in-house side is stated the same way the sub states it, as a cost per square with everything in it.
What the honest comparison lets you decide
Once both sides are cost per square with everything counted, several standing arguments resolve.
- Whether to crew up or sub out the next expansion, at your real numbers instead of the industry's.
- What your crossover point is: the schedule fill rate below which the in-house crew stops being cheaper.
- Which job types your crew genuinely beats subs on, which is usually the complex work where a sub's price carries a risk premium.
- What to bid, since a bid built on wage cost rather than loaded cost is quietly bidding away your own margin.
A look at a roofing contractor
Take a roofing contractor doing about $9 million a year, running a mix of in-house crews and subs, mostly residential replacement and small commercial. Subs quote around $95 a square installed. The owner's working assumption is that his crews come in well under that.
Suppose the contractor builds a real cost per square for one crew over one season, counting everything that attaches to it.
Start with what the crew looks like today. Five people at an average of $32 an hour is $160 an hour of crew wages. If the crew installs about 25 squares in a nine-hour day, that is 45 crew hours for 25 squares, or roughly 1.8 crew hours per square. At $32, that is about $58 a square in wages. Against a $95 sub price, in-house looks like an easy win, and this is exactly the comparison most owners are carrying in their head.
Now load it. Payroll taxes, workers compensation at roofing rates, general liability, and paid time off would plausibly put the loaded multiplier around 1.55, which takes $58 to about $90 a square. Add the crew's truck, trailer, fuel, tools, and phones, call it $2,800 a month, or roughly $33,600 a year against 3,500 squares, which is about $10 a square. Then add paid unproductive time: if roughly 12 percent of the crew's paid hours go to weather, travel, waiting, and slow weeks, that lifts the labor portion again, to around $101.
Add it up and the crew is closer to $111 a square, not $58, and not obviously better than the sub at $95.
The gap between the number the owner was using and the real one is about $53 a square. On 3,500 squares a year, that is roughly $185,000 of cost per crew that the comparison was never seeing. It was always being paid. It was just being paid somewhere that did not look like crew cost.
What an owner would likely do with that is not fire the crew. In-house capacity buys quality control, callback response, and scheduling certainty that a sub does not, and those are worth paying for. The more probable moves are smaller and more useful: bid off the loaded number rather than the wage number, use subs deliberately for overflow instead of apologetically, and watch the crew's productive hour percentage, because that one variable is what decides whether the in-house model wins in any given quarter.
How to start
You can build this for one crew in one season without changing anything about how you sell.
- Load the labor rate once. Take wages and add payroll taxes, workers compensation, liability, and paid time off. Use the result everywhere, including in bids.
- Attach the crew's equipment to the crew. Truck, trailer, fuel, tools, and phones belong on the crew that uses them, not in general overhead.
- Separate productive hours from paid hours. Track how many paid hours actually installed something. That percentage is the whole argument.
- Let the cost per square update itself. Set automation to recalculate loaded cost per square as hours and squares come in, so the comparison is current when the next bid goes out.
The takeaway
You are not comparing a sub against a crew. You are comparing a complete number against a partial one, and the partial one always wins. Load your crew's rate, put its trucks and tools on its own back, and count the hours you pay for that install nothing. Then set the result next to the sub's price per square and see which way it actually falls. The answer will not be the same in every season or on every job type, which is the point: the decision should move with your schedule, and right now it cannot, because only one side of it has a number.
Every business has a number like that hiding in it.
Text us where your team loses its time, and we’ll put a real number on yours, then show you what’s worth organizing and automating first. No forms, no sales call.