Booking Plugin — SynaptikCMS

Standalone appointment-booking module: public weekly-availability calendar, admin approval workflow, email notifications with .ics calendar attachments, and optional phone-callback reminders.

Built on SynaptikCMS's plugin system — installs under /plugins/booking/, integrates into the real admin panel (sidebar entry, full page inside the standard layout), and is managed entirely from Admin → Tools → Extensions. No manual core file edits required.


Installing

1. Upload the plugin

From Admin → Tools → Extensions, use the Install a plugin upload form and select the plugin's .zip file. The ZIP must contain a plugin.json manifest at its root with "synaptik_plugin": true. The plugin is extracted to /plugins/booking/ but not activated automatically — this is intentional, mirroring how theme uploads work. If a folder named plugins/booking/ already exists, the upload is refused. Delete the existing plugin first (see Deleting) if you're reinstalling or replacing it.

2. Activate it

Still on the Extensions page, click Activate on the Booking card. This makes it start handling requests immediately and adds a Booking entry to the main admin sidebar.

3. Configure it.

Open the Booking sidebar entry → Settings tab:

4. Set your availability.

Booking → Availability tab:

5. Add the booking form to a page.

In the content editor, insert the shortcode [booking_form] anywhere in an article, page, or project. The calendar widget and form render automatically at that spot on the public-facing page.


Using it day to day

Client side — visitor picks an appointment type, browses the calendar week by week, clicks an open slot, fills in name/email/phone, optionally checks "I would also like to be called back" with a preferred date/time. On submit they receive a confirmation email (status: pending) with an .ics file for their calendar.

Admin side — Booking → Requests tab:

  • Confirm a pending request → the client gets a confirmation email with .ics; you (admin) already received a notification email when the request came in.
  • Refuse a pending request → the slot is released, the client gets a polite refusal email (no .ics, nothing added to their calendar).
  • Cancel a previously confirmed appointment → the client is notified.
  • Delete a cancelled/refused appointment permanently removes its record.

Booking → Calendar tab gives a month-view overview with pending/confirmed counts per day, linking into the filtered request list.

Phone callback reminders — if a client requests one, you get a dedicated admin notification email with its own .ics (15-minute event, built-in alarm) at the time the request comes in — independent of whether you confirm or refuse the actual appointment.


Deleting the plugin

From Extensions, a plugin can only be deleted while inactive — deactivate it first. Deleting removes /plugins/booking/ entirely, including its data (appointments, availability, settings) and secrets. This is permanent; there is no undo.


Maintenance notes

  • Appointment type keys must stay stable. The key (internal slug) of an appointment type is what's stored on each appointment record. Renaming the label is safe; changing the key breaks the link to existing appointments using that type — the label falls back to showing the raw key.
  • Rate limiting and CSRF are independent from the core contact form. 5 submissions per IP per hour, 2-hour CSRF token TTL, stored separately in plugins/booking/private/ — never shared with the core's own contact-form state.
  • Adding a language: copy lang/en.jsonlang/{locale}.json and lang/admin/en.jsonlang/admin/{locale}.json, translate the values. The plugin automatically follows the core's active_language (front) and admin_language (admin) settings — no extra configuration needed.
  • Distribution. This plugin is excluded from the core CMS's public release export (export-release.sh excludes /plugins/ and plugins.json) — it ships and updates independently of core releases.