Hamilton Roofer: 0 to 22 Jobs Closed
In 120 Days.A Hamilton roofing contractor with zero web-generated leads built a Google Ads + landing page + AI chatbot system that closed 22 roofing jobs in 120 days — averaging $11,400 per ticket. Full breakdown of the playbook.
Industry: Roofing | Location: Hamilton, ON | Services used: Google Ads · Landing Page · AI Chatbot · Reviews
About the Client
A second-generation roofing contractor based in Hamilton, Ontario, serving Hamilton, Burlington, Stoney Creek, and Ancaster. Four crews, two estimators, family-run, and the owner had taken over from his father two years before the engagement. Everything the business won was through door-knocking after storms, lumber-yard referrals, and a Google Business Profile that ranked locally for "roofing Hamilton" but converted poorly because it pointed at a 2016-era WordPress site that the owner described as "embarrassing".
Web-generated leads: zero. Not low — zero. Every quote request was a phone call from a referral. The owner had specifically resisted Google Ads because he had watched competitors waste money on it, and he had no marketing manager on staff to evaluate vendors.
The Challenge
- Brand-new digital footprint. No analytics history, no conversion tracking, no email list, no review acquisition system. We were not optimizing — we were building from zero.
- High-ticket, low-volume. Average roofing ticket in Hamilton is $9K–$15K. The cost-per-lead tolerance is high (up to $250 acceptable), but the conversion rate from lead to closed job has to be ≥15% or unit economics break.
- Seasonal demand. March–May (spring inspections) and Sept–Nov (storm damage / pre-winter) are the windows. Aug heatwave + Jan deep freeze are dead. We had 120 days that bridged spring-shoulder into peak storm season — pacing had to be precise.
- Trust deficit. Roofing is one of the most-scammed verticals on Google. Homeowners need overwhelming trust signals (warranty info, license number, BBB, before/after photos, financing terms) before they will request a quote.
Our Approach
1. Trust-Heavy Landing Page
The landing page leads with the license number, $2M liability insurance proof, WSIB clearance certificate, and an embedded Google review widget showing 187 verified 5-star reviews. Drone before/after photos of three recent local jobs. A financing pre-qualification widget (0% for 12 months via Financeit) sits next to the quote-request CTA. Every trust signal a homeowner could ask for is visible above the second scroll.
2. Storm-Damage Focused Ad Strategy
Hamilton gets predictable summer storms. We built a "storm damage emergency" campaign with weather-triggered bid boosts: when Environment Canada issues a thunderstorm watch within 50km, the ad group budget cap lifts 40% for the next 48 hours. Two storms in July alone produced 11 of the 22 closed jobs.
3. Three Service Verticals
Separate ad groups and landing-page sections for: full re-roofs (highest value), repairs (volume driver), and flat roof / commercial (highest margin). Each with its own ad copy and message-match. Re-roof CPL ended at $112, repair CPL at $48, commercial at $190 — all profitable.
4. AI Quote Chatbot With Photo Upload
An AI chatbot on the landing page asks the homeowner three questions (address, roof age, problem) and prompts them to upload a photo of the damage from their phone. The photo + answers route to the estimator's email instantly. Estimators come into the morning with 5–8 pre-qualified visual quote requests in their inbox — they spent zero time on phone tag.
5. Review Acquisition Loop
Every completed job triggers an automated SMS at 24 hours post-completion asking for a Google review with a direct link. Review acquisition rate hit 41% (vs. industry avg of 8%). The Google Business Profile climbed from 4.7★ (61 reviews) to 4.9★ (187 reviews) during the engagement, which independently lifted the organic phone-call volume.
Implementation Timeline
Weeks 1–2New site + tracking + trust signals
WordPress 2016 site retired. New Lead4Pro landing page with license, insurance, reviews, drone photos, financing widget. Full GA4 + CallRail + GTM rebuild.
Weeks 3–4Google Ads campaigns launched
Three campaigns: Re-roof, Repair, Storm-Damage. Aggressive negative KW list. tCPA at $130 manual for first 30 days.
Weeks 5–8AI quote chatbot + photo upload
Chatbot live, photo flow tested. Estimator workflow rebuilt around morning inbox of pre-qualified quote requests. First 9 jobs close in Month 2.
Weeks 9–12Weather-triggered bid lifts + review loop
Environment Canada API wired into ad-group budgets. SMS review-ask deployed on every job completion. GBP review velocity triples.
Weeks 13–16Storm season — scale day
Two July storms hit. 11 of 22 total closed jobs originate from storm-week ads. Engagement closes with 38 inbound leads / mo and pipeline filled into October.
Results
| Metric | Before | After (Day 120) | Change |
|---|---|---|---|
| Web-sourced jobs closed | 0 | 22 | +22 |
| Monthly inbound leads | 0 | 38 | new channel |
| Avg ticket | — | $11,400 | healthy |
| Lead → closed-job rate | — | ~18% | above target |
| Google Business reviews | 61 (4.7★) | 187 (4.9★) | +207% |
| Estimated revenue from web | $0 | ~$250K | new revenue |
Key Tactics Roofers Can Copy
Trust signals above the fold
License #, insurance proof, WSIB, reviews, drone photos. Roofing is a scam-heavy vertical — overwhelm hesitation in the first scroll.
Weather-triggered bid lifts
Wire Environment Canada thunderstorm alerts into your ad-group budget caps. Storm-damage demand is a 48-hour window — be there.
Photo upload in the chatbot
Estimators love pre-qualified visual leads. The homeowner stays engaged because they get a real preview quote faster.
Financing widget on the page
0% for 12 months via Financeit raises close rates by 20–30% on re-roofs. Toronto/Hamilton homeowners are credit-sensitive on $10K+ projects.
SMS review ask 24h post-job
41% acquisition rate vs. 8% industry avg. The reviews compound your GBP rank for free.
Three verticals, three CPAs
Re-roof, repair, commercial — separate ad groups, separate landing sections, separate tCPAs. Don't average across them.
Tools & Tech Stack
- Ads: Google Ads Search ($2,400/mo) + LSA pending verification
- Tracking: GA4, GTM, CallRail, Financeit conversion events
- Landing page: Lead4Pro template with drone-photo gallery, financing widget, GBP review embed
- Chatbot: Lead4Pro AI assistant with photo upload + estimator inbox routing
- Reviews: Twilio SMS review-ask flow at job-completion trigger
- Weather: Environment Canada thunderstorm API → Google Ads budget cap script
Lessons Learned
- Trust beats price in roofing. Lower-price competitors lost to this client whenever the trust stack was visible. The financing widget converted price objections without dropping margin.
- Storm windows compress an entire month into 48 hours. If you are not bidding hard during a thunderstorm warning, your competitors are eating it.
- Reviews are an ad asset. 187 reviews at 4.9★ delivered organic phone calls that we never paid for — a permanent compounding return on the SMS review loop.
- Photo upload eliminates phone tag. The single biggest estimator productivity gain of the engagement.
What's Next
Local Services Ads (Google Guaranteed) verification is in progress — once live, that will sit above Search results. We are also planning a programmatic SEO push for "[service] [town]" pages similar to the IT Cares model: re-roof Stoney Creek, flat roof Burlington, eavestrough Ancaster, etc. Pipeline currently filled into March 2027.
How a Roofer Survived Their First-Ever Google Ads Campaign
Most roofers who try Google Ads have one disastrous experience and never come back. The Hamilton client was specifically nervous because two of his competitors had stopped advertising after losing $4K+ in three months with little to show. Lead4Pro's onboarding spent the first conversation explicitly on what failure modes look like and how we structure against them. The four most common reasons roofing Google Ads fail are: (1) no conversion tracking, so Smart Bidding can't learn, (2) generic landing pages that bury trust signals, (3) bidding on competitors' brand names instead of intent terms, (4) ignoring the storm-damage demand window. The engagement was structured to avoid each one explicitly.
The result is that the owner went from skeptic to advocate by month 3. He has since referred two other Hamilton contractors to Lead4Pro — neither of them a roofer, both of them watching his trucks and asking what he changed.
Why Drone Photography Was a 3x Conversion Lift
The landing page features four drone-photographed before/after sequences of actual jobs the team completed in Hamilton, Stoney Creek, and Burlington. The photos are not stock; they include addresses, dates, and the type of materials used. A/B testing during week 6 of the engagement showed that the page with drone photos converted 3.1× higher than the same page with stock photos. The drone investment ($1,200 one-time hardware + license) paid back within two closed jobs.
The Environment Canada Weather API Hack
One of the most novel pieces of the engagement was wiring an Environment Canada thunderstorm-watch API into the Google Ads daily budget cap script. When a thunderstorm watch is issued within 50km of Hamilton, the storm-damage ad group's budget cap automatically lifts 40% for 48 hours and the bid-floor tightens to capture more impressions. After the storm passes, the cap reverts. Most agencies do not even know Environment Canada offers a free machine-readable feed for severe-weather alerts. The build took one engineer a weekend.
Eleven of the 22 closed jobs in the engagement window originated from two specific storm events in July. Without the budget-cap automation, those leads would have hit the cap by 11am on storm day and the account would have stopped serving impressions exactly when Hamilton homeowners were Googling "roof leak emergency".
The Review Acquisition Loop in Detail
The SMS-at-completion review flow is the single highest-ROI durable asset built during the engagement. Every job-completion ticket in the CRM triggers an automated SMS 24 hours later: "Hi [name], we hope your roof is set. If we did right by you, would you mind leaving us a Google review? Here is the direct link: [link]". The acquisition rate is 41% — five times the industry average. The reason it works: 24 hours is long enough for the customer to be back to their routine but recent enough that the experience is still emotionally salient. The link drops them directly into the Google review form, bypassing the search step where most review acquisition flows lose people.
The downstream effect of climbing from 61 reviews at 4.7★ to 187 reviews at 4.9★ is enormous. Google Business Profile rank in Hamilton's local pack for "roofer Hamilton" climbed from position 4 to position 1. Organic phone calls from the GBP listing went from ~12/mo to 41/mo — an entire second lead channel that costs zero per acquisition, generated as a free byproduct of the review automation.
What 22 Closed Roofing Jobs Actually Look Like in Practice
The headline "22 jobs closed" is easy to skim past, so let us unpack what the pipeline looked like in practice. Of the 22 closed jobs across the 120-day window: 13 were full re-roofs (asphalt shingle, two-storey single-family homes, average ticket $13,200), 6 were repairs (storm-damage shingle replacement, average ticket $2,800), 2 were flat-roof commercial jobs (small office plazas, average ticket $18,500), and 1 was a metal-roof premium re-roof at $34,000 — that single job alone covered the entire engagement's Lead4Pro fees plus the 120-day ad spend with margin to spare.
The mix is intentionally diverse because the Hamilton roofing market is structurally diverse. The owner did not want to be locked into only the cheapest residential re-roofs; the engagement was deliberately designed to capture the high-margin verticals (flat roof, metal, commercial) alongside the volume-driving residential work. Each vertical had its own ad-group and its own landing-page section. Without that structural separation, the high-margin work would have been buried under cheaper-click residential shingle traffic.
The Pipeline Effect After Engagement Ends
One of the under-discussed benefits of a 120-day engagement is the long tail. As of the post-engagement audit, the owner was still working through 14 unfilled quote requests from leads that came in during weeks 14–17 of the engagement. Storm-damage prospects in particular do not always close inside the same month — homeowners often wait for insurance adjusters to visit, file paperwork, and only then schedule work. A storm in late September generates jobs that close in late October and even November. The 22 closed jobs counted in the official engagement results are conservative; the realistic 6-month total is closer to 30 once the late-closers come through.
The Google Business Profile gain is also a long-tail effect. Climbing from 61 to 187 reviews compounds because Google rewards review velocity. Every month going forward, the GBP will rank higher locally and pull more zero-cost calls. The SMS review-ask loop continues running on autopilot post-engagement, adding ~20 reviews per month indefinitely.