Text reminders for Outlook Calendar events

A text before each event, from your own phone and number

n8n · Power Automate · Zapier · Make
Upcoming event → one text

Nobody misses the appointment

Shortly before an event in your Outlook calendar, your automation hands a reminder to your SMSTunnel account and your own Android phone texts it from your own number: to you ("Reminder: dentist at 15:30"), or to the client whose number is in the appointment, who can reply to a number they know.

Using Google Calendar? A free template texts your reminders from your own phone, with no server and no automation tool: Google Calendar reminders.

1. Get your key

  1. 1. Install the SMSTunnel app from Google Play on your Android phone and sign in.
  2. 2. In your dashboard, open Apps → Add an app, pick Script or server, name it (for example "Calendar reminders") and click Create the key.
  3. 3. Copy the key right away: it's shown only once. You can stop or delete the app there anytime, and Calendar reminders can't send texts anymore.

Get the steps with your key in them

It opens Add an app with Script or server picked. Once the key is made, the dashboard shows every step and command with the key already filled in, ready to copy.

Where the number comes from

  • Remind me: your own number, typed once in the automation. The simplest and safest start.
  • Client appointments: write the client's number in the event's Location, in international format, like +14155550123. Only for clients who gave you their number for reminders.
  • One text per event, to one number. Each way below also keeps an event from texting twice.

With n8n

Uses the SMSTunnel community node and n8n 2.21 or newer. Four nodes:

1. Schedule Trigger
Trigger Interval: Minutes, Minutes Between Triggers: 5
2. Microsoft Outlook
Event → Get Many, From All Calendars, Include Recurring Event Instances on
Start Date
{{ $now.toISO() }}
End Date
{{ $now.plus(30, 'minutes').toISO() }}
Output
Raw (the simplified output has no location)
3. Remove Duplicates
Remove Items Processed in Previous Executions, Keep Items Where: Value Is New
Value to Dedupe On
{{ $json.id }}{{ $json.start.dateTime }} (a moved event texts again)
4. SMSTunnel
Message → Send
To
+14155550123 or, for clients, the expression below
Message
Reminder: {{ $json.subject }} at {{ DateTime.fromISO($json.start.dateTime, { zone: 'utc' }).setZone('Europe/London').toFormat('HH:mm') }}
To, for client appointments: the number in Location
{{ ($json.location.displayName.match(/\+\d{7,15}/) || [''])[0] }}

Put your own time zone in setZone(): Outlook gives n8n start times in UTC. For clients, add an If node before SMSTunnel that skips events with no number. Publish the workflow: Remove Duplicates remembers events across runs.

With Power Automate

Trigger
Office 365 Outlook: When an upcoming event is starting soon (V3)
Calendar Id
Calendar
Look-Ahead Time
30 (minutes)
Action
HTTP
Method
POST
URI
https://smstunnel.io/api/v1/sms/send
Headers
X-API-Key = your key
Headers
Content-Type = application/json
Body
the JSON below
Body: your number, and your time zone (a Windows time zone name)
{
  "to": "+14155550123",
  "message": "@{concat('Reminder: ', triggerOutputs()?['body/subject'], ' at ', convertFromUtc(triggerOutputs()?['body/startWithTimeZone'], 'GMT Standard Time', 'HH:mm'))}"
}
  • Premium. The HTTP action is a Premium feature: Microsoft 365 licences include standard connectors only, so the flow's owner needs Power Automate Premium (or a trial).
  • Hide the key. In the HTTP action's Settings, turn on Secure Inputs and Secure Outputs, so run history doesn't show it. People who can edit the flow still can: give it its own app in SMSTunnel.
  • Client numbers: Power Automate expressions can't search text for a number, so keep only the number in Location and use triggerOutputs()?['body/location'] as to.
  • Personal Outlook.com accounts use the Outlook.com connector's version of the trigger.

With Zapier

  • Trigger: Microsoft Outlook → Calendar Event Start, with Time Before set to how early the text should go. Zapier supports Microsoft 365 work or school accounts here, and skips events it has already seen.
  • Action: SMSTunnel → Send SMS, with the number and a message built from the event's subject and start. SMSTunnel's Zapier app is coming soon.
  • Until then, on a paid Zapier plan, Webhooks by Zapier → POST does the same: URL https://smstunnel.io/api/v1/sms/send, Payload Type JSON, Data to and message, Headers X-API-Key = your key.

With Make

  1. 1. Schedule the scenario every 15 minutes.
  2. 2. Microsoft 365 Calendar → Make an API Call, GET, to list the events of the next 30 minutes (a Microsoft Graph path; if the module asks for a full URL, put https://graph.microsoft.com in front):
    /v1.0/me/calendarView?startDateTime={{now}}&endDateTime={{addMinutes(now; 30)}}
  3. 3. An Iterator over value, then Data store → Check the existence of a record with the event's id, and a filter that lets only new events through.
  4. 4. SMSTunnel → Send an SMS (SMSTunnel's Make app is coming soon; until then, HTTP → Make a request with an API key credential in the X-API-Key header), then Data store → Add/replace a record with the id.

With an AI assistant (MCP)

Connect the SMSTunnel MCP server to Claude Desktop, Claude Code, Cursor or VS Code, plus a calendar connector (in Claude, the Microsoft 365 connector for work or school accounts, or Google Calendar). Then ask, for example:

  • "Text me my agenda for tomorrow."
  • "Send a reminder text to each client with an appointment tomorrow, using the phone number in the event. Show me the list first."

The assistant reads the calendar, shows you each person, their number and the exact text, and after your OK sends one text per person. Keep each client's number in the event (Location or description), with + and the country code. It acts when you ask: for reminders that go out on their own, use one of the automations above.

Worth knowing

  • Only expected texts. Reminders to you, or to clients who gave you their number for appointment reminders. Never text everyone on a calendar or in a meeting's attendee list.
  • 30 sends a minute, up to 1600 characters per text.
  • Phone offline? The reminder waits and goes out as soon as the phone is back.

If it doesn't work

  • 401 "Invalid or expired API key": the key is wrong or was deleted. "API key is required. Use X-API-Key header.": the key isn't in an X-API-Key header. SMSTunnel reads the key only from that header: Bearer or Basic authentication won't work.
  • 403 with PERMISSION_REQUIRED: the key may not send texts. Make a new one under Apps → Add an app.
  • 400 "property … should not exist": the body has a field SMSTunnel doesn't know. Send only to and message (and, if you need them, deviceId and defaultCountryCode). "message must be shorter than or equal to 1600 characters": shorten the text. "Phone number must contain…": put the number in international format, like +14155550123.
  • 400 with "to must be a string" and "message must be a string": the body didn't arrive as JSON. Add the header Content-Type: application/json.
  • 404 "Cannot GET /api/v1/sms/send": the tool sent a GET. Choose POST.
  • 429: too many texts at once. SMSTunnel takes 30 send requests a minute. Wait a minute and try again.
  • No text, but no error? If your phone is offline, the text waits and goes out as soon as the phone is back online. Open the SMSTunnel app on the phone to check it's linked.

Build it with an AI assistant

Copy this prompt into Claude, ChatGPT, Cursor or Copilot and replace the part in [brackets]. Don't paste your API key into the chat: the prompt doesn't need it.

Help me text a reminder before my Outlook Calendar events, from my own phone, with SMSTunnel: to me ("remind me"), or to the client whose number is in the event.

About SMSTunnel (https://smstunnel.io): my own apps and tools hand text messages (SMS) to my SMSTunnel account, and my own Android phone sends them from my own number, on my own SIM and plan. The phone runs the SMSTunnel app from Google Play (https://play.google.com/store/apps/details?id=io.smstunnel.app), signed in to my account.

What I want: [describe what should send a text, to whom, and when]

How it works:
- One text per event, to one number. The number is either mine, or written in the event's Location in international format (+14155550123), for client appointments.
- n8n (community node n8n-nodes-smstunnel): Schedule Trigger every 5 minutes → Microsoft Outlook node, Event → Get Many, "Include Recurring Event Instances" on, Start Date {{ $now.toISO() }}, End Date {{ $now.plus(30, 'minutes').toISO() }}, Output Raw (n8n 2.21 or newer) → Remove Duplicates, "Remove Items Processed in Previous Executions", Value to Dedupe On {{ $json.id }}{{ $json.start.dateTime }} → SMSTunnel node, Message → Send, To my number or {{ ($json.location.displayName.match(/\+\d{7,15}/) || [''])[0] }}, Message Reminder: {{ $json.subject }} at {{ DateTime.fromISO($json.start.dateTime, { zone: 'utc' }).setZone('Europe/London').toFormat('HH:mm') }}. Graph gives start times in UTC.
- Power Automate: trigger "When an upcoming event is starting soon (V3)" (Office 365 Outlook; Calendar Id, Look-Ahead Time 30) → action HTTP: Method POST, URI https://smstunnel.io/api/v1/sms/send, Headers X-API-Key = <my key> and Content-Type = application/json, Body:
{
  "to": "+14155550123",
  "message": "@{concat('Reminder: ', triggerOutputs()?['body/subject'], ' at ', convertFromUtc(triggerOutputs()?['body/startWithTimeZone'], 'GMT Standard Time', 'HH:mm'))}"
}
Settings → Secure Inputs and Secure Outputs on. The HTTP action is Premium: Microsoft 365 licences include standard connectors only, so the flow's owner needs Power Automate Premium. Power Automate expressions have no regex: for client numbers, keep only the number in Location and use triggerOutputs()?['body/location'].
- Zapier: Microsoft Outlook trigger "Calendar Event Start" with Time Before (Microsoft 365 work or school accounts only) → "Webhooks by Zapier" POST on a paid plan: URL, Payload Type JSON, Data to + message, Headers X-API-Key (SMSTunnel's own Zapier app is coming soon). Zapier skips events it has already seen.
- Make: schedule every 15 minutes → Microsoft 365 Calendar "Make an API Call" GET /v1.0/me/calendarView?startDateTime={{now}}&endDateTime={{addMinutes(now; 30)}} (a Microsoft Graph path) → Iterator over value → Data store "Check the existence of a record" (key: event id) → filter not exists → HTTP "Make a request" with an API key credential, header X-API-Key (SMSTunnel's own Make app is coming soon) → Data store "Add/replace a record".
- One recipient per request: SMSTunnel sends one text to one number. For several people, one request (or one notification) per number.
- Answers: 200 {"success": true, "messageId": "…"}; 401 wrong or deleted key; 403 the key lacks a permission ("code": "PERMISSION_REQUIRED"); 400 a missing, unknown or too long field; 429 too many requests (30 sends a minute, with Retry-After): wait and retry; without Retry-After, the plan's limit for the day or month is reached. If my phone is offline the text waits and goes out when it is back, within 3 days.
- The API key comes from my SMSTunnel dashboard (https://dashboard.smstunnel.io): Apps → Add an app → Create the key. It is shown only once and can send texts and check whether they went out.

Rules for your answer:
- Do not ask for my SMSTunnel password or API key and do not put a real key in your answer; I will not paste it in this chat.
- Phone numbers must be in international format (+ and the country code).
- Help me test it with my own number first.
- Only send texts people expect from me. No unsolicited texts.
- Only text clients who gave me their number for appointment reminders. Never text everyone on a calendar.

Responsible use

Built for alerts to yourself and your team, and texts people expect from you. One text goes to one number. Sending unsolicited messages from a consumer SIM generally breaches mobile carrier terms of service.

Microsoft, Outlook and Power Automate are trademarks of Microsoft; Zapier and Make are trademarks of their owners. SMSTunnel is a third-party integration and is not affiliated with, endorsed by, or sponsored by Microsoft, Zapier or Make.

No phone paired yet?

Install the Android app and sign in with your account, and you're ready in about a minute.

Get it on Google Play