calcom/cal.com
Workflows and reminders
Purpose
Workflows let organizers attach automation to event types: send a reminder 24 hours before, send an SMS thanks-you 1 hour after, mark no-show automatically if the host doesn't join. In upstream Cal.com these are richly configurable via an EE workflow runtime; in Cal.diy that runtime is being deprecated as part of the EE removal sprint. The remaining facilities are simpler reminder + no-show flows that hook directly into the tasker.
The recent commit d2a54e2 — refactor: remove dead workflow runtime config (2026-04-28) is part of this cleanup.
What still exists in Cal.diy
- Reminder cadence — booking reminders (email, SMS, WhatsApp) scheduled via
packages/features/taskerand drained bycron-bookingReminder.yml,cron-scheduleEmailReminders.yml,cron-scheduleSMSReminders.yml,cron-scheduleWhatsappReminders.yml. - No-show flow —
packages/features/handleMarkNoShow.ts(top-level),packages/features/noShow/, plusscheduleNoShowTriggers.tsinside the booking pipeline. This is wired from both attendee + host perspectives. - Webhook-based automation — for any "if booking happens, do X" use case, the supported pattern is an outbound webhook to Zapier / n8n / Make (apps under
packages/app-store/). - Workflow constants and schemas — preserved in
packages/features/ee/workflows/lib/constants.ts(AGENTS.mdreferences this path) for backward compatibility with persisted workflow configurations on existing event types.
What's being removed
The EE workflow runtime — the engine that interpreted workflow definitions and dispatched their actions — has been progressively removed. Recent cleanup PRs include:
d2a54e2—refactor: remove dead workflow runtime config- Multiple
cleanup(test): remove ... integration coveragecommits that drop EE-specific test fixtures
The removed pieces were tightly coupled to Cal.com's hosted product (license-key checks, EE billing). Self-hosted Cal.diy users replace them with webhook-based automation through the App Store.
Reminder flow (what's left)
sequenceDiagram
participant Booking as RegularBookingService
participant Tasker as features/tasker
participant DB as Postgres (Task table)
participant Cron as cron-bookingReminder.yml
participant Endpoint as apps/web/pages/api/cron/...
participant Email as packages/emails
Booking->>Tasker: enqueue("reminder", payload, runAt = booking.startTime - 24h)
Tasker->>DB: INSERT Task
Cron->>Endpoint: HTTP GET /api/cron/...
Endpoint->>DB: SELECT pending tasks where runAt <= now()
Endpoint->>Email: render + send
Endpoint->>DB: UPDATE Task status = succeededMigration guidance
If you are migrating from a Cal.com (EE) deployment to Cal.diy:
- Existing workflow definitions on event types remain in the
Workflowtable but the runtime no longer interprets them. - The recommended replacement is an outbound webhook subscription that posts to your automation tool of choice (Zapier, n8n, Make, Pipedream).
- For per-attendee reminders, use the standard reminder fields on the event type (these still flow through tasker).
- For no-show handling, the no-show flow is preserved; the EE-only "post-no-show" workflow actions are not.
Entry points for modification
- Reminder content: edit templates in
packages/emails/. - Reminder timing: edit the producer in
packages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.tsand similar. - No-show logic: edit
packages/features/handleMarkNoShow.tsandpackages/features/noShow/.
Related pages
Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.