All posts

How to Price a Roofing Job: Materials, Labor, and Margin

11 min read

The short answer: Price a roofing job by measuring the roof in squares, costing the shingles, underlayment, and accessories at what they actually cost you, adding labor at a loaded rate times the hours the crew truly works, plus a share of overhead, then a margin on top. The formula is Price = (materials + loaded labor + overhead) ÷ (1 − target margin). The number most roofers get wrong is waste and tear-off hours, because the extra bundles and the dumpster runs never make it into the estimate. CRMb prices materials at real average cost and pulls labor from your crew's punch-ins, so the quote you send is built on measured numbers, not a hunch.

Roofing pricing looks like arithmetic and behaves like a trap. The roof is a fixed size, the shingles have a list price, and yet two crews quoting the same house land hundreds of dollars apart. The gap is almost never the shingle price. It is the waste factor, the tear-off labor, the steep-pitch slowdown, and the overhead nobody assigned. This guide walks the full build-up and shows where the margin actually leaks.


Start with the four things every roofing job costs

Whether you are quoting a straightforward asphalt reroof or a complex multi-facet replacement, the price rests on the same four layers:

  • Materials, the shingles, underlayment, ice-and-water shield, drip edge, ridge cap, starter, nails, and flashing, at your real cost including delivery.
  • Tear-off and disposal, the labor to strip the old roof plus dumpster and dump fees.
  • Labor, the loaded hourly cost of everyone on the roof for the hours they actually work.
  • Overhead, the slice of trucks, ladders, insurance, dispatch, and office that this job has to carry.

Miss a layer and you are not discounting, you are working for free on that part of the job. The two layers that leak most are materials, because waste is underestimated, and labor, because tear-off and pitch slow the crew far more than the bid assumes.

Step 1: measure in squares and add an honest waste factor

Roofing is priced by the square, an area of 100 square feet. Measure the roof's total area, divide by 100, and you have the squares. A 2,000-square-foot roof surface is 20 squares before anything else.

Then add waste. Every roof needs more material than its bare area because shingles get cut at hips, valleys, rakes, and penetrations, and the offcuts are scrap. A simple gable roof might waste 10%; a cut-up roof with multiple valleys and dormers can waste 15% or more. Order 20 squares of coverage on a complex roof and you will run short mid-job, which means a second delivery, a stalled crew, and a margin hit nobody quoted.

The fix is to value materials at average cost, the running average of what you actually paid across recent purchases, so a mid-season price bump on a bundle of shingles does not silently blow up a job you costed off last quarter's number. CRMb tracks inventory at average cost across your warehouse and truck stock, and when material is pulled to a job its real cost lands on that job automatically.

Step 2: cost tear-off and disposal separately

Tear-off is the layer most reroof quotes underprice, because it feels like "just ripping shingles off" and turns out to be the sweatiest hours of the job. A roof with two or three existing layers takes far longer to strip than a single layer, and the labor scales with what is up there, not with what is going down.

Disposal is a hard cost, not a rounding error: the dumpster rental, the haul, and the per-ton dump fee. Old roofing is heavy, and a full tear-off can fill a container faster than the estimate assumed. Price the dumpster and the dump ticket as their own line so a busy week of tear-offs does not quietly eat the profit on all of them.

Step 3: build the loaded labor rate, then use real hours

Labor is where roofing margins live or die, and it fails in two ways at once: the rate is too low and the hours are too few.

The rate is too low when you cost at the bare wage. Every roofer costs more than their paycheck, payroll taxes, workers' comp (steep in a trade that works at height), benefits, and paid time off add roughly 25% to 35% on top. A $26 wage is really a $33 to $35 loaded rate. Cost at $26 and you understate labor on every job. The full build-up is in how to calculate labor cost per job.

The hours are too few when you cost from the estimate instead of the clock. Real roofing hours include the parts nobody bids: the steep-pitch slowdown that turns a one-day job into a day and a half, the rotten decking that had to be replaced before felt went down, the weather delay that sent the crew back a second morning, the extra hands pulled in to beat an afternoon storm. Those are exactly the hours that flip a healthy bid to a thin one, and they are invisible unless the crew captures them.

The reliable way to capture them is to have the crew punch in against the specific job. With Punch, each punch-in is tagged to the job, and the hours flow into CRMb as labor cost with the loaded rate already applied. You cost the job from what happened, not what you hoped.

Step 4: add overhead so the job carries its share

Overhead is every cost that keeps the doors open but does not belong to one job: truck payments and fuel, ladders and tools, general liability, software, the phone that gets answered, the pay of anyone not on the roof. It is real money, and if no job carries it, it comes straight out of profit.

The common method is an overhead rate, your annual overhead divided by the billable labor hours you expect to sell in a year, applied per labor hour. If overhead runs $150,000 a year and you sell 6,000 billable hours, that is $25 of overhead per labor hour on top of the loaded wage. The mechanics are in how to calculate an overhead rate.

Step 5: set the price from the cost, not the other way around

With materials, tear-off, labor, and overhead totaled, you have the job's true cost. Price is that cost divided by one minus your target margin:

Price = total cost ÷ (1 − target margin)

For a 30% margin, divide by 0.70. Note the difference from markup, dividing by 0.70 is not the same as adding 30%, and confusing the two quietly costs you points of margin on every job. The distinction is spelled out in markup vs margin.

A worked example: an asphalt shingle reroof

A 22-square asphalt reroof over a single existing layer, priced from the ground up. Loaded roofer rate $34.00, overhead $25.00 per labor hour, target margin 35%.

Cost layerDetailAmount
Shingles + accessories22 sq + 12% waste, underlayment, drip edge, ridge, starter, nails$4,300
Tear-off + disposalDumpster + dump fees$700
Labor4 roofers × 10 hrs = 40 hrs × $34.00$1,360
Overhead40 hrs × $25.00$1,000
Total cost$7,360
Price at 35% margin$7,360 ÷ 0.65$11,323

Now the leak. Suppose the crew actually worked 50 hours, not 40, a sheet of rotten decking to swap and a steeper back slope than the bid assumed. At $34 loaded plus $25 overhead, those 10 hours cost $590 the estimate never saw. Cost the job at the 40 bid hours and you would book it at $7,360 and believe the margin held; cost it at the real 50 hours and the true cost is $7,950, quietly turning a 35% job into roughly 30%. On one reroof it is a bad afternoon. Across a busy season it is real money walking off the roof.

Should roofing be flat rate or time and materials?

Most reroofs are quoted flat rate, a fixed price the homeowner sees up front, rather than billed by the hour. Flat rate is easier for the customer to approve and it rewards a crew that works efficiently, since faster work does not lower the price. It only works, though, if the flat price was built from real cost history. Price a flat rate from a guess and you have locked in the guess.

Time and materials fits the open-ended part of the job, the decking you cannot see until the old roof is off. Many roofers quote the reroof flat and handle deck replacement as a per-sheet add-on, which is a form of change order. Either way, cost the job from real hours behind the scenes, so next season's flat price is built on history rather than hope. See time and materials vs fixed price for how the two models trade off.

Send a quote the customer can approve on the spot

A price is only useful once the customer accepts it. CRMb turns the costed job into a professional quote with a public share link: the homeowner opens it on their phone, sees the scope and the price, and signs to approve. When the work is done, the quote converts to an invoice, pulling the same materials and labor through, so nothing is re-keyed and nothing is forgotten. As the crew punches in, the reports view shows the job's margin trending live and flags it if it drifts toward the red while the roof is still open.

Frequently Asked Questions

How do you price a roofing job?

Measure the roof in squares and add a waste factor, cost the shingles and accessories at their real price, add tear-off and disposal, then add labor at a loaded rate times the hours the crew actually works, plus a share of overhead. Total those and divide by one minus your target margin to get the price. The formula is Price = (materials + loaded labor + overhead) ÷ (1 − target margin). Building the price from measured cost, rather than copying a competitor's per-square number, is what keeps the margin real.

How much does a roofing job cost per square?

Per-square pricing varies widely by material, pitch, tear-off, and region, so a fixed number is unreliable. The discipline matters more than the figure: cost your own materials, labor, and overhead for a real job, divide by the squares, and you have your true per-square cost to price from. Quoting off someone else's per-square rate ignores your waste factor, your loaded labor, and your overhead, which is exactly where roofing margins leak.

What is a good profit margin on a roofing job?

Many roofers target a gross margin in the 25% to 40% range, with tear-off and steep or complex roofs often carrying different economics than a simple reroof. The right number depends on your overhead and market, but a 35% margin calculated from bare wages and estimated hours is fiction. Cost every job from loaded labor and real hours first, then judge the margin.

How do I account for material waste in a roofing estimate?

Add a waste factor to the measured squares, commonly around 10% for a simple gable roof and 15% or more for a cut-up roof with valleys and dormers, and value the material at average cost so mid-season price swings do not blindside you. CRMb tracks each bundle at its real average cost and lands it on the job when it is pulled, so the materials line matches what the roof actually consumed instead of a round guess.

Why do roofing jobs lose money even when the estimate looked profitable?

Almost always because the tear-off and labor hours ran over the bid and were never re-costed, or the labor was costed at the bare wage instead of the loaded rate. Rotten decking, a steeper pitch than expected, and weather delays are invisible unless the crew captures the hours. Cost jobs from punched hours at a loaded rate and the overruns show up while you can still learn from them, instead of at year end.


Getting started with CRMb

Price your next roof from measured numbers. Measure the squares and add honest waste, cost the materials at real average cost, add loaded labor for the hours the crew actually works and the tear-off it really takes, layer in overhead, then set the margin, and send the homeowner a quote they can approve from their phone.

CRMb brings the CRM, scheduling, average-cost inventory, quotes and invoices, and job costing on real punched hours into one app, on Mac, iPad, and the web. Start your 14-day free trial and quote your next roof on numbers you can trust.

More from the blog