Most roofing contractors using QuickBooks Online are losing money they don't know exists. Not because business is bad — because their books are set up for a generic small business, not a roofing company. After reviewing dozens of roofing QuickBooks files at JobCostBooks, the same five mistakes appear almost every time. Each one hides profit, creates tax surprises, or lets uncollected cash slip through the cracks.
Here are the five mistakes, what they cost, and exactly how to fix them.
Mistake #1: QuickBooks Projects Is Turned Off — So You Have Zero Job Costing
The single most expensive QuickBooks mistake for roofing contractors is not activating the Projects feature. Without Projects enabled, QuickBooks has no way to group expenses and income by individual job — meaning every invoice, every subcontractor payment, and every material purchase flows into one undifferentiated pile. You can see total revenue and total expenses. You cannot see which jobs made money and which did not.
QuickBooks Online Plus and Advanced both include Projects at no extra charge. It is simply turned off by default. To enable it: go to Settings → Account and Settings → Advanced → Projects → turn on. Then, for every active job, create a Project and assign every invoice, bill, and expense to it.
The fix
- Enable Projects in Settings → Advanced → Projects
- Create one Project per job (use the address or job name as the project name)
- Assign all future bills, expenses, and invoices to the relevant Project
- Run the Project Profitability report monthly — it shows revenue, costs, and gross margin per job
If you have active jobs with historical transactions already entered, a roofing bookkeeper can retroactively assign them to Projects during a QuickBooks cleanup. At JobCostBooks, this is included in the onboarding for every new client.
Mistake #2: Using a Generic Chart of Accounts Not Built for Roofing
QuickBooks' default chart of accounts is designed for a generic retail or service business. It has no categories for roofing materials by type, no distinction between labor and subcontractor costs, and no accounts for retainage receivable or retainage payable. Using the default means your P&L looks clean but tells you almost nothing useful about your roofing business.
A roofing-specific chart of accounts separates the cost categories that actually matter for your margins:
| Default QBO Account | What It Should Be (Roofing) | Why It Matters |
|---|---|---|
| Cost of Goods Sold | Materials — Shingles, Underlayment, Flashing (separate accounts) | Track material cost as % of each job |
| Contractor Expense | Subcontractor Labor (taxed differently — 1099 required) | Separate from W-2 labor for tax compliance |
| Accounts Receivable | AR + Retainage Receivable (separate) | Retainage due is not regular AR — it has a different collection timeline |
| n/a | Retainage Payable (if you hold retainage on subs) | You owe this to your subs — it's a liability, not revenue |
| Equipment Expense | Equipment Rental + Equipment Depreciation (separate) | Rental is COGS; depreciation is an operating expense — different tax treatment |
Mistake #3: Retainage Is Not Tracked in QuickBooks at All
Retainage — the 5–15% of contract value held back by the property owner or GC until project completion — is one of the most mishandled items in roofing company books. Most contractors invoice for 90% of the job, collect it, and forget the remaining 10% exists in their QuickBooks. It's not in AR, not tracked anywhere, and eventually never collected.
Retainage is money you have earned but not yet been paid. It is a receivable — an asset — and it must be tracked separately from regular AR because it has a different collection date (typically 30–90 days after job completion and final inspection).
How to track retainage correctly in QuickBooks Online
- Create a Retainage Receivable account (type: Other Current Asset)
- When you invoice a job, enter the full contract amount, then add a retainage line item as a negative amount to reflect what's being held
- The invoice total shows what you're billing now; retainage receivable shows what's held
- When the job completes and retainage is released, invoice for the retainage balance and apply it against the Retainage Receivable account
- Run an Accounts Receivable Aging report monthly — retainage balances older than 90 days should be followed up immediately
For a detailed walkthrough, read our guide on retainage tracking in QuickBooks Online for roofing contractors.
Mistake #4: Personal Expenses Run Through the Business Account
This one is extremely common with owner-operators and creates two separate problems. First, it inflates your cost of goods sold or operating expenses with personal costs, making your P&L useless for measuring actual business performance. Second, it creates a tax compliance risk — personal expenses run through a business account are either non-deductible (and must be removed) or they trigger IRS scrutiny if claimed as business deductions incorrectly.
Common personal-through-business expenses we see in roofing company QuickBooks:
- Personal vehicle expenses mixed with work truck expenses
- Home mortgage or rent booked as "office expense"
- Restaurant and entertainment coded as "client meals" without documentation
- Personal insurance premiums in business expenses
- Owner draws coded as payroll or subcontractor payments
Mistake #5: Books Are Never Reconciled — So the Numbers Are Wrong
Bank reconciliation is the process of matching every transaction in QuickBooks against your actual bank and credit card statements. If it's not done monthly, duplicate transactions accumulate, missing transactions go unnoticed, and your QuickBooks balance drifts away from reality. By the time you look at your P&L, the numbers are fiction.
Most roofing contractors doing their own books reconcile quarterly at best — often only when their CPA asks for it at tax time. At that point, fixing 9–12 months of errors is a major project.
| Reconciliation Frequency | Error Risk | Time to Fix at Year-End |
|---|---|---|
| Monthly | Low — caught immediately | 1–2 hours |
| Quarterly | Medium — 3 months of errors compound | 4–8 hours |
| Annually (at tax time) | High — 12 months of drift | 20–40 hours (often requires a bookkeeper) |
| Never | Critical — books are unreliable | Full QuickBooks cleanup: $1,500–$3,000 |
The 5 Mistakes — Quick Reference
| # | Mistake | Cost | Fix |
|---|---|---|---|
| 1 | Projects (job costing) not enabled | Invisible loss on every job | Enable in Settings → Advanced |
| 2 | Generic chart of accounts | Useless P&L, wrong tax treatment | Add roofing-specific accounts |
| 3 | Retainage not tracked | $40K–$120K uncollected cash | Create Retainage Receivable account |
| 4 | Personal expenses in business books | Inflated costs, tax risk | Code to Owner's Draw equity account |
| 5 | No monthly reconciliation | Unreliable numbers, expensive cleanups | Reconcile all accounts monthly |
What Should You Do Next?
Run a Profit & Loss by Customer/Project report in QuickBooks right now. If you can't run it, or if all jobs show the same margin, Mistake #1 is already costing you. If retainage doesn't appear as a separate receivable on your balance sheet, Mistake #3 has likely already cost you tens of thousands of dollars.
JobCostBooks offers a free 15-minute QuickBooks screen-share for roofing contractors. We'll open your file, spot the exact mistakes present, and tell you what they're costing you — no obligation. If we don't find at least $10,000 in fixable profit leaks in your first 90 days as a client, your first month is free.