HVAC Lead Generation: AI Call Tags Show Which Sources Book Replacements

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for HVAC Lead Generation: AI Call Tags Show Which Sources Book Replacements.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for HVAC Lead Generation: AI Call Tags Show Which Sources Book Replacements.

No lead source books replacements by default; Local Services Ads, paid search, referrals and your own site rank differently for every company. Give each source its own tracking number, have AI tag every call as replacement, repair, maintenance or other, follow each booked job to its sale, then divide replacements sold by qualified calls per source.

The catch is that a call's intent is not the job's outcome. A caller who books a repair can end up buying a replacement after the technician's diagnosis, so a call tag alone misreads the source. You need three tags: what the caller asked for, what the technician found and what the customer bought. Local Services Ads is also moving into Google Ads, which changes where you record booked jobs.

Follow me on Instagram@sagnikteaches

Three tags per lead: what was asked, what was found, what was sold

Each lead gets one row in a sheet, and each row collects three tags at three moments. The first comes from the call, the second from the visit and the third from the invoice. The row is joined by the caller's phone number or the job number, so decide which before you start.

Connect on LinkedInSagnik Bhattacharya
TagSet whenSet byValues
SourceThe call arrivesTracking number, or the question how did you hear about usLSA, paid search, referral, own site, other
Call intentAfter the callAI, from the transcriptReplacement enquiry, repair, maintenance, existing customer, solicitation or wrong number, job seeker, other
Replacement signalsAfter the callAI, from the transcriptSystem age, repeat repairs, price shopping, urgency
Visit outcomeAfter the visitTechnician or office, in the job softwareRepair sold, replacement quoted, replacement sold, no sale
RevenueAfter invoicingJob software exportAmount and job type

Define a qualified call before you count anything: a homeowner or business in your service area, asking about a job you do, who is not already mid-job with you. Solicitations, wrong numbers and job seekers are excluded. Without that rule every source's rate is diluted by calls that were never leads, and the sources that attract more junk look worse than they are.

Subscribe on YouTube@sagnikteaches

One lead followed through its three moments shows why the row needs every tag. The details are illustrative.

MomentWhat happenedWhat the row records
Call, 3 MarchA Local Services Ads caller asks for a repair on a 17-year-old system that has been repaired twiceSource LSA; intent repair; candidate Y
Visit, 4 MarchThe technician finds a failed compressor and quotes a replacementOutcome: replacement quoted
Sale, 6 AprilThe customer signs at $9,600 after a second quote elsewhereOutcome: replacement sold; revenue $9,600; counted in March, the month of the call

Count the call tag alone and this lead is a repair from Local Services Ads. Count all three and it is a replacement the source delivered, credited to the month the source produced it, which is the comparison you need.

The question that fills the source column

Tracking numbers cover only the sources that have one. For everything else, the first question on every call does the work, and it has to be asked the same way each time. Give the office a short script and a closed list of answers so the sheet stays clean.

Before I book you in, may I ask how you found us?
 1 Google search or a Google ad
 2 Google Maps or reviews
 3 A friend, neighbour or family member (ask: who should we thank?)
 4 Our website or chat
 5 Saw our van or a leaflet
 6 Something else (write it down)
Record the number and the referrer's name. Do not ask twice.

The answer's number, not free text, goes into the Source column. When it conflicts with the tracking number, keep both: set Source to the customer's answer if it names a person, and to the tracking number otherwise. Existing customers ringing about a booked job or an agreement renewal are not leads, so give them their own tab and keep them out of the rates.

What each source can and cannot tell you

Local Services Ads

Google's help pages say you are charged for each valid lead: an answered or returned call, a missed call during business hours where the caller stays on the line for more than 20 seconds, or a message. Lead prices vary with location, job type, lead type or bidding mode, and follow-up contact from the same number or email within 15 days is not charged again. Charged leads are reassessed for 30 days and can be credited automatically if later judged low quality, duplicate or invalid (credits are not offered in every market), and the Charge Status column shows Charged, Not charged, In review or Credited.

For this tutorial the useful part is what Google lets you record. The ad uses a forwarding number that Google assigns, and its help page says you cannot choose it, so Local Services Ads leads are identified from Google's own lead list rather than from one of your call-tracking numbers. The lead inbox also lists booked jobs. If your account lets you mark a lead as booked or add a note to it, type the same word every time, such as replacement or repair, so a filter can find them later; the controls differ between accounts, so look at what yours offers rather than relying on a description.

The bigger news is the move. Google's help article says Local Services Ads campaigns are being migrated to a Performance Max campaign type built for pay-per-lead goals inside Google Ads, with a first phase for home-service advertisers including HVAC from August 2026 and later phases through 2027. You still pay only for valid leads, your average weekly budget is divided by seven to set a daily average, and manual bidding, including a maximum cost per lead, is no longer supported. Past leads and message history move across, but historical performance reports do not; Google says a download option is coming and suggests screenshots in the meantime, so save what you need before your account moves. Google's transition article has the details, and the plumber's export checklist for the move is written for another trade, though an HVAC firm's needs are likely to be similar. After the move, leads are reviewed in a table under Goals, then Conversions, then Leads, which replaces the old lead inbox, so check where your account now records booked jobs and keep your own sheet as the master record.

Paid search, referrals and your own site

Paid search is the source where you control intent. A campaign on replacement keywords and a separate one on repair keywords, each with its own tracking number, tell you which wording books which job. Referrals, meaning past customers and neighbours, usually have no tracking number, so the tag comes from the question at the start of the call. Your own site and Google Business Profile bring calls, forms and chat; give the website a separate number and a dedicated replacement quote page so those leads are identifiable.

Five tracking numbers, the allowance on CallRail's entry plan described below, are enough for a firm this size because Local Services Ads brings its own. One split that keeps every paid or owned source distinct: the replacement-keyword campaign, the repair-keyword campaign, the website, the Google Business Profile, and a spare for van livery or leaflets. Referrals stay on the opening question. If two sources ever share a number, their calls cannot be separated afterwards, and no prompt can repair that.

None of these sources reports replacement against repair by itself. That is why the three-tag row exists: the platforms count leads, and only your job records know what was sold.

An AI call-tagging prompt and what its output looks like

CallRail is one route to tagging. Its pricing page lists Lead Tracking at $50 a month, with five local numbers, 250 local minutes and call recording, transcription and analysis, and Lead Conversion at $150 with call summaries, sentiment analysis and automatic conversion tagging. Extra local numbers cost $3 each and transcription minutes $0.025 on Lead Tracking, while extra local minutes appear as $0.05 in some tables on the page and $0.06 in another. At 150 calls a month averaging four minutes, that is 600 minutes against 250 included, so $17.50 to $21 of extra minutes and, if no transcription minutes are included, $15 of transcription: about $80 to $90 in all. Confirm the figures at sign-up. Every account starts with a 14-day free trial, which is long enough to tag two weeks of real calls before paying.

The alternative is a chat assistant working on transcripts exported from your phone system. Strip names and addresses before pasting, and use a business-grade plan or the model-training switch in the privacy settings of a consumer one. A prompt like this keeps the tags consistent.

You label inbound calls to an HVAC company from a transcript.
Return one JSON object per call with these keys:
intent: one of "replacement_enquiry", "repair", "maintenance", "existing_customer",
  "solicitation_or_wrong_number", "job_seeker", "other"
system_age_years: a number if the caller states or clearly implies it, otherwise null
repeat_repairs: true if the caller says the same system was repaired recently, else false
price_shopping: true if the caller mainly wants a price comparison, else false
urgency: "no_heat_or_cooling", "this_week" or "flexible"
booked: true if an appointment was agreed on the call
evidence: the shortest quote from the transcript that supports "intent"
Rules: use only the transcript. If unclear, use "other" or null. Do not guess.
Only use replacement_enquiry when the caller asks about replacing or quoting their own system.

Here is a sample transcript and the reply it might produce.

Caller: Our AC is about 17 years old. It has been low on refrigerant twice in two summers
and now it is blowing warm air. I don't know if it's worth fixing.
Office: We can send a technician tomorrow morning for a diagnostic, and he can talk through
replacement options if it makes sense.
Caller: Yes please, tomorrow is fine.

{"intent":"repair","system_age_years":17,"repeat_repairs":true,"price_shopping":false,
 "urgency":"this_week","booked":true,"evidence":"I don't know if it's worth fixing"}

The tag is accurate and still misleading. The booked job is a diagnostic, so the intent is repair, but a 17-year-old system with repeat repairs is a replacement candidate. Add a rule to your sheet that flags any call with system_age_years of 15 or more, or repeat_repairs true, as a candidate. Without that flag, a source like Local Services Ads looks like a repair-only source when many of its repair visits are really replacement leads in waiting.

A second call shows the opposite error. The caller says a neighbour recommended the company after having a new system fitted, and that their own furnace is banging. A loosely worded prompt may tag it as a replacement enquiry because of the words new system. The extra rule in the last line of the prompt, which requires the caller to ask about their own system, fixes that, and the same call is a good example of a referral source detected from the conversation rather than from a number.

Before you trust any prompt, hand-tag 30 calls yourself and run the same 30 through the assistant. As a rule of thumb, accept it when at least 27 of the 30 intent tags match, and read every disagreement to see whether the prompt or the human was wrong. The tutorial on routing sales calls to the right person covers what to do with a replacement enquiry once it is tagged.

A ten-call check, with two mismatches

Run a small check before trusting the prompt at volume. This sample of ten calls shows the kind of disagreement to expect.

CallWhat the caller saidYour tagAI tagMatch
1AC blowing warm, 17 years old, repaired twiceRepair, candidateRepairYes
2Wants a quote for a new system for an extensionReplacement enquiryReplacement enquiryYes
3A neighbour recommended you; furnace is bangingRepairReplacement enquiryNo
4Selling card-payment terminalsSolicitationSolicitationYes
5Annual tune-up for an agreement customerMaintenanceMaintenanceYes
6Price for replacing a 12-year-old heat pump; two other quotes comingReplacement enquiryReplacement enquiryYes
7Asks whether you are hiring techniciansJob seekerJob seekerYes
8Install booked for Friday; asks about arrival timeExisting customerExisting customerYes
9Thermostat screen is blankRepairRepairYes
10Tenant asking on the landlord's behalf for a quoteOtherReplacement enquiryNo

Eight of ten match, which is short of the 90% bar. The first miss is the referral caller: the words new system pulled the tag towards replacement, which shows the last rule in the prompt needs an example to hold. The second is the tenant, because the prompt has no home for someone who does not control the system. Add a rule that callers who are not the owner or manager are tagged other, add the neighbour call as a worked example, re-run the ten, and only then run the full 30.

One quarter, four sources, twenty-two replacements

These figures are illustrative, so treat them as a template for your own sheet. They cover three months for a small HVAC firm whose average replacement is $9,600.

SourceSpendQualified callsAI-tagged replacement enquiriesReplacement quotesReplacements soldSold per 100 qualifiedCost per replacement sold
Local Services Ads$4,8007891779.0$686
Paid search$3,600411314614.6$600
Referrals$1,05024711625.0$175
Own site$600336939.1$200
Total$10,05017635512212.5$457

The spend column has four different meanings. Local Services Ads and paid search are what Google charged. Referrals are a $50 thank-you for each of 21 booked referral visits, and the own-site figure is a share of website upkeep and content. Whatever your own mix, write down what each number includes, or the comparison is quietly unfair.

Read the table in three passes. First, Local Services Ads brought the most qualified calls and a replacement rate of 9 per 100, below paid search at 14.6 and referrals at 25. Second, compare the tag column with the quotes column. Local Services Ads had 9 calls tagged as replacement enquiries and 17 replacement quotes, so at least eight quotes came from calls that began as something else, almost half. Paid search had 13 tagged and 14 quoted, which fits a campaign built on replacement keywords. Third, the cost per sale: $686 for Local Services Ads, $600 for paid search, and $175 and $200 for referrals and the website.

What the quarter would change

Local Services Ads may well be worth keeping, but the case rests on repair volume and on the replacement quotes that arise at the visit, not on its call-stage replacement rate. That points to the technician's first-visit routine: when a diagnostic finds a 17-year-old system, the visit needs a replacement conversation and a good-better-best quote ready. The quote follow-up sequence tutorial covers the days after the quote goes out.

Paid search shows its intent control working, so a larger replacement-keyword budget is the obvious test. Referrals are the cheapest replacements, and the fix is a simple one: ask every happy replacement customer for introductions, and identify old systems in your customer list for outreach, as the ageing systems outreach tutorial describes. The website converts at the same rate as Local Services Ads for a fraction of the cost, so a dedicated replacement quote page is worth building before spending more elsewhere.

Now the caution. Seven sales against six is not a gap: one more sale for Local Services Ads would bring its cost per sale down to $600, the same as paid search. Treat the order of the two as a hypothesis for the next quarter. The referral result is the one that would survive a recount, because its margin is wide. Repairs matter too: if Local Services Ads' 62 visits included 41 repairs averaging $420, that is $17,220 of repair revenue the replacement table ignores, and it changes whether $4,800 is well spent.

What a replacement is worth when judging a source

Suppose your replacements earn about 45% gross profit on $9,600, roughly $4,320 after equipment, materials, permits and labour. Divide each source's cost per replacement sold by that figure: Local Services Ads takes about 16%, paid search about 14%, referrals about 4% and the website about 5%. None loses money on replacements alone, so the real question is where the next dollar goes.

Referrals and the website are limited by capacity, because you cannot buy more neighbours' recommendations, while Local Services Ads and paid search scale with budget. The sensible plan is to keep funding the two scalable sources, test whether paid search can absorb more, and put effort rather than money into the other two. Repairs earn margin as well, so the all-in return on Local Services Ads is higher than the replacement-only figure suggests.

The sheet that joins the tags to the jobs

Keep the sheet plain: one row per qualified lead, with columns for call date, source, phone number, call intent, candidate flag, visit outcome, job number and revenue. The rate by source is then a single formula, and it works the same way in Excel and Google Sheets.

Columns: A Call date | B Source | C Phone | D Intent | E Candidate (Y/N)
         F Qualified (Y/N) | G Visit outcome | H Job no. | I Revenue

Replacements sold, LSA:
=COUNTIFS(B:B,"LSA",G:G,"Replacement sold")

Sold per 100 qualified, LSA:
=100*COUNTIFS(B:B,"LSA",G:G,"Replacement sold")/COUNTIFS(B:B,"LSA",F:F,"Y")

Cost per replacement sold, LSA (spend in K2):
=K2/COUNTIFS(B:B,"LSA",G:G,"Replacement sold")

A Monday routine keeps it alive and takes about 20 minutes. Export last week's calls and run them through the tagging prompt. Paste the tags into the sheet. Update the visit outcome for visits that finished, and fill revenue from the invoice export. If you want help with the spreadsheet side, the older ChatGPT Excel guide covers formulas like these.

Mistakes that make a source look better or worse than it is

  • Counting junk calls. Solicitations and wrong numbers dilute the rate. Exclude them before dividing.
  • Judging by sale date. A replacement sold three weeks after the call belongs to the call's date. Group by call date and, as a rule of thumb, wait about 45 days before judging a month.
  • Double counting a repeat caller. Google does not charge again for follow-up contact from the same number or email within 15 days, so make that one row in yours too.
  • Trusting the tracking number over the customer. A caller who was referred and then searched for you arrives through paid search. When the first question reveals a referral, record the referral and note the number.
  • Mixing seasons. A heatwave quarter fills the sheet with urgent repairs, which lowers every source's replacement rate. Compare like with like.
  • Tagging by guess. If the transcript is missing, tag the call other. An untagged call is honest; a wrongly tagged one hides in your totals.

Missed calls skew all of this, because a call nobody answers has no transcript and no tag. On Local Services Ads it costs money as well: Google's page counts a missed call during business hours as a charged lead once the caller has stayed on the line for more than 20 seconds, so the source is billed for a lead your sheet never sees. Pull missed calls from the lead list each morning, ring them back, and tag them from the return call. If your office misses calls often, fix that first; the missed calls cost tutorial shows how to price the loss.

The first thirty days of tagging

  • Days 1 to 3: choose the join key, confirm which sources have tracking numbers, and add the source question to the office script.
  • Days 4 to 10: build the sheet, hand-tag 30 calls, test the prompt against them and fix its rules.
  • Days 11 to 25: tag every call each Monday, update visit outcomes and record the week's spend for each source.
  • Days 26 to 30: produce one table like the quarter above, mark every result that rests on fewer than ten sales, and choose a single change to test next.

One change at a time is the discipline that makes the numbers readable. If paid search gets a new landing page and a bigger budget in the same month, you will not know which one moved the rate. Write the change and its date in a notes column, and leave it alone for a full quarter before judging.

Recording, consent and what you keep

Tell callers that calls may be recorded, and ask your adviser about the rules that apply to you, since recording consent differs from place to place. Keep recordings and transcripts only as long as you need them for the tagging and any dispute with a lead charge. Customers' names and addresses add nothing to the tagging prompt, so leave them out when you paste, and keep the join key, the phone number, in your own sheet rather than in an AI account.

If a lead was charged but looks wrong, check the credit rules before disputing: Google keeps assessing quality for 30 days, and the plumber's evidence pack for disputing leads shows what to gather. For the wider set-up, the AI guide places call tagging alongside the other jobs an HVAC firm can automate. If you would rather map it with someone, that is what my AI implementation consultation covers.

HVAC lead sources and call tagging: questions

Which HVAC lead source books the most replacements?

There is no universal answer; it depends on your keywords, pages and referral habits. In this tutorial's illustrative quarter, referrals sold 25 replacements per 100 qualified calls and Local Services Ads about 9, but your figures will differ. Measure replacements sold per 100 qualified calls for every source you pay for.

How many sales do I need before trusting a source's replacement rate?

As a rule of thumb, treat fewer than about ten replacement sales per source as direction rather than proof, because one extra sale moves the rate a lot. Track a second quarter, and group results by the date of the call, not the date of the sale, so slow replacements are counted fairly.

Can AI listen to my recorded calls and tag them?

It works from transcripts. CallRail's pricing page lists call transcription and analysis on its Lead Tracking plan from $50 a month and automatic conversion tagging on Lead Conversion at $150, though the page carried conflicting figures. A chat assistant can also tag pasted transcripts; remove names and addresses first.

Do Local Services Ads still exist after the Google Ads move?

Google's help pages describe moving them into a Performance Max campaign type with pay-per-lead goals, starting with select home-service advertisers in August 2026 and finishing in 2027. You still pay only for valid leads. Save historical reports before your account moves, because they do not carry over; Google suggests screenshots until its download option arrives.

Further reads

Sources: Google Ads help pages on the Local Services Ads move to Performance Max pay-per-lead goals and on lead credits; Local Services Help pages on how leads work and on managing leads and jobs; CallRail pricing page. Read in October 2026.

Want to know which leads really book replacements?

On a 1:1 call we'll map how calls, visits and invoices are recorded today, set up the three tags that connect them, and decide whether your existing call tracking and job software can do the counting.

Book a 1:1 call with me