WordPress plugin · version 2.3.0 · GPL-2.0-or-later

Appointment booking that does not double-book

Simple Booking turns any WordPress site into an appointment system. Define your services, set your opening hours, and let customers book themselves in. Free, with no limit on services, staff or bookings — and no upsell hiding inside the features you already have.

Version 2.3.0 · requires WordPress 6.4+ and PHP 8.0+ · WooCommerce optional

Everything here is in the free plugin

Not a trial, and not a feature list with padlocks on it. Group bookings, multiple staff and editable notification wording are all in the free version and stay there, and there is no cap on services, staff or bookings.

The paid add-on is a separate plugin. It sends messages over SMS and WhatsApp, and collects deposits through your WooCommerce checkout. Both of those are code the add-on ships; neither is a switch in front of something this plugin already contains.

  • Unlimited services, staff members and bookings — no caps of any kind
  • Weekly opening hours, breaks, holidays and one-off schedule changes
  • Per-service duration, setup and cleanup buffers, minimum notice, booking window
  • Group bookings for classes and workshops
  • Email confirmation, cancellation and reminders, with wording you can edit
  • Customer self-service cancellation, within a window you set
  • Admin calendar with day, week and month views, and booking by phone
  • Prices per service, settled on site
  • Fully translatable, times stored in UTC

Why it holds up under load

Most booking plugins fail in the same four places. These are the decisions that keep this one from joining them.

Double booking is a constraint, not a check

Every slot has a digest of (staff, start instant) under a unique database index. Two people pressing “book” on the same slot at the same moment produce the same digest, so the second insert fails at the database rather than racing the first. There is no window in which both can win.

One availability engine

The customer calendar, the admin calendar and the final pre-insert check all call the same code. Version 1 had three implementations of this logic, and every double booking it ever produced was a place where they disagreed.

Times are stored in UTC

Every instant is a UTC column with the originating timezone recorded next to it. Wall-clock storage makes each comparison implicitly local, which quietly breaks across daylight-saving boundaries and server moves.

A booking stores two spans

What the customer sees is the appointment. What collides on the calendar is the appointment widened by the service’s setup and cleanup padding. Collapsing the two into one pair reads as an economy and is in fact a bug: customers get shown the salon’s cleanup time as part of their slot.

Five simultaneous requests for one slot return exactly one 201 and four 409. That is an assertion in the test suite, run against a real server over real HTTP — not a claim in a feature table.

Getting started

01

Install

Upload the ZIP under Plugins → Add New, and activate it.

02

Set your hours

Booking → Settings holds your weekly opening hours, breaks and holidays.

03

Add services

Duration, buffers, minimum notice and price, per service.

04

Place the form

Drop the [simple_booking] shortcode or the Booking Form block on any page.

Coming from version 1.x?

If the plugin finds bookings stored by an earlier version, it offers a one-click import that preserves appointments, customers and payment status. Past bookings are marked completed and stop reserving their slot; future ones keep theirs. Running the import twice imports nothing the second time.

Start with the free plugin

There is no trial to expire and no limit to hit. Add SMS, WhatsApp and online deposits later if you need them.