Guide · Make.com · Calendly · Google Sheets · Slack

Calendly bookings to Google Sheets and Slack with Make

Short answer: Use Calendly › Watch events with both invitee created and invitee canceled selected, then a Router with three routes: new booking, rescheduled, canceled. The trick is that a reschedule is not one event. Calendly sends two: an invitee.canceled for the old time with rescheduled = true, and an invitee.created for the new time that carries the old booking's URI in old_invitee. Ignore the first, and use the second to update the existing row, so your sheet shows one booking at its new time instead of a "cancellation" plus a "new lead". Watch events needs a paid Calendly plan.

By Flowpaja · Published

This guide contains an affiliate link, marked “affiliate link”.

Calendly Watch events with a router: a new booking adds a row, a reschedule with old_invitee updates the same row, and a real cancellation marks the row canceled
A reschedule is two events: ignore the canceled half and update the row from the created half.
Disclosure: everything in this guide works with plain Make.com and the apps it connects. At the end we mention our own Make templates and our Make scenario fix service on Fiverr. Module names, settings and limits were checked against Make's Calendly docs and Calendly's reschedule payload docs in October 2026. Menus and limits change, so check them if something looks different.

What you need

  • A paid Calendly plan. Make's Watch events module uses Calendly webhooks, which aren't included in Calendly's free plan.
  • A Google Sheet with a Bookings tab and these headers: A Invitee URI, B Status, C Name, D Email, E Start, F Updated, G Cancel reason
  • A Slack channel for booking alerts
  • Test bookings with fictional names and @example.com emails

Why reschedules break simple booking automations

A first version usually has one trigger, invitee created → Add a Row → Slack. Then someone reschedules and two things happen:

What Calendly sendsWhat the simple version doesWhat you want
invitee.canceled for the old time, rescheduled = trueNothing, or a "Canceled" alert if you added oneNothing
invitee.created for the new time, old_invitee = old URIA second row and a "New booking" alertUpdate the first row to the new time, post "Rescheduled"

The two events can arrive in either order, so the scenario mustn't depend on which comes first. The design below doesn't.

Step 1: Watch both event types

Add Calendly › Watch events, click Create a webhook, connect Calendly, and select both the created and canceled events. Choose the organization or user to watch.

Click Run once and book a test meeting. The bundle contains the booking data Calendly sends. These are the fields this guide uses, with Calendly's names (Make's labels may differ slightly):

FieldExampleUse
eventinvitee.createdWhich route
payload › urihttps://api.calendly.com/scheduled_events/…/invitees/…Row key: one per booking per invitee
payload › name, payload › emailJamie Example, jamie@example.comColumns C–D
payload › scheduled_event › start_time2026-10-08T12:00:00.000000Z (UTC)Column E
payload › rescheduledtrue / falseTell a reschedule from a real cancellation
payload › old_inviteeURI of the booking it replacesFind the row to update
payload › cancellation › reason"Conflict"Column G

Key the sheet on the invitee URI, not the email. One person can have several bookings, and a returning invitee shouldn't overwrite their earlier meeting.

Step 2: Add the router

After the trigger, add a Router with three routes:

  1. New booking: event equal to invitee.created AND old_invitee does not exist
  2. Rescheduled: event equal to invitee.created AND old_invitee exists
  3. Canceled: event equal to invitee.canceled AND rescheduled equal to (Boolean) false

The canceled half of a reschedule (rescheduled = true) matches no route and stops there. That's intended: it costs 1 credit for the trigger and posts nothing.

Step 3: New booking route

  1. Google Sheets › Add a Row: A = uri, B = Booked, C = name, D = email, E = the start time (see Step 6), F = {{now}}.
  2. Slack › Send a Message: New booking: {{name}}, {{start}}.

Step 4: Rescheduled route

  1. Google Sheets › Search Rows: column A equal to old_invitee.
  2. Router on Search Rows' Total number of bundles:
    • > 0 → Update a Row with the found Row number: A = the new uri, B = Rescheduled, E = the new start time, F = {{now}}.
    • = 0 → Add a Row with B = Rescheduled. This happens for bookings made before the scenario existed.
  3. Slack › Send a Message on each branch: Rescheduled: {{name}}, now {{start}}.

Writing the new URI into column A matters: if the invitee reschedules again or cancels later, the next search finds this row.

Search Rows with no match still outputs one empty bundle with Total number of bundles = 0, so route on that number. More in Search Rows returns nothing.

Step 5: Canceled route

  1. Google Sheets › Search Rows: column A equal to uri.
  2. Filter: Total number of bundles > 0 → Update a Row: B = Canceled, F = {{now}}, G = the cancellation reason.
  3. Slack › Send a Message: Canceled: {{name}}, {{start}}.

Step 6: Show the start time in your time zone

Calendly sends start_time in UTC. Format it before writing:

{{formatDate(payload.scheduled_event.start_time; "ddd D MMM YYYY, HH:mm"; "Europe/London")}}

Replace Europe/London with your own time zone (click the field rather than typing the path). If the sheet turns the text into a different date or a number, see Google Sheets date errors in Make.

Step 7: Test all four cases

With fictional data:

TestExpected sheetExpected Slack
Book a meetingNew row, BookedNew booking
Reschedule itSame row, Rescheduled, new time, new URI in ARescheduled (once)
Reschedule it againSame row, newer timeRescheduled
Cancel itSame row, Canceled, reasonCanceled

Then add an error handler on each Google Sheets module (right-click → Add error handler): a Slack message to an alerts channel, then Skip. An instant-trigger scenario is switched off after its first unhandled error. On Calendly's side, a webhook that keeps failing is retried for up to 24 hours and then disabled.

Credits

EventCredits
New booking: trigger, Add a Row, Slack3
Reschedule: canceled half (trigger only) + created half (trigger, search, update, Slack)1 + 4 = 5
Cancellation: trigger, search, update, Slack4
No bookings0 (instant trigger)

60 bookings a month with 10 reschedules and 5 cancellations: 60 × 3 + 10 × 5 + 5 × 4 = 250 credits. Try your own numbers in the Make credits calculator.

Free template

Lead Capture → Google Sheets + Slack, with dedupe uses the same Search Rows → Total number of bundles → add or update pattern for form leads, tested in Make with fictional data. Free download.

No Make account yet? Create a free Make account (affiliate link). Flowpaja may earn a commission if you sign up through it, at no extra cost to you.

FAQ

Does this work on Calendly's free plan?
Not with Watch events: Make's documentation says it needs a paid Calendly subscription, because the free plan has no webhooks. Make's Calendly app also has a List events module you could run on a schedule, but that polls and isn't covered here.
Why did I get a "Canceled" alert when someone only rescheduled?
Your canceled route doesn't check rescheduled. Add the condition rescheduled equal to false.
Why not use the email as the key?
One person can book several meetings. The invitee URI identifies one booking, and Calendly links reschedules through it (old_invitee / new_invitee).
Can I send the invitee a confirmation from Make?
You could add an email module, but Calendly already sends confirmations. Keep this scenario for your own team.

Bookings doubling up in your sheet?

Send the exported blueprint and a screenshot of the scenario's run history to our Make scenario fix service on Fiverr. No logins needed.

Stuck on an error in your own Make scenario? Make scenario fix / debugging on Fiverr, from $25: send the exported blueprint and a description of the error, no logins needed.

← All guides · All templates

Make, Calendly, Google, Google Sheets and Slack are trademarks of their owners. Flowpaja is independent and not affiliated with or endorsed by them. Menus, limits and prices change; check the providers' current help.