Bookable Calendar
This module provides a simple way to create a bookable calendar for your website. You can set up specific times and dates when users can book appointments, reserve resources like conference rooms, or schedule lessons.
Bookable Calendar provides capacity-aware scheduling and reservations for Drupal. Administrators
define calendars and recurring opening rules, and permitted authenticated or anonymous users can reserve the
generated time slots.
It works well for appointments, lessons, office hours, consultations, conference rooms, group sessions,
equipment, and other resources with limited availability.
Bookable Calendar 3.1
Bookable Calendar 3.1 builds on the Drupal 11+ reservation system introduced in 3.0 and adds optional Drupal
Commerce checkout and reverse availability synchronization with Google Calendar and Microsoft Outlook Calendar.
Highlights
- Create multiple calendars with independent capacity, booking windows, permissions, descriptions, and
notification settings. - Define one-time or recurring opening schedules using Smart Date and Smart Date Recur.
- Automatically generate individual reservable opening instances.
- Support authenticated and anonymous reservations through Drupal permissions.
- Support individual and group reservations with configurable party sizes.
- Prevent concurrent requests from overbooking the same opening.
- Manage reservations, attendance, check-in status, and availability through Drupal administration and Views. li>
- Send queued confirmation and cancellation notifications with HTML templates, tokens, previews, language-aware
rendering, and per-calendar overrides. - Expose calendars, opening definitions, opening instances, and reservations through Drupal JSON:API.
- Provide custom endpoints for booking, availability, check-in, and check-out integrations.
- Ship schema-backed Single Directory Components for availability, booking actions, and opening groups.
- Use Drupal access control, validation, CSRF protection, locking, and entity APIs throughout the reservation
process.
Google Calendar and Microsoft Outlook integration
Optional included submodules connect Bookable Calendar to Google Calendar or Microsoft Outlook Calendar through
OAuth. Each Bookable Calendar can use its own external account and destination calendar.
Reservation event synchronization
Outbound reservation synchronization creates a separate private external event for each confirmed reservation and
invites only that customer. Updating or cancelling the reservation updates or removes its corresponding event.
Creating separate events protects customer privacy when several people reserve the same opening.
Availability synchronization (new in 3.1)
Inbound availability synchronization can automatically prevent visitors from booking opening instances that
conflict with busy events already on a connected Google or Microsoft calendar.
- Enable availability synchronization separately for each connected calendar.
- Keep outbound reservation event synchronization and inbound availability synchronization under separate,
clearly labeled controls. - Use Drupal cron to periodically reconcile upcoming openings with external busy periods.
- Temporarily mark conflicting openings unavailable across rendered calendars, Views, API responses, and booking
validation. - Restore openings automatically when external meetings are moved or removed.
- Ignore events originally created by Bookable Calendar so reservation synchronization does not block its own
opening. - Preserve existing reservations when a new external conflict appears.
- Process provider requests through queues with retry handling for temporary failures.
Availability synchronization is opt-in and reversible. It does not delete opening instances or existing
reservations.
Paid reservations with Drupal Commerce (new in 3.1)
The optional Bookable Calendar Commerce submodule adds capacity-safe paid reservations through Drupal Commerce
3.x checkout.
- Assign a published Commerce product variation to an individual Bookable Calendar.
- Charge once per reservation or multiply the quantity by the reservation's party size.
- Temporarily hold capacity while the customer completes checkout.
- Configure checkout holds from 5 to 120 minutes.
- Confirm the reservation only after Commerce reports that the order is fully paid.
- Release capacity when an order item is removed, an order is cancelled, or an unpaid hold expires.
- Use a separate Commerce order item for each reservation.
- Prevent one-click booking or direct API requests from bypassing payment on priced calendars.
Expired payment holds are cleared by Drupal cron. Payment gateways and site-specific Commerce workflows remain
responsible for refund processing.
How it works
- Create a Bookable Calendar.
- Configure its capacity, booking window, permissions, and notifications.
- Add an opening definition with one or more dates or a recurrence rule.
- Optionally configure Google Calendar, Microsoft Outlook Calendar, or Drupal Commerce.
- Give the appropriate roles permission to view calendars and create reservations.
- Visitors can view future availability and reserve an opening.
Requirements for 3.x
- Drupal 11 or 12
- PHP 8.3 or newer
- PHP Sodium extension
- Smart Date 4.3 or newer
- Smart Date Recur
Installing 3.1
Install the current 3.1 prerelease with Composer:
composer require 'drupal/bookable_calendar:^3.1@alpha' drush en bookable_calendar
After updating an existing site, run:
drush updb drush cr
Drupal cron should run regularly when using notifications, external calendar synchronization, or Commerce payment
holds.
Optional integrations
- Drupal Commerce provides paid reservations and
checkout. - ECA can provide time-based reminder workflows. It is not
required for confirmation or cancellation notifications. - BPMN.iO is only required when administrators need to edit
ECA workflows visually. - Token provides additional notification tokens and an
administrative token browser. - Views Bulk Operations enables the included
bulk-booking integration. - Calendar View can provide Views-based calendar
displays. - FullCalendar can provide standard calendar
listings.
Upgrading from 2.x
Version 3.x contains a major data-model update. It consolidates legacy per-attendee Booking rows into Booking
Contact reservations with a party size and removes the legacy booking entity type.
Before upgrading:
- Back up the complete site and database.
- Update to the latest 2.2 release.
- Apply all available 2.2 database updates.
- Read the upgrade guide before replacing the module code.
Sites with custom fields on the legacy Booking entity require a site-specific migration.
Documentation and support
Slack channel
Join the Drupal Slack community and visit the #bookable-calendar channel for discussion and
support.
Depends on
Dependencies of the latest stable release
- Smart Date
- Smart Date smart_date_recur
- text Drupal core
- views Drupal core
Required by
Tracked projects that depend on this one
No tracked projects depend on this one yet.
Activity
Release Timeline
Releases
| Version | Type | Core | Notes | Release date | |
|---|---|---|---|---|---|
| 3.1.0-rc1 | Pre-release | 11 | First release candidate for 3.1, adding per-reservation Google Meet links alongside Commerce and reverse availability synchronization. | Aug 26, 2026 | |
| 3.1.0-alpha2 | Pre-release | 11 | Adds opt-in Google and Microsoft calendar conflict syncing, automatically blocking unavailable booking times while preserving existing reservations. | Aug 20, 2026 | |
| 3.1.0-alpha1 | Pre-release | 11 | Adds optional Drupal Commerce checkout with capacity-safe payment holds for paid reservations. | Aug 18, 2026 | |
| 3.1.x-dev | Dev | 11 | Adds optional Drupal Commerce checkout with capacity-safe payment holds for paid reservations. | Aug 18, 2026 | |
| 3.0.0-rc2 | Pre-release | 11 | Improves booking-page labeling, FullCalendar documentation, bulk-booking reliability, and automated test coverage ahead of the 3.0 stable release. | Aug 18, 2026 | |
| 3.0.0-rc1 | Pre-release | 11 | First release candidate for the Drupal 11+ rewrite with transactional reservations, JSON:API, SDC, and optional Google/Outlook sync. | Aug 18, 2026 | |
| 3.0.x-dev | Dev | 11 | Drupal 11+ rewrite with transactional reservations, JSON:API, SDC, and optional Google/Outlook sync. | Aug 18, 2026 | |
| 2.2.13 | Stable | 9–11 | Adding Access Checks for Booking Contact | May 27, 2025 |