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:
- Only 6% of replacement buyers came in cold, with no prior relationship, ready to spend $10K+. These are the people Google LSAs catch — and they already had that channel covered.
- 71% of replacement buyers had been a customer for 8–36 months before replacing. They came in through a tune-up, a repair, or a warranty call first.
- Of the 71%, only 34% had ever been put on a maintenance agreement. The other 66% were one-and-done, at the mercy of whoever ran the cheapest tune-up ad the next summer.
- Average lifetime value of a customer on a maintenance agreement: $4,300 over 4 years.
Average LTV of a non-agreement customer: $890. - Maintenance-agreement customers were 3.9× more likely to replace their system with the same company when it died, vs. shopping around.
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)
Funnel B — "Is Your System Over 10 Years Old?" Replacement Nurture
Funnel C — Maintenance-Agreement Upsell to Tune-Up Customers
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.
- Creative 1 — The Founder Video: Mike on camera, in a driveway next to a condenser unit, saying "If your AC is older than your kids' iPhones, it's working harder than you think. We'll clean, check, and catch problems before July for $89." CTR: 3.9%. Unpolished on purpose. This was the winner.
- Creative 2 — The Math Ad: A carousel explaining why a clogged condenser coil can add $40/mo to a summer electric bill. Ended on "The tune-up pays for itself in 2 months." CTR: 2.8%, but 1.7× higher book-and-pay rate.
- Creative 3 — The Testimonial Reel: 22-second voiceover from an actual customer who'd had a tune-up catch a leaking refrigerant line before it killed the compressor. Dollar amount shown on screen: $3,400 saved. This one printed.
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.
- Phase 1 (educational): 4 Reels over 3 weeks. "What happens inside your AC after 10 years," "Why modern systems cost 40% less to run," "SEER ratings explained in 60 seconds," "The 3 signs your system is about to quit." Zero sales pitch. Average watch-through: 47%.
- Phase 2 (soft offer): Free in-home replacement estimate + same-day 0%-APR financing pre-check. Landing page had one form, one photo of Mike, and a calendar embed.
- Phase 3 (retargeting): For anyone who watched Phase 1 content but didn't book, we pushed a testimonial Reel from a real customer who'd replaced their 14-year-old unit and cut their summer bill by $180/mo.
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
- Installed Conversions API, wired it to ServiceTitan so booked-and-paid jobs, not form-fills, became the optimization event. Event match quality climbed from 3.8 to 8.4 by week 6.
- Built all three landing pages in Webflow (5 days total). Single-form, single-CTA, Mike's face on every one.
- Launched Funnel A on March 8 with $150/day. Booked 92 pre-paid tune-ups in 30 days at a $41 CPA.
- Month 2 close: 201 tune-ups booked. Funnel B still in creative-test mode. 22 maintenance agreements sold from Funnel C (early — these were mostly word-of-mouth upsells).
Months 3–5: The First Real Money
- Funnel B creative winner emerged in week 2 of month 3: the testimonial Reel. Single creative drove 58% of replacement-estimate bookings for the next 6 months.
- First replacement from Meta-only attribution closed in month 3, week 2. $11,400 ticket. Mike texted me at 9:47 PM. "OK. I see it."
- Shoulder-season wound down in late May. We shifted budget from Funnel A to Funnel B for the peak-demand window (emergencies handled by Google LSAs, but replacement consideration peaks when systems are straining — June–August).
- Month 5 close: 14 replacements closed YTD. $128,300 in replacement revenue. 87 agreements active.
Months 6–8: Scaling the Replacement Funnel
| What we adjusted | Impact |
|---|---|
| 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 magnet | Captured 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
| Metric | Before (both prior agencies, averaged) | After (month 12) | Change |
|---|---|---|---|
| Monthly Meta ad spend | $6,000 | $14,000 | +133% |
| Optimization event | Form submit ("get estimate") | Booked-and-paid job (via CAPI + ServiceTitan) | — |
| Primary offer | $179 service call, summer-only | 3 seasonal funnels (tune-up / replace / agreement) | — |
| Booked-and-paid tune-ups per month (peak) | ~18 | ~140 | 7.8× higher |
| Replacement estimates per month | ~0 from Meta (all from Google LSAs) | ~36 | new channel |
| Maintenance agreements sold / month | ~12 (in-home tech pitch only) | ~34 (tech pitch + Meta nurture) | 2.8× higher |
| Show rate on tune-up appointments | 58% | 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 / 10 | 8.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
- 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.
- 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.
- Pre-paid appointments fix your show rate overnight. We went from 58% to 91% with a single pricing change. Zero additional ad spend.
- 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.
- 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.
- 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.
- 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.