Connect Cal.com directly to your Twenty CRM.
A signed Cal.com webhook is received by a serverless function inside Twenty,
which upserts a Booking record and links the attendee Person.
No Zapier, no n8n, no glue server to operate.
Most Cal.com → CRM setups route bookings through a third-party automation tool (Zapier, Make, n8n). That means another moving part to host, secure, and pay for. Cal bridge runs the integration as a native Twenty application: the webhook handler is a serverless function the Twenty server already operates, so the only infrastructure is Twenty itself.
Bookingobject —startsAt,endsAt,meetingUrl,status,calBookingUid, plusreminder24hSent/reminderDaySentflags for your own reminder automations.- Person linking — every booking links to a
Person(matched by email, created if new); each person shows theirBookings. - Signed & verified — every delivery is checked with HMAC‑SHA256 against your
secret; forgeries are rejected with
401. - Idempotent — upserts by
calBookingUidbehind a unique index, so retries, reschedules, and cancellations update the same record instead of duplicating. - Hardened — body‑size cap, field truncation, email validation, monotonic status, and fail‑closed error handling. See docs/security.md.
- Bookings view in the sidebar out of the box.
New to Cal.com? Create an account with our referral link: https://refer.cal.com/alexismaison-hydg
- In Twenty, open Settings → Applications and install Cal bridge.
- Open the app → Variables and set
CAL_WEBHOOK_SECRETto a strong random string (you'll reuse it in step 4). - Copy the webhook route shown on the app's page — it looks like
https://<your-twenty>/functions/<app>/cal/webhook. - In Cal.com → Settings → Developer → Webhooks → New:
- Subscriber URL = the route from step 3
- Secret = the same value as
CAL_WEBHOOK_SECRET - Triggers = Booking Created, Rescheduled, Cancelled, Rejected, Meeting Ended
- Send a test ping — a
Bookingappears under the Bookings view.
Full walkthrough: docs/configuration.md.
Cal.com triggerEvent |
Booking.status |
|---|---|
BOOKING_CREATED / REQUESTED / RESCHEDULED / PAID |
SCHEDULED |
BOOKING_CANCELLED / REJECTED |
CANCELLED |
MEETING_ENDED |
COMPLETED |
Updates never overwrite reminder24hSent / reminderDaySent, and a COMPLETED
booking is never downgraded by a later event.
| Doc | Contents |
|---|---|
| Architecture | How the pieces fit, the data flow, the upsert/idempotency design |
| Configuration | Install, the webhook secret, Cal.com setup, field mapping |
| Webhook reference | Payloads handled, signature scheme, HTTP responses, reschedule logic |
| Security | Threat model, verification, input hardening, reporting |
| Development | Local setup, tests, CI, publishing & versioning |
| Troubleshooting | Common issues and fixes |
Requires Node 24+ and Yarn 4.
yarn install
yarn test:unit # pure-logic unit tests (no server needed)
yarn lint
yarn twenty dev:typecheck
yarn twenty dev # build + sync to a connected Twenty instanceSee docs/development.md for the full loop, integration tests, and publishing.
Issues and pull requests are welcome — see CONTRIBUTING.md.
Built and maintained by Roekish.
New to Cal.com? Sign up with our referral link.