Use cases

WhatsApp appointment reminders for clinics, salons and service businesses

· 5 min read · By JPL365

Every missed appointment is an empty slot you cannot resell. A reminder the day before gives customers a nudge, and a way to say "I cannot make it" gives you time to offer the slot to someone else. For most Kenyan customers, WhatsApp is the channel they actually read. This guide shows how a clinic, salon, garage or any appointment-based business can automate reminders and handle replies.

The simple version

  1. When someone books, save their phone number and ask permission to send reminders.
  2. The evening before, a scheduled job finds tomorrow's appointments and sends each customer a WhatsApp message.
  3. The message asks them to reply 1 to confirm or 2 to reschedule.
  4. Replies arrive at your webhook, and your system updates the appointment.

A good reminder message

Keep it short, specific and polite:

Hi Amina, a reminder of your appointment tomorrow at 10:30 at Westlands Branch.
Reply 1 to confirm or 2 to reschedule.

Include the day, time and place, and nothing more. Do not put medical details, diagnoses or prices in a message. A chat can be seen by anyone who picks up the phone, and sensitive personal data deserves extra care under Kenya's Data Protection Act. This is general information and not legal advice, so ask a professional about your specific situation.

The scheduler (Python)

Run this once a day from cron or your platform's scheduler. Adapt the query to your own database.

import os
import datetime as dt
import requests

def reminder_text(a):
    return (
        f"Hi {a['name']}, a reminder of your appointment tomorrow at "
        f"{a['time']:%H:%M} at {a['place']}. "
        "Reply 1 to confirm or 2 to reschedule."
    )

def send_reminders(db):
    tomorrow = dt.date.today() + dt.timedelta(days=1)
    rows = db.fetch_all(
        "SELECT id, name, phone, time, place FROM appointments "
        "WHERE date = %s AND reminder_sent = FALSE AND reminders_allowed = TRUE",
        (tomorrow,),
    )
    for a in rows:
        r = requests.post(
            "https://qwela.jpl365.com/v1/messages",
            headers={"Authorization": "Bearer " + os.environ["QWELA_KEY"]},
            json={"to": a["phone"], "text": reminder_text(a)},
            timeout=15,
        )
        if r.status_code == 202:
            db.execute("UPDATE appointments SET reminder_sent = TRUE WHERE id = %s", (a["id"],))
        elif r.status_code == 429:
            break  # daily limit reached: the rest go out on the next run
        else:
            print("reminder failed", a["id"], r.status_code, r.text)

A cron entry to run it at 4 pm every day (check your server's time zone):

0 16 * * *  /usr/bin/python3 /opt/app/send_reminders.py

Qwela sends queued messages a few seconds apart, so a long list takes a little while to go out. That pacing is deliberate. It keeps the number safe.

Handling replies

Set a webhook URL in the Qwela dashboard. When a customer replies, your endpoint receives a message.received event with their number and text. Verify the signature first, as explained in our guide to verifying Qwela webhooks, then act on the reply:

def handle_reply(event):
    phone = event["data"]["from"]
    answer = event["data"]["text"].strip()

    if answer == "1":
        mark_confirmed(phone)
    elif answer == "2":
        ask_to_reschedule(phone)   # for example: send them your booking link
    # anything else: leave it for a person to read

Match replies to appointments by phone number, and note that in some cases WhatsApp does not reveal a contact's number. Always have a fallback, such as a person checking the replies you could not match.

Practical tips

  • Two reminders can beat one. Many businesses send one the day before and a short one a couple of hours ahead. Test what works for your customers.
  • Offer cancelled slots to a waiting list by sending a message to people who asked for an earlier time.
  • Let people opt out with a simple "Reply STOP", and respect it.
  • Only message people who booked. That keeps your number in good standing. Our checklist for avoiding a number ban goes through the rest.

Connecting it to Zoho or your booking system

If your appointments live in Zoho CRM or Zoho Bookings, a workflow can send the reminder without any scheduler script. See how to send a WhatsApp message from Zoho CRM for the pattern.

You can try Qwela free for 7 days, with no card, at qwela.jpl365.com. If you would like reminders set up for your clinic, salon or practice, talk to JPL365.