Calendly Module
Run a workflow for every Calendly booking, cancellation, reschedule, no-show, routing-form submission, contact change or Notetaker recap, and find slots, share booking links, book, cancel, keep contacts up to date and work with meeting recaps from any flow.
The Calendly Module adds three Start events, each on its own Channel: the Calendly Start (Calendly, bookings), the Calendly contact start (CalendlyContact) and the Calendly recap start (CalendlyRecap). A Process may hold all three. Its Tasks work on any Channel. Typical uses: create a CRM record and send a WhatsApp confirmation for every new booking; send a reschedule link after a no-show; offer the next free slots in a chat or voice flow and book the one the caller picks; email the action items of every recorded meeting to its attendees.
Requirements
- A Calendly organization owner or admin connects the account. The Start and the Tasks then see every member's meetings.
- Webhooks (the Calendly Start) and Book meeting need a paid Calendly plan: Standard, Teams or Enterprise.
- Book meeting is limited by Calendly to 10 bookings a minute, 50 an hour and 100 a day outside Enterprise.
- Contacts and Notetaker need a paid Calendly plan with those Calendly features turned on for the organization.
- Compliance (activity log, sent messages, data deletion) needs Calendly Enterprise.
Configuration
The Calendly Module is configured per Environment, so Development and Production can use different Calendly organizations.
| Field | Type | Required | Description |
|---|---|---|---|
| Calendly account | button | Yes | Connect Calendly signs in with Calendly. Workspace owners and admins only, with a Calendly organization owner or admin account. The sign-in is stored encrypted on the engine and never shown. The field also shows the webhook's state and any permission the sign-in did not grant. Disconnect removes the webhook and revokes the sign-in. |
| Default time zone | string | No | IANA time zone (e.g. Europe/Rome) for local times and for dates written without an offset. Tasks can override it. Default: UTC. |
| Contacts | boolean | No | Features. Allows the Calendly contact start and the Calendly contacts Task. |
| Notetaker | boolean | No | Features. Allows the Calendly recap start and the Calendly recaps Task. |
| Recaps of every member | boolean | No | Features, shown with Notetaker. Calendly sends recap webhooks only for the connected account's own meetings; with this on, the engine also checks every 10 minutes for every other member's recaps and starts the recap flow for each new one. |
| Organization admin | boolean | No | Features. Allows inviting users, revoking invitations and removing members (Calendly organization Task). |
| Compliance | boolean | No | Features (Enterprise). Allows the Calendly compliance Task: activity log, sent emails and SMS, data deletion. |
Features and permissions
Connect asks only for the permissions of the features that are on:
| Feature | Permissions |
|---|---|
| Scheduling (always on) | read: users, the organization and its groups, locations, routing forms; create and change: event types and their availability, meetings and bookings, booking links and custom links, webhooks |
| Contacts | contacts (read and write) |
| Notetaker | meeting recaps (read and write) |
| Organization admin | organization (write) |
| Compliance | activity log, outgoing communications (read); data compliance (write) |
Turning a feature on after connecting shows Reconnect to grant: … on the field: reconnect so Calendly asks for the new permissions. Until then, a deploy that uses the feature is refused and its Tasks fail.
Operations that can't be undone (Delete contact, Delete recap, Revoke invitation, Remove member, Delete invitee data, Delete event data) need two things: their feature on in the Environment, and the Task's own I understand this can't be undone box. A deploy that misses either is refused, the Task checks again when it runs, and every such run is logged.
Calendly Start
Starts the Process when one of the ticked events happens in the connected organization. When you deploy, the engine creates (or updates) a Calendly webhook for the Environment with exactly the ticked events. A deploy without a Calendly connection is refused. Deploying a version without the Calendly Start removes the webhook.
| Field | Type | Default | Description |
|---|---|---|---|
| New bookings | boolean | on | A meeting is booked. A reschedule arrives here too, with {booking.action} = rescheduled. |
| Cancellations | boolean | off | A meeting is canceled by the host or the invitee. |
| No-shows | boolean | off | A host marks an invitee as no-show. |
| No-show removed | boolean | off | A no-show mark is taken back. |
| Routing form submissions | boolean | off | Someone submits a routing form, whether or not they then book. |
| Only these event types | string | (all) | Advanced. Comma-separated slugs (30min), ids or addresses. |
| Only these hosts | string | (all) | Advanced. Comma-separated host emails. |
| Only these groups | string | (all) | Advanced. Comma-separated Calendly group names (or ids): only meetings hosted by a member of one of them. A group that can't be found makes Calendly retry the delivery instead of dropping it. |
| Also run for the cancel half of a reschedule | boolean | off | Advanced. Calendly reports a reschedule as a cancellation followed by a booking. Off: only the booking runs, as rescheduled. |
| Booking variable | output | {booking} | Receives the event (below). |
When several events are ticked, branch on {booking.action} with an Exclusive Gateway. The Calendly Channel has nobody to answer: an Input Task fails there. To reach the invitee, use an email, SMS or WhatsApp Task with {booking.email} or {booking.phone}.
Testing. In the editor's chat, start the Process at the Calendly Start with test data, e.g. { "action": "booked", "name": "Ada", "email": "ada@example.com", "eventName": "Demo", "startTime": "2026-11-03T09:00:00Z" }. Without test data a sample booking is used. {booking.isTest} is true.
The {booking} variable
| Path | Example | Description |
|---|---|---|
{booking.action} | booked | booked, canceled, rescheduled, no_show, no_show_removed or form_submitted. |
{booking.name}, {booking.firstName}, {booking.lastName} | Ada Lovelace | The invitee. |
{booking.email} | ada@example.com | The invitee's email (also {booking.from}). |
{booking.phone} | +393331234567 | The SMS reminder number, when the event type asks for one. |
{booking.timezone} | Europe/Rome | The invitee's time zone. |
{booking.eventName} | 30 Minute Meeting | The event type's name. |
{booking.startTime}, {booking.endTime} | 2026-11-03T09:00:00.000000Z | UTC. |
{booking.startLocal}, {booking.endLocal} | 2026-11-03T10:00:00+01:00 | In the invitee's time zone (else the default time zone). |
{booking.location.joinUrl}, {booking.location.kind}, {booking.location.address} | Where the meeting happens. | |
{booking.hosts.0.email}, {booking.hosts.0.name} | The hosts (also {booking.to}). | |
{booking.answers.0.question}, {booking.answersByQuestion.Company} | The booking questions' answers. | |
{booking.utm.source}, .medium, .campaign, .term, .content | UTM parameters of the booking link. | |
{booking.cancelUrl}, {booking.rescheduleUrl} | Links the invitee can use. | |
{booking.cancellation.reason}, .canceledBy, .canceledByType | For canceled. | |
{booking.rescheduled}, {booking.oldInviteeUri} | true | For rescheduled. |
{booking.noShow} | true | For no_show. |
{booking.payment.amount}, .currency, .successful | 25.00 | When the event type takes payments. |
{booking.routingForm.answers.0.answer}, .resultType, .resultValue | For form_submitted (no meeting fields). | |
{booking.eventUri}, {booking.inviteeUri}, {booking.eventTypeUri} | Calendly addresses, for the Tasks below. |
Calendly contact start
Starts the Process when a contact is created, updated or deleted in the connected organization. Needs the Contacts feature. Deploying it adds the ticked contact events to the Environment's Calendly webhook (the same one the Calendly Start uses); deploying a version without it takes them out again.
| Field | Type | Default | Description |
|---|---|---|---|
| Contact created | boolean | on | |
| Contact updated | boolean | off | Calendly sends the whole contact. Calendly reports changes made in Calendly; changes made through its API (for example by the Calendly contacts Task) may not arrive. |
| Contact deleted | boolean | off | A deleted contact carries only {contact.uri} and {contact.deletedAt}. |
| Contact variable | output | {contact} | Receives the contact (below). |
{contact}: action (created, updated, deleted), name, email (the primary one, also {contact.from}), emails, phone, phones, company, jobTitle, country, state, city, linkedIn, timezone, customFields by label ({contact.customFields.Tier}; select fields show the option's label, tags are comma-separated, currency is an amount), creationSource, uri.
Testing. In the editor's chat, with test data such as { "name": "Ada", "email": "ada@example.com", "company": "Acme" }.
Calendly recap start
Starts the Process when a Calendly Notetaker meeting recap is ready. Needs the Notetaker feature. Calendly sends recap webhooks per user, so the deploy subscribes for the connected account's own meetings; turn on Recaps of every member in the configuration to also pick up every other member's recaps (checked every 10 minutes). A recap found both ways runs once.
| Field | Type | Default | Description |
|---|---|---|---|
| Recap ready | boolean | on | |
| Recap edited | boolean | off | Runs again when the recap's highlights or share link change in Calendly. |
| Include the transcript | boolean | on | Fetches the transcript and attaches it to the run as a text file, {recap.transcript}. |
| Recap variable | output | {recap} | Receives the recap (below). |
{recap}: name (the meeting), startTime, startLocal, endTime, location, eventUri (empty for a meeting not booked through Calendly), attendees (name, email, host), summary, actionItems, discussion (plain text), summaryMarkdown, actionItemsMarkdown, discussionMarkdown, shareLink, transcript (a file: use it as an email attachment or in a Read file Task), transcriptPreview (the first 2,000 characters), source (webhook or poll). {recap.from} is the first guest's email, {recap.to} the host's.
Testing. In the editor's chat, with test data such as { "summary": "...", "actionItems": "- [ ] ...", "transcript": "Anna: hello" }.
Calendly meetings
Works with booked meetings. Meetings and invitees are Calendly ids or addresses, typically {booking.eventUri} and {booking.inviteeUri}.
| Operation | Fields | Result (default variable) |
|---|---|---|
| Get meeting | Meeting | {meeting}: name, status, startTime, startLocal, location, hosts, guests, invitees. |
| Find meetings | Invitee email, Host email, Status (active / canceled / any), Starting from, Until, Max results (advanced, default 20) | {meetings}: count, items (soonest first). |
| Get invitee | Invitee (full address) | {invitee}: name, email, status, answers, cancelUrl, rescheduleUrl, noShow. |
| List invitees | Meeting; optional invitee email, status | {invitees}: count, items (as {invitee}). For group meetings. |
| Cancel meeting | Meeting, Reason | {cancellation}: canceled, reason. Calendly emails the invitees. |
| Mark no-show | Invitee (full address) | {noShow}: uri, noShow = true. |
| Remove no-show | Invitee, or the no-show's address | {noShow}: noShow = false. |
Calendly scheduling
| Operation | Fields | Result (default variable) |
|---|---|---|
| Find free slots | Event type, Starting from, Days to search (default 7, up to 60), Max slots (default 5) | {slots}: count, items (startTime, startLocal, schedulingUrl), text (e.g. Tue 3 Nov 10:00, Tue 3 Nov 10:30, in the conversation's language). |
| Create booking link | Event type | {link}: url, a link that books once. |
| Create custom link | Event type; optional Name, Duration, When it can be booked (between two dates / the next N days / any time), Location kind + Location, Hours for this link (weekly lines) | {link}: url. A single-use link whose fields override the event type's; anything not set is copied from it. One-on-one event types only. |
| Create one-off meeting | Name, Duration, When it can be booked (between two dates, under 365 days / the next N days, weekdays only / exact start times, one per line); optional Host email (default: the connected account), Co-hosts, Location kind + Location | {oneOff}: url (the booking link), eventTypeUri, name, duration. |
| Book meeting | Event type, Start time, Invitee name, Invitee email, Invitee time zone; advanced: SMS reminder number, Answers (Question: answer per line), Guests, Location kind, Location | {booked}: meetingUri, startLocal, cancelUrl, rescheduleUrl, invitee. Calendly sends its usual confirmation. |
Event type accepts the slug (the end of the booking link, e.g. 30min), the booking link itself, the id or the address. When two members have an event type with the same slug, use the booking link or the id.
Book meeting is never retried: when the slot was taken in the meantime, or Calendly's booking limit is reached, the Task ends on its error route with Calendly's reason. Find free slots again and offer another one.
Calendly event types
| Operation | Fields | Result (default variable) |
|---|---|---|
| List event types | optional Member email (default: the whole organization), Active only (default on) | {eventTypes}: count, items (name, slug, duration, schedulingUrl, kind, ownerName). |
| Get event type | Event type | {eventType}: name, slug, active, duration, durationOptions, kind, poolingType, type, schedulingUrl, description, color, locale, secret, isPaid, ownerName, locations, questions (name, type, required, answerChoices), hosts. |
| Create event type | Name, optional Duration (default 30), Switched on (default off), Member email (owner; default: the connected account); advanced: Duration choices, Description, Color, Language, Location kind + Location | {eventType}. One-on-one event types only. |
| Update event type | Event type and any of the Create fields | {eventType}. Only the fields you set change; a location replaces the event type's locations. |
| Get availability | Event type | {availability}: timezone, weekly (day, hours), overrides (date, hours), weeklyText, overridesText. |
| Set availability | Event type; Weekly hours and/or Date overrides; How to apply (only the listed days and dates / replace everything); optional Time zone | {availability} as saved. |
| List locations | optional Member email | {locations}: count, items (kind, connected): the meeting locations the member can offer. |
Weekly hours has one line per day, for example monday: 09:00-12:00, 13:00-17:00 or friday: unavailable. Date overrides has one line per date, for example 2026-12-24: unavailable. Times use the 24-hour clock.
Get availability's {availability.weeklyText} and {availability.overridesText} use the same format, so a flow can read the hours, change a line and write them back. With only the listed days and dates, everything you don't mention stays as it is.
Calendly routing forms
| Operation | Fields | Result (default variable) |
|---|---|---|
| List forms | {forms}: count, items (name, status, questions). | |
| Get form | Form (name, id or address) | {form}: name, status, questions (name, type, required, answerChoices). |
| List submissions | Form; Max results (advanced, default 50, newest first) | {submissions}: count, items (answers, answersByQuestion, utm, resultType, resultValue, submitterUri, createdAt). |
| Get submission | Submission (id or address, e.g. {booking.routingForm.submissionUri}) | {submission}. |
Calendly organization
| Operation | Fields | Result (default variable) |
|---|---|---|
| Connected account | {account}: name, email, schedulingUrl, organizationName. | |
| List members | {members}: count, items (name, email, role, timezone, schedulingUrl). | |
| Find member | Member email | {member}: name, email, role (owner, admin, user), timezone, schedulingUrl, userUri. An email outside the organization ends on the error route. |
| Busy times | Member email, Starting from, Days (up to 7) | {busy}: count, items (type, startTime, endTime). |
| Availability schedules | optional Member email (default: the connected account) | {schedules}: items (name, default, timezone, weekly, overrides, weeklyText, overridesText). |
| List groups | {groups}: count, items (name, memberCount). | |
| List group members | Group (name, id or address) | {groupMembers}: items (name, email, role in the group, invited: true for people invited to the organization who haven't joined yet). |
| List teams | optional Member email | {teams}: items (name, schedulingUrl). |
| List invitations | Status (pending / accepted / declined / any), optional email | {invitations}: items (email, status, lastSentAt). |
| Invite user | Member email | {adminResult}: done, outcome (invited, already_member, already_invited), email, uri. Calendly emails the invitation. Organization admin. |
| Revoke invitation ⚠ | Member email (or the invitation's address) | {adminResult}: outcome revoked, or nothing_to_do when no invitation is pending. Organization admin + confirm. |
| Remove member ⚠ | Member email | {adminResult}: outcome removed, or nothing_to_do. The organization's owner and the connected account can't be removed. Organization admin + confirm. |
Calendly contacts
Needs the Contacts feature.
| Operation | Fields | Result (default variable) |
|---|---|---|
| Find contacts | any of Email, Phone, Country (exact, comma-separated), Name, Company (partial); Sort; Max results (default 100, up to 1,000) | {contacts}: count, items (as {contact}). |
| Get contact | Contact (email, id or address) | {contact}. |
| Create contact | Name, Email (the first is the primary; up to 10), optional Phone, Company, Job title, Time zone, Country, State, City, LinkedIn, Custom fields | {contact}. |
| Update contact | Contact and any of the Create fields | {contact}. Emails and phone numbers replace the existing lists; custom fields change only the ones listed. |
| Create or update by email | Email and any of the Create fields | {contactResult}: created (true when new), contact. The usual CRM step: an existing contact keeps its other email addresses. |
| Delete contact ⚠ | Contact | {contact} (as it was). Needs confirm. |
| List custom fields | {customFields}: items (label, type, options, currency). |
A new invitee also becomes a contact: a booking starts the Calendly Start and, when the Calendly contact start is deployed, a contact run ({contact.creationSource} = calendly_invitee).
Custom fields take one Label: value per line, by the field's label in Calendly: Tier: Gold (a select field takes the option's label), Interests: pricing, demo (tags), Budget: 12.50 (currency), Renewal: 2027-01-31 (date). An empty value clears the field. An unknown label or option ends on the error route before anything is sent.
Calendly recaps
Needs the Notetaker feature.
| Operation | Fields | Result (default variable) |
|---|---|---|
| Find recaps | any of Meeting (e.g. {booking.eventUri}), Attendee email, From, To; Status (ready / processing / unavailable); Max results (default 20, up to 200) | {recaps}: count, items (name, startTime, attendees, summary, actionItems, discussion and their Markdown, shareLink, transcriptUri). |
| Get recap | Recap (id or address, e.g. {recap.uri}) | {recap}. |
| Get transcript | Recap | {transcript}: file (a text file of the run, one Speaker: words line per turn), preview, characters. |
| Update recap | Recap; any of Summary, Action items, Discussion (Markdown) | {recap} as saved. Empty fields stay unchanged. |
| Delete recap ⚠ | Recap | Removes the recap and its transcript. Needs confirm. |
Calendly compliance
Needs the Compliance feature and a Calendly Enterprise plan.
| Operation | Fields | Result (default variable) |
|---|---|---|
| Search activity log | any of Search (Calendly's search syntax: or, and, exact phrases, exclusions, prefixes), Actors (member emails), Namespaces, Actions (advanced), From, To; Sort; Max results (default 100, up to 1,000) | {activity}: count, totalCount, totalExceedsMax, items (occurredAt, namespace, action, fullName, actorName, actorType, details as JSON). |
| List sent emails and SMS | optional From, To; Max results (default 100, up to 1,000) | {communications}: items (type email or sms, to, from, subject, body, senderEmail, sentAt). |
| Delete invitee data ⚠ | Invitee emails (comma-separated, up to 100) | {deletion}: requested, kind invitees, emails, requestedAt. |
| Delete event data ⚠ | From, To (in the past, at most 24 months apart) | {deletion}: requested, kind events, from, to, requestedAt. |
Calendly deletes the data within 7 days and offers no status to follow; a deletion request is never retried automatically.
Calendly lookup (replaced)
Calendly lookup is no longer offered for new flows; use Calendly organization and Calendly event types, which have the same operations. Flows that already use it keep running.
Errors
Every Task has an error route. A missing or broken connection ("Calendly is not connected", "needs reconnecting") is a configuration error: reconnect in the Environment settings. A feature that is off, or an operation that can't be undone without its confirm box, is an error in the flow. Calendly's own refusals (no permission, plan, rate limit, slot taken) carry Calendly's reason; a plan refusal says which plan is needed (paid, Enterprise) or that the Calendly feature is off for the organization.