This is a Google Ads result, not a Meta Ads result. Web Pinnacles has published a separate case study on a Southwest US roofer's Meta Ads campaign — different client, different market, different channel. The two shouldn't be read as the same engagement or added together. This page covers one client's Google Ads account, restructured from the ground up over a 90-day window.
The Situation
A roofing contractor in the Southeast US was spending roughly $8,000 a month on Google Ads before working with Web Pinnacles. The account was generating leads, but at a cost per lead of $214, and the owner had no real visibility into which of those leads ever turned into a booked job. Spend was going out the door every month with no way to tell whether the account was actually working or just producing expensive form-fills.
That combination, high CPL and no attribution back to booked jobs, is the most common reason home service contractors give up on Google Ads entirely and assume the channel itself is the problem. It usually isn't. It's the account.
What the Audit Found
Two issues accounted for most of the wasted spend, and both are common enough that they show up in the majority of roofing accounts we audit:
| Finding | What was happening |
|---|---|
| Broad-match keywords, no negative list | Every keyword was running on broad match with no negative keyword list built out, so budget was being spent on searches with no real roofing intent, DIY queries, unrelated home repair terms, and job-seeker searches all pulled clicks away from homeowners actually looking to hire. |
| All traffic to the homepage | Every ad, regardless of the keyword or ad group that triggered it, sent clicks to the general homepage instead of a dedicated landing page. A homeowner who searched "emergency roof repair" landed on a page built for every visitor, not for them, with no message match between what they searched and what they saw. |
| No dedicated high-intent landing page | Because there was no landing page built around specific search intent, there was nothing to test, tighten, or optimize for conversion, the homepage was never designed to convert cold search traffic into a call or form-fill. |
| Leads sitting in an inbox | When a lead did come through, it landed in a shared inbox with no automated follow-up, so response time depended on whoever happened to check email next rather than an instant, consistent trigger. |
None of this is unusual. It's the default state of a Google Ads account nobody has restructured since it was first set up, broad match left broad, negative keywords never built, and every click routed to the same general-purpose page.
What Was Changed
The fix was a full account restructure mapped to the Booked-Job Pipeline™, not a single tactic:
Match types were tightened across the account and a real negative keyword list was built and maintained, cutting off the DIY and unrelated searches that had been eating budget. A dedicated landing page went up for the account's highest-intent search terms, built around message match, a homeowner searching for roof repair now landed on a page written for exactly that, not the general homepage. CRM follow-up automation was layered on top so a new lead triggered an instant response instead of sitting in an inbox until someone got to it.
Each of those three changes maps to a different leak in the funnel: match types and negative keywords fixed the top of the funnel (who sees the ad), the landing page fixed the middle (what happens after the click), and CRM automation fixed the bottom (what happens after the lead comes in). Fixing only one of the three would have left the other two leaking.
The Results, Honestly
Over the 90-day window, cost per lead dropped from $214 to $53, a 75% reduction, at the same roughly $8,000/month ad spend the client was already committing. At the old $214 CPL, that budget would have produced roughly 168 leads over 90 days. At $53, it produced 483 qualified leads, close to three times the volume, because more of the same spend was landing on clicks that actually matched the account's intent rather than being absorbed by broad-match noise.
Want the same audit run against your current Google Ads account? Book a free audit and we'll show you where your account is leaking before you spend another dollar. If you want the full picture of how we approach the channel, see our Google Ads service page, or how we think about the roofing vertical specifically on our roofing marketing page.
In Their Words
"Before this, I genuinely couldn't tell you if Google Ads was working or just burning money every month. $214 a lead with no idea which of those leads ever became a job, that's not a marketing strategy, that's a guess. Now I'm getting close to three times the leads on the same budget, and they actually get called back the moment they come in instead of waiting until someone has time to check email."
This quote is a draft written for the client's review and sign-off, not yet a confirmed testimonial. It will be replaced with the client's actual words once approved.
What We Wouldn't Claim
$53 is not a universal Google Ads CPL benchmark. It's what this account produced once broad match, negative keywords, and message match were fixed, cost per lead varies heavily by market competition and search volume.
90 days is the measurement window, not a guaranteed timeline. Results depend on starting account health, local search competition, and how much historical data the account already had.
This was Google Ads plus CRM, not Meta Ads. If you're comparing this to our Southwest US roofer's Meta Ads case study, treat them as two separate, non-comparable engagements, different client, different channel, different market.
One client, one market, one account. This is evidence of what a properly restructured Google Ads account can do for a roofing contractor, not a universal law of Google Ads CPLs.
Free: The Lead Generation Checklist
The exact audit we run before taking on a new client — see where your site is leaking booked jobs.