Case Study: How a Charlotte Roofing Company Got 158 Leads on a $3,300/Month Ad Budget

Numbers without context are meaningless, so let me give you the full picture on one of our Charlotte roofing campaigns, what the client came to us with, what we built, what it cost, and what happened.


The Situation

Roofing USA came to us with a Google Ads account that had been running for several months. They were spending around $3,300 per month and felt like they weren’t getting results proportional to the spend, calls were coming in but the quality was inconsistent, the volume wasn’t what they needed, and they couldn’t tell you which keywords or ads were actually working.

When we audited the account, a few things stood out immediately. The campaigns were running broad match keywords, meaning every roofing-adjacent search was potentially triggering their ads. They had no dedicated landing page, so all traffic was going to the homepage. There was no call tracking in place, making it impossible to connect ad spend to actual calls. And geographic targeting was set to “Charlotte metro area” without any radius refinement, pulling in traffic from well outside their service area.


What We Built

We paused all existing campaigns and rebuilt from scratch, creating two primary campaigns: emergency/repair for urgent high-intent searches and replacement for higher-value longer-decision-cycle buyers. Each got its own keyword list, ad copy, and budget allocation. We identified the 40 highest-performing keyword themes from their historical data, moved them to phrase and exact match, and added over 90 negative keywords to block irrelevant traffic, eliminating broad match entirely.

We built two dedicated landing pages, one for emergency roof repair and one for roof replacement. Each had a headline matching the campaign keywords, a large clickable phone number at the top, before/after photos, Charlotte-specific social proof with reviews from local homeowners, and a single CTA with no navigation. We added Google forwarding numbers on both landing pages so every call was attributed to the exact keyword and ad that triggered it. Geographic targeting was tightened to a 20-mile radius of their primary service area with bid adjustments to increase bids in high-value South Charlotte zip codes.


The Results

Over the campaign period: 158 qualified leads at an average cost per conversion of $136, and not just 158 calls, but 158 leads that met their qualification criteria of correct service area, real roofing need, and homeowner rather than renter or commercial inquiry. The $3,300 monthly budget didn’t change. The results changed because the setup changed. Full case study: Roofing USA →


What Made the Difference

If I had to identify the two changes with the highest impact, they are the landing pages and the negative keyword list. Traffic that was previously bouncing off a homepage that said nothing targeted was now landing on a page that spoke directly to what the homeowner searched, and conversion rate on clicks to calls more than doubled. Cutting irrelevant searches out of the campaign through aggressive negative keyword management immediately reduced wasted spend, the budget that had been going to job seekers and DIYers was now being spent on actual homeowners with roofing needs. Everything else was optimization work built on top of those two foundations.


Is This Replicable?

Yes, with qualifications. Every Charlotte market is slightly different, and your service area, your competition, your average job value, and your ability to answer calls and close estimates will all affect your specific results. What we can promise is the same methodical approach: proper setup, dedicated landing pages, tight targeting, call tracking, and ongoing optimization. Learn about our Google Ads management for roofers →



Start your Project

We’ll call you within 24 hours to discuss your goals.