Northgate Roofing
A storm-season contractor who was invisible in local search
Quote requests roughly doubled over two storm seasons, with cost per lead down 41% on paid.
- Webflow design
- Webflow development
- Local SEO
- Google Ads guidance
- Analytics
A wireframe of the page structure we built for Northgate Roofing. We draw these rather than publish screenshots, so the case study stays accurate as the client keeps editing their site.
2.1x
Quote requests
Two storm seasons after launch versus the two before
-41%
Cost per lead on paid search
After conversion tracking and account restructure
60
Service-area pages live
Twelve towns across five services, each written separately
9 → 47
Local map pack appearances
Weekly average for target towns, month 6
Lead figures are from Northgate's own CRM. Paid search figures come from their Google Ads account after conversion import; before-launch cost per lead was estimated from spend divided by CRM-attributed jobs.
What was going wrong
Northgate does most of its work in the eight weeks after a hail storm. When a storm hit, their phone rang because of yard signs and word of mouth, and almost never because of search — they did not appear in the local map pack for any of the towns they serve.
The site had one page per service and nothing per town, so there was no page for Google to rank against "roof replacement Aurora" or any of the eleven other places they cover.
They were spending on Google Ads with no conversion tracking at all. Nobody could say which clicks turned into work, so the budget was set by feel.
What we did about it
In the order it happened, including the decisions the client pushed back on.
Build a service-area model in the CMS, not twelve copy-pasted pages
We modeled two collections, services and service areas, and generated the combinations as real pages with distinct content: local storm history, permit notes for that jurisdiction, and jobs completed nearby. Twelve towns and five services, each page different enough to deserve indexing rather than a template with the town name swapped in.
Make the emergency path obvious on a phone
Storm traffic is almost entirely mobile and impatient. The header carries a call button at every screen width, the quote form is four fields and appears above the fold on every service-area page, and photo galleries load lazily so a roof survey does not cost the visitor 4MB on cell data.
Rebuild the Google Ads account around real conversions
We set up GA4 events for call clicks, form submits and the quote flow, imported them as conversions, then restructured the account by service area rather than one catch-all campaign. Negative keyword lists cut out the DIY and jobs-board traffic that was eating a third of the spend.
Tie the Google Business Profile to the right pages
Each service-area page is linked from the matching Business Profile service, with LocalBusiness schema, consistent name-address-phone details, and a review request built into the job-completion email. The map pack appearances followed the pages, not the other way around.
What it was built on
- Webflow CMS with two collections
- Programmatic service-area templates
- Google Ads with GA4 conversion import
- Google Business Profile
- LocalBusiness and Service schema
- Twilio call tracking numbers
We used to sit through a storm hoping the phone rang. Now the forms come in overnight and my crew leads pick them up in the morning. The thing I did not expect was being told to spend less on ads in the quiet months — no agency had ever suggested that to me before.