Automatically notify leads about earlier available booking times

Modified on Tue, 13 Jan at 11:09 AM

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.

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:

  1. Automation – Triggers before the scheduled event and checks for availability
  2. Email template – Notifies the lead about earlier available times
  3. 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}@endif

What this does:

  • latest-date="+10days" – Checks for availability within the next 10 days
  • booking-form="YOUR_BOOKING_FORM_ID" – Replace with your actual booking form ID
  • full-address="%lead_full_address%" – Checks availability for the lead's address
  • Returns 1 (true) if more than one available slot is found, otherwise 0 (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 name
  • YOUR_PHONE and YOUR_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 opportunitiesavailable-dates shows 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:

  1. Create a test lead with a future booking
  2. Manually trigger the automation or adjust the trigger date to fire immediately
  3. Verify the email sends and displays correctly
  4. Click the rebooking link and confirm the form shows earlier available times
  5. 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

Let us know how can we improve this article!

Select at least one of the reasons
CAPTCHA verification is required.

Feedback sent

We appreciate your effort and will try to fix the article