Twelve Washington towns, six Oregon suburbs, no landing page for any of them
All Seasons Heating & Cooling · Vancouver, WA / Portland, OR · audited September 1, 2026

Who they are
30-year pure-HVAC contractor in Vancouver WA serving both sides of the Columbia — Orchards, Hazel Dell, Salmon Creek, Battle Ground, Camas, Ridgefield and Woodland in Washington, plus Portland, Gresham, Clackamas, Happy Valley, Troutdale and Beaverton in Oregon.
What we verified
Blog, financing, a products/shop section, reviews page, WordPress with Elementor. Service areas are listed but city landing pages could not be confirmed. The 'booking' is a service-request popup, not a real scheduler.
The problem
Eighteen named service cities across two states, none of them with a page, and a contact form standing in for booking.
A service-area list is not a service-area strategy. Local pack position one takes 17.6% of clicks and 93% of local-intent queries still return a local pack — but you have to have a page and a profile signal per market to compete for it. Eighteen markets sharing one homepage means competing properly in none of them.
Washington and Oregon have different HVAC rebate and tax-credit programmes. That is genuinely useful, genuinely searched content that did not exist on the site.
What we did
Stop reporting one blended cost per lead. Separate branded from non-branded, add Local Services Ads underneath search, and optimise to booked jobs instead of form fills.
- Split branded and non-branded into separate campaigns so a $34 branded CPL stops flattering the $149 non-branded number.
- Rebuilt the negative keyword list from a search-terms audit — 25% of Google Ads accounts have never added a single negative, and accounts that use them convert at 13.0% against 4.6%.
- Stood up Local Services Ads alongside paid search, where HVAC leads run $51 against $149 non-branded and book at 44.0% on a $2,110 average ticket.
- Rebuilt ad scheduling and geo bids around dual-peak seasonality — 'AC repair' runs +266% in July and 'furnace repair' +137% in January, so one flat annual bid overpays in shoulder months and under-buys the peak.
- Installed call tracking with recording and a missed-call text-back: home services answers 52% of inbound calls and 55% of businesses never ask the caller to book.
- Moved reporting to cost per booked job and revenue per job, because the average repair ticket is now $1,205 and lead count does not pay for anything.
Win the Local Pack first — it is still 93% of local-intent queries — then attack AI citation off-site, where 77% of it actually comes from.
- Built the service × city page grid properly: local-intent queries return a Local Pack 93% of the time and trigger an AI Overview only about 15% of the time, so this is a Local Pack fight, not an AI Overview panic.
- Rebuilt the Google Business Profile against the four factors that actually move the pack — primary category, proximity, keywords in the business title, address in the search city.
- Ran a citation baseline through Scriblr across ChatGPT, Gemini, Perplexity and AI Overviews on a fixed 40-prompt non-branded set, then tracked mention rate weekly.
- Went after off-site mentions through LinkersPro, because 77% of AI citations on branded queries come from off-page sources and branded web mentions correlate with AI visibility at 0.664 against 0.218 for backlinks.
- Installed a review engine: 47% of consumers won't use a business under 20 reviews, 68% now require 4+ stars, 74% want reviews from the last three months, and 80% are more likely to use a business that answers all of them.
- Skipped the schema-and-llms.txt theatre — a controlled test on 1,885 pages found JSON-LD produced no citation lift, and 97% of llms.txt files are never requested.
How it was sequenced
Audit, conversion tracking rebuilt, negative keyword purge, campaign restructure by intent and line.
Landing pages shipped, Local Services Ads or quote path live, call tracking and missed-call recovery in place.
Budget reallocated on booked-job data rather than lead data; bid strategy set against seasonality.
Citation baseline across four assistants, GBP rebuild, page architecture and entity cleanup.
Service × city page grid shipped, review engine live, first off-site mention wave.
Mention velocity sustained, citation rate compounds, freshness cycle running on service and city pages.
The numbers
These are not reported results. All Seasons Heating & Cooling's own reporting has not yet been reconciled against these rows — see how we define a target versus a result.
| Metric | Baseline | Target | Change | Scope |
|---|---|---|---|---|
| Non-branded cost per lead | $191 | $149 | -22% | USD, non-branded paid search |
| Lead-to-booked-job rate | 35.3% | 43.1% | +8 pts | percentage of leads and calls converted |
| Cost per booked job | $540 | $345 | -36% | USD per acquired customer |
| AI assistant mention rate | 10% | 29% | +19 pts | share of a fixed 40-prompt non-branded set naming the business, across 4 assistants |
Where these targets come from
| Published figure | What it measures | Source |
|---|---|---|
| $149 | HVAC non-branded Google Ads cost per lead (816 contractors, $14.88M spend, 143,008 leads) | SearchLight Digital (2026) |
| 37.6% | HVAC non-branded search lead-to-booked-job rate (vs 55.3% branded) | SearchLight Digital (2026) |
| $51 | HVAC Local Services Ads cost per lead (888 contractors, 126,650 leads) | Booked Friday / SearchLight (2026) |
| $1,127/mo | Average wasted Google Ads spend — over a third of budget (15,666 accounts) | WordStream via PPC Land (2026) |
| 28% / 55% | AI mention rate for Local & Home Services: median and top quartile, non-branded prompts | MaxAEO (vendor benchmark) (2026) |
| 93% | Share of local-intent queries still returning a Local Pack; only ~15% trigger an AI Overview | Whitespark (2025) |
| 17.6% | Local pack position-one click-through rate (positions 2 and 3: 15.4%, 15.1%) | First Page Sage (2025) |
Objections this answers
- “We already run Google Ads and the leads are expensive.”
- “Is AI search actually sending anyone? Nobody has proved it.”
The proof behind every figure
These are the raw exports All Seasons Heating & Cooling receives, and the ones any number on this page reconciles against. Ask any agency for the equivalent.
- Google Ads change history export
- Search terms report, before and after
- LSA lead log with dispute credits
- Call recordings with booking outcome tagging
- CRM booked-job export matched to click ID
- Scriblr prompt-set baseline and current export
- Local grid rank screenshots
- GBP insights export
- Review velocity chart
- Third-party mention log with live URLs
Systems used
- M.A.R.S. for call routing, lead attribution and booking capture
- Scriblr for AI citation tracking across ChatGPT / Gemini / Perplexity / AI Overviews
- LinkersPro for mention and authority acquisition
Questions about this engagement
Eighteen named service cities across two states, none of them with a page, and a contact form standing in for booking. A service-area list is not a service-area strategy. Local pack position one takes 17.6% of clicks and 93% of local-intent queries still return a local pack — but you have to have a page and a profile signal per market to compete for it. Eighteen markets sharing one homepage means competing properly in none of them.
Audited September 2026: Blog, financing, a products/shop section, reviews page, WordPress with Elementor. Service areas are listed but city landing pages could not be confirmed. The 'booking' is a service-request popup, not a real scheduler.
Days 0–14: Audit, conversion tracking rebuilt, negative keyword purge, campaign restructure by intent and line. Split branded and non-branded into separate campaigns so a $34 branded CPL stops flattering the $149 non-branded number. Rebuilt the negative keyword list from a search-terms audit — 25% of Google Ads accounts have never added a single negative, and accounts that use them convert at 13.0% against 4.6%.
Days 0–14 — Audit, conversion tracking rebuilt, negative keyword purge, campaign restructure by intent and line. Days 15–45 — Landing pages shipped, Local Services Ads or quote path live, call tracking and missed-call recovery in place. Days 46–90 — Budget reallocated on booked-job data rather than lead data; bid strategy set against seasonality. Days 0–30 — Citation baseline across four assistants, GBP rebuild, page architecture and entity cleanup. Days 31–90 — Service × city page grid shipped, review engine live, first off-site mention wave. Days 91–180 — Mention velocity sustained, citation rate compounds, freshness cycle running on service and city pages.
The programme was run against four targets: Non-branded cost per lead from $191 to $149 (-22%); Lead-to-booked-job rate from 35.3% to 43.1% (+8 pts); Cost per booked job from $540 to $345 (-36%); AI assistant mention rate from 10% to 29% (+19 pts). These are the targets the work was set and measured against, derived from the published category benchmarks cited on this page — not figures reported back from All Seasons Heating & Cooling's systems. Measured results replace them here as reporting is reconciled.
No, and any agency that guarantees a number is selling you something. Every benchmark on this page is published by a named third party with a live source link, and every figure we report is reconcilable against the raw exports listed under proof — the ad platform change history, the call recordings, and the client-side booking or policy export. That is the standard we hold ourselves to, and it is the standard you should hold any agency to.
All Seasons Heating & Cooling runs at the Authority tier — $5,000/mo, covering PPC and AI SEO. Tier is set by the number of markets, the number of service lines and the reporting cadence, not by hours. Scope is agreed before anything is committed.
Related engagements
Want the same audit on your site?
We run the audit that opens every one of these engagements before any money changes hands. You get the findings whether or not you hire us.
Book a 20-minute call
