← Field Notes
Roofing contractor reviewing financial summary on tablet — roofing company profit margins

You Did $600K Last Year. Here Is Why You Only Kept $40K.

Roofing company profit margins average 6–7% net. Here is the math behind the number — and the five cost leaks eating what should be yours.

By ZephEdited by Shareef Huddle7 min read

You invoiced $600,000 last year.

Full crew. Busy most months. More jobs than the year before.

Then January came and you looked at the bank account.

Forty thousand dollars.

That is not a mistake. That is the industry average for roofing company profit margins. Doing everything the normal way — good work, consistent volume, crews staying busy — produces exactly this outcome.

Here is what it looks like on the ground:

  • You quoted a job at what felt like a solid margin, installed it clean, and still could not figure out where the money went
  • You did more volume than last year and somehow have less cash than last year
  • Your numbers look fine on the estimate sheet — the bank account says something different at month end
  • You cannot tell what you actually netted on any single job from last quarter
  • Payroll clears, materials get paid, and whatever is left is what you call profit

None of that is bad work. None of it is laziness.

It is a margin problem. And margin problems have specific causes. This post names them.

What the Average Roofing Margin Actually Looks Like

Start with gross.

A typical residential replacement job runs 30–35% gross margin. On a $10,000 roof, you keep $3,000–$3,500 after materials, labor, and direct job costs.

That number looks healthy.

Most roofers stop there.

Net is the number that matters.

Net margin is what you keep after every cost is accounted for. Overhead, insurance, vehicles, office, marketing, your own salary.

Net is where roofing gets brutal.

According to the CFMA 2024 Construction Financial Benchmarker, specialty-trade contractors averaged 6.9% net income before taxes in 2023. Best-in-class shops hit 11.9%. The average shop — running hard, staying busy — netted somewhere between 5% and 8%.

Here is what that looks like on real numbers:

: Revenue

Average Shop
$600,000
Best-in-Class
$600,000

: Gross margin (35%)

Average Shop
$210,000
Best-in-Class
$210,000

: Overhead (28%)

Average Shop
$168,000
Best-in-Class
$138,000

: Net margin

Average Shop
$42,000 (7%)
Best-in-Class
$72,000 (12%)

Same revenue. Same gross. Thirty thousand dollars difference.

Driven entirely by overhead discipline.

That is the number most roofing owners never see. Because they are watching gross and calling it profit.

Gross Margin Is Not Profit. Here Is the Difference.

Gross margin is what you keep after direct job costs. Materials, labor, subcontractors. A job-level number.

Net margin is what you keep after everything else. Trucks, insurance, office, marketing, your salary. A business-level number.

Most roofers watch gross.

The bank account reflects net.

Here is where it gets worse.

A lot of roofing owners are calculating markup when they think they are calculating margin.

Not the same number.

If you add 40% on top of your costs, you have applied a 40% markup. Your gross margin on that job is 28.5%.

Not 40%.

28.5%.

On a $500,000 year of revenue, that gap is $57,500 in gross profit you thought you had but did not.

Before overhead takes its cut.

A typical roofing company carries 20–28% of revenue in overhead. Insurance, vehicles, equipment, office, marketing, owner compensation.

Apply that to a 28.5% gross margin and you are in the red. On a year you thought was profitable. And you did not know it until January.

That is not a cash flow problem.

That is a math problem. And it starts with the difference between markup and margin.

The Five Places Your Margin Goes to Die

Margin does not disappear all at once. It bleeds out across five specific places.

Most roofing owners can name one or two. Few have looked at all five at the same time.

  • Markup math instead of margin math.Every job quoted with a markup instead of a margin target is a job that underperforms. A 40% markup is a 28.5% gross margin. Across a full year that gap compounds into real money — and you cannot recover it after the job is installed.
  • Workers comp class code 5551.Roofing sits in one of the highest-rated workers comp classifications in the country. Rates run from $10 to $29 per $100 of payroll depending on your state. On a $200,000 annual payroll that is $20,000 to $58,000 in premiums alone — before general liability, before vehicle insurance. If your estimates do not have a real insurance number built in, every job is subsidizing it invisibly.
  • Labor drift.A crew that takes three days on a two-day job does not just cost you one extra day of labor. It delays the next job and compresses the schedule. Labor is 30–40% of your job cost. When it runs over, nothing else on the estimate saves you.
  • Material waste and no escalation clause.The industry standard waste factor is 10–15% per job. Ordering extra and not returning unused bundles adds up fast across a busy year. And according to the NRCA, construction input prices are 43.4% higher than February 2020. Quote in March, install in June, no escalation clause — you absorb every price increase in between.
  • Uncollected supplements on insurance work.The average supplement on a residential insurance claim recovers $7,000–$8,000 in legitimate scope the adjuster's first estimate left out. Drip edge, ice-and-water shield, step flashing, code upgrades, ventilation. A shop running 50 insurance jobs a year and not supplementing is leaving $350,000 to $400,000 on work already sold.

What a Roofing Company That Keeps Its Money Actually Looks Like

The difference between a 6% net shop and a 12% net shop is rarely the quality of the work.

It is rarely the market.

It is almost never volume.

It is overhead discipline and pricing accuracy.

Fix those two things and you double your net margin without adding a single job to the schedule.

Here is the target.

Healthy roofing company: 35–40% gross on residential work. Overhead at or below 25% of revenue. That leaves 10–15% net.

That is the range where the business starts to feel like it is actually working.

CFMA benchmarks best-in-class specialty-trade contractors at 11.9% net before taxes. That is the number worth building toward.

Getting there does not require more revenue.

It requires knowing your numbers at the job level.

The shops netting 12% are not closing more jobs than the shops netting 6%. They know what each job actually cost to complete. Not what it was estimated to cost. What it actually cost — materials, labor hours, time on site.

That number goes into every future estimate. Margin improves because pricing improves. Pricing improves because the data exists to support it.

One more thing. Most posts on this topic never say it.

The owner pays himself a real salary.

Not a draw when cash is available. A fixed, market-rate salary built into overhead before the profit number is calculated.

When owner compensation is treated as a variable, the P&L looks better than it is. The owner is subsidizing the business with unpaid labor and calling the difference profit.

A well-run roofing company carries the owner's salary as a fixed cost. And still nets 10–12% on top of it.

If it cannot do that, the pricing is the problem.

One Number to Run Before You Do Anything Else

Before you adjust pricing. Before you review overhead. Before anything else this week —

Pull your last ten jobs.

Three numbers per job. What you estimated the margin would be. What you actually spent on materials and labor. What you netted when the job was done.

Not the invoice total. The net.

If you can pull that in under an hour, your job costing is in decent shape.

If you cannot pull it at all — numbers scattered, no record, nothing you can find fast — that is the problem.

Not your pricing formula.

Not your overhead percentage.

The absence of per-job data is what makes every other margin problem impossible to fix.

You cannot fix what you cannot measure.

In roofing, most owners manage the business from two numbers: the invoice total and the bank balance. Those two numbers tell you almost nothing about where the margin went.

Job costing is not complicated. Three numbers per job, tracked consistently.

What you bid. What you spent. What you kept.

Ten jobs and a pattern emerges. A quarter and that pattern becomes a decision — which job types, which crew configurations, which customers actually produce the margin the business needs.

That is where the 12% shops start.

Not with a price increase. Not with new software.

With knowing what they actually made on the last roof they installed.

Run the numbers.

What is a good profit margin for a roofing company?

A healthy net margin is 10–15%. Best-in-class specialty-trade contractors averaged 11.9% net before taxes per the CFMA 2024 Construction Financial Benchmarker. The industry average sits closer to 5–8%. If your net is consistently below 8%, the issue is almost always overhead that has not been measured against revenue, pricing based on markup rather than margin, or both.

What is the difference between gross and net margin in roofing?

Gross margin is what you keep after direct job costs — materials, labor, and subcontractors. Net margin is what you keep after every business cost is accounted for — insurance, vehicles, office, marketing, and your salary. A job can show 35% gross and produce 7% net once overhead is applied. Most roofing owners track gross. Net is the number that determines whether the business is actually building wealth.

Why do roofing companies with high revenue still struggle with cash flow?

Because revenue and profit are not the same number. A $2M roofing company at 5% net keeps $100,000. The same company at 12% net keeps $240,000. Revenue growth without margin discipline produces more invoices, more payroll, more material costs — and the same thin slice at the end. Cash flow tightens because overhead scales with volume while pricing stays flat.

How do I know if I am underpricing my roofing jobs?

Pull your last ten jobs and calculate what you actually netted on each one — after materials, labor, and a proportional share of monthly overhead. If the number is consistently below 10%, you are underpricing, overspending on job costs, or both. The most common cause: using markup instead of margin when building estimates. A 40% markup produces a 28.5% gross margin, not 40%.

How much should a roofing company spend on overhead?

At or below 25% of revenue for a well-managed roofing operation. That includes insurance, vehicles, equipment, office, marketing, and owner salary. When overhead exceeds 30% of revenue consistently, net margin compresses into the danger zone regardless of how well jobs are priced. Sometimes the fix is cutting costs. Sometimes it is growing revenue until fixed overhead becomes a smaller percentage of the total.

The margin problem is real. But it is also a sequencing problem. Job costing only improves when you have enough consistent volume to build the data. Overhead only gets manageable when the pipeline is full enough to cover it. Pricing only holds when the phone is ringing with real roofing jobs — not when you are chasing the next one. A roofing company scrambling for work cannot afford to walk away from a job that underperforms on margin. A roofing company with consistent inbound can. The math starts with the calls. The calls start with showing up first.

Own Your Market

Ready to Be the Roofer Homeowners Find First?

The Search-to-Booked Roofing System gets you found, called, and booked. Start with the free scorecard or claim your market before a competitor does.

One Roofer Per Market. No long-term contracts.