A customer books a slot on your calendar, something comes up, and they just don't show. You've lost the hour, the drive time if it was a house call, and the chance to fill that slot with someone else. Most service businesses already run their bookings through Google Calendar. This weekend, turn it into a reminder system too — no new software, no subscription, no login for your customers to fumble through.
What you're building
A small script that runs automatically every morning, looks at tomorrow's events on your Google Calendar, and emails each customer a plain reminder with the day, time, and what they booked. It uses Google Apps Script, the free scripting layer built into every Google account — the same one behind countless Gmail and Sheets automations. If you already put customer emails on the calendar event (as a guest, which most booking forms and Calendar invites do automatically), this works with zero changes to how you schedule jobs today.
What you need
- A Google account with the Calendar you already use for bookings
- Customer email addresses attached to each event as a guest
- About 30–45 minutes this weekend, and nothing to buy
Build it step by step
- Open the script editor. Go to script.google.com, sign in with the same account as your Calendar, and start a new project.
- Paste in the reminder function. Delete the placeholder code and replace it with this:
function sendTomorrowsReminders() {
var tz = Session.getScriptTimeZone();
var tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
var events = CalendarApp.getDefaultCalendar().getEventsForDay(tomorrow);
var sentKey = 'sent_' + Utilities.formatDate(tomorrow, tz, 'yyyy-MM-dd');
var props = PropertiesService.getScriptProperties();
var alreadySent = JSON.parse(props.getProperty(sentKey) || '[]');
events.forEach(function (event) {
var id = event.getId();
if (alreadySent.indexOf(id) !== -1) return;
var guests = event.getGuestList().map(function (g) { return g.getEmail(); });
if (guests.length === 0) return;
var when = Utilities.formatDate(event.getStartTime(), tz, "EEEE 'at' h:mm a");
var subject = 'Reminder: your appointment tomorrow';
var body = 'Hi, just a reminder that "' + event.getTitle() + '" is scheduled for '
+ when + '. Reply to this email if you need to reschedule.';
MailApp.sendEmail(guests.join(','), subject, body);
alreadySent.push(id);
});
props.setProperty(sentKey, JSON.stringify(alreadySent));
}
This checks tomorrow's events, pulls the guest list off each one, and sends a short email. The alreadySent tracking (stored with PropertiesService) stops it from double-messaging anyone if the script happens to run twice in a day.
- Run it once manually. Click Run, and Apps Script will ask you to authorize access to Calendar and Gmail on your own account — that's expected for a script only you own. Put a test event on tomorrow's calendar with your own email as a guest first, so you can see the reminder land in your own inbox before it ever reaches a customer.
- Set it to run every morning. In the editor, open Triggers (the clock icon), add a new trigger for the
sendTomorrowsRemindersfunction, set it to time-driven, and pick a daily window — early morning works well, so reminders go out for the next day's appointments. Google's installable triggers guide covers the options if you want to fire it more than once a day.
That's the whole build. From here it runs in the background, on Google's infrastructure, whether or not your computer is on.
Making it more useful
A few small changes make this fit your business better:
- Let customers reply to reschedule. The email already comes from your Gmail address, so a reply lands in your normal inbox — no separate system to check.
- Tune the lead time. Swap the one-day lookahead for two days if your jobs need more notice to reschedule, or send both a two-day and a same-day nudge by adding a second trigger that checks
getEventsForDay(new Date()). - Handle guests without emails on the invite. If you sometimes note a phone number in the event description instead of adding a guest, you can parse the description text as a fallback before skipping the event.
- Text instead of email. Plain
MailApponly sends email. If your customers respond better to texts, that step needs a paid SMS service like Twilio wired in — a reasonable next project once the email version is running and you know it's worth the added cost.
If your account has the newer Gemini side panel in the Apps Script editor (it's rolling out to Workspace accounts), you can paste this code in and ask it to adjust the wording or add a feature, which is a fast way to customize it if you'd rather describe the change than write it.
Why this is worth the weekend
The whole point is that it costs you nothing ongoing and touches nothing else in how you run your day. Your calendar stays the source of truth, your customers get a heads-up in the inbox they already check, and once it's set up you never have to think about it again — it just runs.
