The four financial problems that keep roofing contractors working hard and earning little — and exactly how to diagnose which one is costing you.
Busy but not profitable is the most common financial complaint in the roofing industry — and it's not a business development problem. You don't need more jobs. You need to know which of your current jobs actually make money. The answer to "why aren't we more profitable?" is almost always hiding in your QuickBooks — if it's set up to show you.
There are four specific causes. Most roofing companies have at least two.
Without QuickBooks job costing enabled, every invoice and expense flows into one bucket. You see total revenue and total costs. You cannot see that your residential re-roofs run 42% margin while your commercial jobs run 18% — so you keep bidding and winning commercial work that's dragging down your overall profitability.
This is the most common cause of the busy-but-not-profitable problem. A roofing contractor doing $2M in revenue with no job costing is flying blind on every bid. They win on price, work all year, and wonder why the bank account doesn't reflect the revenue.
Can you run a report in QuickBooks right now that shows gross profit on each individual job completed this month? If not — this is your problem.
Fix: Enable QuickBooks Projects (Settings → Advanced → Projects). Create a Project per job. Assign every invoice and expense to its Project. Run the Project Profitability report monthly. Full setup: QuickBooks job costing for roofers →
Most roofing contractors price jobs by adding a markup to materials and labor. But markup on direct costs is not the same as margin on the business. Overhead — business insurance, vehicle expenses, admin, owner salary, software, marketing — must be covered by the gross margin on every job. If it isn't factored in, you're subsidizing your overhead from what feels like profit.
| Scenario | Job Revenue | Direct Costs | Gross Margin | Overhead (20%) | Net |
|---|---|---|---|---|---|
| 30% markup on costs | $52,000 | $40,000 | 23% | $10,400 | -$1,600 |
| 50% markup on costs | $60,000 | $40,000 | 33% | $12,000 | +$8,000 |
| Target: 35–50% gross margin | $65,000+ | $40,000 | 38%+ | $13,000 | +$12,000+ |
What is your overhead as a percentage of revenue? If you don't know — your pricing is probably not covering it. Use our free job cost calculator to check your margin on recent jobs.
Fix: Total all overhead expenses for the last 12 months and divide by revenue. That's your overhead rate. Your gross margin target must exceed this rate plus your target net profit. Most roofing companies should target 35–50% gross margin to cover 15–25% overhead and leave 10–20% net.
Retainage — the 5–15% held back until job completion — is earned money that never shows up in the bank account if nobody tracks it. A roofing company doing $2M in revenue can easily have $60,000–$120,000 in uncollected retainage that was simply never invoiced after jobs wrapped up.
The business looks busy and revenue looks fine — but a significant chunk of earned cash is sitting in a customer's account because no completion invoice was ever sent. This is a bookkeeping problem, not a collections problem.
Is there a Retainage Receivable line on your QuickBooks balance sheet right now? If not — you are not tracking retainage and almost certainly have uncollected cash. How to fix it →
Cash-basis accounting records revenue when money hits your account. If a $60,000 insurance check clears in October, October looks like a great month — even if the shingles were purchased in September and the crew was paid two weeks ago. Cash basis systematically distorts monthly profitability, making good months look great and bad months look worse than they are. It's impossible to make informed pricing or hiring decisions on distorted data.
Does your P&L spike and crash month-to-month in ways that don't match how busy you actually were? That's cash-basis distortion. The fix is accrual-basis bookkeeping — revenue matched to when work is earned, costs matched to when they're incurred.
When a new client onboards at JobCostBooks, the first 30 days covers a complete QuickBooks diagnostic and rebuild: Projects enabled and configured, chart of accounts restructured for roofing, retainage receivable account created, historical retainage balance identified and entered, and accounting method converted to accrual basis. Most clients discover $40,000–$120,000 in fixable issues in the first month. That's the basis of our $10K guarantee — we've never had to honor it.
Book a free 15-minute QuickBooks screen-share. JobCostBooks will diagnose the exact financial leak in your roofing business — no charge.
Book My Free 15-Min Assessment →$10K profit leak guarantee in 90 days · Plans from $600/mo · hello@jobcostbooks.com