Every HVAC contractor knows the seasonal campaigns they should be running. Spring tune-up promotions before cooling season. Heating system check offers before the first cold snap. The logic is obvious and the timing is predictable. The problem is execution: by the time the owner of a 15-to-20-truck operation, fielding 20 or more inbound calls a day, gets around to drafting the campaign message, building the customer list, and scheduling the sends, the best window has already passed by two or three weeks.
Seasonal HVAC marketing has a narrow effective window. A cooling season tune-up campaign that goes out on May 1st when homeowners are just starting to think about their air conditioning captures attention when the timing feels natural. The same campaign sent on June 15th, after two weeks of hot weather have already driven emergency calls and scheduling is full, is nearly useless. The business that captures the tune-up slot in April keeps that customer off the emergency call list in July. The one that markets too late converts nobody and scrambles anyway. That missed customer is still in Jobber, but as a reactive emergency call instead of a scheduled maintenance visit at a predictable flat rate.
This article walks through how to set up a fully automated seasonal campaign that launches six weeks before each peak season, segments your customer list by relationship type, sends personalized messages to each segment, and follows up automatically with non-responders without anyone on your team doing anything manually. You build it once, and it runs every season on schedule, whether your jobs are tracked in Jobber, Housecall Pro, or any other field management platform.
TL;DR
- Seasonal HVAC campaigns are most effective when sent six weeks before peak season, not after demand has already arrived.
- Most operators send campaigns late because manual execution requires time the owner does not have at the right moment.
- A scheduled trigger fires six weeks ahead of each season and automatically segments customers into three groups.
- Agreement holders, single-service customers, and lapsed customers receive different messages matched to their relationship with your business.
- Non-responders receive a follow-up email with a different angle five days after the initial SMS.
- Warm leads who still have not booked receive a personal CSR call task at the end of the sequence.
- HVAC contractors running 10 or more trucks and handling 20 or more inbound calls per day see the clearest return from this automation.
How Does an Automated Seasonal Campaign Launch Work?
Automated seasonal HVAC marketing fires a scheduled trigger six weeks before peak season, segments the contact list by customer relationship type, sends personalized SMS messages to each group, and runs a follow-up sequence for non-responders automatically. ServiceAgent handles this through its Workflow Builder, running segmentation, message generation, and follow-up without manual input.
Why Seasonal Campaign Timing Is Everything in HVAC
Most HVAC contractors handle seasonal campaigns manually today: the owner or office manager builds the customer list by exporting from Jobber or scrolling through Housecall Pro, writes one generic message, and sends it through their texting tool when they find a spare hour. With front-desk turnover and a full dispatch board, that spare hour rarely comes at the six-week mark. The campaign goes out late, the optimal window closes, and the pre-season slots that should have filled in April end up as scrambled emergency calls in July.
The HVAC service calendar is not evenly distributed across the year. Demand concentrates in two periods: the weeks leading into cooling season (typically late April through June) and the weeks leading into heating season (typically mid-September through November). Within each of those windows, there is a sweet spot where marketing converts efficiently because customers are thinking about their systems but have not yet been forced into action by a failure or extreme temperature.
A tune-up campaign sent in early April reaches customers who have the mental bandwidth to schedule a non-urgent appointment. They look at the message, remember that their system has not been serviced in 18 months, and book a slot three weeks out. That is a low-friction, high-margin job for your team because it is scheduled in advance and requires no emergency dispatch. A campaign sent in late June reaches customers who are already dealing with a system that is struggling under summer heat. They are not booking tune-ups at that point. They are calling for emergency service from whoever picks up first.
Six weeks of lead time also gives you operational runway. If the campaign drives a significant booking surge, you have six weeks to adjust technician schedules, confirm parts availability, and extend booking windows rather than turning customers away. Without that runway, a successful campaign becomes an operational problem.
Understanding the Three Customer Segments
The most common mistake in HVAC seasonal campaigns is sending a single message to the entire customer list. Maintenance agreement holders, single-service customers, and lapsed customers have completely different relationships with your business and respond to completely different messages.
Agreement holders are already on a maintenance agreement with your operation and trust you for recurring service. Sending them a tune-up promotion feels redundant because they know their tune-up is coming as part of their agreement. The right message for this group is a seasonal readiness reminder: “Your system is covered and your spring maintenance is scheduled. Here’s what our techs check during a cooling tune-up and why it matters this season.” It reinforces the value of their maintenance agreement rather than trying to sell them something they already have.
Single-service customers have used your business at least once but have not committed to an agreement. They are the warmest segment outside of agreement holders. Their message can be more direct: “You worked with us last year on [service type]. Before cooling season hits, now is the best time for a system check at a member rate. Book before [date] for priority scheduling.” The key is referencing the prior relationship without assuming they remember every detail of it.
Lapsed customers, those who have not booked in more than 12 months, need a different approach entirely. They may have moved to a competitor or simply drifted. A seasonal campaign to this group is effectively a re-engagement offer: “It has been a while since we serviced your system. Before this summer’s heat, here is a discounted tune-up to make sure you are covered. No commitment, just one good visit.”
Introducing the Workflow Builder
The Workflow Builder is a visual drag-and-drop canvas inside ServiceAgent where you build automated sequences that fire the moment a trigger event occurs. For seasonal campaigns, the trigger is a scheduled date: February 15th for cooling season and September 1st for heating season. When the trigger fires, the workflow segments your contact list, generates three personalized message variants, distributes them by SMS, and runs a follow-up sequence for non-responders. You configure it once and it launches automatically at the right moment each season.
| Trigger | What fires | What it does |
|---|---|---|
| Scheduled (February 15) | AI Analyze, AI Generate, Send SMS, Wait 3 Days, AI Decision | Launches the cooling season campaign, segments contacts into three groups, sends personalized SMS, and routes non-responders into an email follow-up sequence. |
| Scheduled (September 1) | AI Analyze, AI Generate, Send SMS, Wait 3 Days, AI Decision | Launches the heating season campaign with the same node structure and season-specific message content, following the same segmentation and follow-up logic. |
What Does the Seasonal Campaign Workflow Look Like?
Campaign Launch
Trigger: scheduled (February 15 for cooling season / September 1 for heating season)
What it does: Fires on the preset date and initiates the seasonal campaign sequence, six weeks ahead of the peak period, for the entire active contact list.
Why it matters: The trigger eliminates the dependency on the owner remembering to launch the campaign at the right time. In a busy HVAC operation in mid-February, launching a spring campaign is not the top priority. The scheduled trigger makes sure it happens at the optimal moment regardless of what else is going on.
What you do: Create two instances of this workflow: one set to trigger on February 15 for the cooling season campaign and one set to trigger on September 1 for the heating season campaign. Each instance can use the same node structure but with season-specific message content. Set both triggers to fire at 8:00 AM in your local timezone.
What to check: Set the trigger one week early on a test run to confirm the workflow initiates correctly. Verify both workflow instances are active and will fire at their respective dates. Check that neither trigger is set to “run once” if you want them to repeat annually, or confirm the recurrence setting is set to yearly.
Node 1: AI Analyze
What it does: Segments the full contact list into three groups based on CRM relationship data: Agreement Holders (active maintenance agreement), Single-Service (at least one completed job, no active agreement, last visit within 12 months), and Lapsed (no booking in more than 12 months).
Why it matters: Segmentation is the difference between a campaign that feels personal and one that feels like a mass blast. A contact who has been on a maintenance agreement for three years should not receive the same message as someone who called once two years ago and never came back. The AI Analyze segmentation uses real CRM data to sort the list correctly before any message is generated.
What you do: Configure AI Analyze to pull from the contact database and apply three filters: Agreement Holder (Agreement Status field equals Active), Single-Service (Visit Count greater than or equal to 1, Last Visit Date within 12 months, Agreement Status not Active), and Lapsed (Last Visit Date more than 12 months ago or no visit date on record). Output the three segment lists with contact IDs and CRM field data for use in the AI Generate node.
What to check: After the analysis runs on a test batch, pull the segment counts and verify they match your understanding of your customer base. If all contacts are landing in a single segment, check whether the Agreement Status and Last Visit Date fields are consistently populated in your CRM.
Node 2: AI Generate
What it does: Creates three distinct SMS message variants, one per segment, each referencing the season, the appropriate offer framing, and a clear call to action with a booking link or phone number.
Why it matters: Segment-specific messaging outperforms generic campaigns in booking conversion rate. A maintenance agreement holder receiving a message about “locking in a tune-up slot” will be confused because their slot is already locked in. That confusion reduces trust and response rate. Messages matched to each customer’s actual status with your business convert at two to three times the rate of a single generic message sent to everyone.
What you do: Configure AI Generate to produce three outputs in a single prompt. Message for Agreement Holders: 120 to 140 characters, referencing their covered maintenance, previewing what the technician checks during the seasonal tune-up, and confirming their scheduling priority. Message for Single-Service customers: 130 to 150 characters, referencing the prior service relationship, naming the seasonal offer (discounted tune-up at member rate), and including a booking link. Message for Lapsed customers: 130 to 150 characters, acknowledging the time gap warmly without making them feel guilty, presenting a specific discounted offer, and including the booking link. All three messages should avoid urgency language that feels aggressive (“Act now before it’s too late!”) and instead use calendar logic (“Before the heat arrives, here is when to book.”).
What to check: Review all three generated message variants before the first live campaign. Confirm each is within SMS character limits. Read each message aloud: it should sound like a text from a business you trust, not a promotional blast.
Node 3: Send SMS
What it does: Delivers the appropriate segment-specific SMS message to each contact in the corresponding segment list.
Why it matters: SMS is the highest-response channel for time-sensitive service offers. Open rates for SMS in home services run above 90 percent, and response rates for seasonal tune-up offers via SMS typically outperform email by 3 to 4 times. Getting the campaign message into the customer’s phone via text is the highest-value distribution step in the sequence.
What you do: Connect three Send SMS nodes in parallel, each tied to one segment’s AI Generate output and one segment’s contact list from AI Analyze. Set send time to 9:00 AM local time to avoid early-morning deliveries. Include opt-out language at the end of each message as required by SMS compliance regulations in your region.
What to check: Before launching the live campaign, send the three message variants to internal test contacts representing each segment. Verify the correct message goes to the correct segment. Check that the booking link in the SMS is functional and points to the correct service type on your booking page.
Node 4: Wait 3 Days
What it does: Holds the workflow for 72 hours after the initial SMS send before checking which contacts have responded or booked.
Why it matters: Most SMS responses to service campaigns come within 24 to 48 hours of delivery. Waiting 3 days before checking response status gives contacts adequate time to act without marking non-responders prematurely.
What you do: Add a Wait node set to 72 hours after the Send SMS node. No configuration beyond the wait period is required.
What to check: Confirm the Wait node countdown starts from the time of SMS delivery, not the time the workflow was initiated. If contacts are in different time zones, verify the wait calculation uses the correct reference point.
Node 5: AI Decision
What it does: Checks each contact’s status after the 3-day wait period. Contacts who responded to the SMS or booked an appointment are routed to Path A (close and tag). Contacts who have not taken action are routed to Path B (email follow-up).
Why it matters: The follow-up sequence is where significant additional bookings are captured. Not every customer who is interested in a tune-up will respond to the first SMS, especially if they received it during a busy moment. A second touchpoint via a different channel with a different angle captures a meaningful percentage of contacts who were interested but did not act on the first message.
What you do: Configure AI Decision to check the CRM for each contact in the campaign for two conditions: has the contact replied to the SMS campaign, or has a new appointment been booked for this contact in the last 72 hours. If either condition is true, route to Path A. If neither is true, route to Path B.
What to check: After the first live campaign decision run, compare the Path A count (responded or booked) against your SMS response data to verify the decision logic is correctly identifying responders. If Path B is capturing contacts who actually booked, check the appointment detection logic in the decision node.
Path A: Responded or Booked
Path A summary: Tag the contact as “Campaign Converted” in the CRM and close this instance of the workflow. No further automated messages are sent to this contact for this campaign cycle.
Send SMS → Wait 3 days → AI Decision → Update CRM (tag "Campaign Converted")
Path B: No Response (Email Follow-Up)
Node 6B: Send Email
What it does: Sends a follow-up email to non-responders with a different angle from the initial SMS: either a seasonal offer framing (what happens if a system is not serviced before peak season) or urgency framing (limited appointment slots available before the peak period).
Why it matters: Email allows for longer-form communication than SMS. A non-responder who did not act on a 140-character text may respond to a more detailed email that explains the specific value of a pre-season tune-up. The different channel and different message angle give the contact two distinct reasons to convert rather than repeating the same message twice.
What you do: Configure Send Email with segment-specific email content generated by AI Generate for each of the three segments. The email angle should differ from the SMS: where the SMS led with an offer, the email can lead with an educational angle (what your technician checks during a cooling tune-up and what they commonly find on systems that have not been serviced). Include the booking link prominently and an option to call directly. Subject line should reference the seasonal timing, not the discount.
What to check: Check that the follow-up email is not being sent to contacts who already booked but whose appointment data may not have synced before the AI Decision check. Add a manual review of the Path B list for the first campaign cycle to catch any edge cases.
Node 7B: Wait 5 Days
What it does: Holds the workflow for 5 days after the email send before a final response check.
What you do: Add a Wait node set to 5 days. No additional configuration needed.
What to check: Confirm the wait period calculates from email delivery time, not workflow initiation time.
Node 8B: AI Decision
What it does: Checks whether Path B contacts have responded or booked after the email follow-up. Contacts who responded are tagged “Campaign Converted” and the workflow closes. Contacts who still have not responded are routed to the final step.
What you do: Same decision logic as Node 5, checking for SMS reply, email reply, or new appointment booking within the past 5 days. Route responders to close. Route non-responders to Create Task for warm leads or to workflow archive for cold leads.
What to check: Verify the decision correctly identifies email replies and appointment bookings, not just SMS responses. Test with a contact who replies by email only.
Node 9B: Create Task (Warm Leads Only)
What it does: Creates a personal CSR call task for non-responding contacts who have a history of two or more prior visits, flagging them as warm leads worth a personal outreach.
Why it matters: Contacts with multiple prior visits who have not responded to two campaign touchpoints are not necessarily uninterested. They may be busy, traveling, or waiting until closer to the season. A personal call from the CSR, mentioning their service history and offering to hold a slot, converts a meaningful portion of this group because the personal touch differentiates from the automated messages they have already received.
What you do: Configure Create Task with the condition that the contact has a Visit Count of 2 or more. Task text: “Personal call: [contact name] received two campaign touchpoints with no response. They have [visit count] prior visits. Call to offer seasonal tune-up, mention their last service date. Do not reference the automated campaign.” Assign to CSR. Due within 3 business days.
What to check: Verify the Visit Count condition is filtering correctly. Contacts with a single prior visit should not receive a call task, only the archive tag.
Path B workflow summary:
AI Decision (no response) → Send Email → Wait 5 days → AI Decision → Create Task (warm leads) | archive (single-visit only)
Full campaign workflow summary:
scheduled → AI Analyze → AI Generate → Send SMS → Wait 3 days → AI Decision → [Path A: tag converted] | [Path B: Send Email → Wait 5 days → AI Decision → Create Task or archive]
What Changes After Running Automated Seasonal Campaigns for Two Full Cycles?
After two full seasonal cycles, typically one cooling season and one heating season, patterns begin to emerge that reshape how you think about your customer list. You will see precisely which segment drives the highest booking conversion rate from SMS alone, which segment requires the email follow-up to convert, and which segment consistently does not respond to any automated touchpoint. Each of those insights drives a more refined campaign for the next cycle.
Booking distribution also changes. Operators who run pre-season campaigns successfully typically see their shoulder-season calendar fill 60 to 70 percent before peak demand arrives. That means fewer emergency calls in July and August because customers who might have had failures during the heat peak had their systems serviced in April or May. It also means more predictable revenue in the calendar months that would otherwise be slow.
The CSR team benefits as well. When warm lead call tasks are created automatically, CSRs have a prioritized call list ready without spending time manually identifying who to call. The list is pre-filtered by visit history, which means call time goes to the contacts most likely to convert, not to cold contacts who have not engaged with the business in years.
Why ServiceAgent Handles This for HVAC
An HVAC contractor planning a seasonal campaign manually has to build the contact list, write the message, schedule the send, track the responses, send the follow-up, and create the call tasks. Each of those steps takes time, and the dependency chain means a delay at step one pushes every subsequent step out. Instead of managing this across a 6-tool stack of your texting platform, CRM, email tool, and scheduling system, the Workflow Builder compresses it into a single configured automation.
HVAC contractors running automated seasonal campaigns through ServiceAgent save 10 or more hours per week on front-office admin, the result of removing list-building, message scheduling, and follow-up tracking from the manual workload. That recovered time goes back to the CSR team handling warm lead calls and inbound booking instead of campaign logistics.
The segmentation is automatic. The message generation is automatic. The follow-up logic is automatic. The call task creation is automatic. The owner’s role in the campaign is to configure it once, review the AI-generated message variants before the first live run, and read the booking conversion report afterward.
For HVAC specifically, the seasonal nature of the business creates clear, repeating campaign opportunities that are ideal for automation. Cooling season and heating season happen every year on a predictable calendar. Configuring the automation once and letting it run for years produces compounding returns: the workflow improves as the contact list grows cleaner, the message variants get refined based on conversion data, and the business stops losing the early-window bookings to late execution.
Frequently Asked Questions
How far in advance should I set the scheduled trigger for each season?
Six weeks is the optimal lead time for most HVAC markets. This gives customers enough time to schedule a non-urgent tune-up before peak demand, while the topic is still timely rather than premature. In markets with early spring heat, five weeks may be sufficient. In markets with mild shoulder seasons, seven weeks can extend the conversion window.
What should I do if I have customers who opt out of SMS campaigns?
ServiceAgent respects opt-out status automatically. Contacts who have opted out of SMS will not receive the initial text message but will still be eligible for the email follow-up in Path B if their email opt-in status is active. Check your contact compliance settings to confirm this routing is configured correctly.
Can I run both the cooling and heating season campaigns from the same workflow?
They can share the same node structure but should be separate workflow instances with different trigger dates and season-specific message content. Running them as one workflow with conditional logic for the season introduces complexity that increases the risk of the wrong message going to the wrong contacts. Keep them as two clean, separate workflows.
Is this workflow right for my size of HVAC operation?
HVAC contractors handling 20 or more inbound calls per day and running 10 or more trucks get the clearest return from this workflow. At that volume, campaign execution falls through the cracks because the owner is managing the dispatch board, handling escalations, and tracking technicians across the service territory, and no one with the right context has time to build the list and write the message at the six-week mark. Smaller operations can run it with fewer nodes, the trigger logic stays the same, the output volume is lower.