HVAC marketing attribution should end at a booked job, not a phone call. The honest way to get there is to count booked jobs by branch or ZIP from your field-service software, then compare areas where spend changed with matched areas where it didn’t. The gap is what the marketing added. Calls are a useful early signal along the way, nothing more.
Most HVAC marketing reports stop at calls because calls are easy to count and every channel produces them. That’s exactly the problem. A channel can double your calls and barely move the dispatch board.
Why calls are the wrong finish line for HVAC attribution
A tracked call tells you the phone rang. It doesn’t tell you who was on the other end. In a typical week that includes existing customers checking on a part, members booking their tune-up, warranty callbacks, price shoppers comparing three companies, vendors and plain spam. Some of those calls become jobs. Many never will.
And the definition of a “lead” keeps moving under you.
Whatever you think of the change, it means an LSA lead this winter is not the same thing as an LSA lead last winter, so cost per lead can’t be compared across the two. A booked job is a booked job in both years. Your field-service software has been counting them consistently all along.
Weather is the biggest channel you don’t buy
Nothing moves HVAC demand like the first 98-degree week of June or the first hard freeze. Cooling is close to universal in American homes, so heat drives demand almost everywhere at once.
That is why before-and-after comparisons fail so badly in this trade. Any campaign that starts the week before a heat wave looks like genius. The fix is a comparison group that lives through the same weather: branches or ZIPs in the same climate, matched on how their booked jobs moved through last summer and last winter.
Notice the second thing in that chart. When every tech is booked through Friday, more ads can’t create more jobs; they create a longer callback list. In peak weeks, the measured lift drops towards zero for a good reason. Plan tests for shoulder weeks, when the schedule has room, or the result will tell you the ads did nothing.
What to export from ServiceTitan, Jobber or Housecall Pro
All three systems can export jobs with a branch (or business unit), a customer ZIP, dates and a job type. You want a count per branch or ZIP per day, split a few useful ways. No customer names, street addresses or phone numbers are needed.
| Field | Use it to | Watch out for |
|---|---|---|
| Branch or business unit | Assign each job to a location | Jobs moved between branches for dispatch reasons |
| Customer ZIP | Measure by service area, and run ZIP-level tests | Commercial jobs billed to a head-office ZIP |
| Booked date and completed date | Booked for the early read, completed for the final one | Jobs rescheduled into a later week |
| Job type | Split repair, replacement estimate and maintenance | Maintenance-agreement visits you scheduled yourself |
| New or existing customer | Separate demand you created from demand you already had | Fields left blank by busy CSRs |
| Status and invoice total | Drop cancellations; value completed work | Zero-dollar warranty callbacks |
Leave maintenance-agreement visits out of the outcome. Your dispatchers booked those from the membership list, not from an ad. Replacement estimates deserve their own series: they are rare, valuable and slow, so they drown in the noise of repair calls if you mix them together.
Measuring LSA, search and radio against booked jobs
Each channel buys geography differently, and that decides how you test it.
- Local Services Ads. You set service areas and a budget. Raise or pause LSA in some branches’ areas while holding others steady, then compare booked jobs. Judge it on cost per extra booked job, not on the charged-lead count Google shows you. Our guide on whether Google Local Services Ads are worth it goes deeper.
- Search and Performance Max. Target by radius or ZIP, which makes ZIP-level holdouts practical. Watch for branded search: it intercepts customers who already chose you, which is great for cost per call and weak for extra jobs.
- Radio and TV. Bought by metro, so the unit of comparison is the branch or the whole market. You need several branches across several metros to read it. Streaming audio can be targeted by ZIP, which is easier to test.
- Direct mail and door hangers. Already ZIP-based. Mail to half the matched ZIPs, hold back the other half, and count booked jobs in both.
Worked example: calls up 20%, booked jobs up 9% (illustrative)
A nine-branch HVAC company adds $3,000 a week of streaming audio and extra LSA budget at three branches for six early-summer weeks: $18,000 in total. The other six branches keep their usual spend. Each test branch normally books about 120 jobs a week.
| Metric | Test branches | Twin (expected) | Difference | Cost per extra |
|---|---|---|---|---|
| Tracked calls | 6,900 | 5,750 | +1,150 (+20%) | $15.65 |
| Booked jobs | 2,600 | 2,380 | +220 (+9.2%) | $81.82 |
| Completed jobs | 2,450 | 2,250 | +200 (+8.9%) | $90.00 |
- The call story. $18,000 ÷ 1,150 extra calls = $15.65 a call. It looks cheap.
- The booking rate. Normal calls book at 2,380 ÷ 5,750 ≈ 41%. The extra calls booked at 220 ÷ 1,150 ≈ 19%. The campaign reached people who were more likely to be shopping around.
- The job story. $18,000 ÷ 220 = $81.82 per extra booked job, and $90 per extra completed job.
- The value. If a completed repair averages $450 and about half is left after parts and tech labor (use your own numbers), each extra job is worth about $225. 200 × $225 = $45,000 against $18,000 of spend.
So the campaign paid. But a manager who planned next summer on $15.65 calls and a 41% booking rate would expect about 470 extra jobs (1,150 × 0.41) and get fewer than half that. Budget on the number from the dispatch board.
One branch? Use a ZIP-level test instead
A single-branch operator has no second market to compare against. What you do have is a service area made of ZIP codes, and a job history that says how many jobs each one books in a normal week. That’s enough to build a test.
- Pair up ZIPs that booked similar jobs per week over the past year, adjusted for households.
- In each pair, randomly pick one to get the campaign and one to hold out.
- Leave out ZIPs at the edge of your drive time and any with a big new subdivision coming online.
- Run 8–12 weeks in shoulder season, then compare booked jobs in test ZIPs with holdout ZIPs over the same weeks.
Both halves live through the same heat, the same holidays and the same competitor’s billboard, so the gap is the campaign. Spillover is the main risk: radio and broad social will reach holdout ZIPs too, which makes ZIP tests best suited to channels that target precisely, like search, LSA service areas, streaming audio and mail. If you can’t split by ZIP, the measuring ads for a single location guide covers alternating on and off weeks instead.
Common mistakes in HVAC marketing attribution
- Optimizing to cost per call. The worked example’s extra calls booked at half the normal rate.
- Crediting the weather. Comparing June with May, or this heat wave with last year’s mild week.
- Testing at peak. When crews are full, ads can’t add jobs. The test will read zero.
- Counting maintenance visits. Membership tune-ups you scheduled yourself aren’t marketing results.
- Mixing replacements with repairs. Track replacement estimates and sold systems as their own series.
- Trusting “how did you hear about us?” CSR-entered lead sources are useful color, but people credit whatever they saw last, often Google.
- Comparing LSA leads across years. The charging rules changed in October 2026. Booked jobs didn’t.
Questions people ask about HVAC attribution
How do I track which marketing brings in HVAC jobs?
Export booked jobs by branch or ZIP from your field-service software and line them up with spend by area. Then compare areas where spend changed with matched areas where it didn’t, over the same weeks. The difference in booked jobs is what the marketing added. Call tracking and lead-source fields help, but they can’t separate new demand from existing customers.
What is a good cost per booked job for HVAC?
It depends on your ticket size, margins and job mix, so set it from your own numbers. Take the average value of a completed job after parts and labor, decide the return you need, and that gives a ceiling. Then judge channels on cost per extra booked job, measured against a comparison group, not on cost per call.
Are Google Local Services Ads worth it for HVAC?
Sometimes, and you can find out. Raise or pause LSA in some service areas while holding others steady, and compare booked jobs over six to eight weeks. Judge it on cost per extra booked job. Since October 2026 Google charges for some missed calls, so charged-lead counts are a weaker guide than they used to be.
How do I separate weather from marketing results?
Compare against branches or ZIPs that experienced the same weather. A heat wave lifts both the test and comparison areas, so it cancels out of the gap. Avoid comparing a campaign period with the weeks before it, and avoid testing during peak weeks when crews are fully booked and can’t take more jobs.
Can a single-location HVAC company measure ads?
Yes, with ZIP codes. Split your service area into matched pairs of ZIPs, run the campaign in one of each pair, and compare booked jobs. It works best for channels that target precisely, such as search, LSA service areas, streaming audio and mail. Countlift offers ZIP-level tests to single-location service businesses in early access.
Your dispatch board is the most honest marketing report you have. Count booked jobs, compare like with like, and let calls go back to being what they are: a sign the phone rang.
Next step
Put your own locations through the comparison.
Your first location report is free at any size. Bring a CSV of weekly sales and spend, or connect your POS and ad accounts.
Written by The Countlift team at First Byte in The Woodlands, Texas. Questions or corrections? Email hello@countlift.com.