How to Measure Marketing ROI for HVAC Contractors

By Christoph Olivier, Founder, CO Consulting
Last reviewed: July 2026
Most HVAC owners measure marketing with the wrong number. They watch cost-per-lead and clicks, nod when the agency report looks green, then wonder why the bank balance disagrees. A lead is not revenue. A click is not a booked job. If you want to know whether your marketing pays, you measure the dollars that come off the truck: cost-per-booked-job, average ticket, close rate, and the lifetime value of a membership customer. This guide shows you how to build that measurement, what benchmarks to hold yourself to, and where a clean-looking lead report hides a broken business.
What marketing ROI actually means for an HVAC business
Marketing ROI for an HVAC contractor is revenue generated per marketing dollar spent, traced by channel down to completed, paid jobs. Not leads, not calls, not form fills. The honest version answers one question for every channel: for each dollar I put in, how many dollars of booked and closed work came back? Everything upstream of a paid invoice is a leading indicator, useful but not the score.
Here is the trap. Cost-per-lead (CPL) and clicks are cheap to report and easy to game. A channel can post a $40 CPL and still lose you money if those leads never book, or book service calls that never close into anything. The channels that look expensive per lead often win per booked job. You cannot see that unless you measure the right unit.
The metric that matters: cost-per-booked-job
Cost-per-booked-job is total channel spend divided by the number of appointments actually put on the board from that channel. It is the single most useful marketing number an HVAC owner can track. It folds your answer rate and your booking rate into one figure, so a channel that generates cheap leads your team never converts stops looking cheap.
The math is simple: spend / booked jobs = cost-per-booked-job. Compare that across channels and the picture changes fast. Current benchmarks from home-services data:
| Channel | Typical cost per lead | Book rate | Cost per booked job |
|---|---|---|---|
| Google Local Services Ads (Google Verified) | ~$51 | ~44% | ~$168 |
| Google Search Ads (non-branded) | ~$149 | varies | ~$300+ |
| Thumbtack shared leads | lower nominal | low | ~$260 |
| Angi / HomeAdvisor shared leads | lower nominal | lowest | ~$542 |
Read that Angi line. A shared lead sold to three to eight contractors at once can carry a headline price that looks fine, then land near $542 per booked job, more than three times an LSA booked job, because most of those leads go cold or go to the other seven guys. This is exactly why we counsel owners to move budget out of shared-lead marketplaces and into channels they can measure and own. When we help operators re-plan channel mix inside a broader marketing program for HVAC contractors, this reallocation alone usually frees real money.
Set the guardrail: cost-per-booked-job under about 15% of your ticket
Keep cost-per-booked-job under roughly 15% of your average ticket and most jobs stay profitable after labor and parts. Cross that line and you are buying revenue you lose money on. It is the fastest sanity check in HVAC marketing: put your cost-per-booked-job next to your average ticket, and if the ratio is ugly, no clever attribution model will save it.
Work an example. A residential service ticket averages $400 to $700. A ~$168 LSA booked job sits comfortably under 15% of even a $700 ticket. Now take a channel running $514 per booked job against a $500 service ticket, that is over 100% of the ticket, deeply underwater before you count the tech’s time. The guardrail also flexes by job type: a booked job that leads to a $4,800 to $13,000 system replacement can justify a far higher acquisition cost than a $293 repair. Which is why you cannot measure ROI with one blended ticket, covered below.
How the funnel hides money: book rate and close rate
Book rate is the share of qualified calls your team turns into scheduled appointments; close rate is the share of estimates that become sold jobs. Marketing delivers the call. Your front desk and your techs decide whether it becomes revenue. A lead report that only shows lead volume can hide a broken book rate or close rate completely, and make good marketing look like a failure.
The numbers are unforgiving. Industry average HVAC booking rate is around 42%; top-quartile shops book 62 to 70% of answered calls. Run the same marketing spend through those two operations:
| Scenario | Cost per answered call | Answer rate | Book rate | Cost per booked job |
|---|---|---|---|---|
| Strong operation | $140 | 90% | 65% | ~$240 |
| Weak operation | $140 | 68% | 40% | ~$514 |
Same channel, same lead cost, more than double the cost-per-booked-job, driven entirely by phone handling and booking discipline. Close rate compounds it further: typical HVAC close rates run 50 to 70%, with elite operators above 70%. Speed matters too; contractors who respond inside five minutes book at roughly eight times the rate of those who take 30-plus minutes. If your marketing ROI looks weak, measure book rate and close rate before you fire the marketing. Often the leak is operational, not the channel.
Build the attribution chain: call tracking into ServiceTitan or your CRM
Attribution means tying each booked, completed, paid job back to the exact channel that produced it. For HVAC that runs on the phone, the spine is call tracking wired into your CRM. Give each channel its own tracked number or dynamic number insertion, tag every call and form by source, pipe that tag into ServiceTitan or Housecall Pro, and let completed-job revenue attach back to the channel. Do that for six months and you stop guessing where the next dollar goes.
- Assign a tracking number per channel (LSA, Google Ads, GBP/organic, direct mail, referrals) so every ring is attributed.
- Tag the source on the call and form, down to keyword and landing page where you can.
- Push the tag into your CRM so the source rides with the customer record through booking, dispatch, and invoicing.
- Attach completed revenue back to source after the job is paid, not when the lead arrives.
- Reconcile monthly: spend, booked jobs, and closed revenue by channel in one view.
ServiceTitan’s ecosystem increasingly assumes this attribution exists, and its Marketing Pro layer can drive reactivation campaigns off the same data. You do not need enterprise software to start, but you do need the source to survive from first ring to paid invoice. Owners who distrust marketing usually distrust it because nobody ever built this chain; once they can see cost-per-booked-job by channel, the argument ends.
Separate service-call revenue from replacement revenue
Attribute service-call revenue and replacement (system-sale) revenue separately, because they carry completely different economics and blending them destroys your read on ROI. A repair averages around $293 nationally; a system replacement runs $4,800 to $13,000 and up. If a channel’s booked calls convert into replacements, its true return is far higher than the service ticket suggests.
This is where CPL tracking lies hardest. Paid AC-repair campaigns look expensive at roughly $231 per lead, until you see that repair calls convert into replacement sells and the campaign posts an average ticket near $3,174, a positive return on a lead that looked overpriced. So in your scorecard, split each channel’s booked revenue into service versus replacement and track pull-through, the replacement work a service call drags behind it. A channel that feeds your replacement pipeline is worth protecting even when its per-lead cost frightens people. Getting this mix right is the core of durable revenue growth for HVAC contractors, not chasing the lowest CPL.
Do not ignore membership LTV
Membership and maintenance-agreement customers are worth multiples of a one-off caller, so ROI measured only on the first job badly understates the channels that recruit members. Estimated HVAC customer lifetime value is around $15,340 over a 7-to-10-year relationship; for membership-attached customers it is roughly $47,200. That is the number that should govern how much you are willing to spend to acquire the right customer.
Maintenance agreements run $15 to $30 a month, carry 45 to 65% gross margin, and pull through $1 to $3 of additional work per $1 of contract. The acquisition math is friendly: winning a maintenance-plan customer costs around $100 versus $300 to $500 for an install lead. When you measure marketing ROI, track member sign-ups as a first-class outcome, not an afterthought, and value them at membership LTV. A channel that looks mediocre on first-job revenue can be your best channel once recurring revenue and pull-through are counted, and recurring revenue is also what raises your business’s value if you ever sell.
A simple monthly ROI scorecard
You do not need a data team. One spreadsheet, updated monthly and reviewed quarterly, with these columns per channel, tells you where the next dollar goes:
| Column | What it captures |
|---|---|
| Spend | All media plus fees for that channel |
| Leads / calls | Tracked and tagged by source |
| Answer rate | Share of calls actually answered |
| Book rate | Qualified calls turned into appointments |
| Booked jobs | Appointments on the board |
| Cost per booked job | Spend / booked jobs |
| Close rate | Estimates sold |
| Service vs replacement revenue | Split completed revenue by job type |
| Memberships added | Valued at membership LTV |
| Revenue / ROI | Closed revenue vs spend, by channel |
Hold the guardrail at cost-per-booked-job under about 15% of average ticket, weighted for the service-versus-replacement mix, and reallocate quarterly toward the channels that clear it. Operators who switch from CPL to cost-per-booked-job tracking commonly reshuffle 20 to 30% of budget in the first cycle, because the ranking of channels changes once you measure the right unit.
One 2025 change to fold into your reporting
If you run Local Services Ads, note the currency shift. On October 20, 2025 Google consolidated Google Verified, Google Verified, and License Verified into a single Google Verified badge, and the money-back Google Guarantee ended, with consumer reimbursement discontinued after November 7, 2025. The blue badge now signals vetting, not a money-back promise. That does not change your ROI math, but it changes the trust story you tell homeowners, so lean on reviews, warranties, and your own guarantee, and keep license and insurance current to hold the badge. A word on expectations: no honest measurement framework guarantees a return. What it does is show you the truth fast enough to move money before you waste a season on it.
Measuring ROI this way is the difference between marketing you trust and marketing you tolerate. If you want an owner-level view built on your real unit economics, a fractional CMO for HVAC contractors can stand this up and run it without another full-time hire. Book a consultation and we will map your channels to cost-per-booked-job and membership LTV so every dollar has a job.
Frequently asked questions
What is a good cost-per-booked-job for HVAC? Aim to keep it under roughly 15% of your average ticket. On a $400 to $700 service ticket that means well under $100 or so, though Local Services Ads commonly land around $168 per booked job and still pay when many of those calls convert to replacements at far higher tickets. Judge each channel against the ticket it produces.
Why is cost-per-lead a bad metric on its own? A lead is not revenue. A channel can post a low cost-per-lead and still lose money if those leads rarely book or rarely close. Cost-per-lead ignores your answer rate, book rate, and close rate, which is exactly where booked jobs are won or lost. Cost-per-booked-job folds those in.
How do I attribute a job to the right channel? Use a dedicated tracking number per channel, tag every call and form by source, push that tag into ServiceTitan or your CRM, and attach revenue back to source only after the job is completed and paid. That chain, held for a few months, tells you which channel earns the next dollar.
Should I count membership customers differently? Yes. A membership-attached customer is worth roughly $47,200 in lifetime value versus about $15,340 for a typical customer, and costs less to acquire. Track member sign-ups as a distinct outcome and value them at membership LTV, or you will underrate the channels that recruit them.
How often should I review marketing ROI? Update the scorecard monthly so tagging stays clean and problems surface early, then review and reallocate budget quarterly. Quarterly cadence gives channels enough time to produce booked and closed revenue while still letting you cut losers before they drain a full season.
Did the Google Guarantee change affect ROI tracking? Not the math. The Google Verified badge became Google Verified in October 2025 and the money-back guarantee ended after November 7, 2025. Your cost-per-booked-job measurement is unchanged, but you should update the trust story shown to homeowners and keep license and insurance current to keep the badge.
