HVAC case studies
What an audit actually surfaces. Three real ones, walked end to end.
Three anonymized audits from the North Shore corridor. Different problems, different priorities, same audit substrate. Names and specific dollar figures are stripped. Underlying findings, priority order, and recommended fixes are unchanged from the actual audit. Each one shows what the audit surfaced, what the priority order was, and what good would look like.
Names and dollar figures anonymized. Findings, priority order, and outcome math are unchanged from the actual audits.
Tracking · Brand defense · Local pack
Tracking-blind on ~$72k/year of spend. What 60 days of fixes would recover.
HVAC contractor · Peabody, MA · audit run 2026-03
Spending $5-7k/month on Google Ads with zero conversion data. Smart Bidding is optimizing on a coin flip across roughly $72k/year. Lighting up tracking is the difference between an algorithm with signal and an algorithm guessing.
A multi-service HVAC contractor on the North Shore. Active Google Ads spend, real ad impressions across local-pack-style placements. Strong website with promos and service-area pages, GBP claimed. The kind of operation that should be a known quantity in their market. What the account looked like from outside: ads running, calls coming in, leads happening. What the audit found inside: the spend was real but the data telling Google what worked was missing. Smart Bidding optimizing on a coin flip.
What the audit found
No conversion tracking installed
No Google Ads conversion tag, no GA4, no Tag Manager container, no call tracking vendor on the site. Every paid click is being charged for unmeasured.
Missing from the local 3-pack on every captured search
Across the captured service searches in their primary town, the contractor's GBP did not appear in a single local-pack render.
No brand defense against competitor encroachment
Competitors were observed bidding on the contractor's own business name. No defensive ad runs on their own brand searches.
AI Overview cites competitors on every captured service search
Every search where Google rendered an AI Overview pulled from competitor domains, not from this contractor's site. Visibility issue layered on top of the tracking issue.
Compelling on-site offers, none echoed in ads
A double-digit number of specific promos captured on the site. Zero of those promos appear in any active ad copy.
Sparse GBP review base relative to local competitors
Single-digit review count compared to local competitors averaging 100+. Review velocity is slow enough that paid clicks land on a profile that converts well below local benchmarks.
What I would do, in order
- Wire conversion tracking first. Google Ads conversion tag, GA4, GTM, call tracking. Until this is installed, every other recommendation is a guess. Foundation work; usually an afternoon. The capability →
- Run a brand-defense campaign. Tiny budget, tight match-type discipline. Defends against competitor brand-bid encroachment and reclaims own-brand search volume that should never have left. The capability →
- Sync the on-site promos to ad copy. Twelve unused signals on the site. Cheapest CTR work in the playbook. Each promo becomes an ad-copy variant with built-in differentiation. The capability →
- Review-velocity work on the GBP. Slower payoff but compounds. Until the rating moves, the ad account is capped from above on conversion rate.
What good would look like. Tracking lands first. Within 30 days, conversion data starts pricing every campaign and Smart Bidding has real signal to optimize against. The brand-defense and on-site-promo work close inside 60 days. The local-pack and AEO work are longer-arc but visible from day one. The honest version: most of the cost here is on the table because the measurement gap was masking what to fix.
This finding type appears in roughly 60% of HVAC audits I run.
Tracking conflict · Form friction · Call tracking
Tracking installed, tracking lying. The silent killer that makes mature accounts plateau.
HVAC contractor · Peabody, MA · audit run 2026-04
Mature account, real ad spend, tracking visibly installed. Two different conversion accounts firing on the same pages, phone calls invisible, contact form bleeding clicks at the last step. The bidder is making decisions on data that contradicts itself; every dollar after the conflict resolves performs better with no other change.
A residential HVAC contractor with mature ad spend. Tracking IS installed: Google Ads conversion tag, GA4, Tag Manager. Active campaigns, real volume. The kind of account that looks healthy from the outside. The audit found the trap that hides inside this profile. Tracking exists, but it is not what the ad account thinks it is. Two different conversion accounts firing on the same pages. A contact form built like a long-form questionnaire. Phone-call CTAs everywhere with nothing recording the calls.
What the audit found
Two different Google Ads conversion accounts firing on the same site
Two separate AW IDs loading on every page. Conversions counted in both, neither is the source of truth. Bidder optimizing against blended (and probably double-counted) signal.
Phone calls invisible despite active phone-call CTAs
No call tracking vendor detected on the site. Every paid click that becomes a phone call is unmeasured. CTAs everywhere, signal nowhere.
Missing from the local 3-pack on every captured search
Multiple service searches captured; none rendered the contractor's GBP in the local pack.
Competitors bidding on every captured brand search
Every search for the contractor's own name showed competitor ads. No defense.
Contact form has 9 input fields
Service-area lead-capture benchmark is 4 to 5 fields. Friction this heavy on a converting click is leaks happening at the last moment.
AI Overview cites competitors on most captured service searches
Same pattern as the cleanest accounts on the North Shore. Visibility issue layered on top of the tracking issue.
What I would do, in order
- Resolve the dual conversion-tracking conflict. Pick the canonical account. Retire the second tag. Until done, every bidding decision is running on bad signal. This is the silent killer here. The capability →
- Install call tracking immediately. Whichever vendor (CallRail, CallTrackingMetrics, Google forwarding numbers; pick one). Every paid click that becomes a phone call has been invisible. Fix this before anything else creative-side. The capability →
- Trim the contact form. 4 to 5 fields max. Name, phone, service, town. Optional message. The other fields can come later in the conversation. The capability →
- Brand-defense campaign. Same playbook as the first case study. Tiny budget, tight match-type discipline. The capability →
- AEO content discipline. Clean Q&A on the services pages. Structured data marked up to match what's on the page. Local content that's actually local. The capability →
What good would look like. Conversion-data conflict is the silent killer here. Bidding decisions are running on bad signal. Once that resolves, the existing campaigns probably perform better with no other change. The form trim is a one-day win. Call tracking pays back the first week. Everything else is incremental on top of those three.
Roughly 1 in 4 mature HVAC accounts I audit has a tracking-on-paper-but-broken pattern.
Strong site · Weak ad layer · Recoverable in 60 days
Site is doing the work. Ads aren't picking up the slack. The highest-leverage case in this set.
HVAC contractor · Peabody, MA · audit run 2026-04
An operator who's already done the harder work: real services, real promos, real local presence on the site. The ad layer is the bottleneck, not the substrate. Every fix here is connecting layers that already exist independently. Site to ads. On-page content to schema. Service-area claim to campaign coverage.
An established HVAC and plumbing contractor with a real digital footprint. Strong content on the site: a double-digit number of specific service promos captured. A service-area page that names dozens of towns. A real local presence in the trade. The site is doing operator work. The ad layer is not picking up the slack. The audit found a clean visibility gap on top of a missing measurement layer. Different problem flavor from the first two case studies, same audit substrate, different priority order on the fix list.
What the audit found
No conversion tracking despite running ads
Same gap as the first case study, but more visible here because the prospect already invested in the site substrate.
AI Overview cites competitors on most captured service searches
Strong site content, real services covered, but the substrate is not earning answer-engine citations. The capability page on AEO covers the structural gap.
Missing from the local 3-pack on every captured service search
A real local presence by every other measure, invisible in the placement that decides most local-services clicks.
Absent from paid slots across every service-area town the site claims
The site says "we serve these towns." The ads were not running in any of them at the captured times.
Twelve on-site promos, none echoed in any active ad
Site is screaming about real, specific offers. Ad copy is generic.
No brand defense
Same competitor encroachment pattern as the other case studies.
What I would do, in order
- Wire tracking. Same first move as the first two case studies. No bidding decision is honest until the data lands. The capability →
- Mirror the on-site promos into ad copy. Lowest-cost-highest-yield CTR work in the playbook. Each promo on the site becomes an ad-copy variant with built-in differentiation. The capability →
- Schema and on-page Q&A for AEO. This contractor has the substrate to earn AI Overview citations. What's missing is the structural markup and the on-page Q&A pattern that the cited competitors are using. The capability →
- Geographic ad coverage matching the site claim. If the site claims a service area of dozens of towns, the ads should be set up so every one is reachable. Locations, bid modifiers, town-level landing pages where it's worth the build. The capability →
- Brand-defense campaign. Same as the first two case studies. The capability →
What good would look like. This is the highest-leverage case in this set. The substrate is there. Most of the work is connecting layers that already exist independently. Site to ads. On-page content to schema. Service-area claim to campaign coverage. Each piece of work is small. Together they close a gap that has been costing the contractor leads they have already done the harder work to deserve.
Roughly 1 in 3 HVAC audits I run shows this strong-substrate / weak-ad-layer pattern.
Want this run on your account?
Send the domain. The audit will surface findings specific to your account in the same shape and same priority order as these case studies. Free.
Get the audit on your account