WhatsApp Reminders from Outlook Calendar Using Power Automate
If your team runs on Microsoft 365, your appointments already live in Outlook Calendar. Power Automate can watch that calendar and fire off a WhatsApp reminder before each event — without writing a line of code. This is the Microsoft-stack equivalent of using n8n or Zapier, and it's the simpler path if your business already runs on Outlook, SharePoint and Teams.
This guide walks through a working flow: trigger on an upcoming Outlook event, format a message, and call the TextMeFlow API to send it.
Why use Power Automate instead of a custom script
Power Automate is already included in most Microsoft 365 business plans, runs on Microsoft's infrastructure, and needs no server or cron job on your side. For a solo practice or small team that wants "remind the client 24 hours before their appointment" without maintaining a script, it's the path of least resistance. If you're comfortable with Node.js or Python instead, the same logic works with a scheduled job calling the same API — see sending WhatsApp messages from PHP, Python or Node.js for code examples.
What you need
- A Microsoft 365 account with Power Automate access (included in most business plans).
- A TextMeFlow account with a paired WhatsApp number and an API key from your dashboard.
- Appointments in Outlook Calendar that include the client's phone number — either in the event location/body, or cross-referenced from a linked list (see the alternative below).
Step 1: build the trigger
In Power Automate, create an Automated cloud flow. The built-in Office 365 Outlook connector has a trigger called "When an upcoming event is starting soon", which fires on a schedule relative to each calendar event. This avoids building your own polling logic.
For more control over the exact lead time (say, exactly 24 hours before, not "soon"), use a Scheduled cloud flow instead: run it hourly, call "Get calendar view of events (V3)" with a window of "now + 24 hours" to "now + 25 hours", and loop over the results. This is more reliable for production reminders because the timing is explicit rather than approximate.
Step 2: extract the phone number
Outlook events don't have a dedicated "phone number" field, so you need a convention. The two practical options:
- Store the number in the event body in a predictable format, e.g.
Phone: +3247xxxxxxx, and extract it with a Compose action using Power Automate'ssplit()andtrim()expressions. - Look it up from a source of truth — a SharePoint list, Excel table, or Dataverse table keyed by client name or booking ID — using a "Get items" action right after the trigger. This is more robust if staff don't always type the number the same way in the calendar body.
For anything beyond a handful of appointments a week, option 2 is worth the extra ten minutes of setup.
Step 3: call the TextMeFlow API
Add an HTTP action (Premium connector, included in most business Power Automate licenses) that does a POST request:
Method: POST
URI: https://api.textmeflow.eu/v1/messages
Headers:
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Body:
{
"to": "@{triggerOutputs()?['body/phoneNumber']}",
"text": "Hi @{triggerOutputs()?['body/clientName']}, reminder: your appointment is tomorrow at @{formatDateTime(triggerOutputs()?['body/start'], 'HH:mm')}. Reply STOP to opt out."
}
Adjust the field names to match whatever your trigger or lookup action actually returns — Power Automate's dynamic content picker will show the available fields once the flow has run at least once in test mode.
Step 4: handle delivery status (optional but recommended)
TextMeFlow signs delivery and status webhooks with HMAC so you can verify they actually came from TextMeFlow — see verifying webhook signatures if you want to log delivery failures back into a SharePoint list automatically, rather than finding out a reminder bounced only when the client doesn't show up.
A note on opt-in and quiet hours
Appointment reminders to an existing client for a scheduled service are normal transactional messaging, not marketing — but you should still be able to show the client agreed to be contacted this way (a signed intake form or booking confirmation is enough). TextMeFlow's anti-spam pipeline also enforces quiet hours automatically, so a flow that miscalculates a time zone and fires at 6 AM still won't reach the client until a reasonable hour. This is general information, not legal advice — for GDPR specifics, see GDPR and sending WhatsApp messages.
Testing before you go live
Run the flow manually against a test event with your own number first. Check that:
- The phone number is in international format (
+32..., not a local format) — the API will reject malformed numbers. - The message renders correctly when the client name or time field is empty (Power Automate won't error on this, but your message will look broken).
- The HTTP action's response code is 2xx — log the response body on failure so you can debug without re-triggering real client events.
Once it's reliable, turn the 24-hour lead time into a habit: fewer no-shows, fewer "per your conversation, see you tomorrow" phone calls, and no extra software to install on top of Microsoft 365 you're already paying for.
Ready to wire this up? Sign up for the free plan — 50 messages a month at no cost, enough to test the full flow before committing to a paid tier.
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