HVACPPCAI SEO

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

HVAC technician servicing a condenser unit outside a home

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.

Live site audit · September 1, 2026

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.

Every statement above was confirmed against allseasonshvac.com on September 1, 2026. Sites change; this is a dated observation, not a permanent claim.

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.

What made this one different

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

PPC playbook

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.

AI SEO playbook

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

PPC timeline

  1. Days 0–14

    Audit, conversion tracking rebuilt, negative keyword purge, campaign restructure by intent and line.

  2. Days 15–45

    Landing pages shipped, Local Services Ads or quote path live, call tracking and missed-call recovery in place.

  3. Days 46–90

    Budget reallocated on booked-job data rather than lead data; bid strategy set against seasonality.

AI SEO timeline

  1. Days 0–30

    Citation baseline across four assistants, GBP rebuild, page architecture and entity cleanup.

  2. Days 31–90

    Service × city page grid shipped, review engine live, first off-site mention wave.

  3. Days 91–180

    Mention velocity sustained, citation rate compounds, freshness cycle running on service and city pages.

The numbers

Targets this programme was set and measured against

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.

MetricBaselineTargetChangeScope
Non-branded cost per lead$191$149-22%USD, non-branded paid search
Lead-to-booked-job rate35.3%43.1%+8 ptspercentage of leads and calls converted
Cost per booked job$540$345-36%USD per acquired customer
AI assistant mention rate10%29%+19 ptsshare of a fixed 40-prompt non-branded set naming the business, across 4 assistants

Where these targets come from

Published figureWhat it measuresSource
$149HVAC 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)
$51HVAC Local Services Ads cost per lead (888 contractors, 126,650 leads)Booked Friday / SearchLight (2026)
$1,127/moAverage 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 promptsMaxAEO (vendor benchmark) (2026)
93%Share of local-intent queries still returning a Local Pack; only ~15% trigger an AI OverviewWhitespark (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.

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
CallWhatsAppBook
Chat with us