inparlor.
Case studyHVAC Companies90 days

How we drove 4.2× ROAS for a Texas HVAC chain in 90 days

Multi-location HVAC operator in Houston spending $48K/month on Meta with mismatched attribution. We rebuilt the measurement layer, killed two-thirds of campaign sprawl, and tripled tracked revenue in 90 days.

Anonymized · Published March 15, 2026

Headline results
  • Blended ROAS

    4.2×

    +180%

  • Cost per booked job

    $87

    -58%

  • Monthly tracked revenue

    $340K

    +220%

  • Maintenance plan attach

    38%

    +15 pts

The challenge

The client operates 11 HVAC service trucks across Houston, Sugar Land, and The Woodlands. By the time they came to us, they had been running Meta Ads for 18 months with two prior agencies, both percentage-of-spend retainers. Spend had climbed to $48,000 per month. The dashboards said ROAS was healthy. The operations team said it didn't feel that way.

The first audit confirmed both were partially right. Tracked conversions on Meta showed ~140 booked jobs per month at a $340 cost per job. Their service-titan job database showed 92 attributable jobs that month at an actual cost per booked job of $522. The gap, 30%+ of reported conversions did not exist in the operating system, had compounded for over a year.

Worse: 71% of monthly spend ran through six "evergreen" campaigns that the prior agency had been afraid to touch. Three were broad-targeting awareness sets with no conversion event firing. One was a remarketing pool that hadn't been refreshed in 9 months and was burning $4,800/month on the same 12,000 stale users.

What we found

Our two-week audit produced a 23-page fix list. The headlines:

  • Measurement was lying. Meta Pixel was firing on phone-call clicks, not actual booked jobs. CAPI had been installed but pointed at a Zapier flow that broke during a ServiceTitan integration update 7 months prior.
  • Campaign structure was sprawl. 34 active campaigns. 142 active ad sets. Most had been launched, then forgotten.
  • Creative was stale. The top 5 spending ads averaged 18 months old. Frequency above 7 in their core retargeting pool.
  • Landing pages were generic. One landing page handled every service category and every geography. Mobile load time hit 6.2s.

Approach

We sequenced the fix so the operating numbers would move before the team had to defend any decisions internally.

  1. Week 1-2

    Measurement rebuild

    Re-installed CAPI through Stape with full server-side event mapping. Connected ServiceTitan's CRM to GA4 via offline-conversion uploads. Validated 100% of booked jobs were firing within 24 hours.

  2. Week 3-4

    Campaign consolidation

    Killed 27 of 34 active campaigns. Consolidated the remaining 7 into 3 structured around the three highest-LTV service lines: replacement, repair, and maintenance plan.

  3. Week 5-8

    Creative cadence

    Briefed and shipped 12 new creative concepts: 4 weather-triggered ads (heat-wave + cold-snap), 4 social proof ads built from real ServiceTitan review data, 4 explainer ads on maintenance plan economics.

  4. Week 9-12

    Landing page rebuild + CRO

    Built 3 dedicated landing pages (replacement, repair, maintenance) with geo-aware copy. Shipped 4 A/B tests across the funnel, the maintenance plan offer test alone lifted attach rate from 23% to 38%.

Execution

The measurement rebuild was the most important week of the engagement and the one the client found hardest to greenlight, because it required two weeks of "no campaign changes" while we instrumented the backend. We held that line because every campaign decision afterward depended on knowing what was real.

By week 6, the new structure had been live long enough that we could read true cost per booked job, not Meta-reported conversions. The data revealed something the prior agencies had missed: the maintenance plan attach offer, which the client treated as a footnote, was their highest-LTV acquisition surface. Maintenance plan subscribers had a 12-month gross-margin LTV roughly 4.1× a one-off replacement customer.

We rebuilt the creative cadence around that insight. Of the 12 concepts we shipped in weeks 5-8, 4 were maintenance-plan-led. By week 9, the maintenance plan campaign was the highest-ROAS surface in the account, and we re-allocated 40% of total spend toward it.

Cost-per-booked-job, audited via ServiceTitan jobs (not Meta-reported conversions)

Before · Cost per booked job

$522

What the operations system actually showed before engagement

After · Cost per booked job

$87

Tracked through full CAPI + offline-conversion stack at week 12

Results

After 90 days the operating dashboard showed numbers that finally matched the operating reality. Cost per booked job dropped from $522 to $87, most of the move came from killing wasted spend and pointing the budget at the campaigns that were always working but were buried in the noise. Tracked revenue moved from $106K/month to $340K/month while spend grew only 22% over the same window.

(See the full headline-results grid at the top of this page.)

What we learned

The instinct in a high-spend account is to fix creative first. The right instinct is to fix measurement first. Three months in, we ran a counterfactual exercise with the founder, if we had only changed creative and left the measurement broken, the dashboards would have shown a 25-30% improvement that the operations team would have correctly disbelieved. The trust ceiling on every subsequent decision is determined by whether the dashboard tells the truth.

Two specific operating decisions came out of this engagement that the client has kept:

  • Weekly Friday Loom under 10 minutes is now the only reporting cadence. No monthly slide decks.
  • Maintenance plan attach is the north-star metric, not ROAS. The team scoreboards it daily.

The measurement rebuild was the boring two weeks that paid for every quarter since. We can finally make the next call without flying blind.

, The client's GM, six months post-engagement

Engagement led by Inparlor

Published March 2026 · 2 services · 90 days

Want results like these?

Tell us about your business. We respond in 48 hours.

Pricing, scope, timeline, and the team that would actually run the engagement.

Get a proposal