← Back to blog

Service Contracts vs. One-Off Calls: Which HVAC Work Actually Earns

June 23, 2026

The problem: Maintenance agreements read as steady, predictable revenue, but nobody counts how many visits each individual agreement actually consumes over a year.

The solution: Attach every truck roll, hour, and part back to the specific agreement that pulled it, so a contract's real cost sits next to its price instead of disappearing into the service department total.

The math

If a quarter of a $10M HVAC company's 3,000 maintenance agreements pull two unbilled visits a year beyond the two they were priced for, that is roughly $210k of margin the contract book quietly gives back.

Ask a residential HVAC owner which side of the business pays better, agreements or one-off calls, and the answer usually comes fast. Agreements. They smooth the shoulder seasons, they keep the trucks moving in April and October, they give you first call when the system finally dies, and they show up on the books as recurring revenue instead of whatever the phone brings in. Every part of that is true.

What is much harder to answer is whether any particular agreement earned its price. The revenue side is exact: 3,000 agreements at $220 a year is $660k, billed and collected. The cost side is not tracked at the level where the decision lives. Visits get dispatched, technicians get paid, and the whole thing settles into a service department labor number for the month. Nothing ever asks how many times the company drove to 14 Elm Street this year.

The contract is priced on an assumption nobody checks

A maintenance agreement is a bet. You sell two scheduled tune-ups, a filter or two, priority scheduling, and some percentage off repairs, and you price it assuming the customer takes roughly what you sold them. Most do. The pricing works because the average holds.

The problem is that averages hide the tail, and in service contracts the tail is where the money goes. Priority scheduling means a member who is uncomfortable calls you instead of waiting, and the call is free to them, so they call sooner and more often. An aging system that should have been replaced four years ago generates a nuisance visit every summer, and each one is a truck, a technician, and two hours of a day you could have sold. A customer whose ductwork was undersized from the day the house was built will never be satisfied by a tune-up, so the tune-up becomes three visits.

None of these are unreasonable customers. They are exactly the customers the agreement was designed to serve. But the agreement was priced for two visits, and this one consumes five, and the only place that fact is recorded is in the head of the technician who keeps getting sent.

What a one-off call actually looks like next to it

The comparison people make is revenue against revenue, and by that measure the one-off call looks worse: unpredictable, seasonal, competitive on price, and it comes with a customer you may never see again.

Costed properly, the picture is less obvious. A one-off diagnostic call is billed at the point of service, so the visit pays for itself before anything else happens. It carries no obligation for a second visit. Its conversion into repair or replacement work is often higher than people expect, because the customer called with a problem rather than a schedule. What it lacks is the retention and the first-call position, which are real and worth paying for.

So the question is not "agreements or calls". It is which agreements are worth what they are priced at, and that is a question about visit consumption, not about the model.

Why the answer is not in your system today

Most HVAC companies at this size run a field service application for dispatch and QuickBooks for the books, and the two meet at the invoice. That is enough to tell you what you billed. It is not enough to tell you what a contract cost, because the costs arrive as separate things that never get added together against one agreement:

  • Technician hours, which land in payroll by employee and week, not by contract.
  • Truck time and fuel, which land in a fleet expense line.
  • Parts and filters consumed on a no-charge visit, which land in materials.
  • The discounted repair labor a member gets, which shows as a lower invoice rather than as a cost of the agreement.
  • The dispatch and scheduling time spent booking, rescheduling, and reminding, which lands nowhere at all.

Each one is captured somewhere. None of them are connected to the agreement number. Until they are, a contract's profitability is a company-wide average applied to 3,000 very different customers.

A look at a residential HVAC company

Consider a residential HVAC company doing about $10 million a year, roughly 45 people, with about 3,000 maintenance agreements on the book at an average of $220. The owner considers the agreement program a success, and by the measures available it is: renewal is strong, the shoulder seasons stay busy, and replacement leads come out of the member base at a rate the marketing spend could not match.

Suppose the company starts tagging every dispatch to the agreement that generated it and lets the hours, parts, and truck time settle against it. Within a season, you would expect the book to split into three groups that nobody had seen before. A large majority taking the two visits they were sold, which is the group the price was built for. A profitable minority taking less than they paid for. And a tail, plausibly a quarter of the book, pulling extra visits nobody priced.

Put a number on the tail. If 750 agreements pull two unbilled visits a year beyond the two scheduled, and a visit costs on the order of $140 once technician time, drive time, and the truck are counted, each of those agreements is giving back about $280 against a $220 price. Across the tail that is roughly $210k a year, sitting inside a program that looks healthy on every report the owner currently sees.

What the owner would likely do with that is not cancel the program. Some of the tail is priced wrong and gets a second tier at renewal, one that reflects an older system and more visits, which most of those customers would accept because they are already the ones calling. Some of it turns out to be replacement conversations that were never had, because the pattern of five visits a year on a nineteen-year-old system is a sales signal nobody was reading. And a small group gets moved off the agreement entirely, which frees technician days for work that pays.

How to start

You can get most of this from one season of data and the dispatch system you already run.

  1. Tag every visit to the agreement. Make the agreement number a required field on the dispatch, so a truck roll cannot happen without landing somewhere.
  2. Cost the visit once. Set a loaded cost per visit that includes technician time, drive time, and the truck. One honest number beats four precise ones nobody maintains.
  3. Rank agreements by visits consumed, not by revenue. Every agreement is the same $220. The ranking that matters is how many visits each one took.
  4. Let the flagging run itself. Set automation to surface any agreement that crosses its third visit in a year, so repricing and replacement conversations happen when the pattern appears rather than at renewal.

The takeaway

A maintenance agreement is not steady revenue, it is a fixed price against a variable cost, and the variable is the one part of it nobody counts. The program can be genuinely profitable while a quarter of the book loses money inside it, and both facts can be invisible at the same time because visits dissolve into a monthly labor number instead of landing on a contract. Tag the visits, cost them once, and rank the agreements by what they consume. The first honest ranking is likely to change what you charge at renewal, which systems you push to replace, and how confidently you can say that the agreement side of the business is the better one.

Every business has a number like that hiding in it.

Text us where your team loses its time, and we’ll put a real number on yours, then show you what’s worth organizing and automating first. No forms, no sales call.