Skip to main content
Version: 3.0.6

Booking pages (webmail)

Booking pages let a mailbox user publish a "book a meeting with me" page. A visitor opens the public link, picks an appointment type and a free time, leaves their name and email, and the meeting lands in the user's calendar — with a confirmation email and calendar invitation to both sides and links to reschedule or cancel. Free times are computed from the user's weekly availability minus what is already in their calendar, so a meeting added from a phone blocks the page at once.

Everything runs on your own server: no third-party scheduling service is involved.

Setting up a page​

Open the Calendar page in the webmail and click Booking pages in the toolbar (or Manage booking pages under the day's agenda). Click New booking page and fill in:

  • Title and Description — what the visitor sees at the top of the page.
  • Address — the last part of the public URL: https://<webmail>/book/<address>. Letters, digits and dashes; it must be unique on the server.
  • Time zone — the zone your availability is written in. Visitors see times in their own zone.
  • Slot interval — how far apart bookable start times are (30 minutes by default).
  • Minimum notice — how far ahead a visitor must book (2 hours by default).
  • Bookable up to — how many days into the future the page offers (60 by default).
  • Calendar for bookings — which of your calendars the meetings go into (your default one unless you pick another).
  • Weekly availability — one or more time windows per weekday. A day with no window is not bookable.

Then add at least one appointment type: a name, the duration, optional buffers before and after (kept free around the meeting), an optional price / label shown next to the name, a location (a room, an address or a call link) and a description. A type can be disabled without deleting it. Untick Page is published to take a page offline while keeping it.

Use Copy link to share the page's address.

What the visitor sees​

The page at /book/<address> needs no login. The visitor chooses an appointment type, moves through the week strip to a day with free times, picks a time (shown in the visitor's own time zone, with the page's zone noted), and enters name, email and an optional note. The slot is checked again at that moment; if someone else took it in the meantime the visitor is asked to pick another.

On success both parties receive an email sent from the page owner's mailbox:

  • the visitor gets a confirmation with the meeting as a calendar invitation (.ics, METHOD:REQUEST) and a Reschedule or cancel link;
  • the owner gets a "New booking" email with the visitor's details and notes.

The meeting is created in the owner's calendar with the visitor as attendee, so it also syncs to phones over CalDAV.

Rescheduling and cancelling​

The visitor's link (/book/manage/<token>) shows the booking and offers Pick a new time (the same free-slot picker, with the booking's own slot released) and Cancel this booking. Either action updates the calendar event and emails both sides — a cancellation carries a METHOD:CANCEL invitation so mail clients remove the event.

The owner sees upcoming bookings under the day's agenda on the Calendar page and on the Booking pages screen, and can cancel any of them; the visitor is emailed.

Limits and protection​

The public endpoints are rate-limited per IP address (reads and bookings separately), a booking is only accepted for a slot the page currently offers, and each page is limited to a 120-day window per request. Booking pages is a webmail plugin, on by default; a user can turn it off under Settings → Plugins.

Calendar invitations in mail​

Related: when an email contains a calendar invitation (a text/calendar part or an .ics attachment), the message view shows an invitation card with the event details, a timeline strip of your day — your existing events with conflicts marked in red — and Accept / Maybe / Decline buttons. Answering emails an iTIP reply to the organizer from the receiving account and adds the event to your calendar (a decline removes it). You can pick which calendar to add it to when you have more than one.