Blog · · 4 min read
Automatic appointment reminders with n8n and Google Calendar (email and WhatsApp)
How to build an n8n workflow that reminds your customers 24 hours before their appointment, by email or WhatsApp, reading straight from your Google Calendar. Step by step, no database needed.

If your business runs on appointments (a clinic, a salon, a physio, an accountant, a repair shop), you know the problem: someone books, forgets, and the slot sits empty. The classic fix is calling everyone the day before. The automatic fix is a workflow that reads your calendar and reminds each customer while you do nothing.
In this guide we build that workflow in n8n with Google Calendar, sending the reminder by email and, if you like, by WhatsApp.
How it works, in one sentence
Every hour, n8n checks which appointments start in 24 hours, pulls the customer's contact details from the event itself and sends them a message with the date, the time and how to change it.
No database and no spreadsheets: the calendar is the single source of truth.
What you need
- A running n8n (if you don't have one yet, see how to install n8n for free with Docker).
- A Google Calendar that holds your appointments.
- A Gmail account (or any SMTP server) for the emails.
- Optional: the WhatsApp Cloud API set up, for WhatsApp reminders (guide to connecting it to n8n).
Step 1: store the customer's contact in the event
The workflow can only remind people it can find. Get into the habit of creating appointments with the email and, if you have it, the phone number in the description, always in the same format:
Email: customer@example.com
Tel: +15550000000
If bookings come in through an automated form (like the one in the Google Calendar bookings workflow), have it write the description this way and you won't touch anything by hand.
Step 2: the trigger, every hour
Add a Schedule Trigger node that runs every hour, at minute 0. Each run covers a one-hour window, so no appointment is reminded twice and none is missed.
Step 3: fetch the appointments 24 hours out
Add a Google Calendar node with the operation that gets many events (Get Many) and use the start and end filters to request only events that start between 24 hours from now and 25 hours from now. With n8n expressions:
After: {{ $now.plus({ hours: 24 }).startOf('hour').toISO() }}
Before: {{ $now.plus({ hours: 25 }).startOf('hour').toISO() }}
Also turn on expanding recurring events, so weekly repeat appointments come through as individual appointments.
Step 4: extract the email and phone
A Code node reads each event's description and splits out the details:
return $input.all().map(item => {
const d = item.json.description || '';
const email = (d.match(/Email:\s*([^\s<]+@[^\s<]+)/i) || [])[1] || null;
const tel = (d.match(/Tel:\s*(\+?\d{8,15})/i) || [])[1] || null;
return { json: {
title: item.json.summary,
start: item.json.start.dateTime || item.json.start.date,
email, tel
}};
});
Then an IF node lets through only events that have an email or a phone number. That way personal blocks ("Lunch", "Closed") don't trigger reminders.
Step 5: the email reminder
With a Gmail (or Send Email) node, send something short and clear:
Subject: Reminder: your appointment tomorrow at {{time}}
Hi, just a reminder of your appointment at [Business name] tomorrow at {{time}}. If you need to change it or can't make it, reply to this email and we'll find you another slot.
Format the time in your business's time zone, for example {{ DateTime.fromISO($json.start).setZone('America/New_York').toFormat('h:mm a') }}, so nobody gets a time in UTC.
Step 6 (optional): the WhatsApp reminder
WhatsApp messages tend to get read sooner than email, but there's one important rule: if the customer hasn't messaged you in the last 24 hours, you can only start the conversation with a template approved by Meta. Reminders use a utility category template, with variables for the date and time.
Once it's approved, add an HTTP Request node that calls the WhatsApp Cloud API with the customer's number, the template name and the variables. Meta charges for template-initiated messages depending on the country, so check their current pricing before switching it on for every customer.
Common mistakes
- Duplicate reminders. These happen when the search window is longer than the trigger interval. A one-hour window and an hourly run, always matched.
- Wrong times. Set the time zone in the workflow settings and in the message format. Watch out for daylight saving changes.
- Inconsistent formats. If you sometimes write "Email:" and sometimes "mail", the workflow won't find them. Use one fixed format, or a form that writes it for you.
- Permission to message. Tell customers at booking time that you'll send a reminder; on WhatsApp, they must have agreed to receive messages from you.
Ideas to take it further
- A second reminder two hours before, with an identical workflow and a different window.
- A link to confirm attendance that changes the event's colour in the calendar.
- An automatic message after the appointment asking for a review, then answering reviews with the AI Google review replies workflow.
Shortcut: bookings already built
Reminders work best when appointments come in on their own with the details written properly. The Google Calendar bookings agent in the AgentKiosk pack takes the booking from a form on your site, checks availability, suggests alternatives and sends the confirmation, all as an n8n template ready to import.
Want to start with something free? Download the WhatsApp agent and then read AI automations for small businesses.


