How it works
What this workflow does
Give sales one Airtable meeting record per Calendly invitee. The workflow reacts to invitee.created, waits for Calendly's Google Calendar sync, finds the matching calendar event by exact invitee email and start and end times, and upserts the contact and meeting in Airtable. New meeting records can also post an internal Slack alert.
The workflow imports inactive with dryRun: true. Run with sample data uses a fictional booking and calendar event, so the preview does not call Calendly, Google Calendar, Airtable, or Slack.
This is a booking-capture layer for the Meeting Lifecycle & Outcome Verification blueprint; the Intelligent Lead Routing & Response blueprint covers inbound ownership before the meeting.
Match the calendar event without guessing
After a configurable wait (calendarWaitSeconds, 30 by default), the workflow reads calendar events in the booking window. A match requires the exact invitee email plus matching start and end timestamps. The result is matched, missing, or ambiguous. A missing or ambiguous result is still written to Airtable so the team can review it; the workflow does not pick the closest event.
When addInternalAttendeeEmail is configured and exactly one event matches, the workflow can add that internal attendee. The calendar update uses the event's If-Match ETag and suppresses attendee update emails. It skips events whose attendees are hidden or already contain the internal address.
Record and notify
Airtable upserts the contact by Email and the meeting by Booking ID, keeping one row per invitee. Slack is notified only when Airtable creates a new meeting row and a Slack channel is configured. A replay of the same invitee URI updates the existing rows and does not send a second Slack alert.
Validation scope
The supplied report confirms the isolated n8n 2.47.4 import, inactive state, and sample path. It also covers unique node IDs, intact connections, Code-node syntax, exact calendar matching, visible missing and ambiguous states, and Slack suppression for record replays. Live Calendly, Google Calendar, Airtable, and Slack calls require a staging test with your accounts.
How to use
Before you start
- A current n8n instance.
- A Calendly account that can register webhooks, connected to the Google calendar that receives its bookings.
- Google Calendar OAuth access to that calendar.
- An Airtable base with the two tables below.
- An Airtable personal access token with record read and write access to the base.
- An optional Slack bot token with
chat:writeand access to the target channel.
1. Import and run the sample
Download the complete package, extract the ZIP, and read the full setup guide. Import calendly-booking-sync.n8n.json and keep it inactive.
Open Run with sample data and choose Test workflow. Match calendar event should show matched and a fictional calendar event ID.
2. Create the Airtable tables
Use single-line text for the key fields and include time on both date fields.
| Table | Fields |
|---|---|
Contacts | Email (text), Name (text) |
Meetings | Booking ID (text), Contact (link to Contacts), Event (text), Starts At and Ends At (date and time), Calendar Event ID (text), Calendar Status (text) |
3. Configure credentials and Setup
Select the Calendly OAuth credential on Receive event. The trigger is scoped to the connected user. Select the Google Calendar OAuth credential on Find calendar events and Add internal calendar attendee.
Create a Header Auth credential using Authorization: Bearer <Airtable token> and select it on both Airtable nodes. If Slack is enabled, create a separate Header Auth credential with the bot token and select it on Notify sales in Slack.
In Setup, set calendarId, airtableBaseId, contactsTableId, and meetingsTableId. Leave addInternalAttendeeEmail blank for the first test. Set slackChannelId only when Slack is ready. Keep the default 30-second wait unless your calendar sync needs longer.
4. Test the booking paths
Use the supplied test payloads for a sample invitee, an unsupported cancellation, and a matching calendar event. Confirm that an exact match stores the event ID and matched status. Confirm that a late sync or two matching events still creates an Airtable row with missing or ambiguous status. Replay the same invitee URI and verify the row updates without another Slack message.
5. Go live
Set dryRun to false in staging. Create a test booking and check Google Calendar, Airtable, optional attendee addition, and Slack before enabling the production trigger. Use an Airtable view for unmatched meetings. This workflow tracks newly created bookings; add a separate cancellation workflow if the team needs to reconcile canceled or superseded rows.
Related automations
Use the AI Inbound Lead Routing & Sales Follow-Up System for the inquiry that precedes the booking, and the Sales-Call Follow-Up Draft System after the meeting. The Client Onboarding & Project Handoff Automation takes over when the deal is signed. Read the Meeting Lifecycle & Outcome Verification blueprint for the full meeting process.
Use the HubSpot Intelligent Lead Routing & Response System when routing belongs in HubSpot rather than a standalone intake form.