Calendly + Google Sheets: meetings logged, no misses
Calendly is great until something changes. A client cancels, someone reschedules, and your “source of truth” becomes a messy mix of inbox threads, Slack pings, and a spreadsheet nobody trusts.
Calendly Sheets logging hits ops managers first, because they’re the ones cleaning up the fallout. But coaches and agency leads feel it too when a missed update turns into a no-show or an awkward “wait, are we still on?” email.
This workflow turns every booking, cancellation, and reschedule into a clean Google Sheets log, updates the status automatically, and keeps your team notified. You’ll see exactly how it works, what you need, and where to tweak it for your process.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: Calendly + Google Sheets: meetings logged, no misses
flowchart LR
subgraph sg0["Flow 1"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Calendly Webhook"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Parse Calendly Event"]
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Event Router", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Log to Google Sheets", pos: "b", h: 48 }
n4@{ icon: "mdi:location-exit", form: "rounded", label: "Create Calendar Event", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Slack - New Booking"]
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Prepare Confirmation Email"]
n7@{ icon: "mdi:message-outline", form: "rounded", label: "Send Confirmation Email", pos: "b", h: 48 }
n8@{ icon: "mdi:database", form: "rounded", label: "Log Cancellation", pos: "b", h: 48 }
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Slack - Cancellation"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Prepare Cancellation Email"]
n11@{ icon: "mdi:message-outline", form: "rounded", label: "Send Cancellation Email", pos: "b", h: 48 }
n12@{ icon: "mdi:database", form: "rounded", label: "Log Reschedule", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Slack - Rescheduled"]
n14["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Prepare Reschedule Email"]
n15@{ icon: "mdi:message-outline", form: "rounded", label: "Send Reschedule Email", pos: "b", h: 48 }
n16@{ icon: "mdi:cog", form: "rounded", label: "Done - Confirmation", pos: "b", h: 48 }
n17@{ icon: "mdi:cog", form: "rounded", label: "Done - Cancellation", pos: "b", h: 48 }
n18@{ icon: "mdi:cog", form: "rounded", label: "Done - Reschedule", pos: "b", h: 48 }
n2 --> n3
n2 --> n8
n2 --> n12
n12 --> n13
n0 --> n1
n8 --> n9
n5 --> n6
n13 --> n14
n3 --> n4
n1 --> n2
n9 --> n10
n4 --> n5
n15 --> n18
n11 --> n17
n7 --> n16
n14 --> n15
n10 --> n11
n6 --> n7
end
subgraph sg1["Flow 2"]
direction LR
n19["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Format Error1"]
n20["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Slack - Error Alert1"]
n19 --> n20
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n2 decision
class n3,n8,n12 database
class n0 api
class n1,n6,n10,n14,n19 code
classDef customIcon fill:none,stroke:none
class n0,n1,n5,n6,n9,n10,n13,n14,n19,n20 customIcon
Why This Matters: Calendar Changes Create Quiet Chaos
Bookings are easy. It’s the cancellations and reschedules that cause the real damage, because they happen when your day is already packed. Someone updates Calendly, the guest gets the notification, and your internal systems stay stale. Now your spreadsheet shows the old time, your calendar may or may not reflect reality, and the team keeps working off bad info. It’s not just annoying. It’s the kind of small operational mismatch that leads to missed calls, wrong handoffs, and a “we’re disorganized” vibe you didn’t earn.
The friction compounds. Here’s where it breaks down in the real world.
- Reschedules don’t reliably make it into your tracking sheet, so reporting and capacity planning become guesswork.
- Cancellations get buried in inboxes, which means someone still preps for a meeting that will never happen.
- Manual logging leads to inconsistent formatting (names, timezones, meeting types), and you lose clean filters when you need them most.
- When something fails quietly, you find out late, usually after a client asks why nobody showed.
What You’ll Build: A Single Workflow for Bookings, Cancellations, and Reschedules
This automation starts with a Calendly webhook that fires every time a meeting is created, canceled, or rescheduled. n8n parses the scheduling payload, figures out what kind of event just happened, and routes it down the right path. For a new booking, it appends a clean row to Google Sheets, creates the event in the organizer’s Google Calendar, posts a heads-up in Slack, and emails the guest a polished HTML confirmation. For cancellations and reschedules, it logs the change in Sheets (including status updates), alerts your team in Slack (#meetings), and sends the appropriate HTML email so the guest gets a consistent experience. If anything errors out, the workflow formats a readable error report and posts it to Slack (#errors) so you can fix it fast instead of discovering it days later.
The workflow begins when Calendly pushes an event update into n8n. From there, Google Sheets becomes your audit trail, Google Calendar stays accurate for the organizer, and Slack plus Gmail keep everyone informed. One pipeline. Three event types handled end-to-end.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you run a small team that books 30 meetings a week, and about 10 of those get rescheduled or canceled. Manually, logging the update in Sheets (5 minutes), updating a calendar event (5 minutes), and messaging the team (2 minutes) is roughly 10 minutes per change, so that’s about 100 minutes weekly. With this workflow, the “work” becomes checking Slack notifications and occasionally reviewing the sheet, which is closer to a few minutes total. The difference is not subtle.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Calendly to send booking webhooks to n8n.
- Google Sheets for your meeting log and status tracking.
- Google Calendar to create the organizer’s event automatically.
- Slack to notify #meetings and alert #errors.
- Gmail to send confirmation, cancellation, and reschedule emails.
- Calendly webhook signing key (optional) (get it from Calendly Webhooks settings, if you use signature verification).
Skill level: Beginner. You’ll connect accounts, map a few fields, and paste a webhook URL into Calendly.
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
Calendly triggers the workflow. When a booking is created, canceled, or rescheduled, Calendly sends a webhook event to your n8n webhook URL.
The payload gets cleaned up and classified. n8n parses the incoming data, extracts details like name, email, meeting type, date, time, timezone, and meeting URL, then routes the event based on type (new booking vs. cancellation vs. reschedule).
Google Sheets and Google Calendar get updated. Each route writes to the same sheet structure so you can filter and report reliably. New bookings also create a Google Calendar event for the organizer, so availability and reminders stay consistent.
Your team and the guest get notified. Slack posts the update to #meetings, then Gmail sends a professional HTML email matching the event type. If anything fails, an error report is formatted and posted to #errors so you can react quickly.
You can easily modify the email design and wording to match your brand voice based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Start by setting up the webhook that receives scheduling events and kicks off the workflow.
- Add the Incoming Scheduling Webhook node as the trigger.
- Set HTTP Method to
POST. - Set Path to
calendly-webhook. - Under Options, set Response Data to
allEntries. - Copy the webhook URL and configure your scheduling tool to send events to it.
allEntries to avoid timeouts.Step 2: Connect Google Sheets and Calendar
These nodes log bookings and create calendar events, so ensure your Google credentials are connected and the sheet IDs are correct.
- Open Append Booking Log and set Document ID to
YOUR_DOCUMENT_IDand Sheet Name toBookings. - Confirm column mappings in Append Booking Log, such as Date →
{{ $json.formattedDate }}and Status →Confirmed. - Open Append Cancellation Log and set the same Document ID and Sheet Name to
Bookings, with Status →Canceled. - Open Append Reschedule Log and set the same Document ID and Sheet Name to
Bookings, with Status →Rescheduled. - Open Generate Calendar Entry, set Calendar to
primary, Start to{{ $('Parse Scheduling Payload').item.json.startTime }}, and End to{{ $('Parse Scheduling Payload').item.json.endTime }}. - Set Summary to
{{ $('Parse Scheduling Payload').item.json.meetingName }} - {{ $('Parse Scheduling Payload').item.json.name }}and Description toMeeting with {{ $('Parse Scheduling Payload').item.json.name }} ({{ $('Parse Scheduling Payload').item.json.email }})with the join link appended. - Credential Required: Connect your Google Sheets credentials for Append Booking Log, Append Cancellation Log, and Append Reschedule Log.
- Credential Required: Connect your Google Calendar credentials for Generate Calendar Entry.
Step 3: Set Up Parsing and Routing
These nodes normalize the inbound payload and route the event to the correct flow.
- Open Parse Scheduling Payload and review the JavaScript parser that outputs fields like
eventCategory,formattedDate, andmeetingUrl. - In Route Event Type, set Value 1 to
{{ $json.eventCategory }}. - Ensure Route Event Type has three rules for
created,canceled, andrescheduled. - Confirm the flow: Incoming Scheduling Webhook → Parse Scheduling Payload → Route Event Type.
Step 4: Configure the Booking (Created) Flow
This path logs the booking, creates a calendar event, posts to Slack, and sends a confirmation email.
- Verify the sequence: Route Event Type → Append Booking Log → Generate Calendar Entry → Slack New Booking Alert → Build Confirmation Email → Dispatch Confirmation Email → Complete Confirmation Flow.
- In Slack New Booking Alert, set Text to
:calendar: *New Meeting Booked*. - In Build Confirmation Email, customize the
CONFIGvalues likecompanyName,primaryColor, andfooterTextto match your brand. - In Dispatch Confirmation Email, map Send To to
{{ $json.to }}, Subject to{{ $json.subject }}, and Message to{{ $json.htmlContent }}. - Credential Required: Connect your Slack credentials for Slack New Booking Alert.
- Credential Required: Connect your Gmail credentials for Dispatch Confirmation Email.
invitee and event fields.Step 5: Configure the Cancellation Flow
This path logs cancellations, alerts Slack, and sends a cancellation email.
- Verify the sequence: Route Event Type → Append Cancellation Log → Slack Cancellation Notice → Build Cancellation Email → Dispatch Cancellation Email → Complete Cancellation Flow.
- In Slack Cancellation Notice, set Text to
:x: *Meeting Canceled*. - In Build Cancellation Email, update
companyNameandcalendlyUrlin theCONFIGblock. - In Dispatch Cancellation Email, map Send To to
{{ $json.to }}, Subject to{{ $json.subject }}, and Message to{{ $json.htmlContent }}. - Credential Required: Connect your Slack credentials for Slack Cancellation Notice.
- Credential Required: Connect your Gmail credentials for Dispatch Cancellation Email.
Step 6: Configure the Reschedule Flow
This path logs reschedules, alerts Slack, and sends a reschedule email.
- Verify the sequence: Route Event Type → Append Reschedule Log → Slack Reschedule Notice → Build Reschedule Email → Dispatch Reschedule Email → Complete Reschedule Flow.
- In Slack Reschedule Notice, set Text to
:arrows_counterclockwise: *Meeting Rescheduled*. - In Build Reschedule Email, update the
CONFIGblock with your brand settings. - In Dispatch Reschedule Email, map Send To to
{{ $json.to }}, Subject to{{ $json.subject }}, and Message to{{ $json.htmlContent }}. - Credential Required: Connect your Slack credentials for Slack Reschedule Notice.
- Credential Required: Connect your Gmail credentials for Dispatch Reschedule Email.
Step 7: Add Error Handling (Optional Utility Nodes)
These utility nodes can be used to route errors to Slack, even though the workflow does not currently include an error branch.
- Review Utility: Format Error Report to ensure it formats error details like
errorMessageanderrorNode. - Review Utility: Slack Error Alert with Text set to
:rotating_light: *Workflow Error*. - If you want automated error handling, add an error workflow or error branch that routes into Utility: Format Error Report and then to Utility: Slack Error Alert.
- Credential Required: Connect your Slack credentials for Utility: Slack Error Alert.
Step 8: Test and Activate Your Workflow
Run a full test for each event type to verify the logs, notifications, and emails work as expected.
- Click Execute Workflow and send a test payload to Incoming Scheduling Webhook.
- Confirm a booking event appends a row in Append Booking Log, creates an event in Generate Calendar Entry, and sends a Slack alert and email.
- Repeat with cancellation and reschedule events to verify Append Cancellation Log/Append Reschedule Log and the corresponding Slack and Gmail nodes.
- When successful, toggle the workflow to Active for production use.
Troubleshooting Tips
- Calendly webhooks can stop firing if the webhook subscription is removed or changed. Check Calendly > Integrations > Webhooks first, then resend a test event.
- Google Sheets updates often fail because the sheet columns don’t match what the workflow expects. Confirm your header names include Event ID, Date Logged, Name, Email, Meeting Type, Date, Time, Status, Meeting URL, and Timezone.
- Slack credentials can expire or be missing channel permissions. If #meetings or #errors stays quiet, verify the Slack app can post to those channels in Slack’s app settings.
Quick Answers
About 30 minutes if your accounts and sheet are ready.
No. You will connect apps and paste in a webhook URL.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Gmail/Google/Slack usage, which is usually already covered by your existing workspace plan.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s mostly field mapping. You can change what gets written to Sheets by editing the “Append Booking Log”, “Append Cancellation Log”, and “Append Reschedule Log” steps, then tweak the “Build Confirmation Email” code to match your wording. Common customizations include adding sales owner fields, writing a “Source” column (web, referral, partner), or swapping Slack alerts for Microsoft Teams notifications.
Usually it’s not “Calendly auth” at all, it’s the webhook setup. Confirm the webhook is active in Calendly and pointing to the exact n8n webhook URL (including the right environment). If events arrive but routing fails, the payload shape may differ from what the parsing step expects, especially if you added new event types in Calendly. And yes, it can also be rate limits or temporary outages, which is why the Slack #errors alert is worth keeping.
On most n8n setups, this can handle hundreds of events per day without drama. n8n Cloud Starter includes a monthly execution limit based on your plan, while self-hosting has no fixed execution cap (it depends on your server). Each Calendly event is typically one execution, and the workflow is lightweight unless you’re sending a very high email volume.
Often, yes, because you can handle bookings, cancellations, and reschedules in one workflow with clean branching and real error handling. You also get a self-hosted option, which matters when volume grows and per-task pricing starts to sting. Zapier and Make can absolutely do it, but teams usually end up maintaining three separate zaps/scenarios plus extra “glue” steps for edge cases. If you want help picking the right stack for your situation, Talk to an automation expert.
Your sheet stays accurate even when calendars change. Set it up once, then let the workflow quietly keep everyone in sync.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.