This project is not covered by Drupal’s security advisory policy.
Booking Calendar puts a self-service booking page in the spirit of Calendly on your own Drupal site: a visitor picks the kind of appointment, a day and a free slot, fills in a short form and gets the confirmation, the invitation and a link to move or cancel. No account for the visitor, no scheduling service in between.
It is for consultancies, agencies, practices and small teams that keep answering "when are you free?" by email. You create a calendar in one click, set hours, buffers and questions in a builder that previews the real page as you type, and publish a link. From then on bookings, blocked dates, minimum notice and the busy events of your own calendars take slots off the page for you.
What you get
- A public booking page per calendar at
/agenda/your-link, five steps served outside the site theme, so no header, blocks or banners reach the visitor. - Slots that are computed, never typed: weekly hours, open date ranges, blocked dates, horizon, minimum notice, buffers, daily cap and slot increment, with spring-forward gaps skipped.
- A booking the visitor manages alone: the confirmation carries a link to reschedule or cancel without an account, until the deadline you set, plus Google Calendar, Outlook.com and Office 365 links and an
.icsdownload. - A builder with a live preview: ten sections, from presentation to calendar synchronisation, next to a phone frame that renders the real public page with every change.
- As many calendars as you need, each with its own link, availability, questions, follow-up, measurement and bookings list with CSV export, created, duplicated, switched off and deleted from one index.
- Emails to both sides: confirmation, cancellation and reschedule notices for the visitor, up to three cron reminders (1, 3, 24, 48 or 168 hours before) and a team notice for every new, moved or cancelled booking.
- Calendar synchronisation in both directions: secret iCal addresses whose events, recurring ones included, hide slots here, and an iTIP invitation by email for every booking, withdrawn when it is cancelled or moved.
- Conversion measurement on the confirmation only: GA4, Google Tag Manager, Google Ads, Meta pixel and Conversions API, LinkedIn Insight, counted once per booking, with optional UTM attribution.
How it works
Configuration describes each calendar; bookings are content, one booking_calendar_booking entity per appointment. Slots are recomputed on every request, and every confirmation runs under a per-calendar lock that re-checks availability, so two visitors racing for one slot cannot both get it. Everything administrative starts at Administration » Booking calendar: one card per calendar with its figures, builder and bookings a click away.
Use cases
- A consultancy with one link for discovery calls, where the visitor picks an intro call, a demo or a follow-up, each with its own duration.
- A site with several departments or professionals, one calendar each, so every team keeps its own hours, link and inbox.
- A campaign landing page whose bookings must count as conversions, with attribution, in the same platforms as the rest of the funnel.
Getting started
- Go to Administration » Booking calendar (
/admin/booking-calendars) and press Create: the calendar starts unpublished and its builder opens at/admin/config/services/booking-calendar/{agenda}. - Name it, add an appointment type, set availability and time limits, and write the booking questions while the frame on the right shows the result.
- Assign the public link in the Presentation section and save: the page is live at
/agenda/your-link. The link never changes;manageandconfirmedare reserved. If the card on the index shows the calendar switched off, switch it on there. - Grant the permissions at
/admin/people/permissions/module/booking_calendar:view booking calendar bookings,manage booking calendar bookingsandadminister booking calendar, which is accepted wherever the other two are. - Choose the retention window at
/admin/config/services/booking-calendar/settingsand make sure cron runs: reminders and the cleanup depend on it.
Requirements
- Drupal 11.1 or newer, and the PHP version it requires (8.3); core modules User and System.
- Central Connect AI SDK, required for the admin screens (see below).
composer require drupal/booking_calendar
Privacy and security
- Bookings are content entities; configuration only carries the definition of the calendar, so personal data never reaches an export.
- The management link is a capability URL: 256 random bits, never derived from the booking, and worthless under another calendar's link.
- Pages with live availability or personal data are never page-cached; the personal ones are marked noindex.
- The booking form uses Form API, a honeypot and the site's flood control; consent is a mandatory checkbox, and an optional marketing checkbox stores the sentence accepted.
- Administrative writes are CSRF-protected; the three permissions are restricted to trusted roles, and only the manage and administer tiers see the management link.
- The Meta Conversions API token lives in state, never in configuration, and emails and phones sent to Meta are hashed with SHA-256 first.
- A retention window (30, 90, 180 or 365 days after the appointment, off by default) deletes bookings from cron.
- Outbound calls: the iCal addresses you paste are fetched over https with a five-minute cache; the Google, Meta and LinkedIn scripts load on the confirmation only when you set their identifiers, Meta's Conversions API only when you store a token, and the broker only after you connect an account. The public page carries no cookie banner, so decide on consent before you paste an identifier.
Part of the Central Connect AI suite
The suite is a set of free modules sharing one admin design system that can, optionally, talk to a central platform. Booking Calendar is complete on its own apart from that shared admin shell: it needs Central Connect AI SDK for the header, icons, notifications and the optional calendar broker, and nothing else. Through the SDK, the person you name as responsible for a calendar gets an in-site notification for every booking taken, moved or called off. No other suite module is required or called.
Nothing here is locked: everything above works with no external service and no credentials. One convenience is optional: connecting a Google or Microsoft account through the calendar broker of a Central Connect AI central, configured in the SDK and operated by the provider of that central (the sponsor, or any provider exposing the same API), so the account answers free/busy directly and receives each booking as a calendar event, with no invitation email. You connect explicitly from the connect button of a provider row; until then nothing is sent, without a central the row shows no button, and any failure falls back to iCal and the emailed invitations.
Similar projects and how this one differs
- Bookable Calendar lets you create dated openings that visitors reserve; Booking Calendar computes slots from hours, buffers and notice and serves a themeless page with visitor self-management.
- Webform Booking adds a slot element to any webform; Booking Calendar is a whole flow with builder, management links, reminders, calendar synchronisation and measurement.
- Booking Scheduler takes date bookings for bookable resources such as rooms and equipment, inside the site theme, without external calendar synchronisation or visitor-managed bookings.
- BEE and BAT are availability frameworks on which you build the experience; Booking Calendar ships the finished appointment page and has no payment step.
- Calendly embeds the hosted Calendly widget and the bookings live there; Booking Calendar keeps page, bookings and data on your site.
Development
Parts of this module were written with the assistance of AI-based coding tools, as required by the policy on the use of AI when contributing to Drupal. All the code has been read, corrected, tested and is maintained by the human maintainer listed below, who takes full responsibility for it.
Maintainers and sponsor
Maintained by pedroromán. Development is sponsored by Tangram Consulting as part of the Central Connect AI suite. Issues, ideas and contributions are welcome in the issue queue.
Project information
- Project categories: Administration tools, Content display
- Created by pedroromán on , updated
This project is not covered by the security advisory policy.
Use at your own risk! It may have publicly disclosed vulnerabilities.