Build Twilio appointment reminders with scheduled messages or a worker, then handle delivery callbacks, consent, opt outs, replies, and scheduling limits.

Use Twilio Programmable Messaging to schedule SMS reminders, or the Conversations API when customers need to reply and confirm. Schedule with scheduleType and sendAt, or run a worker that calls messages.create at send time. Track delivery with status callbacks, and manage opt-outs through the Consent Management API.
TL;DR:
- Twilio accepts scheduled messages only when they are created 15 minutes to 35 days before delivery; store each message SID to cancel or reschedule it.
- Status callbacks start only after a message enters the queue, so log delivery states and inspect ErrorCode and ChannelStatusMessage when a send fails.
- Cancel pending reminders as soon as a customer opts out; a scheduled message can fail at send time, and a Messaging Service centralizes consent records.
- Store appointment times in UTC with each customer’s time zone, and use a worker queue for bookings inside 15 minutes or beyond 35 days.
- Twilio charges for sent messages, carrier fees, and sender costs, while scheduling adds no fee; long texts may split into billable segments.
Table of Contents
- How do you send a scheduled SMS reminder with Twilio?
- What are the limits of Twilio message scheduling?
- How does Twilio track the status of a reminder?
- How do you handle consent and opt-outs?
- Should reminders be one-way or two-way?
- How do you deploy reminders reliably across time zones?
- How do you test and debug SMS reminders?
- How do you write SMS reminders people act on?
- How do SMS reminders fit into Pipeline’s lead and job workflows?
- What do UK rules mean for SMS reminders?
- How do you handle customer replies and follow-ups in Pipeline?
- What does it cost to send SMS reminders with Twilio?
- Where we would start
- Run reminders without building the integration
- FAQ
How do you send a scheduled SMS reminder with Twilio?
You need four things before you write any code:
- A Twilio account with your Account SID and Auth Token kept in environment variables
- A Messaging Service SID, or a Twilio number to send from
- Recipient numbers in E.164 format
- A public URL for status callbacks, which we cover below
The shortest route is Twilio’s own scheduling. Create the message with scheduleType set to fixed and sendAt set to an ISO-8601 timestamp in UTC. In Python it looks like this:
from twilio.rest import Client
import os
client = Client(os.environ["TWILIO_ACCOUNT_SID"], os.environ["TWILIO_AUTH_TOKEN"])
message = client.messages.create(
messaging_service_sid=os.environ["TWILIO_MESSAGING_SERVICE_SID"],
to="+447700900123",
body="Reminder: your boiler service is tomorrow at 10:00. Reply C to confirm.",
schedule_type="fixed",
send_at="<ISO-8601 timestamp>",
status_callback="https://example.com/twilio/status",
)
print(message.sid) # save this against the appointment
Save that returned SID against the appointment record. You will need it to cancel or change the send later.
The alternative is a worker job in Celery, Bull or Sidekiq that calls messages.create at the appointment time. You trade Twilio’s built-in scheduler for full control over rescheduling logic.
For a fuller example, Twilio publishes a Flask sample app. Look at the route that creates the appointment, the function that calls the Twilio client, and the status callback handler. Twilio also describes appointment reminder workflows built in code or in its low-code Studio tool.
What are the limits of Twilio message scheduling?
Scheduling has hard edges, and hitting them at send time is an unpleasant way to find out. The Message Scheduling documentation sets them out:
- Set scheduleType to fixed and provide sendAt on the Message resource
- Create the message between 15 minutes and 35 days before sendAt, or the request is rejected
- A scheduled message returns the status scheduled and emits no status callbacks until it is processed
- To cancel, update the Message resource and set its status to canceled, which means you must have stored the SID
- Each account or subaccount can hold up to 500,000 scheduled messages, so plan around that if you send at high volume
Two practical consequences follow. An appointment booked 10 minutes ahead cannot use scheduling at all, so send that one straight away. And a reminder for an appointment more than 35 days out needs a worker that creates the scheduled message later.
Scheduling works across SMS, MMS, RCS and WhatsApp, and Twilio charges only for the messages you send.
How does Twilio track the status of a reminder?
Every message moves through a lifecycle: scheduled, then queued, then sent or failed, then delivered or undelivered. Status callbacks only begin once the message is queued, so a scheduled reminder stays silent until its send time arrives.
To receive updates, expose a public endpoint and let Twilio post to it:
- Twilio sends a POST request with an application/x-www-form-urlencoded body to your StatusCallback URL
- The body carries MessageStatus and, on failure, an ErrorCode, as described in the guide to tracking outbound message status
- Set a service-level Delivery Status Callback on a Messaging Service, or pass a statusCallback parameter on each message
- At send time, check ErrorCode and ChannelStatusMessage to separate an opt-out from a carrier error
Update your appointment record from the callback: delivered, failed, or needs a phone call. A failed reminder that nobody notices is the same as no reminder.
How do you handle consent and opt-outs?
Opt-outs bite hardest with scheduled messages. If a customer opts out after you schedule a reminder, the message fails at send time unless you cancel it first.
- Cancel pending scheduled messages when a customer opts out, and reschedule them if they opt back in
- Use a Messaging Service, which centralises consent and syncs opt-outs. Without one, you record opt-outs and re-opt-ins yourself
- Use the Consent Management API to bulk create or update consent records. It takes a contact_id in E.164 format and a sender_id, which is your Messaging Service SID
- When a customer opts back in, check the consent records and confirm the opt-in is recognised
- Store date_of_consent and a correlation_id so you can show an auditable consent timeline
Pro Tip: Run a nightly job that compares your pending scheduled SIDs against current consent records and cancels any mismatch. It catches opt-outs your webhook missed.
Should reminders be one-way or two-way?
Start with what the reminder has to achieve.
- For a plain “see you tomorrow” text, the Programmable Messaging API is enough
- For confirm or reschedule flows, prefer the Conversations API. Twilio recommends treating appointment reminders as two-way engagement where appropriate, and Conversations keeps replies in a thread
- Conversations adds multi-channel fallback and threaded context, but also more moving parts to build and maintain
- Letting customers reply to confirm or move a slot feeds straight into your workflow and tends to reduce no-shows
Our advice is to ship one-way reminders first, watch how many customers reply anyway, and add Conversations once those replies justify the extra build.
How do you deploy reminders reliably across time zones?
Wrong-hour texts come from sloppy time handling, not from Twilio.
- Store appointment datetimes in UTC and keep a separate timezone field for the customer. Compute sendAt from those two values so daylight saving changes cannot shift a send
- Use a worker queue such as Celery, Sidekiq or Bull. Twilio’s own guidance recommends a dedicated worker or job queue and UTC normalisation over simple database polling
- Index message SIDs against appointments so a cancellation or reschedule touches the right message in seconds
- Use Messaging Service sender pools when volume grows, for throughput and delivery optimisation
Pro Tip: Test your date logic around daylight saving changes. A naive “the day before” calculation can shift a send to the wrong time.
How do you test and debug SMS reminders?
Work through this checklist before going live:
- Send to real E.164 numbers from a dev account and confirm your status callback logs show every state change.
- Read ErrorCode and ChannelStatusMessage on the Message resource to diagnose carrier rejections.
- Simulate an opt-out and confirm the scheduled send is cancelled, not failed.
- Log every message event, then add retry and backfill for transient failures.
If a message never arrives, check these in order: the number format, the opt-out status, the sender registration for the destination country, and the error code on the Message resource. Registration rules differ by market, and US A2P 10DLC rules apply only to US traffic. For anything outside the US, read the international SMS guide, since short code and sender ID support varies by country.
How do you write SMS reminders people act on?
A good reminder is short, specific and easy to answer. Put the date, time and what the visit is for in the first line. “Your boiler service is tomorrow at 10:00” does more work than “Don’t forget your upcoming appointment”.
Add the name of your business so the customer knows who is texting, and give one clear action: reply C to confirm, or call a number to change. Avoid links where a reply will do, since replies are easier on a phone screen and keep the customer in the thread.
On timing, send the first reminder early enough to rearrange, and consider a short follow-up on the morning of the visit. The right gap depends on your trade. A cleaner with a recurring client needs less lead time than an electrician who has booked a half-day slot, so test your own numbers rather than copying someone else’s.
Personalise with what you already hold: first name, the engineer’s name, the job type. Skip anything that makes the text feel like a mail merge gone wrong.
Twilio also lets you label these texts correctly. Its compliance guidance recommends setting messageIntent to notifications so the platform treats reminders as essential and handles delivery and quiet hours accordingly. Do not switch off riskCheck outside the US to get around filtering. Label the traffic properly instead.
Finally, keep reminders and marketing apart. A reminder that suddenly includes a discount code starts to look like a promotion, and the consent rules change with it.

How do SMS reminders fit into Pipeline’s lead and job workflows?
A reminder is only useful if it hangs off real data: who the customer is, which job it belongs to, and what happens next. That is the part most custom builds leave until last, and it is where they get messy.
In Pipeline, the reminder sits inside the same record as everything else. An enquiry becomes a lead, the lead becomes a booked job, and the job carries its date, its assigned engineer and the customer’s contact details. When the booking changes, keep the reminder aligned with it so nobody has to remember to cancel a text by hand. We connect Twilio SMS directly.
Because customer details, quotes, invoices and appointments share one customer record, the same connection that sends a “see you tomorrow” text can also send the right message at other points in the job. Our piece on cleaning job scheduling shows how visual scheduling and reminders work together to stop double bookings, and our guide to invoice reminders covers the same idea applied to getting paid.
If you are comparing channels, push notifications can sit alongside SMS. Tools such as Beepify’s customer engagement features cover instant push and location alerts, which suit loyalty and walk-in businesses more than booked appointments.
Whether you build your own or use ours, the principle is the same: keep one source of truth for the appointment, and make the reminder a consequence of it.
What do UK rules mean for SMS reminders?
Two sets of rules matter: UK GDPR for how you hold personal data, and PECR for how you contact people electronically. We are a software company, not a law firm, so treat this as a map and check the details with the Information Commissioner’s Office or a solicitor.
The broad distinction is between service messages and marketing. A text that tells a customer about an appointment they booked is part of delivering that service. A text promoting an offer is marketing, and marketing by SMS generally needs prior consent. Keep the two separate in your system, with separate consent records, so a reminder opt-in never quietly turns into permission to promote.
Under GDPR, hold only the data you need, such as name, mobile number and appointment details. Keep it secure, and delete it when you no longer need it. Record when and how a customer gave their number, which is exactly what the date_of_consent and correlation_id fields in the Consent Management API are for.
Make opting out easy and honour it straight away. Twilio’s handling of opt-out keywords on a Messaging Service helps, but you still have to cancel any scheduled sends, as covered above.
Our post on a GDPR-aware appointment booking workflow walks through how consent fits into booking for UK trades, and is a sensible next read if you hold customer details on spreadsheets today.

How do you handle customer replies and follow-ups in Pipeline?
Customers answer reminders in ways your code never expected. “Yes”, “yep”, “can we do Thursday?”, a thumbs-up emoji. Plan for that before launch.
For the simple cases, keyword matching works: C confirms, R asks to reschedule, STOP opts out. Parse the inbound message, update the appointment, and send a short acknowledgement. Anything your parser does not understand should land in front of a person, not vanish.
In Pipeline, customer and job information is managed alongside the rest of the workflow. Our automatic replies to simple customer requests feature can help with customer communications. That gives you lightweight two-way handling without building a full Conversations flow.
Follow-ups are where the time savings pile up:
- An unconfirmed appointment gets a nudge the next morning
- A cancellation frees the slot and prompts you to offer it to someone on the waiting list
- A completed job triggers a thank-you and, later, the invoice reminder
Twilio’s guidance describes the same pattern: collecting confirmations, handling rescheduling and backfilling cancellations across channels. The difference is whether you write and run that logic yourself or configure it. For a team of tradespeople out on jobs all day, configuring wins.
What does it cost to send SMS reminders with Twilio?
Twilio charges per message sent, plus any carrier fees and the cost of a number or sender, so your bill grows with volume rather than with team size. Scheduling itself carries no extra charge. Twilio states that message scheduling is included without extra cost and you pay only for messages sent.
Cost drivers worth modelling before you commit:
- Messages per appointment: one reminder, two reminders, plus a confirmation reply each multiply your volume
- Message length: long texts split into multiple segments, and each segment is billed
- Destination country: rates and sender requirements differ by market
- Sender type: a standard number, short code or alphanumeric sender ID each carry different set-up and running costs
- Failed sends: build retries carefully so a bad number does not get billed repeatedly
Check Twilio’s live pricing page for current per-message rates in your destination country, since they change and differ by market. Here is a worked example with illustrative inputs only: say you send 2 reminders per appointment and book 100 appointments a week. That is 200 outbound messages a week before replies. Multiply by your actual per-message rate to see the weekly spend.
Remember the engineering cost too. A homemade scheduler needs hosting, monitoring and someone to fix it when a daylight saving change catches it out. In Pipeline, SMS sending is a product line alongside our plans, and the plan prices (Solo at £12 per month, Starter at £38 per month, Professional at £63 per month) are on our pricing page.
Where we would start
I would start with scheduled Programmable Messaging, because it is the smallest thing that works and you can have it running in an afternoon. Add the Conversations API only once customers are replying often enough to justify a threaded flow.
The two things most builds underinvest in are consent and status tracking. Store every message SID, listen to every callback, and cancel pending sends the moment someone opts out. Everything else is polish. Treat Twilio’s documentation as the authority on limits, and test with numbers on the carriers your customers really use, because delivery behaviour varies by region.
— Chris
Run reminders without building the integration
If you would rather spend your week on jobs than on schedulers and callback handlers, we built Pipeline to help manage your lead and job workflows. It brings bookings, customer records and Twilio SMS together with the leads, quotes and invoices you manage, with flat monthly pricing and no per-user fees.

Current plan prices are on our pricing page.
FAQ
Is Twilio having issues right now?
Twilio publishes live service information on its public status page, which is the place to check before you debug your own code. If messages are queued but not delivered, also read the ErrorCode on the Message resource, since a carrier or consent problem looks similar to an outage.
What is a Twilio SMS?
A Twilio SMS is a text message sent through Twilio’s Programmable Messaging API. You make an API call with a recipient, a body and a sender, and Twilio routes it to the carrier and reports status back to you. It works for one-way alerts such as appointment reminders.
What is an SMS reminder?
An SMS reminder is an automated text that tells someone about an upcoming event, such as an appointment or a payment due. It usually states the date, time and any action needed. Done well, it reduces no-shows and missed payments.
Why isn’t my Twilio SMS being sent?
The usual causes are a number not formatted correctly, a recipient who has opted out, or a scheduled message that was created outside the supported scheduling window. Check the Message resource for an ErrorCode and ChannelStatusMessage, and confirm your sender is registered for the destination country.