FlowKit

n8n + Cal.com: automating appointment reminders and no-show tracking with AI

Published 6 August 2026 · 6 min read

A missed appointment costs more than an empty slot: it's wasted prep time, a schedule to rebuild, and often a client or prospect who now needs a cold follow-up. Cal.com, the open-source alternative to Calendly, exposes programmable scheduling through an API and webhooks — and unlike many competitors, it can natively signal a no-show, even on its free tier. Connected to n8n, that makes it possible to build a complete pipeline: confirmation, a well-timed AI-personalized reminder, absence detection, and logging to measure what the automation actually changes. This guide covers the integration end to end.

Cal.com Trigger and the Cal.com node: two distinct building blocks

n8n ships two native nodes for Cal.com, with different roles. The Cal.com Trigger listens for webhooks fired by your Cal.com account and starts a workflow on each event — a new booking, a cancellation, a confirmed no-show. The Cal.com (action) node does the opposite: it acts on Cal.com from a workflow, to create, cancel, or reschedule a booking, for instance, without going through the UI. Most reminder workflows only need the first one; the second becomes useful for cases like an automatic rebooking offer sent to a client after a no-show.

The webhook is configured directly in Cal.com (Settings > Developer > Webhooks), with the production URL provided by the n8n Trigger node as the Subscriber URL. A single webhook can listen to several event types at once, filtered afterward inside the workflow.

Which events to listen for (and why native no-show detection matters)

Cal.com exposes a much finer-grained webhook taxonomy than most scheduling tools. For a reminder-plus-no-show pipeline, the following events matter most:

  • BOOKING_CREATED — a new booking is confirmed: the starting point for the reminder and the logging.
  • BOOKING_CANCELLED — the appointment is cancelled by the invitee: frees the slot and can trigger a re-engagement follow-up.
  • BOOKING_RESCHEDULED — the appointment is moved: handle it as a cancellation followed by a new creation, so you don't send two conflicting reminders.
  • BOOKING_NO_SHOW_UPDATED — the absence status changes, marked either automatically (Cal Video) or manually. This is the event most competing tools lack, where absence has to be inferred after the fact by a Schedule Trigger that periodically re-scans past appointments — see our n8n + Calendly guide on this exact limitation.
  • MEETING_ENDED and RECORDING_TRANSCRIPTION_GENERATED — for calls held on Cal Video, useful if you chain an automatic meeting summary afterward, on the same principle as our meeting transcription guide with Whisper.

A Switch node right after the Trigger, routed on the payload's triggerEvent field, cleanly separates these branches inside a single workflow instead of multiplying copies of it.

Verifying the webhook signature

Cal.com signs every webhook request with an HMAC SHA-256, carried in the X-Cal-Signature-256 header, computed from the secret set when the webhook was created. Without this check, anyone who discovers the webhook URL could inject fake bookings or fake no-shows into your pipeline. n8n's Crypto node computes the expected signature from the raw request body and the secret, to be compared afterward in an IF node against the received value — the exact mechanics, including the classic trap of an accidentally re-serialized body, are detailed in our Crypto node and HMAC signatures guide. The general principles for securing a publicly exposed webhook are covered in our guide to securing n8n webhooks.

Writing a reminder that actually reduces no-shows

A generic reminder ("Reminder: you have an appointment tomorrow at 2pm") works, but not as well as a message that personalizes the context. A study by Martin, Bassi, and Dunbar-Rees, published in 2012 in the Journal of the Royal Society of Medicine (see it on Google Scholar), showed that adding an explicit social norm to the reminder — for instance mentioning that the vast majority of people do show up for their appointments, or having the person repeat the appointment time back at the moment of booking — meaningfully reduces the absence rate compared to a neutral reminder. That's exactly the kind of personalization a Basic LLM Chain connected to Claude or GPT can automate: the prompt receives the guest's name, the appointment's purpose, the exact time, and an aggregate attendance rate, and generates a short message that weaves in that social norm instead of an identical static text for everyone.

The channel matters too: a reminder sent only by email easily gets lost in a crowded inbox. Routing the same message to SMS through our n8n + Twilio guide or to WhatsApp through the WhatsApp Business connection guide increases the odds it's seen in time.

Timing the send with the Wait node

BOOKING_CREATED fires at booking time, often days ahead of the appointment — too early for an effective reminder. Good practice is a Wait node (n8n-nodes-base.wait) configured to resume execution at a specific date, computed by subtracting, say, 3 hours from the payload's startTime timestamp with a Luxon expression. Our Wait node guide covers the classic pitfalls of this delayed-execution mode — piling-up executions, a workflow staying active for hours — worth knowing before putting it into production on a meaningful volume of bookings.

Handling cancellations and confirmed no-shows

A cancellation (BOOKING_CANCELLED) deserves more than silent archiving: depending on the business context, an automatic re-engagement message — or a Slack alert so a human can take over, on the principle of human approval before a sensitive action — can turn a lost appointment into a fresh outreach attempt instead of a silent drop-off. A confirmed BOOKING_NO_SHOW_UPDATED typically triggers a different sequence: a notification to whoever was supposed to hold the appointment, and for repeat cases, a flag to adjust policy (a deposit, a mandatory confirmation 24 hours ahead).

Logging to measure what actually changes

Without logging, there's no way to know whether the no-show rate genuinely drops after rolling out AI reminders — just a hunch. A Supabase table with the booking ID, the timestamp, the status (attended, cancelled, no-show), and the reminder channel used lets you compute that rate week over week. Our n8n ↔ Supabase connection guide covers setting up this kind of table, on the same principle as the Supabase audit logging workflow in the Compliance & Audit Pack — any automated action deserves a trace, if only to prove it's actually working.

Cal.com vs Calendly in n8n: which one to choose

Both tools connect to n8n along the same general pattern (a listening Trigger, plus an action node), but two differences carry real weight for this kind of workflow. First, Cal.com includes webhooks in its free individual tier, while Calendly reserves them for a paid plan (Standard or above) — a detail that changes the calculus for testing the automation before committing budget. Second, Cal.com's native no-show detection (via Cal Video or a manual mark that fires a webhook) avoids the workaround needed on Calendly's side, where no event is emitted for an absence at all: you need a Schedule Trigger that periodically re-scans past appointments to infer it. For a team already committed to one of the two tools, this isn't a reason to migrate; for a choice still open, these two points matter.

Best practices and limitations

  • Filter by event type right at the Trigger, with a Switch on triggerEvent, rather than handling everything in a single linear branch — readability drops fast past three or four listened events.
  • Don't over-message: a single reminder 24 hours or 3 hours ahead is enough in most cases; stacking channels and follow-ups edges toward spam and can backfire.
  • Respect consent for SMS or WhatsApp reminders, which fall under different rules than transactional email — check your legal basis, in the same spirit as our guide to handling GDPR requests.
  • Test with real events before going to production: Cal.com lets you resend a test event from its webhooks panel, worth verifying end to end like any n8n webhook.

Going further

This pipeline illustrates a principle already present across several FlowKit guides: wiring an LLM to a well-chosen business event turns a repetitive task — here, following up on and tracking appointments — into a process that runs on its own, with better conversion than a generic reminder. The Compliance & Audit Pack (€149) already ships the automatic follow-up pattern with Supabase logging, directly reusable for this use case. The Inbox AI Pack (€79) naturally complements it on the team-notification side (a Slack or Telegram digest of the day's appointments), and the Complete FlowKit Bundle (€269) covers the rest.

FAQ

Frequently asked questions

Does the Cal.com Trigger need a publicly exposed server?

Yes, like any webhook: Cal.com must be able to reach your n8n instance over HTTPS from the internet. On n8n Cloud, the URL is provided automatically. Self-hosted, you need a domain name with a valid certificate (see our guide on going HTTPS with Traefik or Caddy); to test locally before wiring up the real endpoint, a tunnel like ngrok is enough, exactly as for testing any n8n webhook locally.

Does Cal.com really detect no-shows automatically, or do they need to be marked by hand?

It depends on the appointment type. For video calls held on Cal Video, Cal.com can automatically detect the host's or guest's absence and fire the BOOKING_NO_SHOW_UPDATED event with no human involvement. For an in-person appointment or a call held on another video tool, there's no automatic detection: the no-show has to be marked manually (dashboard or API), which then fires the same webhook event.

Do you need a paid Cal.com subscription to use webhooks with n8n?

No — unlike Calendly, where organization webhooks require a paid plan, Cal.com includes webhooks in its free individual tier. The Cal.com Trigger works from the free plan onward, which makes it a solid entry point for testing this kind of automation before committing to a Team plan.

Bundle FlowKit Complet

€269