Cal.com
Booking approvals
Bookings on selected event types wait for a manager's approval before they are confirmed.
AuthorYusuf Demir
PublishedFeb 2026
LicenseAGPL-3.0
Installs233
Why it exists
A consultancy wanted prospects to book discovery calls freely, but paid workshops had to be signed off by an account manager first. Cal.com confirms instantly by design, and that design is right for upstream.
This mod adds a pending state to chosen event types: the invitee books, the approver gets one actionable message, and the calendar hold expires cleanly if nobody decides in time.
What it does
- Per-event-type approval requirement
- Approve or decline from email or Slack in one click
- Holds expire automatically after a configurable window
- Invitee sees honest states: requested, confirmed, declined
The spec
These acceptance criteria were written with the person who requested the mod, then locked in as its tests. The mod has to pass them on every new release train before it rides along.
- An unapproved booking never appears as confirmed in either calendar
- Approval after the hold expires reopens the slot instead of double-booking
- Declines notify the invitee with a rebooking link
mods/booking-approvals/tests/expiry.spec.ts
test("late approval cannot double-book the slot", async () => {
const booking = await book(workshopType, invitee)
await clock.advance(hold.window + minutes(1))
const result = await approve(booking, manager)
expect(result.status).toBe("expired")
expect(slot.isAvailable()).toBe(true)
})