Skip to main content

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.

FieldTypeRequiredDescription
Calendly accountbuttonYesConnect 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 zonestringNoIANA time zone (e.g. Europe/Rome) for local times and for dates written without an offset. Tasks can override it. Default: UTC.
ContactsbooleanNoFeatures. Allows the Calendly contact start and the Calendly contacts Task.
NotetakerbooleanNoFeatures. Allows the Calendly recap start and the Calendly recaps Task.
Recaps of every memberbooleanNoFeatures, 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 adminbooleanNoFeatures. Allows inviting users, revoking invitations and removing members (Calendly organization Task).
CompliancebooleanNoFeatures (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:

FeaturePermissions
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
Contactscontacts (read and write)
Notetakermeeting recaps (read and write)
Organization adminorganization (write)
Complianceactivity 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.

FieldTypeDefaultDescription
New bookingsbooleanonA meeting is booked. A reschedule arrives here too, with {booking.action} = rescheduled.
CancellationsbooleanoffA meeting is canceled by the host or the invitee.
No-showsbooleanoffA host marks an invitee as no-show.
No-show removedbooleanoffA no-show mark is taken back.
Routing form submissionsbooleanoffSomeone submits a routing form, whether or not they then book.
Only these event typesstring(all)Advanced. Comma-separated slugs (30min), ids or addresses.
Only these hostsstring(all)Advanced. Comma-separated host emails.
Only these groupsstring(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 reschedulebooleanoffAdvanced. Calendly reports a reschedule as a cancellation followed by a booking. Off: only the booking runs, as rescheduled.
Booking variableoutput{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​

PathExampleDescription
{booking.action}bookedbooked, canceled, rescheduled, no_show, no_show_removed or form_submitted.
{booking.name}, {booking.firstName}, {booking.lastName}Ada LovelaceThe invitee.
{booking.email}ada@example.comThe invitee's email (also {booking.from}).
{booking.phone}+393331234567The SMS reminder number, when the event type asks for one.
{booking.timezone}Europe/RomeThe invitee's time zone.
{booking.eventName}30 Minute MeetingThe event type's name.
{booking.startTime}, {booking.endTime}2026-11-03T09:00:00.000000ZUTC.
{booking.startLocal}, {booking.endLocal}2026-11-03T10:00:00+01:00In 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, .contentUTM parameters of the booking link.
{booking.cancelUrl}, {booking.rescheduleUrl}Links the invitee can use.
{booking.cancellation.reason}, .canceledBy, .canceledByTypeFor canceled.
{booking.rescheduled}, {booking.oldInviteeUri}trueFor rescheduled.
{booking.noShow}trueFor no_show.
{booking.payment.amount}, .currency, .successful25.00When the event type takes payments.
{booking.routingForm.answers.0.answer}, .resultType, .resultValueFor 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.

FieldTypeDefaultDescription
Contact createdbooleanon
Contact updatedbooleanoffCalendly 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 deletedbooleanoffA deleted contact carries only {contact.uri} and {contact.deletedAt}.
Contact variableoutput{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.

FieldTypeDefaultDescription
Recap readybooleanon
Recap editedbooleanoffRuns again when the recap's highlights or share link change in Calendly.
Include the transcriptbooleanonFetches the transcript and attaches it to the run as a text file, {recap.transcript}.
Recap variableoutput{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}.

OperationFieldsResult (default variable)
Get meetingMeeting{meeting}: name, status, startTime, startLocal, location, hosts, guests, invitees.
Find meetingsInvitee email, Host email, Status (active / canceled / any), Starting from, Until, Max results (advanced, default 20){meetings}: count, items (soonest first).
Get inviteeInvitee (full address){invitee}: name, email, status, answers, cancelUrl, rescheduleUrl, noShow.
List inviteesMeeting; optional invitee email, status{invitees}: count, items (as {invitee}). For group meetings.
Cancel meetingMeeting, Reason{cancellation}: canceled, reason. Calendly emails the invitees.
Mark no-showInvitee (full address){noShow}: uri, noShow = true.
Remove no-showInvitee, or the no-show's address{noShow}: noShow = false.

Calendly scheduling​

OperationFieldsResult (default variable)
Find free slotsEvent 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 linkEvent type{link}: url, a link that books once.
Create custom linkEvent 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 meetingName, 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 meetingEvent 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​

OperationFieldsResult (default variable)
List event typesoptional Member email (default: the whole organization), Active only (default on){eventTypes}: count, items (name, slug, duration, schedulingUrl, kind, ownerName).
Get event typeEvent 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 typeName, 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 typeEvent type and any of the Create fields{eventType}. Only the fields you set change; a location replaces the event type's locations.
Get availabilityEvent type{availability}: timezone, weekly (day, hours), overrides (date, hours), weeklyText, overridesText.
Set availabilityEvent 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 locationsoptional 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​

OperationFieldsResult (default variable)
List forms{forms}: count, items (name, status, questions).
Get formForm (name, id or address){form}: name, status, questions (name, type, required, answerChoices).
List submissionsForm; Max results (advanced, default 50, newest first){submissions}: count, items (answers, answersByQuestion, utm, resultType, resultValue, submitterUri, createdAt).
Get submissionSubmission (id or address, e.g. {booking.routingForm.submissionUri}){submission}.

Calendly organization​

OperationFieldsResult (default variable)
Connected account{account}: name, email, schedulingUrl, organizationName.
List members{members}: count, items (name, email, role, timezone, schedulingUrl).
Find memberMember email{member}: name, email, role (owner, admin, user), timezone, schedulingUrl, userUri. An email outside the organization ends on the error route.
Busy timesMember email, Starting from, Days (up to 7){busy}: count, items (type, startTime, endTime).
Availability schedulesoptional Member email (default: the connected account){schedules}: items (name, default, timezone, weekly, overrides, weeklyText, overridesText).
List groups{groups}: count, items (name, memberCount).
List group membersGroup (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 teamsoptional Member email{teams}: items (name, schedulingUrl).
List invitationsStatus (pending / accepted / declined / any), optional email{invitations}: items (email, status, lastSentAt).
Invite userMember 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.

OperationFieldsResult (default variable)
Find contactsany 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 contactContact (email, id or address){contact}.
Create contactName, Email (the first is the primary; up to 10), optional Phone, Company, Job title, Time zone, Country, State, City, LinkedIn, Custom fields{contact}.
Update contactContact 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 emailEmail 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.

OperationFieldsResult (default variable)
Find recapsany 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 recapRecap (id or address, e.g. {recap.uri}){recap}.
Get transcriptRecap{transcript}: file (a text file of the run, one Speaker: words line per turn), preview, characters.
Update recapRecap; any of Summary, Action items, Discussion (Markdown){recap} as saved. Empty fields stay unchanged.
Delete recap ⚠RecapRemoves the recap and its transcript. Needs confirm.

Calendly compliance​

Needs the Compliance feature and a Calendly Enterprise plan.

OperationFieldsResult (default variable)
Search activity logany 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 SMSoptional 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.