OptimoCMS Docs
Back to overview

Booking System

Online appointments and bookings: services, availability, staff, branches, waitlist, CRM, staff dashboard, reminders, iCal, magic links and analytics.

What is the booking system?

The booking system is a widget that you activate per website. Visitors can book appointments online: they choose a service, a date, an available time slot and fill in their details. The system automatically prevents double bookings and calculates available slots based on your opening hours. All booking logic runs server-side (Cloud Functions). The client can never directly create bookings in the database — this prevents fraud and race conditions.

Activating the booking system

How to enable the booking system: 1. Go to Settings → Widgets 2. Activate "Booking" 3. After activation, the booking admin pages appear in the sidebar 4. The BookingWidget block becomes available in the Page Builder
Tips
  • After activation you can immediately create services and set up availability.

Data model (technical)

The booking system stores four types of data per site: • Services (name, duration, price, active) • Staff members (name, linked services, active) • Weekly schedule (day, start, end, optional staff member) • Bookings (service, date, time slot, customer details, status) Services and availability are publicly visible on your website. Bookings are only created server-side.
Tips
  • Bookings are automatically optimised for fast day-view lookups.

Managing services

A service is what you offer (e.g. "Haircut", "30 min Consultation", "60 min Massage"). Manage via Booking → Services: • Name — The name visitors see • Duration — In minutes (determines slot size) • Price — Optional, shown to visitors • Deposit — Optional amount via Stripe • Active — On/off toggle Only active services are visible in the BookingWidget.
Tips
  • The duration determines how large the time slots are. A 30-minute service creates 30-minute slots.

Setting up availability

Via Booking → Availability you set up a weekly schedule: • Per day of the week: start time and end time • Optionally per staff member (if you have staff set up) • Days without times = closed The system automatically calculates available slots based on this schedule minus existing bookings.
Note
  • Changes to availability take effect immediately. Existing bookings are not automatically adjusted.

How slots are calculated

The Availability Engine calculates available time slots server-side: 1. Read availability for the chosen day + optional staff member 2. Generate slots based on service duration (e.g. every 30 min) 3. Fetch existing bookings for that day (status ≠ cancelled) 4. Filter out occupied slots 5. Return available slots Cancelled bookings do not block slots — those times become available again.
Tips
  • Slots are calculated in real time. If someone just booked, the next visitor won't see that slot anymore.

Double-booking prevention

The system automatically prevents double bookings: 1. When creating a booking, availability is re-checked 2. If the slot is already taken → error "Time slot no longer available" 3. Only if the slot is still free is the booking confirmed This guarantees that even with concurrent requests, two bookings never end up on the same slot.
Tips
  • Rate limiting also protects against spam: max 30 slot requests/min and 5 bookings/min per IP.

Staff members (optional)

You can add staff members via Booking → Staff: • Name — Shown if you enable "Show staff" in the widget • Linked services — Which services this staff member performs • Active — On/off toggle Visitors can then choose which staff member to book with. Availability is calculated per staff member.
Tips
  • Staff members are optional. Without staff, visitors simply book on the general availability.

BookingWidget on your website

The BookingWidget is a block you place on a page via the Page Builder: 1. Open a page in the Page Builder 2. Search for "BookingWidget" in the block list (category: Widgets) 3. Drag it onto your page 4. Configure: heading, accent color, layout (compact/full), show staff On the live site, visitors go through the steps: choose service → choose date (14 days ahead) → choose time slot → fill in details → confirmation. In the editor you see a mock preview without real API calls. On the published site the widget runs with real data.
Tips
  • The widget is responsive and works on mobile (375px).
  • When no slots are available, the visitor sees a clear message.

Managing bookings

Via Booking → Bookings you see all bookings: • Filter by date or status • Statuses: confirmed, pending, pending payment, cancelled, completed • Actions: confirm or cancel per booking When cancelled, the time slot is freed up for other visitors.

Stripe deposits (optional)

You can require a deposit per service via Stripe: 1. Go to Booking → Services 2. Edit a service 3. Enable "Deposit required (optional)" 4. Set the deposit amount When booking, the visitor is redirected to Stripe Checkout. The booking gets status "pending payment". After payment: automatically confirmed. No payment within 30 minutes: automatically cancelled (via a scheduled function that runs every 10 minutes). Where does the money go? • A Stripe account can be linked per site via Settings → Payments → Connect Stripe • With Stripe Connect: money goes directly to the client's account, minus a service fee • Without Stripe Connect: money goes to the platform account
Note
  • Stripe must be configured on the website (Settings → Payments) before deposits work.
  • The agency links the client's Stripe account per site via Settings → Payments.

Booking Settings

Via Booking → Settings you configure advanced options: • Booking horizon — How far ahead clients can book (7, 14, 30, 60 or 90 days). Default: 14 days. • Buffer between appointments — Extra time between consecutive bookings (0, 5, 10, 15 or 30 minutes) • Slot interval — Interval between available start times (15, 30 or 60 minutes) With more than 14 days the BookingWidget automatically shows a month calendar instead of date buttons.
Tips
  • The buffer is useful when you need clean-up time between appointments.
  • Closed and fully booked days are shown greyed out in the calendar.

Branches

With branches you can manage multiple locations within one website: • Name, address, city, phone per branch • Each branch has its own staff, availability and bookings • The BookingWidget shows a branch step when there are 2+ active branches • With 1 branch it is automatically selected Via Booking → Branches you manage your locations.
Tips
  • With 0 branches the system works as before — no branch step in the widget.
  • Staff and availability are configured per branch.

No-show Management (Booking)

The system automatically detects no-shows for bookings: • Automatic no-show — If a client doesn't show within the set time after the booking time • Staff overrule — Staff can change a no-show back to 'confirmed' • Reopen — A cancelled booking can be reopened Configurable per branch: automatic no-show on/off and timer in minutes.
Tips
  • When a no-show occurs, the freed slot is offered to the waitlist (if active).

Walk-in Management (Booking)

Via the staff dashboard, staff can register walk-ins: • Choose a service and time • Walk-in is created immediately without online validation • Walk-ins are visible in the bookings overview with source 'walk-in' Walk-ins bypass the booking horizon — they can always be created for today.
Tips
  • Walk-ins appear immediately in the admin overview and staff calendar.

Waitlist (Booking)

When all time slots are full, the client can join the waitlist: 1. Client wants to book → fully booked → "Join the waitlist?" 2. Client fills in details, chooses time preference 3. When a slot frees up → email with accept/decline link 4. Client accepts → booking created 5. No response → offer expires, next in line Settings per branch: • Waitlist on/off • Mode: automatic or manual • Offer expiry time (default: 2 hours)
Tips
  • In automatic mode, spots are offered immediately when a cancellation or no-show occurs.
  • Waitlisted clients receive 3 emails: confirmation, spot offered, and optionally expired.

Email Confirmation by Client (Double Opt-in)

Optionally you can require clients to confirm their booking via email: 1. Enable 'Require client confirmation' in the branch settings 2. Set the expiry time (1, 2, 4, 12 or 24 hours) After booking, the client receives an email with a confirmation button. Without confirmation within the set time, the booking is automatically cancelled.
Note
  • Unconfirmed bookings are automatically cancelled. Inform your clients about this.

PIN-secured Staff Dashboard (Booking)

The staff dashboard is a secured page on your live website where staff can manage bookings without logging into the CMS. Features: • Day agenda with all bookings and statuses • Create walk-in with 1 click • Change status (confirm, complete, no-show, overrule) • View waitlist • Personal welcome: the staff member's name is shown after login Access via a 4-6 digit PIN code per staff member. Session duration is configurable. Via Booking → Staff Access you configure: • Dashboard on/off and session duration • Add individual staff members with name and personal PIN • Activate/deactivate or delete per staff member • Share QR code and link to install the Staff App
Tips
  • After 5 wrong PIN attempts per minute, the IP is temporarily blocked.
  • Each staff member has their own PIN — so you know who is logged in.
  • The staff page can be installed as a standalone PWA app on a tablet. Scan the QR code on the Staff Access page.

Booking Form: Notes, Intake & Marketing Opt-in

The booking form supports additional fields: • Notes — Free text field for special requests • Intake questions — Optional extra questions configurable per service • Marketing opt-in — Checkbox for newsletter/marketing consent All extra fields are saved with the booking and visible in the admin overview.
Tips
  • Intake questions are useful for appointment preparation (e.g. 'What are your symptoms?').

CRM Customer Management (Booking)

The booking system automatically maintains customer profiles: • Automatically created on first booking (based on email address) • Visit history — All bookings with status and date • Loyalty tiers — Automatically calculated based on number of visits • Tags and notes — Manually add for extra context • Marketing consent — Permission for marketing • No-show count Via Booking → Customers you view and manage the customer list.
Tips
  • Customer profiles are automatically updated after each booking.
  • Loyalty tiers: 1 visit = new, 2-4 = returning, 5-9 = regular, 10+ = VIP.

iCal & Add to Calendar (Booking)

After a booking, the client receives calendar options: • .ics attachment in the confirmation email • Google Calendar button • The .ics attachment opens in the default calendar app (Apple Calendar, Outlook, etc.) The appointment contains: service name, date, time, location and optionally staff member.
Tips
  • The .ics attachment is generated automatically — no configuration needed.

Automatic Reminders & Status Emails (Booking)

The system automatically sends emails: Reminders: • 24 hours before (configurable per branch) • Optionally 1 hour before Status emails: • Cancellation by admin/staff → client is informed • Confirmation by admin → confirmation email • No-show marking → optional email to client All emails use the branded layout and include a magic link for self-service.
Tips
  • Reminders can be toggled on/off per branch.
  • The 1-hour reminder is off by default.

Staff Calendar View (Admin Agenda)

The staff calendar provides a visual overview of all bookings: • Day view — Timeline with all bookings per staff member • Week view — Overview of the entire week • Breaks — Blocked times are shown as grey blocks • Availability — Visible which slots are still free Click a booking for details or status changes. Filter by branch and staff member.
Tips
  • The calendar is also accessible via the staff dashboard on the live site.

CRM Dashboard Analytics + Export (Booking)

The Booking CRM Dashboard combines CRM metrics with booking-specific analytics: CRM cards (8): • Total customers, new customers, retention rate, VIP customers • Repeat no-shows, marketing opt-ins, avg visits, inactive customers Booking cards (6): • Revenue this month — Sum of deposits/payments • Most popular service — Most booked service • Busiest day — Weekday with most bookings • Busiest time slot — Hour with most bookings • Avg bookings/day — Average over 30 days • Occupancy rate — Booked slots / available slots × 100% CSV export with segment presets: VIP, win-back, regulars, custom filters.
Tips
  • Analytics are cached for 1 hour for fast loading.
  • Use the export for targeted marketing campaigns to specific customer segments.

Terms & Conditions

Require clients to agree to your terms when booking: 1. Go to Booking → Settings → Terms & Conditions 2. Enable 'Terms required' 3. Enter your terms text (or paste a URL) 4. Save A mandatory checkbox appears during booking. Without agreement, the client cannot book. The agreement is stored with the booking.
Tips
  • You can link to a separate terms page.
  • The agreement is saved with a timestamp (GDPR-compliant).

No-show Fees (Booking)

Charge a fee for no-shows to reduce missed appointments: 1. Go to Booking → Settings 2. Enable 'No-show fee' 3. Set the amount (fixed amount or percentage of service price) When a no-show occurs, a Stripe charge is automatically created if the client previously provided a payment method. Without a payment method, the fee is recorded but not collected. Clients are informed about the no-show policy in the confirmation email.
Note
  • No-show fees require an active Stripe connection on the website.

Calendar Sync (Google/Outlook/Apple)

Synchronize bookings with external calendars: 1. Go to Booking → Calendar Sync 2. Choose a provider: Google Calendar, Microsoft Outlook, or Apple Calendar 3. Complete the OAuth authorization 4. Select which calendar to use After connecting: • New bookings automatically appear in the external calendar • Busy times in the external calendar automatically block booking slots • Cancellations are synchronized bidirectionally
Tips
  • You can connect a separate calendar per staff member.
  • Sync runs every 5 minutes — a slight delay is normal.

Subscriptions (Booking)

Offer recurring appointments via subscriptions: 1. Go to Booking → Subscriptions 2. Create a subscription: name, frequency (weekly/monthly), price, linked service 3. Clients choose a subscription when booking Stripe handles automatic periodic billing. Clients can cancel via their account.
Tips
  • Ideal for hairdressers, coaches, and therapists with regular clients.
  • Upon cancellation, existing appointments remain valid until the end of the period.

POS Register (Booking)

Use the built-in register for on-site payments: 1. Go to Booking → POS Settings 2. Enable POS and connect a Stripe Terminal (if available) 3. On a booking: click 'Checkout' to start a payment The POS supports: • Card payments via Stripe Terminal • Manual registration of cash payments • Receipt printing via Web Serial API (ESC/POS printers)
Tips
  • The POS also works via the staff dashboard on a tablet.
  • Receipts are automatically formatted with your site branding.

Call us