Case Study · HVAC · Phoenix, AZ

"Meta Doesn't Work for HVAC." — $487K Later, It Does.

An 18-truck residential HVAC company in Phoenix had spent four years convinced Meta ads were a waste for their industry. They'd tried it twice with two different agencies. Both flamed out inside 90 days. When they called me, their pitch was "prove us wrong or we're done with it forever." 12 months later: $487K in attributable replacement revenue, 312 maintenance agreements sold, and $18K/month in recurring MRR they didn't have before.

Vertical: Residential HVAC (Repair, Replacement, Maintenance Agreements) Location: Phoenix Metro, AZ Budget: $6,000/mo → $14,000/mo Timeframe: 12 months
$487k
Attributable revenue (12mo)
$18k/mo
New recurring MRR
5.2×
Blended ROAS on Meta
62
Full systems replaced

The Call That Started It

The co-owner — I'll call him Mike — left me a 4-minute voicemail. Paraphrased: "We do $6.8M a year, 18 trucks, mostly residential replacement work. Google LSAs and Angi feed us the emergency calls. We've tried Meta twice with two agencies. Both said the same things, both spent $20K+, neither moved the needle. I'm ready to be convinced it's a dead channel for us — but my business partner keeps sending me screenshots of competitors running Reels. So. Convince me or shut the door."

My first question when I called back: "What does your average replacement customer look like 18 months before they bought? Do you have any idea what they were doing, thinking about, or researching?"

Mike went quiet. Then said: "Honestly? I have no clue." That was the whole audit in one sentence. The reason Meta hadn't worked for them wasn't that Meta doesn't work for HVAC. It's that they — and both prior agencies — were using Meta like it was Google: trying to catch demand at the moment of intent. Meta isn't a demand-capture channel. It's a demand-creation channel. And for an 8-to-15-year purchase cycle like an HVAC system, that distinction is the whole ballgame.

The Audit: What Both Previous Agencies Got Wrong

Before we talked strategy I got read-only access to both prior ad accounts and a de-identified ServiceTitan export of their last 36 months of job history. Within 72 hours I had the full picture.

What the previous agencies were running (and why it couldn't have worked)

  • Agency #1: Lead-form campaigns optimizing for "Book a free AC repair estimate." Ran May–August. Got 180 leads at $42 CPL. 14% booked, 4% closed. Payback on a $179 service call was ~12 months after overhead. Agency quit after their retainer was pulled.
  • Agency #2: Exact same objective, slightly different creative (stock footage of thermostats). Ran same 4-month window. Same result: 210 leads, $39 CPL, 12% book rate. Shut down in September.
  • What both agencies missed: In the ServiceTitan data, the average customer who bought a full system replacement — the $8K–$15K jobs that actually move a business — had first become a customer 14.3 months earlier, usually through a small repair or tune-up. Meta wasn't failing. The agencies were measuring the wrong window.

The customer-journey analysis that changed the strategy

I pulled the last 36 months of jobs and sorted every customer by first-touch-to-replacement lag. Here's what the data said:

That was the unlock. Meta wasn't going to out-Google Google on the 6% of cold buyers. But it was perfect for the other 94% — the patient flywheel of turning $89 tune-ups into $29/mo maintenance agreements into $11K replacements 14 months later. Nobody in their market was running that play on Meta.

The reframe that made the business case

"Your problem isn't that Meta doesn't work. Your problem is that you've been paying Meta to compete with Google for emergency calls, when what Meta is actually good at is filling the top of a 14-month flywheel that Google can't even see. We're going to stop measuring this channel in leads. We're going to measure it in maintenance agreements and LTV."

The 3-Funnel System We Built

Funnel A — Pre-Season Tune-Up Loss-Leader (top of the flywheel)

Before$179 service call offer, summer-only, optimized for form-fill
After"$89 Pre-Season AC Tune-Up + Free Filter" — runs Mar–May and Sep–Oct, optimized for booked-and-paid

Funnel B — "Is Your System Over 10 Years Old?" Replacement Nurture

BeforeNo nurture. Zero attempt to catch the 14-month consideration window.
AfterEducational Reels + retargeting existing customer list → free in-home replacement estimate + financing check

Funnel C — Maintenance-Agreement Upsell to Tune-Up Customers

BeforeTechs were supposed to pitch the $29/mo plan in-home. Close rate: 11%.
AfterCustom Audience of every tune-up customer → 14-day nurture sequence explaining the math → in-home tech close rate rose to 48%

Funnel A: The Pre-Season Tune-Up Engine

We dropped the summer-emergency posture entirely. Ran tune-up offers only in the "shoulder seasons" — March through May, and September through October — when the mercury is climbing (or falling) but most people haven't needed their AC yet. That's the window where a $89 tune-up feels like preventive peace of mind, not a gouge.

Critical operational move: offers were pre-paid. $89 charged at booking, not at the service call. This single change lifted show rate from 58% to 91% and filtered out tire-kickers. Same playbook we ran on the dental case — deposits work everywhere.

Funnel B: The Replacement Nurture (where the big revenue came from)

We built a Custom Audience from two sources: (1) every customer in ServiceTitan whose installed system was 10+ years old (equipment age was a field we had access to), and (2) everyone who'd engaged with Funnel A's ads but hadn't booked. Combined: ~4,400 households.

By month 4, Funnel B was producing 8–12 booked in-home estimates per week at a $94 cost-per-booked-estimate. Close rate on those estimates: 41%. Average replacement ticket: $9,200.

Funnel C: The MRR Machine

This was the quiet win that nobody else in Phoenix was running. Every customer who went through Funnel A (tune-up) got uploaded as a Custom Audience within 48 hours. For the next 14 days they saw a 3-ad rotation explaining the maintenance agreement — not from a salesperson, from Mike, on camera, doing napkin math: "$29 a month. Covers two tune-ups, 15% off any repair, priority dispatch in July. One saved repair pays for two years of the plan."

The tech would show up at the next tune-up to find the homeowner already pre-sold. Tech close rate went from 11% to 48%. At $29/mo × avg 23-month retention = $667 LTV per agreement, on top of the original $89 tune-up. By month 12, the team had sold 312 agreements through this funnel. $18,048/mo in recurring revenue that compounds.

Month-by-Month: What Happened

Months 1–2: Foundation + Shoulder-Season Launch

Months 3–5: The First Real Money

Months 6–8: Scaling the Replacement Funnel

What we adjustedImpact
Expanded Custom Audience to include systems 8+ years old (was 10+)Audience grew from 4.4K to 7.1K. CPL on Funnel B rose slightly ($87 → $104) but booked-estimate volume grew 54%.
Added a "Full System Replacement Financing Guide" lead magnetCaptured 340 emails of people not yet ready. 38 of those booked an estimate within 120 days. Still converting as of this writing.
Launched a second testimonial Reel (different demographic — 60-year-old retiree in Sun City)Unlocked an entirely new audience segment. 22% of Q3 replacements came from Sun City / Peoria / Surprise.
Started SMS follow-up on missed in-home estimates (Mon/Wed/Fri cadence over 9 days)Recovered 17% of no-show and no-close estimates into booked work.

Months 9–12: Compounding

By month 9 the maintenance-agreement base had crossed 220 customers. Two things happened at once: (1) Funnel C became self-funding — the recurring MRR more than covered the cost of Funnel A, meaning tune-ups became free to acquire, and (2) the first cohort of agreement customers started needing replacements, closing at 4× the rate of cold traffic because they already had a relationship. Month 12 close: 62 replacements closed, $487K in attributable Meta revenue, 312 active agreements producing $18,048/mo recurring.

Before vs After: The Numbers

MetricBefore (both prior agencies, averaged)After (month 12)Change
Monthly Meta ad spend$6,000$14,000+133%
Optimization eventForm submit ("get estimate")Booked-and-paid job (via CAPI + ServiceTitan)
Primary offer$179 service call, summer-only3 seasonal funnels (tune-up / replace / agreement)
Booked-and-paid tune-ups per month (peak)~18~1407.8× higher
Replacement estimates per month~0 from Meta (all from Google LSAs)~36new channel
Maintenance agreements sold / month~12 (in-home tech pitch only)~34 (tech pitch + Meta nurture)2.8× higher
Show rate on tune-up appointments58%91%+57%
Blended Meta ROAS (incl. recurring LTV)0.7×5.2×7.4× higher
Recurring MRR from new agreements~$5,200/mo$18,048/mo+247%
Event match quality (Meta signal health)3.8 / 108.4 / 10+121%
"Every other agency treated Meta like it was just another version of Google. Hossein treated it like it was a tool for a completely different job — filling the top of the flywheel, not catching the bottom. Twelve months later my recurring revenue is up $13K a month and I finally understand why my partner kept sending me those damn Reels screenshots. He was right. The first two agencies just didn't know how to use the channel." — Mike, co-owner, Phoenix HVAC company (18 trucks)

7 Lessons Any HVAC (or Long-Cycle Service) Owner Should Take From This

  1. Meta is not Google. Google catches demand at the moment of intent. Meta creates demand months before intent shows up. If you try to use Meta to catch intent you will lose, every single time. Use Meta to fill the top of a flywheel Google can't see.
  2. Your optimization event is your entire strategy in disguise. If you optimize for form-fills, you get form-fillers. If you optimize for booked-and-paid jobs, Meta's algorithm goes and finds the kind of people who book and pay.
  3. Pre-paid appointments fix your show rate overnight. We went from 58% to 91% with a single pricing change. Zero additional ad spend.
  4. The most valuable customer on your books is a maintenance-agreement customer. LTV is roughly 4–5× a one-off repair customer. Every dollar of ad spend should be ladder-rungged toward converting them into one.
  5. Your existing customer list is a cold-traffic goldmine when segmented by equipment age. If you sell something that dies on a schedule — HVAC, water heaters, roofs, windows — the data to predict replacement demand is already in your CRM. Most competitors are ignoring it.
  6. One founder video beats a month of designer creative. Mike in a driveway next to a condenser beat every polished ad we ran. Stop overproducing. Go outside and turn on your phone.
  7. Measure the channel on the right time horizon. HVAC replacements take 14 months of consideration on average. If you kill a channel at 90 days because ROAS is 0.8×, you never see the replacement revenue that was coming at month 11. This is why both previous agencies failed.

Thinking of hiring an agency? Read this first.

Before you sign anything, grab my free 12-page guide "7 Questions to Ask Any Meta Ads Agency Before You Hire Them" from the homepage. It's the same diligence framework that would've saved Mike from his first two agencies. I wrote it so you can evaluate me too.