WhatsApp Appointment Reminders from Calendly Using Webhooks
Calendly sends an email confirmation the moment someone books a slot, and a lot of businesses stop right there — until the no-shows start piling up. WhatsApp gets read within minutes, not sitting in a promotions tab. If you're on a Calendly plan with webhooks enabled, you don't need Zapier or Make as a paid middle layer: a small receiver plus the TextMeFlow API gets you a confirmation the moment someone books, and a reminder the day before.
Why build this instead of using an app
A no-code connector works, but it adds its own subscription on top of your WhatsApp API bill, and you're stuck with whatever trigger logic and delay options it exposes. Wiring Calendly's own webhooks straight to TextMeFlow costs nothing beyond your messaging plan, and you control exactly when the reminder fires, what it says, and how it's personalized per event type. For a driving instructor, a consultant, or a clinic running back-to-back Calendly slots, that control is the difference between a template that feels generic and one that reads like it was typed by hand.
Step 1: Register the Calendly webhook
Calendly's webhook subscriptions are created via their API (POST /webhook_subscriptions), scoped to your organization or a single user. Subscribe to the two events that matter for reminders:
invitee.created→ fires the moment someone books — send the confirmationinvitee.canceled→ fires on cancellation — cancel any scheduled reminder
Point the subscription at an endpoint you control, for example https://yourapp.com/webhooks/calendly, and store the signing key Calendly gives you — every payload arrives with a Calendly-Webhook-Signature header you must verify before trusting the body, the same discipline TextMeFlow expects when you verify its own outbound webhook signatures.
Step 2: Receive the booking and send the confirmation
A minimal Node receiver for the confirmation leg:
app.post('/webhooks/calendly', express.json(), async (req, res) => {
const event = req.body;
if (event.event !== 'invitee.created') return res.status(200).send('ignored');
const invitee = event.payload;
const phone = invitee.text_reminder_number; // E.164 if SMS reminders are enabled on the event type
if (!phone) return res.status(200).send('no phone, skipped');
const start = new Date(invitee.event.start_time);
const when = start.toLocaleString('en-GB', { dateStyle: 'medium', timeStyle: 'short' });
await sendWhatsApp(phone, `Hi ${invitee.name}, your appointment is confirmed for ${when}. Reply STOP to opt out of reminders.`);
res.status(200).send('ok');
});
Calendly only exposes a phone number on the invitee record when the event type has SMS reminders turned on and the invitee filled it in — not every booking will carry one. Skip those silently rather than erroring; Calendly doesn't retry failed webhook responses the way Shopify does, but a 5xx pileup still risks the subscription getting flagged.
Step 3: Send through the TextMeFlow API
curl -X POST https://api.textmeflow.eu/v1/messages \
-H "Authorization: Bearer $TEXTMEFLOW_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"to": "+32470123456",
"text": "Hi Sarah, your appointment is confirmed for Tue 25 Aug, 14:30. Reply STOP to opt out."
}'
The response is 202 with a message_id you can log against the Calendly event.uri, which makes the next step — the reminder — easy to schedule and, if needed, cancel.
Step 4: Schedule the day-before reminder
Calendly's webhook fires at booking time, not the day before, so the reminder itself needs a scheduled job on your side: store the appointment time and phone number when invitee.created arrives, then run a worker (a cron job, a queue with a delay, whatever your stack already has) that sends the reminder 24 hours out. If invitee.canceled arrives before that job runs, mark the stored appointment as canceled so the worker skips it.
Step 5: Keep it inside the anti-spam rules
Confirmations and reminders are one personalized message per invitee, not identical content blasted to a list, so they don't trip the broadcast-style detection in TextMeFlow's risk scoring. Two things still matter specifically for a booking flow:
- Respect STOP. If an invitee opts out via WhatsApp, don't re-message them for their next booking — TextMeFlow rejects sends to opted-out recipients automatically.
- Normalize the phone number. Calendly's
text_reminder_numberfield isn't guaranteed to be in E.164 format depending on how the invitee typed it — validate and reformat before calling the API, or the send fails.
A same-day reminder (someone booking a slot for later today) is a case where you may want to bypass quiet-hours shaping with the urgent flag — a confirmation for a same-day appointment is time-sensitive in a way a generic broadcast isn't.
What this gets you over email
Email confirmations sit unopened; WhatsApp read receipts come back on TextMeFlow's own webhook, so you know within minutes whether someone actually saw their reminder — and can flag no-show risk before the slot, not after. This same pattern works for any scheduling tool that exposes outbound webhooks — Acuity, SimplyBook, a custom booking form — Calendly is just the most common starting point for consultants and service businesses.
Start free on TextMeFlow — 50 messages a month, no time limit, enough to run a full booking-confirmation flow before you commit to a plan.
Zelf WhatsApp-berichten versturen via API?
Gratis voor altijd tot 50 berichten/maand. QR scannen en binnen 5 minuten verstuur je je eerste bericht.
Gratis voor altijd