OptimoCMS Docs
Back to overview

Reservation System (Restaurant)

Online reservations for restaurants and hospitality: branches, tables, opening hours, capacity management, walk-ins, waitlist and staff dashboard.

What is the reservation system?

The reservation system is a widget designed for restaurants and hospitality. Guests reserve a table online: they choose the number of people, optionally a branch, a date, an available time slot and fill in their details. The system supports multiple branches, configurable calendar length, capacity buffers for walk-ins, automatic no-show detection, a waitlist for fully booked slots, walk-in management and a PIN-secured staff dashboard. The difference with the booking system: bookings revolve around services and staff, reservations around tables and capacity. The system automatically matches the smallest suitable table based on the number of guests.

Activating the reservation system

How to enable the reservation system: 1. Go to Settings → Widgets 2. Activate "Reservation" 3. After activation, the reservation admin pages appear in the sidebar 4. The ReservationWidget block becomes available in the Page Builder
Tips
  • After activation you can immediately set up branches, tables and opening hours.
  • The sidebar shows: Branches → Locations → Tables → Hours → Floor Plan → Reservations → Waitlist → Staff Access → Settings.

Branches

A branch is a physical location, for example "Restaurant Utrecht" or "Branch Amsterdam". Locations/rooms, tables and opening hours are managed per branch. Via Reservations → Branches you manage: • Name — Recognisable name for the branch • Address, city, phone — Contact details • Active — On/off toggle • Capacity buffer — Percentage or fixed number of tables reserved for walk-ins • No-show settings — Automatic no-show detection and timer • Customer confirmation — Optional email confirmation (double opt-in) • Waitlist — On/off, automatic or manual offering
Tips
  • With 0 branches the system works as before (no branch step in the widget).
  • With 1 branch it is auto-selected. With 2+ the guest chooses.
Note
  • Locations, tables and opening hours must be linked to a branch once you create branches.

Data model (technical)

The reservation system stores the following data per site: • Branches (name, address, city, phone, active, buffer settings) • Locations/rooms (name, linked to branch) • Tables (name, capacity, active, linked to branch) • Opening hours (day, open, close, per branch) • Reservations (date, time, party size, table, customer details, status, source) • Waitlist entries (date, time preference, party size, status) • Settings (calendar length, reservation duration, slot interval) Tables and opening hours are publicly visible. Reservations and waitlist are managed server-side.
Tips
  • Reservations have a source field: online, walk-in, phone or waitlist.

Managing tables

Via Reservations → Tables you manage your table layout: • Name — A recognisable name (e.g. "Table 1", "Terrace A", "VIP Corner") • Capacity — Maximum number of guests per table • Branch — Which branch the table belongs to • Active — On/off toggle Only active tables are included when calculating available time slots. With multiple branches you can filter by branch at the top of the page.
Tips
  • Create tables for each seating option. The system automatically picks the smallest suitable table for the party size.

Setting up opening hours

Via Reservations → Opening Hours you set per day when guests can make reservations: • Per day of the week: opening and closing time • Configurable per branch • Days without times = closed The system generates time slots within these hours.
Note
  • Changes to opening hours take effect immediately. Existing reservations are not automatically adjusted.

Reservation settings

Via Reservations → Settings you configure: • Calendar length — How far ahead guests can book (7, 14, 30, 60 or 90 days). Default: 14 days. • Reservation duration — Default duration per reservation (60, 90 or 120 minutes). Default: 90 min. • Slot interval — Interval between available times (15, 30 or 60 minutes). Default: 30 min. These settings apply site-wide but can be overridden per branch.
Tips
  • With more than 14 days the widget automatically shows a month calendar instead of date buttons.
  • Closed and fully booked days are shown greyed out in the calendar.

Capacity buffer (walk-in reserve)

The capacity buffer reserves a portion of your tables for walk-ins and phone reservations. Online guests see fewer available tables. Settings per branch: • Mode — Percentage, fixed number, or no buffer • Value — E.g. 20% or 4 tables The system holds back the largest tables (walk-ins tend to be smaller parties). Walk-ins and phone reservations bypass the buffer and see all tables.
Tips
  • Example: 20 tables, buffer 20% → 4 largest tables not available online but still available for walk-ins.
Note
  • The buffer only applies to online bookings. Via the admin panel or staff dashboard you can always use all tables.

How tables are matched

The Reservation Engine matches tables server-side with the following algorithm: 1. Filter tables: capacity ≥ party size, active = yes 2. Apply capacity buffer (online bookings only) 3. Sort by capacity ascending (smallest suitable table first) 4. Per table: check for no overlap with existing reservations at that date + time 5. The first available table is automatically assigned This prevents wasting large tables on small parties.
Tips
  • A reservation for 2 guests will preferably be assigned to a 2-person table, not a 6-person table.

Double reservation prevention

The system automatically prevents double reservations: 1. When creating a reservation, availability is re-checked 2. If the table is already taken → error message 3. Only if the table is free is the reservation confirmed Spam protection is built in: max 30 availability requests/min and 5 reservations/min per visitor.

No-show management

The system automatically detects no-shows and offers flexible status transitions: • Automatic no-show — If a guest doesn't arrive within the set time (15/30/45/60 min after reservation time), the reservation is automatically marked as 'no-show'. • Staff overrule — Staff can change a no-show back to 'confirmed' if the guest arrives after all. • Reopen — A cancelled reservation can be reopened by staff. Status transitions: pending → confirmed (by guest or admin), cancelled confirmed → completed, cancelled, no_show no_show → confirmed (overrule), cancelled cancelled → confirmed (reopen) Configurable per branch: automatic no-show on/off, timer in minutes.
Tips
  • When a no-show or cancellation occurs, the freed slot is automatically offered to the waitlist (if active).

Email confirmation by guest (double opt-in)

Optionally you can require guests to confirm their reservation via email: 1. Enable 'Require customer confirmation' in the branch settings 2. Set the expiry time (1, 2, 4, 12 or 24 hours) After booking, the guest receives an email with a confirmation button. If the guest does not confirm within the set time, the reservation is automatically cancelled and the slot freed. By default this is off — guests receive an informational confirmation email without required action.
Note
  • When enabling double opt-in, unconfirmed reservations are automatically cancelled. Inform your guests about this.

Walk-in management (Floor Plan)

Via Reservations → Floor Plan you see a real-time overview of all tables per branch: • 🟢 Free — No active reservation • 🔴 Reserved — Confirmed online/phone reservation • 🟡 Walk-in — Walk-in is active • 🔵 Completed — Table recently freed • ⚫ No-show — Guest did not arrive Actions per status: • Free → Walk-in: 1 click, choose party size → table immediately occupied • Reserved → Completed: mark as finished • Walk-in → Free: mark as finished • No-show → Overrule: guest arrived after all At the bottom you see the occupancy counter: number of occupied tables and seats.
Tips
  • Walk-ins bypass the capacity buffer — all tables are available.
  • The floor plan updates in real-time: changes by colleagues appear instantly.

Waitlist

When all time slots are full, guests can join the waitlist. When a cancellation or no-show occurs, a spot is automatically (or manually) offered. Settings per branch: • Waitlist on/off • Mode: automatic (offer immediately when slot frees up) or manual (admin chooses who) • Offer expiry time (default: 2 hours) Flow: 1. Guest wants to book → fully booked → "Join the waitlist?" 2. Guest fills in details, chooses time preference (lunch/dinner/any) 3. When a slot frees up → email with accept/decline link 4. Guest accepts → reservation created 5. Guest doesn't respond → offer expires, next in line Via Reservations → Waitlist you manage the list per date and branch.
Tips
  • In automatic mode you don't need to do anything — the system offers spots and processes responses.
  • Waitlisted guests receive 3 emails: confirmation, spot offered, and optionally expired.

ReservationWidget on your website

The ReservationWidget is a block you place on a page via the Page Builder: 1. Open a page in the Page Builder 2. Search for "ReservationWidget" in the block list (category: Widgets) 3. Drag it onto your page 4. Configure: heading, accent color, maximum party size Widget flow: 1. Choose number of guests 2. Choose branch (only with 2+ branches) 3. Choose location/room (only with 2+ locations) 4. Choose date (date buttons for ≤14 days, month calendar for more) 5. Choose available time 6. Fill in details 7. Confirmation — or "Join waitlist?" if fully booked Closed and fully booked days are shown greyed out. In the editor you see a mock preview; on the published site the widget runs with real data.
Tips
  • The widget is responsive and works on mobile (375px), tablet and desktop.
  • Steps adapt dynamically: no branch step with 1 branch, no location step with 1 location.

Managing reservations

Via Reservations → Overview you see all reservations: • Filter by date and branch • Per reservation: party size, time, table, customer details, status, source (online/walk-in/phone/waitlist) • Actions: confirm, complete, cancel, mark no-show, overrule no-show, reopen • Indicator whether the guest has confirmed (with double opt-in) When cancelled or marked as no-show, the slot is freed and optionally offered to the waitlist.
Tips
  • Use the branch filter at the top to quickly find the right location.
  • The source badge shows whether it's an online, walk-in, phone or waitlist reservation.

Staff Dashboard (PIN-secured)

The staff dashboard is a secured page on your live website (/staff) where staff can quickly view and manage reservations without logging into the CMS. Features: • Overview of today and tomorrow: all reservations with status • Create walk-in with 1 click • Change status (confirm, complete, no-show, overrule) • View waitlist and manually offer spots • Occupancy counter (tables + seats) • Personal welcome: the staff member's name is shown after login Access via a 4-6 digit PIN code per staff member. The session expires after a configurable time (default 12 hours). Via Reservations → Staff Access you configure: • Staff 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
  • The dashboard is optimised for tablet use at the front desk.
  • After 5 wrong PIN attempts per minute, the IP is temporarily blocked (brute-force protection).
  • 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.
Note
  • The staff dashboard grants limited access: only view reservations and manage walk-ins/status. No access to tables, locations or settings.

Difference with the booking system

Booking vs. Reservation in short: • Booking: you book a time slot for a service (hairdresser, coach, masseuse). Optionally with a staff member. • Reservation: you reserve a table based on the number of guests. The system automatically matches the right table. Both systems use the same principles: server-side calculation, atomic writes to prevent double bookings, and rate limiting. The difference is in the matching algorithm: service+duration vs. table+capacity.
Tips
  • You can activate both widgets simultaneously on the same website if you offer both services and tables.

Reservation Form: Notes, Allergens & Extras

The reservation form supports additional fields: • Notes — Free text field where guests can mention special requests • Allergens — Multi-select with preconfigured allergens (e.g. gluten, nuts, lactose). The guest selects relevant allergens • Extra options — Checkable extras per branch (e.g. high chair, birthday cake, wheelchair access) • Marketing opt-in — Optional checkbox for newsletter/marketing All extra fields are saved with the reservation and visible in the admin overview and staff dashboard.
Tips
  • Allergens and extra options are configured per branch via Reservations → Branches.
  • The marketing opt-in automatically syncs with the CRM customer card.

Allergens & Extras Management (Admin)

Via Reservations → Branches you can manage allergens and extra options per branch: Allergens: • Add allergens (name + optional icon) • Sort via drag & drop • Enable/disable per allergen Extra options: • Add options (name + optional description) • Sort via drag & drop • Enable/disable per option These automatically appear in the reservation form on the website.
Tips
  • Common allergens: gluten, nuts, lactose, shellfish, egg, soy, celery.
  • Extra options are flexible: use them for anything from high chairs to live music.

CRM Customer Management

The reservation system automatically maintains a customer profile for each guest: • Automatically created on first reservation (based on email address) • Visit history — All reservations from this guest, with status and date • Loyalty tiers — Automatically calculated: new, returning, regular, VIP (based on number of visits) • Allergens — Aggregated from all reservations • Tags — Manually added labels (e.g. 'business', 'large group') • Notes — Free text per customer • Marketing consent — Has the guest given permission for marketing? • No-show count — Number of no-shows for this guest Via Reservations → Customers you view and manage the customer list. Filter by loyalty tier, branch, tags or inactivity.
Tips
  • Customer profiles are automatically updated after each reservation — no manual work needed.
  • Loyalty tiers increase automatically with more visits: 1 = new, 2-4 = returning, 5-9 = regular, 10+ = VIP.
Note
  • Customer data falls under GDPR. Via Reservations → Customers a customer can be deleted (right to erasure).

Staff Dashboard: CRM Integration

The staff dashboard shows CRM information for each reservation: • CRM badge — Guest's loyalty tier (colour-coded) • Mini profile — Number of visits, allergens, last visit • Inline note — Staff can directly add a note to the customer profile This gives staff immediate insight into who is arriving and their preferences.
Tips
  • VIP guests get a prominent badge so staff can give them extra attention.

No-show Scoring & Blacklist

The system automatically tracks how often a guest doesn't show up: • No-show score — Automatically increments with each no-show • Warning — At 3+ no-shows a warning appears in the admin overview • Blacklist — Guests with too many no-shows can be blocked: they can no longer reserve online Blacklisting is manual: an admin puts a customer on the blacklist via the customer profile. Blocked guests receive an error when trying to reserve online.
Tips
  • The no-show threshold for warnings is configurable per branch.
  • A blocked guest can still be registered by phone or as a walk-in.
Note
  • Blacklisting blocks by email address. A guest can still reserve with a different email.

Marketing Export & Newsletter Sync

Via Reservations → Customers you can export customer data: • CSV export — Download a CSV with customer data, filtered by segment • Segment presets — VIP customers, regulars, inactive customers, marketing opt-ins • Custom filters — Combine loyalty tier, branch, tags and activity The export contains: name, email, phone, total visits, loyalty tier, allergens, marketing consent. Newsletter sync: customers with marketing consent are automatically synced to the newsletter_subscribers collection (if the newsletter module is active).
Tips
  • Use the VIP export to send targeted marketing campaigns to your best customers.
  • The export respects GDPR: only customers with marketing consent are included in marketing exports.

CRM Dashboard Analytics

The CRM Dashboard provides an overview of customer metrics on the reservations page: • Total customers — Number of unique guests • New customers (30d) — Customers from the last 30 days • Retention rate — Percentage of customers who return more than once • VIP customers — Number of guests with VIP tier • Repeat no-shows — Guests with 3+ no-shows • Marketing opt-ins — Customers with marketing consent • Avg visits/customer — Average number of visits per guest • Inactive (60d+) — Customers who haven't visited in 60+ days Cards update automatically (cached for 1 hour).
Tips
  • Use the retention rate to measure how well you retain guests.
  • Inactive customers are an opportunity for win-back campaigns via marketing export.

iCal & Add to Calendar

After a reservation, the guest receives calendar options: • .ics attachment — The confirmation email includes an .ics file that most calendar apps recognise • Google Calendar button — Direct link to add to Google Calendar • Apple Calendar / Outlook — The .ics attachment opens automatically in the default calendar app The calendar event contains: restaurant name, date, time, party size and optionally the branch address.
Tips
  • The .ics attachment is generated automatically — no configuration needed.
  • When rescheduling via magic link, the .ics attachment in the new confirmation email is updated.

Automatic Reminders

The system automatically sends reminder emails to guests: • 24 hours before — Standard reminder (configurable per branch) • 1 hour before — Optional additional reminder The reminder email contains: date, time, party size, branch and a magic link to reschedule or cancel. No duplicate reminders: the system tracks which reminders have already been sent.
Tips
  • The 1-hour reminder is disabled by default. Enable per branch via branch settings.
  • Reminders use the same branded layout as the confirmation email.

Status Emails

When status changes are made by admin or staff, the guest automatically receives an email: • Cancellation by admin/staff — Guest is informed the reservation has been cancelled • Confirmation by admin — Guest receives a confirmation email • No-show marking — Optional email to the guest (configurable) All status emails use the branded layout and are available in 5 languages.
Tips
  • The no-show email is disabled by default. Enable via branch settings if you want to inform guests about a no-show.

Shifts (Breakfast/Lunch/Dinner)

Divide your opening hours into shifts for better planning: 1. Go to Reservations → Settings → Shifts 2. Add shifts: name (e.g. 'Breakfast', 'Lunch', 'Dinner'), start and end time 3. Each shift can have separate capacity and settings Guests choose a shift first when reserving. This prevents a lunch reservation from running into dinner time.
Tips
  • Shifts are optional — without shifts, the system uses continuous opening hours.
  • You can set a separate maximum number of guests per shift.

No-show Fees (Reservation)

Charge a fee for no-shows: 1. Go to Reservations → Settings 2. Enable 'No-show fee' 3. Set the amount: fixed amount per person or per reservation When a no-show occurs, a Stripe charge is created if the guest previously provided payment details. Guests are informed about the no-show policy in the confirmation email.
Note
  • No-show fees require an active Stripe connection.
  • Communicate the policy clearly to avoid complaints.

Prepayment

Require guests to pay in advance when reserving: 1. Go to Reservations → Settings 2. Enable 'Prepayment' 3. Set the amount: fixed amount per person or percentage 4. Optional: only for groups above X people After filling in details, the guest is redirected to Stripe Checkout. Without payment, the reservation is not confirmed.
Tips
  • Prepayment significantly reduces the no-show rate.
  • Cancellations within the allowed period are automatically refunded.

Table Combining

The system can automatically combine multiple tables for larger parties: 1. Go to Reservations → Tables 2. Mark which tables can be combined (e.g. Table 3 + Table 4) 3. For a reservation with more people than one table can handle, combinable tables are automatically matched The combined capacity is calculated as the sum of the individual tables.
Tips
  • Only combine tables that are physically adjacent.
  • The system chooses the smallest possible combination that fits.

Internal Notes

Add internal notes to reservations visible only to staff: • Via the admin overview: click a reservation → 'Add note' • Via the staff dashboard: note icon on each reservation • Notes are linked to the staff member who created them Examples: 'Birthday dinner, bring cake', 'VIP guest, window table'.
Tips
  • Notes are not visible to guests.
  • Use notes to track special wishes of regular guests.

Terms & Conditions (Reservation)

Require guests to agree to your terms when reserving: 1. Go to Reservations → Settings → Terms & Conditions 2. Enable 'Terms required' 3. Enter your terms text (or paste a URL) A mandatory checkbox appears during reservation. Without agreement, the guest cannot reserve.
Tips
  • Useful for cancellation policies, no-show fees, and privacy.
  • The agreement is saved with a timestamp.

Event Tickets

Sell tickets for special events through the reservation system: 1. Go to Reservations → Events 2. Create an event: name, date, capacity, ticket price 3. Add the EventTicket block to a page in the Page Builder Guests purchase a ticket via Stripe Checkout and receive a confirmation with QR code. Via the staff dashboard, you can scan tickets at the entrance.
Tips
  • Ideal for wine tastings, cooking workshops, seasonal dinners, and live music.
  • Events do not appear in the regular reservation widget — they have their own block.

Call us