When TMC Roofing first reached out, they were running at a $3M annual pace. A year later they closed at $8M. Same crew. Same market. Same services. The difference was not a better salesman or a lucky storm. The difference was the marketing system we built together in the first 90 days and kept compounding for the next nine months.
This is the full breakdown of what we did, in order, with the actual numbers. If you are a roofing company owner sitting somewhere between $2M and $5M in revenue trying to figure out whether you can break through — this is the playbook.
The Starting Point: What TMC Roofing Looked Like At $3M
TMC Roofing was doing fine. Not struggling. The owner ran a tight crew, did solid work, had good word-of-mouth, and was closing enough retail roof replacements and insurance claims to keep the trucks rolling. The problem was not volume. The problem was where the volume was coming from.
Roughly 70% of their revenue was subcontract work — installing roofs for other contractors who had the jobs sold. Thin margins. Zero brand. Zero control of the pipeline. If the primary contractor had a slow month, TMC had a slow month. If the primary contractor decided to bring work in-house, TMC lost the job.
The remaining 30% was in-house sold work — direct-to-homeowner jobs where TMC owned the relationship, the margin, and the warranty. That 30% made 70% of the profit. But the owner could not scale it because the marketing was functionally dead.
Here is what their marketing looked like on day one:
- A Google Business Profile that had not been updated in 14 months. 42 reviews total, last review six months old.
- A website from 2019 that had not been touched since. No case studies. No before-and-after photos. One contact form that had not been tested in two years.
- Zero paid advertising. No Google Ads. No LSA. No Meta.
- No CRM. Leads got written on sticky notes. The owner carried them in his truck.
- One SEO vendor charging $800/month that had delivered zero traffic growth in 18 months.
The owner's goal was clear: flip the revenue mix. Shift from 70% subcontract / 30% in-house to 70% in-house / 30% subcontract within 12 months. That meant finding an extra $2M to $3M in direct-to-homeowner work without adding crew capacity they did not need.
The First 30 Days: Foundation Before Fireworks
Before I spent a single dollar on paid advertising, I spent three weeks fixing things that were bleeding money every day:
Week 1: Google Business Profile Rebuild
- Claimed and verified all secondary GBPs the owner did not know existed (three duplicates from past crew addresses).
- Rewrote the primary GBP description with local trust signals, service categories, and service area coverage across their real ZIP codes.
- Uploaded 127 photos of past jobs, crew, equipment, and before/afters.
- Set service-area radius to match actual crew capacity.
- Added every service as a distinct GBP service (30+ services), each with its own description.
Week 2: Review Velocity Machine
- Set up a simple SMS-based review request flow through their existing scheduling software. After every completed job, the office manager sent the homeowner a text with a direct Google review link within 24 hours.
- Rewrote the review response policy. Every review — 5 star or not — gets a personalized response within 24 hours.
- In week 2, TMC went from 42 reviews to 58 reviews. In week 4, 74 reviews. The Google algorithm noticed.
Week 3: LSA Approval and Account Setup
- Pulled the general liability and workers comp docs, verified the roofing license, completed the Google Guaranteed background check.
- Approved in 11 days. Account went live mid-week 3.
- Set a cautious $80/day budget to start. Weighted bid toward roof replacement and roof inspection leads.
- Set exclusions for leads outside the service area and for requests that were not roofing (solar, skylights, gutters).
Week 4: Google Ads Infrastructure
- Built four campaigns: Branded, Emergency Repair, Roof Replacement, and Insurance Restoration.
- Created 40+ negative keywords from day one based on 10 years of pattern recognition.
- Wired up call tracking through CallRail so every lead source was attributable to an exact keyword and ad.
- Connected the contact form to a proper CRM instead of the sticky-note system.
Total spent in the first 30 days: $4,200 on the LSA campaign, $1,800 on a minimal Google Ads test, and my agency retainer. Total revenue attributable to marketing activity in Month 1: $48,000 from five insurance restoration jobs that came in through the LSA in weeks 3 and 4.
The owner wanted to spend more. I told him to wait.
Days 31-90: The Six-Pillar Stack Goes Live
By Month 2 the fundamentals were working. LSA was producing 22 qualified leads a week at an average cost per lead of $68. Google Business Profile was showing up in the map pack for three city-level terms. Reviews were compounding — 18 new reviews in Month 2 alone.
This is when we layered the rest of the stack.
Pillar 1: Google Ads scaled to roof replacement intent
Moved Google Ads from $60/day to $180/day. Concentrated spend on "roof replacement [city]", "new roof cost [city]", and "storm damage roof repair [city]". Dropped branded spend (no competitors were bidding). Built dedicated landing pages for roof replacement and insurance restoration instead of routing everything to the homepage.
Pillar 2: Local SEO that actually works
Scrapped the old SEO vendor. Built out a proper service-area SEO structure: a primary city page, then individual pages for each sub-city in the service area (11 cities total), each with localized content, embedded maps, and at least three neighborhood callouts per page. Built the right schema markup on every page. Created a proper internal linking structure from the homepage to service pages to city pages to job examples.
Pillar 3: Content that converted browsers to callers
Added a case studies section with four real past jobs, each with real photos, real before-and-after drone shots, and the actual conversation with the homeowner about what they were worried about before hiring. This was the single biggest website change. Bounce rate on the case studies page was 34%. On the homepage it was 68%.
Pillar 4: Insurance restoration expertise page
A dedicated page walking through how TMC handled insurance adjusters, supplementing, and the homeowner's out-of-pocket. This page became the top-converting page on the site within 60 days. Every insurance job they closed from month 3 forward cited that page as what convinced the homeowner to call.
Pillar 5: Review management on autopilot
The review velocity machine kept running. By end of Month 3 the GBP had 98 reviews at a 4.9 average. Google's local algorithm moved TMC from position 6 in the map pack to position 2 for their primary city.
Pillar 6: 24/7 answer system
Set up an after-hours call answering service that captured every call with a live human, took basic information, and texted the owner within 5 minutes. The owner had been missing an estimated 3-4 calls a week that went to voicemail and never called back. That one change produced 12 additional jobs over the next six months — about $180K in revenue from calls that used to die.
Total marketing spend for Month 2 and Month 3 combined: $31,400. Total attributable revenue: $612,000 from 18 signed in-house jobs.
Days 91-365: Compounding
By Month 4 the system was humming. The owner's job shifted from chasing leads to qualifying them. He had more inbound than he could close and had to start turning down jobs that did not fit the crew's schedule or the margin targets.
Here is what the next nine months looked like by the numbers, pulled from CallRail, Google Ads, GBP analytics, and the new CRM:
Google LSA (Month 4 onward)
- Increased budget from $80/day to $220/day by Month 6
- Average cost per lead held at $62-$78 across the rest of the year
- 314 LSA leads total across Months 4-12
- 23% conversion rate from lead to signed job
- 72 signed LSA jobs over nine months, averaging $14,200 per job
- LSA revenue contribution Months 4-12: approximately $1,022,400
Google Ads
- Scaled from $180/day to $410/day by Month 8
- Roof Replacement campaign became the single highest-ROAS channel in the account
- 196 Google Ads leads across Months 4-12
- 27% conversion rate to signed job
- 53 signed jobs averaging $18,700 per job
- Google Ads revenue contribution Months 4-12: approximately $991,100
Organic and GBP
- Organic traffic 3.2x'd between Month 1 and Month 12
- GBP calls went from 14/month to 87/month
- 61 signed jobs directly attributable to GBP and organic search
- Revenue contribution: approximately $854,000
After-hours answering service
- 28 additional signed jobs captured from calls that previously went to voicemail
- Revenue contribution: approximately $392,000
The full-year number
Add up the attributable channels and you are at roughly $3.2M in direct-to-homeowner revenue through the marketing stack. Layer in the existing base of referral and repeat-customer revenue (about $2.4M) plus the remaining subcontract work the owner still kept (about $2.4M, down from the original $2.1M subcontract base because he was choosier), and you get the $8M total.
The revenue mix flipped: 74% in-house sold work by end of Year 1, up from 30% at start. That was the real win. More revenue, yes. But more importantly, better revenue — margins on in-house work ran 2.4x higher than subcontract work.
What We Would Do Differently If We Started Today
Two things.
First, we would build the after-hours answering service in Week 1, not Month 3. Every week we ran without it, TMC lost two to three qualified calls. Twelve weeks of that meant 24-36 lost jobs. I was too focused on the paid layer in the first 30 days and should have closed that leak first.
Second, we would build the case studies page in Month 1, not Month 2. The single biggest jump in close rate came from adding real photos and real homeowner conversations to the website. Before that, TMC competed on price with every other roofer in the market. After the case studies page, they stopped competing on price. The homeowners who landed on that page and read three case studies were four times more likely to book an inspection than homeowners who landed on the homepage.
The Stack Is Portable
The six-pillar system we built at TMC Roofing is not a California thing. It is not a specific-metro thing. It is a roofing company thing. We are running the same stack right now for roofing companies across DFW, Houston, Austin, and San Antonio, tuned for the storm-driven Texas insurance market instead of the retail-heavy California market. The mechanics are the same:
1. Fix the GBP and get the review velocity going 2. Launch LSA with tight category and geographic controls 3. Layer Google Ads on top, focused on replacement and insurance intent 4. Build real service-area SEO, not keyword-stuffed doorway pages 5. Add case studies, insurance expertise content, and answer the phone 6. Measure, attribute, and compound
If you are running a roofing company between $2M and $5M right now and you feel like your marketing is leaking, score your business against this system. It takes 5 minutes and shows you exactly where the gaps are before your next quarterly planning cycle.
The $8M playbook is public. The only thing between you and the next run is execution.