Export every customer with equipment type, install date and contact permissions; let a spreadsheet formula turn dates into ages; then pitch only the oldest group with a letter, or a text where you hold consent, offering a system health check. AI cleans notes, drafts the messages and sorts replies. You decide who is contacted and honour every opt-out.
Age is a reason to start a conversation, not a diagnosis. Plenty of 18-year-old systems run well, and the letter should say so. Expect the data to be the hard part: in the example below, more than half the records start with no install date, and about a third still have none after the rescue step. AI does four jobs in this process and none of them is the age sum: it pulls install years out of messy job notes, drafts the messages, sorts the replies and helps you spot oddities in the list.
Six stages, their tools and their time
The running example is an invented three-van HVAC firm with a service history of 1,620 system records. The numbers are illustrative, but each one is the kind of figure your own export will give you.
| Stage | Time | Tool | Output |
|---|---|---|---|
| 1: Export | About 30 minutes | Your field-service or CRM software, then a spreadsheet | One row per system, not per customer |
| 2: Rescue install dates | 1 to 2 hours, mostly reviewing | Chat assistant working on job notes | Install years with a confidence label |
| 3: Age and band | 20 minutes | Spreadsheet formulas | Band A, B or C for every dated system |
| 4: Choose recipients | 45 minutes | Filters, plus your consent records | A letter list and a smaller text list |
| 5: Draft messages | 45 minutes | Chat assistant, then Word mail merge | Letter, text and reply scripts |
| 6: Send and track | Ongoing | A tracking sheet or your CRM, plus an assistant to sort replies | Replies, checks booked, opt-outs |
Stage 1: Export the columns the maths needs
Ask your software for one row per system, because a customer with a furnace and a heat pump has two ages. These are the columns worth requesting:
| Column | Why it is there |
|---|---|
| System ID and customer ID | Lets you work without names and join the results back later |
| Equipment type | Air conditioner, furnace, heat pump or boiler; each ages differently |
| Brand and model | Shows discontinued ranges and parts problems |
| Install date or year | The key field, often blank |
| Job notes, free text | Where the missing dates hide |
| Last service date and repair spend over 24 months | A rising repair bill is a stronger signal than age alone |
| Plan member, yes or no | Members get a different message |
| Consent per channel, with date and source | Decides who can be texted or emailed |
| Do-not-contact flag | A hard exclusion |
| Owner, landlord, tenant or commercial | Stops you pitching the wrong occupant |
Keep names, phone numbers, emails and street addresses in a master sheet that never goes near an AI tool. The working copy has IDs, equipment, dates and notes. Job notes sometimes contain a surname or a door code, so skim them before pasting any into an assistant. For duplicate customers and inconsistent spellings, my older tutorial on cleaning messy data covers the spreadsheet side.
Stage 2: Rescue install dates from job notes
In the example, 700 of the 1,620 systems have an install date. A further 380 have a job note that mentions one. An assistant can read those notes and propose dates, if you tell it what not to infer:
For each job note below, extract: equipment type, install year, and a confidence label (confirmed, customer-stated, estimated, none).
Use only the note. Do not infer an age from words like "old". A repair date, a thermostat change or a warranty registration is not an install date unless the note says it is.
Return a table with the exact words you used for each answer.
1. "New 3-ton split fitted March 2013 by our team, 5 yr parts warranty registered"
2. "Condenser is original to house, builder says built 2008"
3. "Replaced capacitor. Unit approx 12 yrs old per customer"
4. "Furnace swapped Oct 2017 (gas valve earlier in year)"
5. "Upgraded thermostat 2021. System looks old."
A sound answer: note 1 is an air conditioner, 2013, confirmed ("fitted March 2013 by our team"). Note 2 is a condenser, 2008, estimated, because a builder's date for the house is not an install date. Note 3 is unknown equipment, about 12 years old per the customer, so a customer-stated age. Note 4 is a furnace, 2017, confirmed. Note 5 is none. A weaker draft gives 2021 as the install year for note 5, because it grabs the only year in the line. That is the mistake to look for, since a thermostat swap would make a system the customer calls old look five years old.
Review every row. Of the 380 notes, 330 were accepted and 50 rejected as ambiguous, which leaves 1,030 dated systems and 590 undated. Mail only on confirmed or customer-stated dates. Estimated dates go on a list for a technician to photograph the data plate at the next visit. Do not ask an assistant to decode serial numbers into manufacture dates: each brand encodes them differently and the formats change between years, so use the manufacturer's own decoding guide.
Stage 3: Turn dates into age bands you can defend
First hunt for impossible dates, because one typo can put a 2013 system in the oldest band. An assistant is quick at this when you ask a narrow question:
Below are rows of: row number, brand, equipment type, install year. List only the rows that look wrong: install years in the future or before 1970, brand names that look misspelt, and equipment types that do not match the brand's range. Give the row number and the reason. Do not correct anything.
A typical result from the example list: row 214 has an install year of 2031 (probably 2013), row 530 has a brand spelt "Cariier", and row 887 gives an age of 61 years (probably 2016 typed as 1956). That is three corrections in a minute, and you make them yourself from the job record, not from the assistant's guess.
Bands then need thresholds, and a guess is hard to defend. ServiceTitan, which sells field-service software, published age-at-replacement benchmarks in June 2026, drawn from its contractor customers' equipment records. They are the vendor's figures, and they describe when equipment tends to be replaced, not when it fails: the article does not say whether the units were still working, and it warns that the figures are not representative of the whole trade, come from contractor-entered install dates, and vary with usage, maintenance and climate. Treat them as a starting point:
| Equipment | 25th percentile (years) | Median (years) | 75th percentile (years) |
|---|---|---|---|
| Furnace | 12.8 | 17.7 | 22.3 |
| Air conditioner or condenser | 10.6 | 15.3 | 21.0 |
| Heat pump | 9.1 | 13.3 | 18.0 |
| Boiler | 10.5 | 18.0 | 25.1 |
My bands: A is younger than the 25th percentile, B runs from there to the median, and C is the median or older. The article lists other equipment too, but for anything outside these four rows, use your own replacement history. With install dates in column F, ages in column G and the equipment type typed as AC, Furnace, Heat pump or Boiler in column B, the formulas are below; any other type comes back as "Own history" instead of being forced into the wrong band. If you only know the year, enter 1 July of that year so the age is never more than six months out.
G2: =YEARFRAC(F2,TODAY())
H2: =IF(B2="AC",IF(G2>=15.3,"C",IF(G2>=10.6,"B","A")),IF(B2="Furnace",IF(G2>=17.7,"C",IF(G2>=12.8,"B","A")),IF(B2="Heat pump",IF(G2>=13.3,"C",IF(G2>=9.1,"B","A")),IF(B2="Boiler",IF(G2>=18,"C",IF(G2>=10.5,"B","A")),"Own history"))))
After a year, replace the borrowed thresholds with your own. List the ages of the last 40 systems you replaced, then use =PERCENTILE(range,0.25) and =MEDIAN(range) for each equipment type. In the example, the 1,030 dated systems fall into 560 in band A, 290 in band B and 180 in band C. Band C is the pitch list, band B gets a lighter touch, and the 590 undated systems wait for a data-plate photo.
The undated 590: let the next visit fill the gaps
Do not chase 590 customers to ask how old their system is. Change what technicians do on every visit instead. The routine is simple: photograph the data plate, attach the photo to the job, and record the brand, model and serial number. Where the plate prints a manufacture date, record that as well. Once a week, someone transcribes the photos into the sheet. An assistant can read a plate photo and propose the fields, but compare every serial number against the photo, because characters such as 0 and O or 8 and B are easy to misread and a wrong serial produces a wrong age. Within a year the undated group shrinks without a single phone call.
Stage 4: Decide who gets which message
Band C is a candidate list, not a mailing list. Remove anyone who should not hear from you:
| Exclusion | Systems removed |
|---|---|
| Second system for a customer already on the list (one letter per household) | 12 |
| Opted out or flagged do-not-contact | 9 |
| Commercial customers, handled by someone else | 14 |
| Quoted or replaced in the last 12 months | 11 |
| No usable address, or marked as tenant | 6 |
That removes 52 of the 180, leaving 128 letters. Sort the 128 by repair spend over the last 24 months, highest first, and send those in the first batch, since recent repair bills are the clearest practical reason for a customer to consider replacing. Of the 128, 49 have documented consent to marketing texts, so they receive a text ten days after the letter. Band B customers are not pitched a replacement. Their ordinary service reminder gains one line, such as "Your system was fitted around [year], which is an age where a short check can catch worn parts early and help you plan ahead", which is also useful to the customer. For timing the mailing around the seasons, see my tutorial on a worked spring and autumn tune-up campaign.
Stage 5: Draft the letter and the text
The prompt does most of the work, because the rules in it are what keep a replacement pitch honest:
You write customer letters for a three-van HVAC company.
Write one letter of 150 words or fewer to a customer whose air conditioner was fitted around [year].
Offer a fixed-price system health check at $[price], credited against any replacement quote.
Rules: plain language. Say "our records show around [year]" and invite corrections. Never say the system is failing. Never promise savings or lower bills. No urgency words such as "act now" or "limited time". Say clearly there is no obligation to replace anything.
End with how to book (reply, call [phone] or scan the code, quoting [reference]) and how to stop receiving letters.
An unguarded first draft slipped in two sentences nobody could support: "systems older than ten years are at risk of sudden failure" and "customers typically save up to 30% on energy bills". Both are the kind of claim that turns a helpful letter into a complaint. They come out, and the rules in the prompt now forbid them. A cleaned-up letter, with placeholders, reads:
Dear [first name], our records show we fitted or serviced the air conditioner at your home around [year]. Systems of that age often still run well, but repair costs and efficiency can change, and it is easier to plan a replacement than to rush one in the middle of summer. We offer a short health check for $[price]: we test performance, look at the condition of the key parts and give you a written note on what we found, including whether we would repair, monitor or replace. There is no obligation to replace anything, and the fee is credited against a quote if you decide to go ahead. To book, reply to this letter, call [phone] or scan the code, quoting [reference]. If you would rather not receive letters like this, tell us and we will stop. [your name], [firm name]
The text version has a hard length limit. This one is 154 characters when a six-letter first name, a five-letter sender name and an eighteen-character firm name are filled in, which is one 160-character segment:
Hi [first name], [your name] from [firm name]. Our records show your system was fitted around [year]. Want a quick health check? Reply CHECK, or STOP to opt out.
Assistants like curly apostrophes and the occasional emoji, and either can triple the cost of a text. Twilio's glossary on SMS character limits puts a single text at 160 characters in the standard GSM-7 set; one character outside that set switches the whole message to UCS-2 encoding, which allows 70 characters, or 67 a segment once a message is split. The same 154 characters then becomes three billed segments. Ask for plain straight apostrophes, or let your texting tool show you the segment count before sending.
For the letter run, use Word's mail merge, with merge fields for first name, address, year and reference, and print one proof before the batch. The reference should differ for each letter so that every reply can be traced to a system.
Consent and opt-out rules to settle before anything is sent
Rules differ by place, by channel and by whether the person is an existing customer, so ask your data-protection adviser or a lawyer which apply to you. These habits hold up in most places, and they cost little:
| Channel | Check before sending | Safe default |
|---|---|---|
| Letter | Do-not-mail flags, tenant or landlord status, a way to stop receiving them | Add a plain opt-out line and record opt-outs the day they arrive |
| Whether you hold consent for marketing, and a working unsubscribe link in every message | Send marketing email only to customers who agreed to it, and honour unsubscribes at once | |
| Text | Documented consent to marketing texts, with date and wording shown | Treat consent as required, say how to stop in every text, and apply STOP across all marketing channels |
- Keep a consent record per customer and channel: yes or no, the date, where it was given and the wording they saw. A tick in a column is not evidence.
- An opt-in is not permanent. If a customer agreed years ago and has not heard from you since, re-confirm before marketing.
- Service reminders and sales pitches are different. In many places a message that mixes the two counts as marketing, so keep the health-check offer out of reminders sent to people who did not agree to marketing.
- Do not extend the list. Stay with customers who know you, and do not buy contacts.
- Send at sensible hours, and never ring or text to chase a letter that went unanswered unless the customer opted in to that channel.
My tutorial on drafting marketing texts with AI and checking the consent rules goes further on the texting side. Nothing here is legal advice, and I would rather you ask once than learn from a complaint.
Stage 6: Send in batches and track every reply
Send 40 to 50 letters a week rather than 128 at once. A smaller batch means you can answer every reply the same week, spot a problem in the wording early and stop if complaints appear. Track each letter in a sheet:
| Reference | Band | Letter sent | Text sent | Reply | Check booked | Outcome | Opt-out date |
|---|---|---|---|---|---|---|---|
| HV-0412 | C | Week 1 | Day 10 | Booked a check | Week 2 | Quote sent | |
| HV-0413 | C | Week 1 | No consent | None | Re-contact in 6 months | ||
| HV-0417 | C | Week 1 | Day 10 | STOP | Removed from marketing | Week 2 |
Have three reply scripts ready before the first letter lands, drafted once with an assistant and approved by whoever answers the phone:
Wants a check: Thank you, [first name]. We can come on [day] between [time] and [time]. The check takes about [length of visit] and you will get a written note afterwards. If your system turns out to be fine, we will say so.
Asks for a rough price: A fair price depends on the size of your home and the system you choose, so we do not quote over the phone or by message. The health check gives us what we need to give you a written figure, and the fee is credited if you go ahead.
Opt-out: We have removed you from our marketing messages, [first name], and you will not hear from us about this again. If you have booked work with us, you may still receive messages about that visit.
Replies arrive in all shapes, and an assistant can sort them into a fixed list of categories: wants a check, wants a quote, question, not now, opt-out, wrong person. This sample batch shows where it goes wrong:
- "Yes please, can you come Thursday morning?" was sorted as wants a check, which is right.
- "Not interested right now, ask me again in March" was first sorted as an opt-out. It is "not now": diarise March.
- "Please stop sending these" was first sorted as "not interested". It is an opt-out, to be applied the same day.
- "Who is this? I rent, the landlord handles the boiler" was sorted as a question. It is a wrong-person reply: mark the record as tenant and take it off the list.
- "How much would a new one cost roughly?" was sorted as a question, which is right, but an assistant must not answer it. A person replies with the health-check offer, because a price needs a survey.
The fix is a rule in the sorting prompt: any message containing stop, unsubscribe, remove or "don't contact" goes to a person as a possible opt-out, and a doubtful case is treated as an opt-out for marketing. A wrongly honoured opt-out costs one lost conversation. A wrongly ignored one can cost much more.
A first batch in numbers
Here is a sum for the 128 letters, using assumptions you should replace with your own as soon as the first batch teaches you better. Print and postage at $1.10 a letter is $141. Say 8% reply, which is about 10 replies, and 7 of them book a health check. A technician's hour per check at a loaded $55 is $385. That is $526 spent for 7 checks, or about $75 per booked check. If 3 checks become quotes and one becomes a $9,000 replacement, the batch has paid for itself several times over, even at a modest margin. If none does, you have lost about $526 and learned how your list behaves, which is cheap data.
The sum is not a forecast. It is a way to decide, before sending, what result would make you do a second batch and what would make you stop. Write those two numbers down. When a booked check turns into a quote, the follow-up matters as much as the letter, and my tutorials on good-better-best HVAC pricing and on following up after a quote cover the next two steps.
Checking it worked after six weeks
Review five numbers: the reply rate, checks booked, quotes sent, replacements sold and opt-outs. Add one judgement: did any reply suggest the letter was pushy or wrong about the system? Compare the cost per booked check with your normal cost of winning a replacement lead. If opt-outs or complaints run above about 3 in 100 letters, which is my own rule of thumb rather than a standard, rewrite the letter before the next batch. Then re-run the export each quarter, apply the opt-out list first, and let the ages roll forward.
Questions about replacement outreach
Do I need an AI tool for this, or is a spreadsheet enough?
A spreadsheet does the age sums, the banding and the sorting. AI earns its place on the messy parts: pulling install years out of thousands of free-text job notes, drafting messages in a consistent tone, and sorting replies. If your records are clean and you have a few hundred customers, start with the spreadsheet alone and add an assistant for the drafts.
Should the letter state the system's age?
Yes, but honestly. Write 'our records show a system fitted around 2012' and invite the customer to correct you. Dates from job notes are often estimates, and a letter that gets the age wrong or implies the system is failing damages trust faster than it wins work. Use the age as the reason for a health check, not as a verdict.
How often should I rerun the list?
Quarterly is enough, because ages move slowly. Add a cooling-off rule so nobody receives the same pitch twice in twelve months unless they asked for a quote, and always apply the opt-out list before any new batch. Rerunning also picks up new install dates your technicians have recorded since the last export.
Can I use the same list to sell maintenance plans?
You can, with a different message to a different segment. Customers in the younger bands without a plan are the natural audience for a plan offer, and customers in the oldest band are the audience for a health check. Keep them separate so no household receives two competing pitches, and check the consent rules for each channel again.
Further reads
- AI Service Plan Reminders for Heating and Cooling Customers — Keep plan members in touch before and after a replacement pitch.
- HVAC Lead Generation: AI Call Tags Show Which Sources Book Replacements — See which lead sources actually book replacements.
- AI Receptionist for HVAC Companies: Route Sales Calls, Not Just Repairs — Seven call types and where each goes, phrases that signal a replacement lead, a four-question qualifier, a warm-transfer script and a worked month of calls.
- AI Tools and AI Development: The Complete 2026 Guide — the AI hub, including every tutorial in the AI-for-business series.
Sources: ServiceTitan's equipment replacement lifespan benchmarks (published 19 June 2026); Twilio's glossary on SMS character limits (checked October 2026).