Automatically notify leads about earlier available booking times
This workflow helps you fill calendar gaps by automatically notifying leads when earlier booking times become available. When a lead has a scheduled appointment and a slot opens up before their current booking, they receive an email offering to reschedule to the earlier time.
On this page
Use case
Perfect for service businesses that want to:
- Maximize calendar efficiency – Fill gaps caused by cancellations or reschedules
- Improve customer satisfaction – Offer leads the option to get service sooner
- Reduce wait times – Move appointments forward when capacity becomes available
- Increase revenue – Complete more bookings by optimizing your schedule
? How it works
An automation checks for available slots before each lead's scheduled appointment. If an earlier time is found, the lead receives an email with a link to rebook. If they prefer to keep their current appointment, they don't need to do anything.
What you need
This workflow combines three main components:
- Automation – Triggers before the scheduled event and checks for availability
- Email template – Notifies the lead about earlier available times
- Booking form – Allows the lead to select a new earlier time
Step 1: Set up the automation
Create an automation that checks for available slots before each appointment.
Automation settings
- Trigger: Date/time field trigger (e.g., 14 days before event start date)
- Field: Event start date
- Time offset: -14 days (adjust based on your business needs)
Condition: Check if earlier times are available
Use this expression in the automation condition:
@if(<hh-data.count><hh-booking.available-dates latest-date="+10days" booking-form="YOUR_BOOKING_FORM_ID" full-address="%lead_full_address%" /></hh-data.count> > 1){1}@else{0}@endifWhat this does:
latest-date="+10days"– Checks for availability within the next 10 daysbooking-form="YOUR_BOOKING_FORM_ID"– Replace with your actual booking form IDfull-address="%lead_full_address%"– Checks availability for the lead's address- Returns
1(true) if more than one available slot is found, otherwise0(false)
⚠️ Important
Replace YOUR_BOOKING_FORM_ID with your actual booking form ID. You can find this in Campaign → Settings → Booking forms.
Action: Send email
If the condition is true (earlier slots are available), send an email notification to the lead using the template from Step 2.
Step 2: Create the notification email template
Create an email template that notifies leads about earlier available times and provides a link to rebook.
Email template example
<style>
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; line-height: 1.6; color: #333; }
.email-container { max-width: 600px; margin: 0 auto; background: white; }
.header { background: #ffffff; color: #333; padding: 40px 30px 25px; text-align: left; border-bottom: 1px solid #f0f0f0; }
.header h1 { font-size: 28px; margin: 0 0 12px 0; font-weight: 300; color: #333; }
.header p { font-size: 16px; margin: 0; color: #666; }
.content { padding: 35px 30px; }
.greeting { font-size: 16px; margin: 0 0 20px 0; color: #333; }
.text-paragraph { font-size: 15px; color: #666; margin: 0 0 25px 0; line-height: 1.7; }
.rebook-section { margin: 30px 0; text-align: center; }
.rebook-button { display: inline-block; background: %brand_color%; color: white; padding: 12px 24px; border-radius: 6px; text-decoration: none; font-size: 14px; }
.info-box { background: #fafafa; border-radius: 6px; margin: 25px 0; padding: 20px 25px; }
.info-box h3 { color: #333; font-size: 18px; margin: 0 0 16px 0; }
.info-row { display: flex; padding: 6px 0; }
.info-label { font-weight: 400; color: #333; font-size: 14px; width: 80px; }
.info-value { color: #666; font-size: 14px; }
.two-column-container { display: flex; gap: 4%; margin: 25px 0; }
.column { flex: 1; background: #fafafa; border-radius: 6px; padding: 18px; }
.column h4 { color: #333; font-size: 16px; margin: 0 0 8px 0; }
.column p { color: #666; margin: 0; font-size: 14px; }
@media only screen and (max-width: 600px) {
.two-column-container { flex-direction: column !important; gap: 15px !important; }
.info-row { flex-direction: column !important; }
.info-label { width: auto !important; margin-bottom: 2px !important; }
}
</style>
<div class="email-container">
<div class="header">
<h1>Good news about your booking!</h1>
<p>We have earlier available times than your current appointment.</p>
</div>
<!-- Content -->
<div class="content">
<p class="greeting">Hi %lead_name%,</p>
<p class="text-paragraph">
We're reaching out because we have available times in the next few days. Instead of waiting for your current appointment on <strong>%event_datetime%</strong>, you can book an earlier time if you'd like.
</p>
<!-- Rebook Button Section -->
<div class="rebook-section">
<a href="@bookingFormUrlLead[YOUR_REBOOK_FORM_NAME]" class="rebook-button">
View Earlier Times
</a>
</div>
<p class="text-paragraph">
If you prefer to keep your current appointment, you don't need to do anything—we'll see you at the scheduled time.
</p>
<!-- Booking Details -->
<div class="info-box">
<h3>Your Information</h3>
<div class="info-row">
<span class="info-label">Name:</span>
<span class="info-value">%lead_name%</span>
</div>
<div class="info-row">
<span class="info-label">Phone:</span>
<span class="info-value">%lead_phone%</span>
</div>
<div class="info-row">
<span class="info-label">Email:</span>
<span class="info-value">%lead_email%</span>
</div>
</div>
<!-- Time and Location -->
<div class="two-column-container">
<div class="column">
<h4>Current Appointment</h4>
<p>%event_datetime%</p>
</div>
<div class="column">
<h4>Location</h4>
<p>%event_location%</p>
</div>
</div>
<p class="text-paragraph">
If you prefer to keep your current appointment, you don't need to do anything—we'll see you at the scheduled time.
</p>
<p class="text-paragraph" style="margin-top: 30px; font-size: 14px; color: #999;">
Questions? Contact us at <strong>YOUR_PHONE</strong> or <strong>YOUR_EMAIL</strong>.
</p>
</div>
</div>Important placeholders to replace:
@bookingFormUrlLead[YOUR_REBOOK_FORM_NAME]– Replace with your rebooking form's API nameYOUR_PHONEandYOUR_EMAIL– Replace with your contact information
Step 3: Create the rebooking form
Create a booking form that allows leads to select an earlier time. This form should include conditional logic to verify that earlier times are still available.
Booking form description code
Add this to the form's description field:
<style>
.full-address-input-div {display:none;}
</style>
<div style="display:none;">
@input[service-field-api-name; id="selectedProducts"]
<input type="hidden" id="duration-input" name="duration" value="35">
</div>
<input name='latest_date' value='<hh-date.format input="%event_start_datetime_db% -1day" output="Y-m-d" />' type='hidden' />
<div class="form-wrapper">
<div id="contactForm">
<div class="form-group">
<h3>Rebook Your Appointment</h3>
Hi %lead_name%<br/><br/>
@if(%event_datetime%){
@if(1 > <hh-data.count><hh-booking.available-dates latest-date="+21days" booking-form="YOUR_BOOKING_FORM_ID" full-address="%lead_full_address%" /></hh-data.count>){
You have a booking on <b>%event_datetime%</b><br/><br/>
Currently, you already have the earliest available time we can offer. If you received an email or SMS about an earlier booking, we apologize—the slot was taken between when we sent the message and when you clicked the link.<br/><br/>
You don't need to do anything further. We look forward to seeing you at your scheduled appointment.
}@else{
You have a booking on <b>%event_datetime%</b>, and we can offer you an earlier time if you'd like.<br/><br/>
Select a date and time that works for you.
}@endif
}@else{
It doesn't look like you have an active appointment.
<div class="rebook-section">
<a href="@bookingFormUrlLead[YOUR_MAIN_BOOKING_FORM]" class="rebook-button">
Click here to book a new appointment
</a>
</div>
}@endif
</div>
</div>
</div>What this code does:
- Hides the address input – Uses the lead's existing address from their current booking
- Pre-fills service and duration – Maintains the same service type and duration
- Sets latest date limit – Only shows dates up to one day before their current appointment
- Checks availability again – Verifies earlier slots are still available when the form loads
- Shows appropriate message – Displays different content based on availability status
⚠️ Remember to replace
• service-field-api-name with your actual service field API name
• YOUR_BOOKING_FORM_ID with your booking form ID
• YOUR_MAIN_BOOKING_FORM with your main booking form API name
• value="35" with your actual appointment duration in minutes
Why use available-dates instead of optimal-datetime-slots?
You might be tempted to use <hh-booking.optimal-datetime-slots> instead, but we recommend <hh-booking.available-dates> for this use case.
Reasons:
- Focus on filling gaps – The main goal is to fill available calendar slots, not necessarily find the "optimal" time
- More opportunities –
available-datesshows all available slots, giving leads more flexibility - Sufficient benefit – Simply moving an appointment forward provides significant value, regardless of whether it's "optimal"
- Higher conversion – More available options increase the likelihood that the lead will rebook
✅ Best practice
For most businesses, filling calendar gaps quickly is more valuable than waiting for the "perfect" optimal time. Use available-dates to maximize your rebooking rate.
Customization tips
Adjust the timing window
- Change
latest-date="+10days"to check a shorter or longer window (e.g.,"+7days"or"+14days") - Change the automation trigger from 14 days to match your average booking lead time
Add multiple automation triggers
- Create multiple automations that check at different intervals (e.g., 14 days, 7 days, and 3 days before the appointment)
- Be careful not to spam leads—consider adding a condition to check if they've already been notified
Customize the email design
- Adjust colors to match your brand
- Add your company logo
- Modify the wording to match your tone
Testing your setup
Before going live, test the workflow thoroughly:
- Create a test lead with a future booking
- Manually trigger the automation or adjust the trigger date to fire immediately
- Verify the email sends and displays correctly
- Click the rebooking link and confirm the form shows earlier available times
- Complete a test rebooking to ensure the old appointment is properly canceled
Summary
This workflow automatically notifies leads when earlier booking times become available, helping you fill calendar gaps and maximize efficiency. Set up a date/time trigger automation (e.g., 14 days before the appointment) with a condition that checks for earlier available slots using <hh-booking.available-dates>. Create an email template that notifies the lead and includes a link to a rebooking form using @bookingFormUrlLead[form-name]. Configure the rebooking form with conditional logic to verify availability and show appropriate messages. Use available-dates instead of optimal-datetime-slots to maximize rebooking opportunities. Customize the timing window, email design, and trigger intervals based on your business needs. Test thoroughly before going live to ensure all links, placeholders, and conditional logic work as expected. This workflow improves customer satisfaction by offering earlier service, increases revenue by optimizing your schedule, and reduces wait times by filling cancellation gaps automatically.
? Common searches
fill calendar gaps • notify earlier booking • automatic rebooking • calendar optimization • move appointments forward • fill cancellation slots
? Also known as
calendar gap filling • early booking notification • appointment rescheduling • booking optimization • proactive rebooking
Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article