Send appointment reminder emails automatically with Google Sheets (free, no add-ons)
No-shows cost small service businesses real money: a hair salon, a dog groomer, a tutor, a cleaner. A reminder the day before helps, but writing those emails by hand every evening is easy to forget.
If you already keep appointments in a Google Sheet, a few lines of Google Apps Script can send the reminders for you. It is free and needs no add-ons. This guide takes about 15 minutes.
What you will build
- A Google Sheet with one row per appointment.
- A script that runs every morning, finds tomorrow's appointments, and sends each customer a reminder email from your Google account.
- A column that records when each reminder was sent, so nobody gets two.
Step 1. Set up the sheet
Create a Google Sheet. Rename the first tab to Appointments and add these headers in row 1:
| A | B | C | D | E | F |
|---|---|---|---|---|---|
| Name | Date | Time | Service | Reminder sent |
Tips:
- Column C must be a real date. Select column C and choose Format > Number > Date.
- Format column D as Format > Number > Plain text and type times like
10:30. Otherwise Sheets turns them into date-time values and the email shows a long timestamp. - Leave column F empty. The script fills it in.
Step 2. Add the script
In the sheet, open Extensions > Apps Script. Delete anything in the editor and paste this:
// Sends a reminder email the day before each appointment.
// Sheet "Appointments": A Name | B Email | C Date | D Time | E Service | F Reminder sent
const SHEET_NAME = 'Appointments';
const BUSINESS_NAME = 'Your Business Name';
function sendReminders() {
const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
const rows = sheet.getDataRange().getValues();
const tz = Session.getScriptTimeZone();
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
const target = Utilities.formatDate(tomorrow, tz, 'yyyy-MM-dd');
for (let i = 1; i < rows.length; i++) { // row 0 is the header
const [name, email, date, time, service, sent] = rows[i];
if (!email || !(date instanceof Date) || sent) continue;
if (Utilities.formatDate(date, tz, 'yyyy-MM-dd') !== target) continue;
const when = Utilities.formatDate(date, tz, 'EEEE, MMMM d') + (time ? ' at ' + time : '');
const subject = 'Reminder: your appointment tomorrow (' + when + ')';
const body =
'Hi ' + name + ',\n\n' +
'This is a reminder of your ' + (service || 'appointment') + ' with ' + BUSINESS_NAME + ' on ' + when + '.\n\n' +
'If you need to change or cancel, just reply to this email.\n\n' +
'See you soon,\n' + BUSINESS_NAME;
MailApp.sendEmail(email, subject, body);
sheet.getRange(i + 1, 6).setValue(new Date()); // column F: when the reminder was sent
}
}
// Run once: sends reminders every day between 9 and 10 am.
function createDailyTrigger() {
ScriptApp.newTrigger('sendReminders').timeBased().everyDays(1).atHour(9).create();
}
Change Your Business Name to your business name, then click Save.
Step 3. Test it
- Add a test row with your own email address and tomorrow's date.
- In the Apps Script editor, choose
sendRemindersin the function menu and click Run. - The first time, Google asks you to allow the script to read the sheet and send email as you. Review the permissions and allow them.
- Check your inbox. Column F of the test row should now show the time it was sent.
Run it again: nothing is sent, because column F is already filled in.
Step 4. Run it every day
Choose createDailyTrigger in the function menu and click Run once. The script will now run every day between 9 and 10 am (in the script's time zone, which you can check under Project Settings).
To see or remove the trigger later, click the clock icon (Triggers) on the left of the Apps Script editor. Run createDailyTrigger only once, or you will get duplicate triggers.
Things to know
- Email limits. Google limits how many emails a script can send per day, and the limit is lower for free Gmail accounts than for Google Workspace. Check Google's Apps Script quotas page if you send many reminders a day.
- Privacy. The sheet holds customer names and emails. Share it only with people who need it.
- Replies. Customers who reply reach your normal inbox, so they can reschedule by email.
- Want a text message instead? That needs an SMS service, which usually costs money. Email is the free starting point.
What else could you automate?
Reminders are one small job. Our free Small Business Automation Check asks for your country, industry and tasks, and shows which admin jobs are easiest to automate and how to begin.