How to Automate Appointment Reminders Using n8n and Twilio (Full Tutorial)
No-shows are one of the biggest revenue leaks in service businesses. A dental practice losing 3 appointments per week at $150 each loses $2,340/month. An automated reminder sequence that sends SMS at 24 hours, 2 hours, and day-of can reduce no-shows by 40–70%.
In this tutorial, you'll build a complete appointment reminder system in n8n using Twilio that handles the full sequence automatically — including confirmation replies and reschedule requests.
What You'll Build
- Pull upcoming appointments from Google Calendar or a spreadsheet
- Send a 24-hour reminder SMS via Twilio
- Send a 2-hour reminder SMS
- Send a day-of morning reminder
- Handle confirmation replies (reply "1" to confirm)
- Handle reschedule requests (reply "2" to reschedule)
- Notify staff when an appointment is confirmed or at risk
- Log all reminder activity
Step 1: Set Up Your Appointment Data Source
For this tutorial, appointments come from a Google Sheet. Your client's booking system (Calendly, Acuity, Square Appointments) should export to or sync with this sheet.
Required columns: appointment_id, client_name, client_phone, appointment_datetime, service_type, reminder_24h_sent, reminder_2h_sent, reminder_dayof_sent, confirmation_status, staff_member.
Set up a Calendly webhook (or Zapier integration) to automatically add new appointments to this sheet when they're booked.
Step 2: Create the Reminder Scheduler Workflow
Create a new n8n workflow called Appointment Reminder Scheduler. Add a Schedule Trigger node:
- Mode: Every Hour (checks every hour for upcoming appointments)
- Or: Every 30 Minutes for higher accuracy
Running hourly means your timing accuracy is within 1 hour — good enough for most businesses. For exact timing, run every 15 minutes.
Step 3: Fetch Appointments Needing Reminders
Add a Google Sheets → Read Rows node to pull relevant appointments. You'll need to filter with a Code node:
For 24-hour reminders: appointments where:
appointment_datetimeis between now+23h and now+25hreminder_24h_sentis blank or Noconfirmation_statusis not Cancelled
Code node filter:
const now = new Date(); const items = $input.all(); return items.filter(item => { const apptTime = new Date(item.json.appointment_datetime); const hoursUntil = (apptTime - now) / 1000 / 60 / 60; return hoursUntil > 23 && hoursUntil <= 25 && item.json.reminder_24h_sent !== 'Yes'; });
Step 4: Set Up Twilio Credentials in n8n
Go to Credentials → Add Credential → Twilio API. From your Twilio Console, get:
- Account SID: found on the Twilio Console dashboard
- Auth Token: also on the Twilio Console dashboard (click to reveal)
Save as Twilio Production. Purchase a local Twilio number in your client's area code under Phone Numbers → Buy a Number.
Step 5: Send the 24-Hour Reminder SMS
After filtering, use a SplitInBatches node to process one at a time, then add a Twilio node:
- Resource: SMS
- Operation: Send
- From: your Twilio number (format: +1XXXXXXXXXX)
- To:
{{$json.client_phone}} - Message:
Hi {{$json.client_name}}, this is a reminder of your {{$json.service_type}} appointment tomorrow at {{formatDate($json.appointment_datetime, 'h:mm A')}}. Reply 1 to confirm or 2 to reschedule. — [Business Name]
Step 6: Update the Reminder Log
After each SMS send, update the Google Sheet row:
- Operation: Update Row
- Match by:
appointment_id - Update
reminder_24h_sentto: Yes - Update
reminder_24h_sent_atto:{{new Date().toISOString()}}
Step 7: Build the 2-Hour Reminder Branch
Add another Code node to filter for 2-hour reminders:
return items.filter(item => { const hoursUntil = (apptTime - now) / 1000 / 60 / 60; return hoursUntil > 1.5 && hoursUntil <= 2.5 && item.json.reminder_2h_sent !== 'Yes'; });
2-hour SMS message:
{{$json.client_name}}, your {{$json.service_type}} appointment is in about 2 hours at {{formatDate($json.appointment_datetime, 'h:mm A')}}. See you soon! Reply STOP to cancel. — [Business Name]
Step 8: Build the Day-Of Morning Reminder
For same-day morning reminders, modify the filter to only run between 7–9 AM and check for today's appointments:
return items.filter(item => { const apptDate = apptTime.toDateString(); const todayDate = now.toDateString(); return apptDate === todayDate && now.getHours() >= 7 && now.getHours() <= 9 && item.json.reminder_dayof_sent !== 'Yes'; });
Day-of SMS:
Good morning {{$json.client_name}} — looking forward to seeing you today at {{formatDate($json.appointment_datetime, 'h:mm A')}}! Your {{$json.service_type}} is confirmed. Reply 2 if you need to reschedule. — [Business Name]
Step 9: Handle Confirmation Replies
Create a second workflow called Appointment Reply Handler. In Twilio, configure your phone number's incoming SMS webhook to point to a new n8n webhook URL: https://your-n8n.com/webhook/appt-reply
Add a Webhook trigger, then a Switch node on Body (the SMS reply text):
- Case 1: confirmation → update sheet
confirmation_status = Confirmed, send thank-you SMS, notify staff in Slack - Case 2: reschedule request → notify staff via Slack, send reschedule link SMS with Calendly URL
- Default: unknown reply → log it, notify staff to respond manually
Step 10: Staff Notifications
Add a Slack node in the confirmation branch:
- Message:
✅ {{$json.client_name}} confirmed their {{$json.service_type}} appointment at {{$json.appointment_datetime}}. - Channel: #appointments
For reschedule requests:
- Message:
⚠️ {{$json.client_name}} wants to reschedule their {{$json.appointment_datetime}} appointment. Their phone: {{$json.client_phone}}. Please call them back.
Testing the Workflow
Before deploying for a client, test with your own phone number:
- Add a test appointment row 25 hours in the future
- Manually trigger the scheduler workflow
- Verify you receive the 24-hour SMS
- Reply "1" and verify the confirmation workflow fires
- Check the Google Sheet updated correctly
- Verify the Slack notification appeared
Pricing and ROI for Clients
For a dental practice with 50 appointments per week, a 40% no-show reduction means 20 fewer no-shows per month. At $150/appointment, that's $3,000/month in recovered revenue. Your $200/month automation fee has a 15x ROI.
Sell this to any business that books appointments: dentists, chiropractors, salons, auto shops, fitness studios, law firms, and financial advisors.
Learn more about n8n automation fundamentals in our n8n beginner's guide, and compare automation tools in our n8n vs Make vs Zapier breakdown.
Want to learn how to build and sell AI automations? Join our free community. Join the free AI Agency Sprint community.
Join 215+ AI Agency Owners
Get free access to our LinkedIn automation tool, AI content templates, and a community of builders landing clients in days.
