Roofing: 24% lower cost per booked appointment
One campaign per market, 36 local landing pages and CRM-joined tracking cut paid cost per booked appointment from $458 to $347, while booked appointments rose 65%.
Multi-market roofing and exteriors company · October 2026
These numbers are my clients' revenue and ad spend, and they don't publish them. So the case studies stay anonymous.
On a free consultation call, I'm happy to go deeper: the work, the numbers, and how they'd apply to your business.
The challenge
A residential roofing and exteriors company with offices in four markets. It spent about $77K a month on Google Ads across 23 campaigns, managed by an outside agency.
Nobody could see past the lead. Most homeowners call, but Google Ads only counted form fills. Calls weren't tied to campaigns, and nothing from the CRM came back to the ad account. There was no full-funnel tracking and no return-on-ad-spend reporting. The client's own verdict on the agency was its "inability to dig into attribution."
Budget followed gut feel. With no booked-appointment data, money moved on hunches: in the client's words, "Charleston needs more leads, give them a couple grand more."
The account worked against itself. Five roofing campaigns bid on the same searches in the same cities. Broad match pulled in DIY and supply searches, and bids with no cost cap paid up to $648 for a single click. Every ad sent people to the homepage or a generic service page.
Roofing took 71% of the spend and cost $487 per lead, about four times the rest of the account. One legacy roofing campaign spent $24,935 for 20 form leads. None of them booked.
The strategy
Build tracking from scratch, to the appointment. I put a tracking number on every phone touchpoint and built a daily dashboard joined to the CRM. Every call and form now shows whether it booked, and what the job sold for.
One campaign per market. I rebuilt roofing search into a campaign for each market, with 27 ad groups and about 900 keywords in total. Strict intent filters and shared negative keywords kept out searches from people who were never going to hire a roofer.
A landing page for every market and service. I built 36 landing pages, nine per market. A homeowner in each city lands on a page about roofing in that city.
Cut the waste, shift the budget. I paused the legacy campaign and moved budget toward Local Services Ads in markets where they booked cheaper. I also reported how often the office picked up, because a missed call is the most expensive lead there is.
The results
| Paid leads from | Spend | Booked appointments | Cost per appointment |
|---|---|---|---|
| June | $84,773 | 185 | $458 |
| July | $133,237 | 322 | $414 |
| August | $105,731 | 305 | $347 |
| September | $101,300 | 278 | $364 |
Google Ads and Local Services Ads combined. Appointments are booked in the CRM, matched to each lead.
From June to August, spend rose 25% and booked appointments rose 65%. Two changes drove it. Search ads got cheaper, from $617 to $469 per appointment. More budget went to Local Services Ads, which booked at about $235 each.
The work shows up in revenue too. Paid leads from June to August have produced $1.85M in job revenue on $324K of spend (5.7x). That number is still growing, because roofing jobs often close weeks after the first call.
Want results like this in your business?
Start with a free 30-minute call. Where you are now, where you want to go, and whether I'm the right fit.