Back to the build library
Any industry
Starter

Appointment Reminder Ladder

A multi-channel reminder sequence that cuts no-shows by confirming, rescheduling and refilling slots without flooding people with messages.

Industry
Any industry
Build effort
Starter
Typical time to launch
3–5 days
On this page
The problemWhat gets builtHow it runsAutomations in detailWhat changesBefore you start
Want this built for you?

Bring your stack to a call and we will scope it against how your business actually runs.

Book a call
01

The problem

A no-show is the most expensive thing that can happen to an appointment-based business, because the cost is total. The slot was held, the staff member was paid, the room or the van or the chair sat idle, and the person who wanted that slot was told it was unavailable. Unlike a lost sale, there is no competing outcome to console yourself with: the capacity simply evaporated. Businesses running at anything near full calendar feel this as a hard ceiling on revenue that has nothing to do with demand.

Most reminder systems make the problem worse in one of two ways. The first is doing too little. A single email the day before, sent to an address the customer does not check, with no way to respond except by phoning during office hours. The second, increasingly common, is doing too much: a confirmation, then a reminder, then another reminder, then a survey, then a review request, all from the same number, all unanswerable, until the customer mutes the thread or replies STOP and vanishes from every future communication the business will ever send. Over-messaging does not just annoy people; it burns the channel, and once a customer has opted out of SMS you have lost the only reminder route that reliably works.

There is also a structural failure almost nobody addresses. When somebody does cancel (which is the good outcome, far better than a silent no-show) the freed slot usually stays empty, because nothing in the system knows to offer it to anyone else. The cancellation that arrives at 16:00 for tomorrow at 10:00 is a sellable eighteen hours of notice, and in most businesses it is wasted. The build below is a reminder ladder tuned to the minimum number of messages that works, with a reply path on every one, a reschedule route that is easier than not turning up, and a waitlist that refills what gets freed.

02

What gets built

Pipeline and stages

An Appointment Lifecycle pipeline. Reminders are usually built as a bare workflow with no visible state, which is why nobody can answer the question "how many of tomorrow's appointments are confirmed?" Giving the lifecycle stages makes that question a glance.

  • Booked - Unconfirmed: appointment exists, customer has not acknowledged it.
  • Confirmed: the customer has actively confirmed. This is the only stage you should feel comfortable about.
  • Reschedule Requested: they want to move it but have not picked a new time.
  • Rescheduled: new time booked; the card re-enters the ladder at the new date.
  • Canceled - Slot Released: canceled with notice, and the slot has gone to the waitlist.
  • At Risk: no engagement at all by the final reminder. These are the ones to phone.
  • Attended: showed up.
  • No Show: did not show, did not cancel.
  • Recovered After No Show: rebooked following a no-show, tracked separately because it is the number that justifies the recovery step.

Calendars

  • Main Service Calendars: whatever the business already runs, one per service type, each with its own reminder profile. A 20-minute consultation and a full-day installation need different ladders, and using one profile for both is the most common build error.
  • Reschedule Calendar: the same availability exposed through a reschedule link, with a wider horizon so somebody moving an appointment can go out four weeks if they need to.
  • Waitlist Fill Calendar: a view of slots released by cancellation inside 72 hours, used by the waitlist workflow.
  • Deposit-Required Calendar: optional, for high-value or repeatedly no-showing customers. A separate calendar requiring payment at booking is a better answer than more reminders.

Custom fields

  • Appointment Type: which service, driving which reminder profile applies.
  • Appointment Value Band: Low, Standard, High. Not a figure: a band, used to decide whether a human call is justified at the At Risk stage.
  • Confirmation Status: Unconfirmed, Confirmed, Reschedule Requested, Canceled.
  • Confirmed At: timestamp of active confirmation.
  • Confirmation Channel: SMS, Email, Call, Web.
  • Reminder Count Sent: a running total, capped per profile. This field is what stops the ladder from stacking with other sequences.
  • Last Reminder Sent At: used by the global frequency guard.
  • Preferred Channel: SMS, Email, Call, No Reminders. The last option exists and should be honoured.
  • No Show Count: lifetime, per contact. Drives escalating treatment.
  • Last No Show Date.
  • Reschedule Count: lifetime. Three reschedules on one appointment is a different problem from a no-show and needs a human.
  • Cancellation Reason: Illness, Schedule Conflict, No Longer Needed, Price, Found Alternative, Other. Collect it; it is the only honest churn data most appointment businesses will ever get.
  • Waitlist Status: Not On Waitlist, On Waitlist, Offered, Accepted, Declined.
  • Waitlist Priority: a number, highest first, so the fill workflow has a defined order rather than a race.
  • Prep Instructions Sent: a switch, because the prep message and the reminder are different jobs and should not be merged.
  • Quiet Hours Zone: the customer time zone. Non-negotiable in a build that sends timed messages.
  • Travel Or Access Notes: included in the final reminder, because "where do I park" is a real cause of no-shows.

Tags

  • appt-unconfirmed, appt-confirmed, appt-at-risk, appt-attended, appt-no-show.
  • repeat-no-show: applied at No Show Count of 2 or more. Routes future bookings to the Deposit-Required Calendar.
  • reminder-opted-out: the customer asked for no reminders specifically, as distinct from opting out of marketing. Keep these separate or you will lose people from reminders for unsubscribing from a newsletter.
  • waitlist-active, waitlist-offered: the second expires after the offer window.
  • first-appointment: first-ever booking, which carries a much higher no-show risk and gets a fuller ladder.
  • high-value-appt: justifies the human call at the At Risk stage.
  • sms-opted-out, email-unsubscribed, do-not-contact.
  • message-cap-hit: applied by the frequency guard when a contact has reached the weekly message ceiling, which suppresses non-essential sends while letting the critical reminder through.

Forms

  • Cancellation Form: linked from every reminder. One required question, the Cancellation Reason, and an immediate offer of three alternative slots on the same screen. Making cancellation easy is counter-intuitive and it works: a cancellation with notice is a recoverable slot, a silent no-show is not.
  • Reschedule Form: really just the Reschedule Calendar with one line of context, so moving an appointment takes two taps.
  • Waitlist Join Form: collects the service wanted, acceptable days and times, and how much notice the person can work with. The notice question is the one that makes a waitlist functional.
  • Pre-Appointment Form: whatever the business actually needs in advance: address and access, vehicle details, case background, intake questions. Sent separately from the reminders, and never bundled into one, because a reminder with a form attached gets read as admin and ignored.
  • No-Show Reason Form: optional, one question, sent after the recovery message. Low response rate, high information value.

BO's role and guardrails

  • BO handles every inbound reply to a reminder, which is the whole point of having a reply path. "Can I come at 3 instead?" gets answered in seconds at 22:00 on a Sunday, which is exactly when people read reminders.
  • BO can confirm, cancel, and reschedule against the real calendar, and writes Confirmation Status, Confirmed At, and Confirmation Channel accordingly.
  • BO collects Cancellation Reason conversationally when somebody cancels by text, rather than sending them to a form: "No problem, I'll cancel that. Quick one: is it timing, or no longer needed?"
  • BO offers alternatives on every cancellation, once. Not twice.
  • BO answers the predictable logistics questions: location, parking, duration, what to bring, who they will see, whether they can bring someone: from the knowledge base.
  • Guardrails: never quote a price or a cancellation fee, never give advice of a clinical, legal, or financial nature, never move an appointment outside real availability, never confirm an appointment the customer has not actually confirmed, and never argue with somebody who wants to cancel.
  • BO escalates on: any complaint, any third reschedule of the same appointment, any mention of a problem with the service, and any reply it cannot classify after one clarifying question.
  • BO never sends a message that would breach the frequency guard. The guard sits above BO, not inside it.

Numbers and channels

  • One SMS-capable number, the same one used for everything else the business sends, so the customer sees a single ongoing thread rather than messages from four shortcodes.
  • Authenticated email domain for the confirmation, the prep message, and the reminder for customers whose Preferred Channel is Email.
  • A voice path for the At Risk call, placed by a human for high-value appointments. BO may place the call for Standard and Low bands where the client wants it, with a short script and an immediate offer to reschedule.
  • Calendar invitations attached to the confirmation email, which quietly does more reminder work than any message, because it puts the appointment in the customer's own calendar with their own alert.
  • The frequency guard: a global rule, not a channel: no more than one non-critical automated message to the same contact in any 24 hours, no more than four in any 7 days, with the 24-hour and 2-hour reminders exempt. This is the single most important thing in the build and the thing most reminder systems lack.
03

How it runs, step by step

  1. A customer books a Standard consultation for Thursday at 14:00, eleven days out. The card is created in Appointment Lifecycle at Booked - Unconfirmed, Appointment Type and Appointment Value Band are written, Confirmation Status is Unconfirmed, and first-appointment is applied because no prior booking exists.
  2. Within two minutes a confirmation goes out on both channels: an SMS with the day, time, and location, and an email carrying the same plus a calendar attachment and the access notes. Reminder Count Sent goes to 1.
  3. Because the appointment is more than seven days out, nothing further happens for a week. This gap is deliberate. Messages sent eight days ahead are forgotten by the time they matter and only consume the frequency budget.
  4. Seven days out, the prep message goes out, carrying the Pre-Appointment Form and nothing else. It does not ask for confirmation, because mixing prep and confirmation halves the response rate on both. Prep Instructions Sent is switched on.
  5. The customer completes the prep form. The answers land on the contact record and the assigned staff member gets no notification, because nothing needs doing. Notifications for routine completions are how teams learn to ignore notifications.
  6. Three days out, the first confirmation request goes out by SMS: the day, time, and a direct ask. "Reply Y to confirm, R to move it, or C to cancel." Reminder Count Sent goes to 3.
  7. The customer replies "Y". BO writes Confirmation Status as Confirmed, stamps Confirmed At, sets Confirmation Channel to SMS, moves the card to Confirmed, applies appt-confirmed, and replies with one short acknowledgement. Because the appointment is now confirmed, the 24-hour reminder is downgraded to a short informational message and the At Risk path is switched off entirely.
  8. The next morning a different customer cancels a Thursday 10:00 slot. Their card moves to Canceled - Slot Released, BO collects Cancellation Reason as Schedule Conflict in the reply thread, and the slot is pushed to the Waitlist Fill Calendar.
  9. The waitlist workflow finds three people on waitlist-active whose stated notice tolerance covers twenty-four hours, ordered by Waitlist Priority, and texts the highest-priority one a single time-limited offer with a 90-minute window to accept.
  10. They accept inside forty minutes. The slot is booked, their card enters the lifecycle at Booked - Unconfirmed, and the ladder starts for them at the 24-hour position rather than the beginning, which is why the ladder is built as position-relative rather than as a fixed sequence.
  11. Twenty-four hours before the original Thursday 14:00 appointment, the confirmed customer gets the final reminder: time, location, duration, parking note from Travel Or Access Notes, and the reschedule link. Short, informational, no ask.
  12. At two hours before, a confirmed Standard appointment gets nothing. The 2-hour message is reserved for unconfirmed appointments and for appointment types where travel is involved. Sending it to somebody who confirmed three days ago is the message that earns the opt-out.
  13. They attend. The card moves to Attended, the staff member marks it in one tap, and the post-appointment sequence takes over, which, importantly, waits two hours before asking for anything.
  14. A third customer that week does not show and did not cancel. Fifteen minutes after the start time the card moves to No Show, No Show Count increments to 1, and a single non-accusatory recovery message goes out offering a rebook. They rebook; the card moves to Recovered After No Show. Had this been their second no-show, repeat-no-show would have been applied and the rebook link would have pointed at the Deposit-Required Calendar instead.
04

Automations in detail

1. Booking Confirmation and Ladder Scheduling

Trigger: appointment created on any main service calendar, by any route: staff, web booking, chat, phone, or waitlist fill.

Conditions and branches: branch on Appointment Type to select the reminder profile. Branch on how far out the appointment sits, which determines where in the ladder it starts. Branch on Preferred Channel.

  • Write Appointment Type, Appointment Value Band, and Confirmation Status as Unconfirmed. Create the card at Booked - Unconfirmed. Apply appt-unconfirmed, plus first-appointment if the contact has no prior attended appointment, plus high-value-appt where the band is High.
  • Send immediately: within two minutes, because a confirmation that arrives an hour later reads as a system error. SMS: "Booked, {{contact.first_name}}: {{appointment.day}} {{appointment.date}} at {{appointment.time}}, {{appointment.location}}. We'll remind you nearer the time. Need to change it? {{reschedule_link}}"
  • Send immediately, email with the same content plus the calendar attachment, the duration, who they will be seeing, and the access notes. The calendar attachment is doing more work than the text.
  • Set Reminder Count Sent to 1 and stamp Last Reminder Sent At.
  • Ladder position branch: more than 7 days out schedules the full ladder from the prep step; 2–7 days out skips prep scheduling to the day it falls due and starts at the 3-day confirmation request; under 48 hours starts at the 24-hour reminder; under 4 hours sends one short message only and nothing else.
  • Preferred Channel of No Reminders: send the confirmation only, apply reminder-opted-out, and schedule nothing. Respecting this is what keeps people on the list.
  • Repeat no-show branch: if No Show Count is 2 or more and the booking was not taken on the Deposit-Required Calendar, create a task for the manager: "Repeat no-show has booked a standard slot. Move to deposit calendar?" Do not message the customer about it automatically.

Exit: when the ladder is scheduled. Any cancellation or reschedule cancels every scheduled step and the workflow re-runs from the top on the new appointment.

2. Pre-Appointment Preparation

Trigger: 7 days before the appointment, or at booking if the appointment is between 2 and 7 days out.

Conditions and branches: skip entirely for appointment types with no prep requirement. Do not send an empty prep message for the sake of ladder symmetry. Skip if Prep Instructions Sent is already on.

  • Send email: this step is email-first because it carries detail. Subject: "Getting ready for {{appointment.day}}". Body: what will happen, how long it takes, what to bring, where to park or how to get access, and a single link to the Pre-Appointment Form.
  • Send SMS only if the appointment type genuinely needs something done in advance: "{{contact.first_name}}, two quick things before {{appointment.day}}: {{prep_form_link}}. Takes a minute."
  • Switch on Prep Instructions Sent. Increment Reminder Count Sent.
  • Wait 2 days. If the prep form is required and still not completed, send one reminder: "Still need those details for {{appointment.day}}, {{prep_form_link}}" and create a task for the assigned staff member if the form is genuinely blocking.
  • Do not ask for confirmation in this message, in either channel. It is a separate job and combining them reduces both response rates.
  • On form completion, write the answers to the contact and notify the staff member only if an answer triggers a flag the business has defined. An access restriction, a requirement for extra time, anything that changes the booking.

Stop conditions: cancellation, reschedule, or reminder-opted-out.

3. Confirmation Request

Trigger: 3 days before the appointment.

Conditions and branches: skip if Confirmation Status is already Confirmed. Branch on Preferred Channel. Branch on whether first-appointment is applied. First-timers get the fuller version with reassurance, repeat customers get one line.

  • SMS, repeat customer: "{{contact.first_name}}, {{appointment.day}} {{appointment.time}} still good? Reply Y to confirm, R to move it, C to cancel."
  • SMS, first appointment: "{{contact.first_name}}, looking forward to seeing you {{appointment.day}} at {{appointment.time}}, {{appointment.location}}. {{duration_line}} Reply Y to confirm, R to move it, C to cancel."
  • Email variant for Email-preference contacts, carrying three buttons rather than reply codes.
  • Increment Reminder Count Sent and stamp Last Reminder Sent At.
  • On Y: set Confirmation Status Confirmed, stamp Confirmed At, write Confirmation Channel, move the card to Confirmed, swap appt-unconfirmed for appt-confirmed, and reply once: "Great. See you then." Then downgrade the 24-hour reminder to informational and cancel the 2-hour message and the At Risk path.
  • On R: move to Reschedule Requested, send the Reschedule Calendar link, and hand to the reschedule workflow.
  • On C: hand to the cancellation workflow immediately. Do not attempt to talk them out of it in this message.
  • On no response: wait 36 hours, then send one shorter nudge: "Just need a quick Y or N for {{appointment.day}}, {{contact.first_name}}, so we know whether to hold the slot." The phrase about holding the slot matters; it reframes the reply as useful to them rather than to you.
  • Still no response: hand to the At Risk workflow.

Stop conditions: confirmation, cancellation, reschedule, opt-out, or the appointment passing.

4. Final Reminder Sequence

Trigger: 24 hours before the appointment, then conditionally 2 hours before.

Conditions and branches: both steps branch on Confirmation Status. The 2-hour step additionally branches on appointment type and travel.

  • 24 hours, confirmed: informational only, no ask. "Tomorrow at {{appointment.time}}, {{appointment.location}}. {{custom_values.travel_or_access_notes}} Running late or need to move it? {{reschedule_link}}"
  • 24 hours, unconfirmed: keep the ask. "{{contact.first_name}}, we've got you tomorrow at {{appointment.time}} but haven't heard back. Reply Y if you're coming, or C and we'll free the slot for someone else."
  • Increment Reminder Count Sent. This step is exempt from the frequency guard. It is the message the whole build exists to deliver.
  • 2 hours, confirmed and no travel involved: send nothing. This restraint is the difference between a ladder people tolerate and one they mute.
  • 2 hours, unconfirmed: "{{appointment.time}} today, {{contact.first_name}}, {{appointment.location}}. {{custom_values.travel_or_access_notes}}"
  • 2 hours, appointment type involves the customer traveling a distance or a tradesperson attending their property: send regardless of confirmation, because the information is operationally useful rather than a nag. "On track for {{appointment.time}}. {{access_or_arrival_note}}"
  • 30 minutes before, staff-side only: notify the assigned staff member with the contact's prep form answers and any flags. No customer message.

Stop conditions: cancellation, reschedule, sms-opted-out, reminder-opted-out.

5. At Risk Intervention

Trigger: appointment is within 24 hours with Confirmation Status still Unconfirmed after the nudge.

Conditions and branches: branch on Appointment Value Band and on first-appointment. This workflow spends human time, so it has to be selective.

  • Apply appt-at-risk and move the card to At Risk. The board now shows tomorrow's risk list, which is the view the person running the calendar actually wants.
  • High band, or first appointment: create a task for the assigned staff member, "Call to confirm, {{contact.full_name}}, {{appointment.day}} {{appointment.time}}": due within 3 hours and inside business hours. A human call at this point recovers appointments that no amount of texting will.
  • Standard or Low band: no call. Send one last message with the easiest possible exit: "{{contact.first_name}}, if tomorrow doesn't work any more just reply C and we'll free it up. No problem either way." Giving permission to cancel converts silent no-shows into released slots, which is a win.
  • Wait 4 hours. If the call task is still open and the appointment is inside 12 hours, reassign once to whoever is on the calendar.
  • On contact made: record the outcome, update Confirmation Status, and either confirm or release the slot. A released slot goes straight to the waitlist workflow.
  • On no contact by 2 hours before: leave the appointment in place, flag it on the staff member's daily list as unconfirmed, and pre-queue the waitlist candidates for that slot so a fill can happen in minutes if the no-show is confirmed.

Stop conditions: confirmation, cancellation, or the appointment start time passing.

6. Cancellation, Reschedule and Waitlist Fill

Trigger: cancellation received by any route, or appointment released by the At Risk path.

Conditions and branches: branch on notice period (more than 72 hours, 24–72 hours, or under 24 hours) which determines whether a waitlist fill is realistic.

  • Immediately move the card to Canceled - Slot Released, cancel every scheduled ladder step, and remove the appointment from the calendar so the slot is genuinely free.
  • Collect Cancellation Reason: conversationally by BO if the cancellation came by text, by the Cancellation Form otherwise. One question, never two.
  • Offer alternatives once, in the same message: "Canceled, {{contact.first_name}}. If you'd rather just move it, I've got {{slot_1}}, {{slot_2}} or {{slot_3}}, otherwise all done." On acceptance, move to Rescheduled and re-run the booking workflow for the new time.
  • Reason of Price or Found Alternative: create a task for the owner rather than an automated save attempt. These are worth a human conversation and nothing else.
  • Waitlist fill, notice over 24 hours: find contacts with waitlist-active whose stated notice tolerance and day or time preferences match the freed slot, order by Waitlist Priority, and offer to the top one only. "A slot's just opened: {{appointment.day}} {{appointment.time}}. Want it? Reply YES in the next 90 minutes and it's yours." Apply waitlist-offered.
  • Wait 90 minutes. On no reply, remove waitlist-offered and move to the next candidate. Repeat through at most five candidates, then stop and notify the calendar owner that the slot is still open. Sequential single offers, never a blast, offering one slot to twelve people produces eleven disappointments and one booking.
  • Waitlist fill, notice under 24 hours: offer to the top three candidates simultaneously with an explicit first-come line, because the window is too short for sequencing. Be honest that it is first-come.
  • On acceptance: book the slot, set Waitlist Status to Accepted, remove waitlist-active, and start the ladder at the correct position for the time remaining.
  • Reschedule count guard: if Reschedule Count reaches 3 on one appointment, stop automated rescheduling and create a task for a human to call. Three moves means something else is going on.

Stop conditions: slot filled, candidate list exhausted, or the slot time passing.

7. Attendance Marking and No-Show Recovery

Trigger: 15 minutes after the scheduled start time.

Conditions and branches: branch on whether attendance has been marked, then on No Show Count.

  • Attendance marked: move the card to Attended, apply appt-attended, and hand to the post-appointment sequence, which waits 2 hours before sending anything, because a review request that arrives while the customer is still in the parking lot is the most common cause of a bad review.
  • Not marked: notify the assigned staff member once: "Is {{contact.first_name}} with you? Tap to mark attended or no-show." Marking must be one tap or it will not happen, and unmarked appointments wreck the reporting that justifies the build.
  • Still unmarked after 60 minutes: treat as a no-show for workflow purposes but flag the record as unverified, so the metrics can distinguish real no-shows from admin failure.
  • No-show confirmed: move the card to No Show, apply appt-no-show, increment No Show Count, stamp Last No Show Date.
  • Wait 2 hours. First-time no-show, send one recovery message with no reproach: "Sorry we missed you today, {{contact.first_name}}, hope everything's alright. Want to pick another time? {{calendar_link}}" Nothing accusatory, no mention of the cost, no second message.
  • Second or later no-show: apply repeat-no-show and send the rebook link pointing at the Deposit-Required Calendar, with one honest line: "Happy to rebook. We hold these slots with a deposit now. {{deposit_calendar_link}}"
  • Wait 1 day. If no rebook, send the optional No-Show Reason Form, one question, and nothing after it.
  • On rebook: move the card to Recovered After No Show and run the booking workflow for the new appointment.

Stop conditions: rebooking, or 3 days after the missed appointment. Never more than two messages following a no-show.

8. Frequency Guard and Reminder Audit

Trigger: runs as a gate on every outbound automated message, plus a scheduled audit every Monday at 07:30.

Conditions and branches: the gate classifies every message as Critical (24-hour and 2-hour reminders, booking confirmations, waitlist offers, cancellation acknowledgements) or Non-Critical (prep messages, confirmation nudges, no-show reason forms, post-appointment requests).

  • Gate rule: a Non-Critical message is held if the contact has received any automated message in the last 24 hours, or four or more in the last 7 days. Held messages are dropped, not queued. A reminder that arrives two days late is worse than none.
  • Apply message-cap-hit when the weekly ceiling is reached, and clear it on a rolling basis.
  • Critical messages pass the gate always, but are logged when they pass over a cap so the audit can show it.
  • Quiet hours: no message of any class sends outside 08:00-20:00 in the contact's Quiet Hours Zone. A 24-hour reminder that would land at 06:30 sends at 08:00 instead, which is still 22 hours of notice.
  • Monday audit: compile messages sent per contact across all sequences, flag any contact who received more than four in the week, and list every instance of two sequences messaging the same contact on the same day. This cross-sequence collision is the usual cause of opt-outs and it is invisible without this report.
  • Compile opt-out counts by sequence and by message position. An opt-out spike at a specific message is a copy problem with a precise address.
  • Email the owner. Subject: "Reminder audit: {{optout_count}} opt-outs, {{collision_count}} message collisions".
  • Wait 10 minutes, then create a task for each flagged collision: "Two sequences hit {{contact.full_name}} on the same day: check sequence overlap", due that week.

Exit: the gate exits per message; the audit exits on send. The audit reports measured platform data only.

05

What changes

The calendar becomes trustworthy. Before the build, "we have twelve appointments tomorrow" means somewhere between eight and twelve will happen and nobody knows which. After it, the board shows how many are confirmed, how many are at risk, and which ones a human should phone, and that information arrives early enough to act on. Capacity planning stops being guesswork.

No-shows fall for three distinct reasons, and it is worth separating them. Some people simply forgot and now do not. Some people were always going to cancel, and the build made canceling easy enough that they did it with notice instead of silently, which converts a dead slot into a sellable one. And some of those sellable slots get refilled by the waitlist, which is net new revenue from capacity that previously vanished. The third effect is usually the one clients did not expect and value most.

Equally important is what does not happen: the customer does not get six messages. The frequency guard and the confirmation-aware branching mean a confirmed, repeat customer receives a booking confirmation, a 24-hour reminder, and nothing else. Opt-out rates stay low, which keeps the SMS channel available for the messages that matter, and the business stops slowly destroying its own ability to reach people.

Metrics to watch

  • No-show rate: by appointment type, by day of week, by time of day, and by whether it was a first appointment. The segmented view is where the actionable finding lives; the headline number alone tells you very little.
  • Confirmation rate: share of appointments actively confirmed before the 24-hour mark, and the correlation between confirmation and attendance. Establish this early; it is what tells you whether confirmation is a useful signal in this business.
  • Cancellation rate and cancellation notice: both should rise initially. Rising cancellations with rising notice is the build working, not failing, and the client needs to be told that before launch.
  • Slot recovery rate: canceled slots refilled from the waitlist, divided by canceled slots with over 24 hours of notice.
  • Waitlist offer acceptance rate: and the average number of offers needed per fill, which tells you whether the waitlist is big enough or whether the notice-tolerance question is being asked badly.
  • Reschedule rate: versus the no-show rate. Reschedules going up while no-shows go down is exactly the trade you want.
  • No-show recovery rate: share of no-shows that rebook, which justifies keeping the recovery message.
  • Repeat no-show share: and whether the deposit calendar reduces it.
  • Messages per appointment: average across the ladder. If this climbs, something has been added that should not have been.
  • Opt-out rate by message position: the most important health metric in the build. A spike at one position names the message to rewrite.
  • Attendance marking completeness: share of appointments with attendance marked within an hour. Below about nine in ten, every other metric here is unreliable.
06

Before you start

Prerequisites

  • Appointments must actually live on platform calendars. A reminder ladder reading from a calendar it cannot write to will send reminders for appointments that were moved an hour ago, which is worse than no reminders at all.
  • A reminder profile agreed per appointment type. Sit down with the client and decide, type by type, how many messages and at what intervals. The temptation is one profile for everything; resist it.
  • An agreed definition of a no-show, including the grace period. Fifteen minutes is common; some businesses use five and some use thirty, and the metric is meaningless until it is fixed.
  • A commitment from staff to mark attendance. One tap, on the day. Without it the build produces reminders but no insight, and the no-show number stays a matter of opinion.
  • A decision on deposits for repeat no-shows, taken before launch rather than after the first painful week. The build supports it; the client has to want it.
  • A waitlist that exists. If nobody is on it, the slot recovery part of the build does nothing, so the waitlist join form needs to be live and promoted from the first day, not added later.
  • Honest baseline numbers for the current no-show rate, however rough. Without a baseline the client will credit or blame the build on feeling alone.

Integrations

  • Google Calendar or Outlook two-way sync for every staff calendar, tested with a reschedule in both directions. One-way sync is the most common cause of reminders for appointments that no longer exist.
  • An SMS-capable number, provisioned and registered, ideally the same number used for all other customer messaging.
  • Email sending domain authenticated with SPF, DKIM, and DMARC, with calendar attachments tested across the clients the customer base actually uses, including the ones that handle invitations badly.
  • Stripe or the client's payment provider if the Deposit-Required Calendar is in scope.
  • Slack or Teams for the At Risk and unmarked-attendance notifications, if that is where the team lives.
  • Any practice management, booking, or job management system the client will not replace: connected directly where possible, or through Zapier or Make. Decide which system is the source of truth for appointment times, write it down, and never let both write.

Number provisioning and messaging compliance

  • Provision the number and complete carrier registration before launch. In the US, A2P 10DLC brand and campaign registration is required for reminders; start on day one, because approval takes days and unregistered traffic is filtered silently, which here means reminders that simply never arrive.
  • Register the use case as appointment reminders and customer care, with sample copy matching what the ladder sends. Reminder traffic is well understood by carriers and registers cleanly when described accurately.
  • Capture messaging consent at booking, in plain language, stating that appointment reminders will be sent by text and email and that message rates may apply. Store the timestamp and the wording shown.
  • Keep reminder consent separate from marketing consent, in both directions. Someone who unsubscribes from the newsletter should still get their appointment reminder; someone who asks for no reminders should still be reachable about a genuine change to their booking. Conflating the two is the most common and most damaging error in this build, which is why reminder-opted-out and email-unsubscribed are different tags.
  • Implement opt-out handling on every path: STOP, UNSUBSCRIBE, QUIT and variants apply sms-opted-out and end every text sequence immediately, with one confirmation reply. When this happens, flag the appointment for a staff member to confirm by phone instead, so the opt-out does not quietly become a no-show.
  • Quiet hours at 08:00-20:00 in the customer's own time zone, held in Quiet Hours Zone. Early-morning appointments need their 2-hour reminder moved to the previous evening rather than sent at 05:00.
  • Enforce the frequency cap as a technical gate, not a guideline. A documented cap that no workflow checks is not a cap.

Data protection

  • Reminder messages are visible on lock screens and read by whoever is holding the phone. Keep the service name out of the message body where the appointment type is sensitive (health, legal, financial, anything personal) and let the business name and the time carry the message. Agree this with the client explicitly; it is a question they will not think to raise.
  • Prep form answers and Cancellation Reason can accumulate information that carries specific handling obligations, particularly in health and legal contexts. Keep sensitive detail out of fields that appear in digests, task bodies, or staff notifications.
  • Agree a retention period for prep form responses and cancellation reasons, and make sure deletion requests clear them along with the contact record.
  • Where customers may be in the UK or EU, document the lawful basis for reminder messaging, which is normally straightforward as it relates to a service the person has requested, but the post-appointment marketing that often gets bolted onto the same ladder is a different matter and needs its own consent.

None of the above is legal advice. Messaging rules, consent requirements, and data-protection obligations vary by jurisdiction and sector, and reminders touching health or financial services carry additional constraints. Confirm the specifics with the client's own counsel before launch, and get the consent wording, the message cap, and the lock-screen policy signed off in writing.

Scoping depends on how many appointment types and calendars are in play. Book a call at bookings.appbo.io to work through yours.

Build it with us.

Every build on this page is something we configure, test and hand over with the SOPs your team needs to run it.

Book a call