Skip to content
Roofing contractorAurora, CO2024

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.

Results
  • 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.

The problem

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.

The approach

What we did about it

In the order it happened, including the decisions the client pushed back on.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

The stack

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.

Marcus ValeOwner, Northgate Roofing
Your project

Every one of these started with a scoping call

Forty-five minutes, no charge, no slide deck. You leave with a fixed price, a page count and a date, whether or not you go ahead with us.

Studio
2500 Larimer Street, Suite 210, Denver, CO 80205

We reply to every inquiry within one business day.