Guide · n8n template · 5 min read
Reschedule Google Calendar appointments with n8n and Google Sheets
Rescheduling is where booking agents quietly break: the old slot never gets freed, or the new one is already taken. This sub-workflow does it in one safe step. It finds the existing booking by phone number, checks the new slot and only then moves the Google Calendar event.
Free template: Reschedule calendar appointments with Google Sheets and Google Calendar
By MD Faizan Uzzaman · Verified n8n Creator · Published 12 Oct 2026
How do you reschedule a Google Calendar event with n8n?
Find the booking (here by phone number in Google Sheets), check the new slot is free, then update the event's start and end time using its stored event_id.
- Another n8n workflow calls this one with the phone number, the current date and time, the new date and time and the new service type.
- It looks up the existing booking in Google Sheets by phone and current date/time.
- If it finds a match, it builds start and end timestamps for the new slot.
- It calls a Check Slot Availability sub-workflow to make sure the new slot is free.
- If it is, it updates the matching Google Calendar event with the new times, an updated summary and the phone number in the description.
- It returns Rescheduled=true with the formatted date and time, or one of four error codes.
What does it return when a reschedule fails?
One of four error codes, so your voice agent can say the right thing instead of a generic failure.
| Error code | Meaning |
|---|---|
| appointment_not_found | No booking matches that phone number and current time |
| new_slot_unavailable | The requested new slot is already taken |
| calendar_unavailable | Google Calendar couldn't be updated |
| crm_unavailable | The bookings sheet couldn't be read or updated |
What columns does the sheet need?
preferred_date, preferred_time, status, phone, event_id and name. The event_id is what links a sheet row to its Google Calendar event.
| Input from the calling workflow | Format |
|---|---|
| phone | E.164, e.g. +14155550123 |
| new_date | YYYY-MM-DD |
| new_time | HH:mm (24-hour) |
How do you set it up?
You need Google Sheets OAuth, Google Calendar OAuth connected in n8n. Then:
- Import the template into n8n.
- Connect Google Sheets OAuth, replace YOUR_GOOGLE_SHEET_ID and make sure the required columns exist.
- Connect Google Calendar OAuth and select the calendar that stores appointments.
- Link a Check Slot Availability sub-workflow that accepts preferred_date and preferred_time and returns an available boolean.
- Make sure the calling workflow sends phone in E.164, new_date as YYYY-MM-DD and new_time as HH:mm.
What should you test before it goes live?
The edge cases, not just the happy path.
| Test | What should happen |
|---|---|
| Wrong phone number | appointment_not_found, nothing changed |
| New time already booked | new_slot_unavailable, original booking kept |
| Valid reschedule | Calendar event moved, Rescheduled=true returned |
| Appointments longer than 30 minutes | Change the default duration first, or the end time will be wrong |
How does it find the right appointment?
By the caller's phone number plus the current appointment date and time, matched against the bookings sheet.
What if the new time is taken?
It returns new_slot_unavailable and leaves the original appointment untouched.
How long are appointments?
30 minutes by default. Change it if your appointments run longer.
Related