Zoho

Zoho Creator and Twilio Integration: Build a Custom Appointment Reminder System

Aaxonix Team Aaxonix Team · Apr 19, 2026 · 13 min read #Appointment Scheduling #Deluge #Integrations
Zoho Creator and Twilio Integration: Build a Custom Appointment Reminder System

Missed appointments cost service businesses between 5% and 10% of their revenue each year. For clinics, consultancies, salons, and field service companies, every no-show is lost time that cannot be recovered. A Zoho Creator and Twilio integration solves this by connecting a custom appointment scheduling app directly to SMS and WhatsApp reminder channels, giving your team full control over when, how, and how often reminders go out. This guide walks through the complete implementation: building the Creator app, connecting Twilio’s messaging API via Deluge, setting up scheduled reminder functions, handling delivery status callbacks, and managing rescheduling and cancellation workflows. By the end, you will have a production-ready appointment reminder system that reduces no-shows by 30% or more.

Why Zoho Creator for Appointment Reminders

Off-the-shelf appointment tools handle basic scheduling, but they fall short when you need custom fields, conditional reminder logic, or integration with your existing Zoho Creator applications. Creator gives you a low-code environment where you can design the data model, build custom forms, and write Deluge scripts that call external APIs, all without managing servers.

The key advantages of building your reminder system on Creator include:

Twilio provides the messaging infrastructure. Its REST API supports SMS to over 180 countries, WhatsApp Business messaging, and delivery status callbacks that confirm whether each message was sent, delivered, or failed. The combination of Creator’s logic layer with Twilio’s delivery network gives you a system that is both customizable and reliable.

Designing the Creator Appointment App

Start with three core forms in your Creator application: Appointments, Clients, and Reminder Logs. The Appointments form captures the scheduling data, the Clients form stores contact details and communication preferences, and the Reminder Logs form tracks every message sent.

Appointments Form Fields

Field NameTypePurpose
ClientLookup (Clients)Links to client record with phone/email
Appointment DateDate-TimeScheduled date and time
Service TypeDropdownConsultation, Follow-up, Demo, etc.
Assigned StaffLookup (Users)Staff member handling the appointment
StatusDropdownScheduled, Confirmed, Cancelled, Completed, No-Show
Reminder IntervalsMulti-select24h, 4h, 1h, 30min before
Channel PreferenceRadioSMS, WhatsApp, or Both
NotesMulti-lineSpecial instructions for the client

Clients Form Fields

The Clients form needs a phone number field stored in E.164 format (e.g., +14155551234) since Twilio requires this format for all API calls. Add a “WhatsApp Opted In” checkbox field to track consent for WhatsApp messaging, which is required under Twilio’s and Meta’s policies. Include a timezone field so your scheduled functions can calculate reminder times relative to the client’s local time, not your server’s timezone.

Setting Up Your Twilio Account for Zoho Creator

Before writing any Deluge code, you need three things from Twilio: an Account SID, an Auth Token, and at least one phone number capable of sending SMS. If you also want WhatsApp support, you will need to register a WhatsApp sender through Twilio’s WhatsApp Business API.

  1. Create a Twilio account at twilio.com and note your Account SID and Auth Token from the console dashboard
  2. Purchase a phone number with SMS capability (starting at $1.15/month for US numbers)
  3. For WhatsApp, navigate to Messaging > Senders > WhatsApp Senders and complete the business verification process
  4. Create a Twilio connection in Zoho Creator by going to Settings > Connections > Add Connection > Twilio

Store your Twilio credentials as a Creator connection rather than hardcoding them in Deluge scripts. This keeps credentials secure and makes it simple to rotate tokens without modifying every function that sends messages.

Deluge Functions for Sending Twilio SMS and WhatsApp Messages

Zoho Creator’s Deluge language has a built-in invokeurl task for HTTP requests, which is what you will use to call the Twilio REST API. Here is the core function for sending an SMS reminder:

// Function: sendTwilioSMS
// Params: toNumber (string), messageBody (string)
// Returns: Map with status and message SID

twilioSID = "YOUR_ACCOUNT_SID";
twilioToken = "YOUR_AUTH_TOKEN";
fromNumber = "+1XXXXXXXXXX";

apiUrl = "https://api.twilio.com/2010-04-01/Accounts/" + twilioSID + "/Messages.json";

params = Map();
params.put("To", toNumber);
params.put("From", fromNumber);
params.put("Body", messageBody);

response = invokeurl
[
    url: apiUrl
    type: POST
    parameters: params
    connection: "twilio_connection"
];

responseMap = response.toMap();
info "Twilio Response: " + responseMap;
return responseMap;

For WhatsApp messages, the only change is the “From” and “To” format. Twilio uses the whatsapp: prefix for WhatsApp numbers:

// WhatsApp variant
params.put("To", "whatsapp:" + toNumber);
params.put("From", "whatsapp:+1XXXXXXXXXX");

Building the Reminder Message Template

Avoid sending generic messages. Include the client’s name, appointment date and time, service type, and a clear call to action. Here is a template function:

// Function: buildReminderMessage
// Params: clientName, appointmentDate, serviceType, intervalLabel

message = "Hi " + clientName + ", this is a reminder about your "
    + serviceType + " appointment on "
    + appointmentDate.toString("MMM dd, yyyy 'at' hh:mm a")
    + ". ";

if (intervalLabel == "24h")
{
    message = message + "Reply CONFIRM to confirm or CANCEL to cancel.";
}
else if (intervalLabel == "1h")
{
    message = message + "See you soon! Reply CANCEL if you need to reschedule.";
}
else
{
    message = message + "Reply CANCEL if you need to make changes.";
}

return message;

Scheduled Functions for Configurable Reminder Intervals

The core of the reminder system is a Deluge scheduled function that runs every 15 minutes, queries for appointments within each reminder interval window, and sends the appropriate messages. In Creator, go to Workflow > Schedules > New Schedule and set the function to run at a 15-minute interval.

// Scheduled Function: processAppointmentReminders
// Runs every 15 minutes

now = zoho.currenttime;
reminderWindows = List();
reminderWindows.add({"interval": "24h", "minutes": 1440, "tolerance": 15});
reminderWindows.add({"interval": "4h", "minutes": 240, "tolerance": 15});
reminderWindows.add({"interval": "1h", "minutes": 60, "tolerance": 15});
reminderWindows.add({"interval": "30min", "minutes": 30, "tolerance": 15});

for each window in reminderWindows
{
    targetTime = now.addMinutes(window.get("minutes"));
    rangeStart = targetTime.addMinutes(-1 * window.get("tolerance"));
    rangeEnd = targetTime.addMinutes(window.get("tolerance"));

    appointments = Appointments
        [Appointment_Date >= rangeStart
         && Appointment_Date <= rangeEnd
         && Status == "Scheduled"
         && Reminder_Intervals.contains(window.get("interval"))];

    for each appt in appointments
    {
        // Check if reminder already sent for this interval
        existingLog = Reminder_Logs
            [Appointment == appt.ID
             && Interval == window.get("interval")];

        if (existingLog.count() == 0)
        {
            client = appt.Client;
            msg = buildReminderMessage(
                client.Name,
                appt.Appointment_Date,
                appt.Service_Type,
                window.get("interval")
            );

            channel = appt.Channel_Preference;

            if (channel == "SMS" || channel == "Both")
            {
                result = sendTwilioSMS(client.Phone, msg);
                logReminder(appt.ID, "SMS", window.get("interval"),
                    result.get("sid"), result.get("status"));
            }
            if (channel == "WhatsApp" || channel == "Both")
            {
                result = sendTwilioWhatsApp(client.Phone, msg);
                logReminder(appt.ID, "WhatsApp", window.get("interval"),
                    result.get("sid"), result.get("status"));
            }
        }
    }
}

The tolerance window (15 minutes) ensures that reminders are sent even if the scheduled function runs slightly before or after the exact target time. The duplicate check against the Reminder Logs form prevents sending the same reminder twice if the function runs multiple times within the window.

Delivery Status Callbacks and Logging

Twilio can send HTTP callbacks (webhooks) to your application whenever a message status changes, moving from "queued" to "sent" to "delivered" or "failed." To capture these, create a Creator custom API endpoint.

In Creator, go to API > REST API > New API and create an endpoint that accepts POST requests from Twilio:

// Custom API: updateMessageStatus
// Method: POST
// Params from Twilio callback: MessageSid, MessageStatus, ErrorCode

messageSid = input.MessageSid;
messageStatus = input.MessageStatus;
errorCode = input.ErrorCode;

logRecords = Reminder_Logs[Message_SID == messageSid];

if (logRecords.count() > 0)
{
    logRecord = logRecords.get(0);
    logRecord.Delivery_Status = messageStatus;
    logRecord.Error_Code = errorCode;
    logRecord.Status_Updated = zoho.currenttime;
}

return {"success": true};

When sending the initial message, include the StatusCallback parameter pointing to your Creator API URL. This gives you real-time visibility into which messages were delivered and which failed, allowing you to retry failed messages or escalate to email as a fallback channel.

The Reminder Logs form should include fields for Message SID, Channel (SMS/WhatsApp), Interval, Delivery Status, Error Code, Sent At, and Status Updated. This creates a complete audit trail for every reminder sent through the system.

Rescheduling and Cancellation Handling

A reminder system is incomplete without handling responses. When a client replies "CANCEL" or "RESCHEDULE" to an SMS, Twilio forwards the inbound message to your webhook. Set up a second Creator API endpoint to process these inbound messages.

// Custom API: handleInboundSMS
// Method: POST

fromNumber = input.From;
messageBody = input.Body.trim().toUpperCase();

// Find the client by phone number
client = Clients[Phone == fromNumber];
if (client.count() > 0)
{
    // Find their next upcoming appointment
    nextAppt = Appointments
        [Client == client.get(0).ID
         && Status == "Scheduled"
         && Appointment_Date > zoho.currenttime]
        .sort(Appointment_Date, true)
        .get(0);

    if (messageBody == "CANCEL")
    {
        nextAppt.Status = "Cancelled";
        sendTwilioSMS(fromNumber,
            "Your appointment on "
            + nextAppt.Appointment_Date.toString("MMM dd")
            + " has been cancelled. Reply BOOK to schedule a new one.");
    }
    else if (messageBody == "CONFIRM")
    {
        nextAppt.Status = "Confirmed";
        sendTwilioSMS(fromNumber,
            "Confirmed! See you on "
            + nextAppt.Appointment_Date.toString("MMM dd 'at' hh:mm a")
            + ".");
    }
}

For rescheduling, you can either send the client a link to an online booking page or handle time-based responses directly. The simpler approach is to reply with a booking link built from your Creator portal URL, letting the client pick a new slot through a published Creator form.

Error Handling, Retry Logic, and Testing

Production messaging systems need to handle failures gracefully. Twilio returns specific error codes that tell you exactly what went wrong, whether it is an invalid phone number (error 21211), an unsubscribed recipient (error 21610), or a rate limit hit (error 20429).

Retry Strategy

Implement a retry function that attempts to resend failed messages up to three times with exponential backoff:

// Retry logic in the scheduled function
if (result.get("status") == "failed" || result.get("status") == "undelivered")
{
    retryCount = existingLog.get(0).Retry_Count;
    if (retryCount < 3)
    {
        // Wait and retry (handled by next schedule run)
        existingLog.get(0).Retry_Count = retryCount + 1;
        existingLog.get(0).Next_Retry = zoho.currenttime.addMinutes(
            toNumber(math.pow(2, retryCount)) * 5
        );
    }
    else
    {
        // Escalate: send email instead
        sendmail
        [
            from: zoho.adminuserid
            to: client.Email
            subject: "Appointment Reminder"
            message: msg
        ];
    }
}

Testing Before Go-Live

Twilio provides test credentials that simulate message sending without actually delivering SMS. Use these during development to validate your Deluge functions without incurring costs. Test the following scenarios before switching to production credentials:

Monitor your API and webhook performance through Creator's built-in logs and Twilio's console dashboard. Set up alerts for delivery rates dropping below 95%, which typically indicates a phone number quality issue or a carrier filtering problem.

Cost Breakdown and Optimization

Understanding the cost structure helps you plan your messaging budget and optimize for efficiency.

ComponentCostNotes
Twilio SMS (US)$0.0079/messageOutbound; inbound free on most plans
Twilio SMS (International)$0.01 - $0.15/messageVaries by country
Twilio WhatsApp$0.005 - $0.08/messageUtility template category pricing
Twilio Phone Number$1.15/monthUS local number
Zoho Creator$8/user/monthStandard plan; $20 for Professional

For a business sending 4 reminders per appointment across 500 monthly appointments, the Twilio SMS cost is approximately $15.80/month for US numbers. Switching to WhatsApp for the 24h and 4h reminders while keeping SMS for the 1h and 30min windows can reduce costs by 30-40% in markets where WhatsApp delivery rates are higher than SMS. This hybrid approach also tends to improve open rates, as WhatsApp messages see 90%+ read rates compared to 82% for SMS.

Frequently Asked Questions

Can I use Zoho Creator's built-in Twilio connection instead of invokeurl?

Yes. Creator offers a native Twilio integration through the twilio.sms.send Deluge task. This works well for basic SMS sending, but the invokeurl approach gives you more control over parameters like StatusCallback URLs, WhatsApp channel routing, and custom message attributes. For a full appointment reminder system with delivery tracking, the REST API approach via invokeurl is the better choice.

How do I handle timezone differences for clients in multiple regions?

Store each client's timezone as a field in the Clients form (e.g., "America/New_York" or "Asia/Kolkata"). In your scheduled function, convert the appointment time to the client's local timezone before calculating reminder windows. Deluge's toTime function with timezone parameters handles this conversion. Always display times in the client's local timezone in reminder messages.

What is the maximum number of SMS messages Zoho Creator can send per day through Twilio?

The limit depends on your Twilio account tier, not on Creator. A standard Twilio account can send up to 500 messages per day from a single number. For higher volumes, use a Twilio Messaging Service with a number pool, which scales to thousands of messages per day. Creator's scheduled functions can handle the API calls, though you should keep each function execution under the 10-minute Deluge timeout limit.

Does this integration work with Zoho CRM appointments too?

Yes, with modifications. Zoho CRM stores meetings and events in different modules than Creator forms, but the Deluge functions for calling the Twilio API are identical. You can either build the reminder logic directly in CRM's custom functions or sync CRM appointments to a Creator app that handles all reminder processing centrally.

How do I comply with SMS consent regulations when sending appointment reminders?

Appointment reminders are generally classified as transactional messages under TCPA (US) and similar regulations, which means they do not require the same level of opt-in as marketing messages. However, you should still collect explicit consent during the appointment booking process, include opt-out instructions (e.g., "Reply STOP to unsubscribe") in at least the first message, and honor all opt-out requests immediately by updating the client record in Creator.

Aaxonix builds custom Zoho Creator applications with Twilio messaging integrations for appointment-driven businesses, from initial app design through production deployment. Book a free consultation to get a scoped implementation plan for your appointment reminder system.

Book a free consultation

A Zoho Creator and Twilio integration gives you complete ownership of your appointment reminder workflow, from the data model to the message templates to the delivery tracking. Start with a single reminder interval and one messaging channel, validate the delivery rates and client response patterns, then expand to multiple intervals and the WhatsApp channel. The scheduled function approach scales to thousands of appointments without additional infrastructure, and the Reminder Logs form gives you the data you need to continuously optimize timing and reduce no-shows.

Share this article LinkedIn Twitter / X
# Appointment Scheduling # Deluge # Integrations # Low-Code # SMS Reminders # Twilio # WhatsApp # Zoho Creator

Thinking about Zoho or NetSuite?

Our team builds systems that actually work. No fluff, just honest architecture and clean implementation.