A cancellation comes in at 8am. Your tech just loaded the truck. You have a two-hour slot going empty, a customer you may never hear from again, and a dispatcher who’s already fielding the day’s first calls. What happens in the next four hours determines whether that job gets recovered or quietly disappears from your revenue.
Most HVAC operations handle this manually. A CSR calls the customer back, leaves a voicemail, and waits. The customer calls someone else. The slot stays empty.
TL;DR
- Why cancellations cost more than the job: An empty slot isn’t just lost revenue: it’s an idle tech, a scrambled dispatcher, and a customer you didn’t re-engage before they called a competitor.
- Why the standard fixes don’t work: CSR callbacks hit voicemail, and reminder tools don’t do anything after a cancellation fires. They only try to prevent it.
- The workflow that changes this:
appointment.cancelledtriggers an immediate AI-generated reschedule offer via SMS, a 4-hour wait, then a branch: confirmation if they respond, email follow-up and backfill task if they don’t. - How to set it up: Build it once in ServiceAgent’s Workflow Builder in under 30 minutes. Every future cancellation runs through it automatically, around the clock.
- What changes: Reschedule rates improve, idle slot time drops, and your team stops spending mornings chasing cancellation callbacks that rarely close.
How Does Automatic HVAC Cancellation Handling Work?
When a customer cancels an HVAC appointment, an automated workflow fires immediately on the appointment.cancelled trigger. The workflow sends a personalized reschedule offer via SMS within seconds, waits for a response, then branches: if the customer reschedules, the new booking confirms automatically. If they don’t respond within four hours, an email follow-up goes out and a backfill task is created for the dispatcher. No staff involvement required at any step.
Why Do HVAC Cancellations Cost More Than Just the Job?
A cancellation on paper looks like one missed job. In practice it’s a chain of losses.
Your tech was dispatched. The truck is loaded. A slot that could have gone to another customer two days ago is empty at 8am. The dispatcher has to decide whether to redeploy the tech, compress the remaining schedule, or absorb the gap. That decision takes time and creates friction across the rest of the day.
The customer who cancelled is also still in play, for now. They may need a service agreement. They may have a furnace check due in October. If no one reaches them with a reschedule offer before they’ve found a competitor, that relationship is gone. Not just this job.
Then there’s the CRM gap. If no one updates the cancelled appointment record, the job sits in a grey zone. No re-engagement fires. No one follows up. The customer gets lumped with “closed lost” even though they weren’t necessarily done with you. They just needed a different time.
The revenue math doesn’t require invented numbers. A residential HVAC call runs $200 to $400. The follow-up revenue from that customer over five years (maintenance agreements, parts, system replacement) is the number that actually stings when you leave it on the table.
Why the Standard Approach Doesn’t Work
When a cancellation comes in, most HVAC operators do one of three things.
The CSR callback. Someone calls the customer back, explains you’d love to reschedule, and leaves a voicemail. The customer is already looking at your competitor’s Google listing. By the time they hear the voicemail, they may have already booked someone else. And if your CSR is fielding 20 calls that day, a cancelled job callback isn’t the top priority.
The reminder-only approach. Automated appointment reminders are worth running, they reduce cancellations. But reminder tools don’t handle what happens after a cancellation fires. They’re preventative. Once the appointment.cancelled event occurs, the reminder system has nothing left to do.
Waiting to see if they call back. The job disappears from the board. If the customer circles back on their own, great. Most don’t.
The gap isn’t in prevention. It’s in the four hours after a cancellation, when the customer is still deciding whether to reschedule with you or find someone new.
| Option | Responds immediately | Sends reschedule offer | Branches on response | Creates backfill task | Updates CRM |
|---|---|---|---|---|---|
| CSR manual callback | No (delayed) | Manually, if reached | No | No | Manually |
| Reminder-only tool | No (pre-appointment only) | No | No | No | No |
| Basic scheduling software | No | No | No | No | Manually |
| ServiceAgent Workflow Builder | ✓ Yes (seconds) | ✓ Yes (AI-generated) | ✓ Yes (automatic) | ✓ Yes (automatic) | ✓ Yes (automatic) |
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. Each workflow starts with a trigger (the event that kicks everything off) and moves through a series of nodes (individual actions the system takes without any human involvement).
For HVAC cancellations, the trigger is appointment.cancelled. The moment a cancellation is logged in your CRM, whether a CSR takes the call, the customer uses a self-serve link, or a tech marks a no-show in the field app, the workflow starts. It generates a personalised reschedule offer, sends it immediately, waits for a customer response, then branches automatically based on what happens next. Operators who run this full sequence save over 10 hours per week previously spent on manual cancellation callbacks, backfill scrambles, and CRM cleanup. You build it once. After that, it runs on every cancellation automatically.
What Happens Automatically When a Cancellation Triggers?
This workflow fires the moment appointment.cancelled triggers. It runs regardless of whether your office is open, regardless of who logged the cancellation, and regardless of whether the dispatcher has seen it yet.
The trigger: appointment.cancelled
What it does: Fires the moment a job is moved to “Cancelled” status in ServiceAgent, whether by a CSR taking the customer’s call, a customer using a self-serve scheduling link and choosing to cancel, or a tech marking a no-show from the field app.
Why it matters: This is the earliest possible point to act. Every minute between the cancellation and your first outreach is a minute the customer is closer to calling someone else. Starting here means the workflow response goes out within seconds of the cancellation, not hours.
What you do: Open the Workflow Builder, select “New Workflow,” and choose appointment.cancelled as your trigger. Apply a source tag filter for “Service” jobs to exclude internal or test cancellations. If you want the workflow to run outside business hours (recommended, since self-serve cancels happen at night), leave the time filter off.
What to check: Mark a test appointment as cancelled and confirm the workflow activates in the Workflow Builder activity log. If it doesn’t fire, verify the job type filter matches exactly what your team uses when creating real service appointments.
Node 1: AI Generate (reschedule offer message)
What it does: Drafts a personalised reschedule offer SMS for the cancelled customer. It pulls the customer’s name, the original appointment date, and the service type from the cancelled booking record, then writes a short message offering to find a new time.
Why it matters: A generic “we noticed you cancelled” message reads like a mass broadcast. A message that names the customer, references their specific job, and offers a clear next step converts at a higher rate because it reads like a real person responded within minutes. The AI does this in under a second per cancellation, faster than any CSR can, and without the CSR needing to be available.
What you do: Configure the AI Generate node with this prompt: “Write a short, direct SMS (under 90 words) from [Business Name] to [Customer Name] acknowledging their cancelled [Service Type] appointment on [Date] and offering to find a new time. Include a booking link. Tone: helpful and matter-of-fact, not apologetic or pushy.” Map the output to the Send SMS node that follows.
What to check: Run a test with a known cancelled appointment. Read the generated message and confirm it correctly pulls the customer name, service type, and date. If any field is blank, the CRM record may not have been updated before the trigger fired. Check the data mapping in your appointment record settings.
Node 2: Send SMS (reschedule offer)
What it does: Sends the AI-generated reschedule offer to the customer’s mobile number within seconds of the cancellation. The message includes a direct link to your ServiceAgent scheduling widget.
Why it matters: A customer who just cancelled is still in the decision window . They haven’t committed to another company yet. If your first contact arrives within five minutes, you have a real shot at keeping the job. If it arrives four hours later via voicemail, the window is almost certainly gone. SMS has a substantially higher open rate than email for time-sensitive messages, and the embedded booking link reduces friction from intention to action.
What you do: Configure the Send SMS node with the customer’s mobile number from the CRM contact record and the AI Generate output as the message body. Confirm the booking link in the message generates a customer-specific URL that pre-populates their contact information on the scheduling page.
What to check: Send a test cancellation through the workflow and confirm the SMS arrives on your own number with the correct message and a working booking link. If the link is generic rather than pre-populated, check the customer token configuration in your scheduling widget settings.
Node 3: Wait/Delay (4 hours)
What it does: Pauses the workflow for 4 hours after the reschedule SMS is sent, giving the customer time to respond before the next action fires.
Why it matters: The window between “I cancelled” and “I’ve committed to a different company” is typically a few hours for non-emergency HVAC calls. Four hours is long enough for the customer to respond at their convenience, and short enough that you’re still in the competitive window if they haven’t moved on. A 24-hour wait loses most customers. An immediate email escalation after the SMS looks automated and impersonal.
What you do: Set the Wait/Delay node to a fixed 4-hour duration from the Send SMS timestamp.
What to check: After a test cancellation, confirm the Workflow Builder activity log shows the workflow paused at Node 3 with an active timer. If the workflow skips straight to Node 4, check that the Wait/Delay duration is set in hours, not minutes.
Node 4: AI Decision (did they reschedule?)
What it does: Checks whether the customer created a new appointment in the 4-hour wait window. If a new booking exists for this contact, the workflow routes to Path B. If no new appointment exists, it routes to Path A.
Why it matters: This is the branching point that separates your recovered customers from your at-risk ones. Without it, every cancelled customer gets the same escalation follow-up regardless of what they did. With it, customers who responded and rescheduled get a CRM update and a clean close. Customers who didn’t respond get an email and a dispatcher task before the slot date passes.
What you do: Configure two conditions. Path B condition: a new appointment record exists for this contact, created in the last 4 hours, with status “Scheduled.” Path A condition: no new appointment record exists for this contact in the last 4 hours. The node evaluates the CRM state at the moment it fires.
What to check: Test both paths, a customer who rescheduled (should route to Path B) and one who didn’t (should route to Path A). If rescheduled customers are routing to Path A, check that the new appointment’s contact ID is matching the cancelled appointment’s contact ID correctly.
Path A: No Reschedule (escalation sequence)
Path A fires when the customer received the SMS reschedule offer but hasn’t booked in 4 hours.
Node A1: Send Email (follow-up with calendar link)
What it does: Sends a follow-up email to the customer with a direct scheduling link, a brief message referencing their original service appointment, and an offer of available time slots.
Why it matters: Not every customer sees an SMS immediately. Some prefer email. Some saw the SMS, meant to respond, and forgot. A 4-hour follow-up email is a second touch that catches both groups. It’s also the format where a slightly longer message, referencing the specific job and naming available time windows, reads naturally rather than pushy.
What you do: Configure the Send Email node with a template: “Hi [Name], just following up on your [Service Type] appointment that was cancelled on [Date]. We can get a tech out [this week / next week] at your convenience. Here’s your booking link: [Link]. Any questions, reply here or call [Number].” Keep it under 80 words. Include your business name in the sender field.
What to check: Confirm the email arrives in a test inbox with the correct customer name, service type, and a working booking link. If the sender name shows as a generic address rather than your business name, update the email sender settings in ServiceAgent.
Node A2: Wait/Delay (24 hours)
What it does: Pauses for 24 hours after the email is sent before the final action in Path A fires.
Why it matters: Twenty-four hours is enough time to give the customer a real chance to respond to the email without over-contacting them. After an SMS and an email over a 28-hour total window, the automated sequence has done what it can. The next move is a manual decision, one more personal call, a slot offer, or a backfill.
What you do: Set the Wait/Delay node to a fixed 24-hour duration from the Node A1 Send Email timestamp.
What to check: Confirm the activity log shows the workflow paused at this node with an active timer after the email sends.
Node A3: Create Task (backfill priority)
What it does: Creates an assigned task for your dispatcher flagging this customer’s original time slot as a backfill priority. The task includes the customer name, original appointment time, service type, and a note that two automated contacts have been made without response.
Why it matters: By this point the automated sequence has made two contacts over 28 hours. If the customer hasn’t responded, the next step is a human decision: one more personal call, an incentive offer, or moving on and filling the slot from your waitlist. The Create Task node ensures that decision lands in the dispatcher’s queue before the original slot date passes, not after. Without it, the no-response cancellation just sits in the CRM with no action item attached and the slot stays empty.
What you do: Configure the task with the dispatcher’s name in the assigned-to field, the original appointment date as the due date, and the task body: “[Customer Name] cancelled their [Service Type] appointment on [Date]. Automated SMS and email reschedule offers sent. No response received. Recommend: backfill slot or one personal outreach call.” Set task priority to High if the appointment was within 48 hours.
What to check: After the 24-hour wait fires, confirm the task appears in the correct dispatcher queue with the customer name, appointment date, and correct priority flag.
Path A complete summary:
appointment.cancelled → AI Generate → Send SMS → Wait 4h → AI Decision (no reschedule) → Send Email → Wait 24h → Create Task
Time from cancellation to first customer contact: under 60 seconds. Total automated follow-up window: 28 hours. Staff involvement during that window: zero.
Path B: Customer Rescheduled
Path B fires when the AI Decision node confirms a new appointment was created within the 4-hour window.
Node B1: Update CRM (reschedule confirmed)
What it does: Updates the original cancelled appointment record with a “Rescheduled” tag and logs the new appointment ID on the contact’s activity timeline. The contact record shows the full sequence: original booking, cancellation, reschedule offer sent, new booking confirmed.
Why it matters: Without this update, the CRM shows a cancelled job and a new job with no visible link between them. The dispatcher can’t tell at a glance that the new booking came from your recovery workflow. The CRM update creates the context: this customer cancelled, the system responded, they rescheduled. That context matters for reporting and for understanding which slots you’re actually recovering.
What you do: Configure the Update CRM node to write “Rescheduled via Recovery Workflow” to a custom tag field on the contact record and link the original cancelled appointment ID to the new appointment using a reference field.
What to check: After a test reschedule, open the contact record and confirm the rescheduled tag and both appointment IDs appear on the activity timeline.
Path B complete summary:
appointment.cancelled → AI Generate → Send SMS → Wait 4h → AI Decision (rescheduled) → Update CRM
The new appointment also triggers your standard appointment.booked confirmation workflow automatically, the customer gets their booking confirmation SMS and reminder sequence without any additional configuration.
How to Set This Up in ServiceAgent
Step 1: Connect your calendar. Before the AI Decision node can check for new appointments, your calendar must be live-synced with ServiceAgent. Connect Google Calendar, Jobber, Housecall Pro, or ServiceTitan in the Integrations panel. The node reads appointment data in real time from whatever calendar your team uses.
Step 2: Set up your scheduling link. The reschedule offer SMS and the follow-up email both embed a direct booking link. Generate a customer-facing booking link from your ServiceAgent scheduling widget. This is the link you’ll reference in the AI Generate node’s prompt and the email template.
Step 3: Open the Workflow Builder. Go to Workflows in your ServiceAgent dashboard and select “New Workflow.” Choose appointment.cancelled as the trigger. Add the job type filter for “Service” to exclude internal cancellations.
Step 4: Build the node chain. Add nodes in sequence, AI Generate, Send SMS, Wait/Delay (4 hours), AI Decision. Then build Path A (Send Email → Wait 24h → Create Task) and Path B (Update CRM) off the decision node’s two outputs.
Step 5: Test both paths. Cancel a test appointment and watch the workflow fire in the activity log. Confirm the SMS arrives on your phone with the correct details and a working link. Then create a new test appointment for the same contact within 4 hours and confirm the AI Decision node routes to Path B.
Step 6: Go live. Enable the workflow and set it active 24/7. after-hours cancellations via self-serve links trigger the full sequence automatically, your team doesn’t need to do anything.
What Happens After the Workflow Runs?
The four hours after a cancellation are no longer dead time. Previously, that window was empty, no one reached the customer until a CSR had a gap in their day. With the workflow running, the customer receives a reschedule offer within seconds, every time, whether the office is staffed or not.
Your dispatcher starts with a clean, actionable queue. Every unresolved cancellation that didn’t self-recover through the workflow has a Create Task entry with full context by the time the dispatcher opens their board. No digging through the CRM to find which cancelled jobs still need attention. The 10+ hours per week most HVAC operators spend on manual cancellation callbacks and CRM cleanup drops because the workflow handles the first two contacts and the task creation automatically.
A measurable slice of cancelled revenue comes back. Not every cancelled customer reschedules, some are gone regardless of how fast you respond. But customers who cancelled because of a scheduling conflict, a forgotten appointment, or a change in plans represent a real recovery window. A consistent reschedule offer within the hour, followed by an email if they don’t respond, captures a portion of that group that a voicemail-based callback process misses. Customers who receive consistent, timed follow-up are also more likely to stay on your books for future service, which is the pattern behind the +20% retention improvement our customers report once automated follow-up replaces manual check-ins.
Why ServiceAgent Handles This for HVAC
A manual cancellation callback process requires a CSR who isn’t already on a call, a customer who picks up the phone, and a dispatcher who has time to backfill. All three need to line up. In a busy HVAC operation, they rarely do.
The cancellation workflow replaces that coordination with a single automated sequence. appointment.cancelled fires. The customer gets an AI-generated reschedule offer in seconds. If they respond, the new booking confirms automatically. If they don’t, the dispatcher gets a task before the slot date passes. No coordination required, no CSR time spent, no slot lost without a recovery attempt.
The 24/7 AI Office Manager runs this sequence whether your team is in the office or not, on a Saturday evening self-serve cancel the same as a Tuesday morning call-in. Setup takes under 30 minutes. If you want to see the workflow running on your calendar before a single real cancellation hits it, start at serviceagent.ai.
Frequently Asked Questions
What triggers the cancellation workflow, does it only fire on customer-initiated cancels?
The appointment.cancelled trigger fires any time a job moves to cancelled status in ServiceAgent, regardless of who initiates it. That includes a CSR marking it cancelled after a customer call, a customer using a self-serve scheduling link to cancel, or a tech logging a no-show from the field app. All three cases start the same automated response sequence.
What if the customer already rescheduled by calling the office directly?
The AI Decision node at the 4-hour mark checks whether a new appointment exists for the contact before routing. If the customer called your team and rescheduled manually, that new appointment is in the CRM and the node routes to Path B (the CRM update) instead of Path A’s email and task. No duplicate outreach fires because the node evaluates real-time appointment state, not just the cancellation event.
How do I know if the workflow is actually recovering cancelled jobs?
The “Rescheduled via Recovery Workflow” tag written by Node B1 gives you a filterable data point. Pull a contact report in ServiceAgent filtered by that tag and compare it to your total cancellations over the same period. That ratio is your recovery rate. Most operators run this report monthly and use it to benchmark whether the workflow messaging needs adjusting, if recovery rate is below 15%, the SMS or email copy is usually the lever to pull first.