CNE MediaTalk to us
Case study · Roofing company · Rural Pennsylvania

The Google search campaign that went from a 3.6% to a 12.8% conversion rate.

A one location roofing company with a crew of 6 to 8, almost all its work from referrals. I ran Google search ads and Local Services Ads for him across eight central PA counties. Halfway through I cut down the landing page and changed the copy to highlight what his best customers actually chose him for. Same campaign, same keywords, before and after.

Before the page rebuild
Sep 1 to Oct 31, 2025, the learning period
3.6%
10 conversions from about 277 clicks. Two of the 10 were unqualified metal painting inquiries.
After the page rebuild
Nov 1 to Dec 22, 2025, the main run
12.8%
21 qualified conversions from about 164 clicks. None were unqualified.

Conversion rate here means calls and form fills divided by clicks, from the Google Ads dashboard. Search campaign only, Local Services Ads not included.

Search campaign, Sep 1 to Oct 31, 2025, by week
Google Ads weekly table for the search campaign, Sep 1 to Oct 31, 2025: 5,677 impressions, 277 clicks, $4,633.95 cost, 10 conversions, 3.61% conversion rate.
Search campaign, Nov 1 to Dec 22, 2025, by week
Google Ads weekly table for the search campaign, Nov 1 to Dec 22, 2025: 3,655 impressions, 164 clicks, $3,618.49 cost, 21 conversions, 12.80% conversion rate.
Service areaSearch ads and Local Services Ads both covered his home county plus 7 surrounding counties, 8 in total.
TimelineAbout 120 days in total. September and October were the learning period, November and December the main run, then two pauses.
SeasonNovember and December are the slow season for roofing, so the main run went against the calendar.

How the project ran

Before Sep 1

His own metal roofing ads

He ran Google Ads himself for metal roofing and lost a few hundred dollars on irrelevant clicks.

Sep 1 to Oct 31

Learning phase

I ran the search campaign with the longer landing page. 8 qualified leads, 3.6% conversion rate.

Nov 1 to Dec 22

Main run

Shorter landing page and new headline. 21 qualified leads, 12.8% conversion rate.

After Dec 22

Pauses and end

He paused the ads for about two weeks, restarted, then paused again about three weeks later. The project ended.

Where he started

Before I came in, almost every job at this roofing company came from referrals and local name recognition. He already ranked first in local search in his hometown, but the hometown was small and lower income, so the local demand ran out.

Some weeks the crew of 6 to 8 had nothing scheduled while payroll kept running. He wanted to reach the rest of the surrounding counties.

Before September 1, he had tried Google Ads once, on his own, for metal roofing. It wasted a few hundred dollars on irrelevant clicks, but he still believed ads could work if they were done right.

What was in the way

1

Too few searches. Even after widening from his home county to 8 counties, there were not enough people searching for a roofer for search ads alone to fill his schedule. That is why I added Local Services Ads.

2

A budget too small for the clicks. The search budget was capped at up to $100 a day. At a $22 average cost per click, search averaged about 3 clicks a day.

3

No view of where the money went. His own metal roofing campaign was matching questions like "how" and "what," and he never saw those search terms, so he could not tell why it failed.

What I changed on November 1

This compares two periods of the same Google search campaign for his roofing replacement and repair work. The keywords were identical in both. The only known change was the landing page that ads sent people to, and its headline. Both changed on the same day, so I cannot say which one deserves the credit.

Sep 1 to Oct 31, the learning period

A longer landing page

Headline: "Asphalt Shingle Roofing"
Page: longer, with content that did not match what people had searched.
Keywords: near me searches such as "roof replacement near me," mostly exact match.

Nov 1 to Dec 22, the main run

A shorter page with one path to an estimate

Headline: "The Only Central PA Roofer With The Owner On-Site Every Job"
Page: cut down, mobile friendly, and highlighting the transparent, fully itemized estimate process.
Keywords: the same near me searches, mostly exact match.

Local Services Ads ran alongside the search campaign the whole time, at roughly $60 a day, to cover the volume search could not reach. I did not have per page tracking, so the page and headline are the most likely cause of the jump.

What the ads produced

Spend and leads by channel, from the Google Ads dashboard and the Local Services Ads dashboard. A qualified lead is a genuine call, form fill, or LSA message, judged with the owner each week. Ghost and scam leads were removed.

Channel and period
Ad spend
Qualified leads
Cost per lead
Search ads, Sep 1 to Oct 31before the page rebuild
$4,634
8
$579
Search ads, Nov 1 to Dec 22after the page rebuild
$3,618
21
$172
Local Services Ads, Nov 1 to Dec 22Sep and Oct spend not tracked here
About $3,358
35
About $96

Average search cost per click in Nov and Dec was $22.06. I do not know how many of the 35 LSA leads became jobs.

Estimated, not invoiced

Jobs and revenue from all 29 qualified search leads, Sep 1 to Dec 22

$85K to $90K
About 9 to 10 booked jobs out of 29 qualified search leads: 8 from the learning period and 21 from the main run

On average, their sales reps closed general roofing estimates at a steady 33% from September through December, and about two thirds of those jobs were replacements and one third repairs. I applied that close rate to all 29 qualified search leads and used his average tickets: $13,500 for a replacement and $1,150 for a repair. I did not see invoices, so treat this as an estimate.

What did not go well

First pause

On December 22 the owner asked me to pause the search ads because he could not fund the ad budget. The pause lasted about two weeks, in the slow season.

After the restart

Search brought in just 1 qualified lead in about three weeks. He then paused the ads again, and the project ended. The Local Services Ads kept running at a lower budget.

Short run

The main run was about 52 days. I cannot tell you how the campaign would have looked at month six.

Job numbers

The owner supplied close rate and job tickets. I unfortunately was not given invoice trails.

What I do differently now

This project showed me where a Google Ads project for a roofer breaks. Here is how I set up new projects.

A budget that fits the clicks

The initial daily budget is the average cost per click times 5 clicks a day. That can be held flat for 5 to 6 months, or slowly bumped up as time goes on for scale.

Incentive alignment

I no longer get paid per lead. I typically charge $500 to $1,000 upfront for setup, then suggest a 3% net profit share. That said, the performance fee can be adjusted to fit what works best for the business.

Markets with enough searches

I check search volume in an area before reaching out. This project's rural area showed me how limited a thin market is.

Want to see if your market has the search volume to work?

Talk to us