The decisions behind a booking system
Which plugin for which kind of booking
Amelia and Bookly are appointment systems: services, employees, a step-by-step booking form and their own admin calendar. Amelia ships more in one package, including events and packages of appointments. Bookly keeps a small core and adds capabilities through separate add-ons, so you install what you use and maintain more moving parts. WooCommerce Bookings works differently. A booking is a product with availability rules, person counts and resources, sold through the normal checkout, which makes it the natural choice for rentals, tours and anything that shares a cart with other products. Simply Schedule Appointments is the quickest to set up and suits one-to-one meetings in the style of a hosted scheduling link.
Time zones and daylight saving
We store every appointment as an exact moment in UTC and convert at the edges. The choice that matters is whose clock a service follows. An in-person haircut belongs to the salon's time zone whatever the customer's phone says. A video consultation should be shown in the customer's zone and the consultant's zone at once. Recurring bookings keep their rule in local wall-clock time, so a weekly 9 am stays at 9 am after the clocks change. We test with dates either side of a daylight saving switch, because that is where the one-hour bugs live.
How double bookings really happen
There are three causes. The first is a race: two checkouts read the same free slot before either writes. The fix is to check availability again inside the same database transaction that creates the booking, or to hold the slot for a few minutes once it enters the cart. The second is caching, where a page cache serves yesterday's availability, so slot requests must bypass it. The third is calendar sync. A private event in Google Calendar or Outlook only blocks a slot once the site knows about it, and a staff member's expired sign-in can stop sync without any visible error. We add a check on each connection and warn an admin when one goes quiet.
Reminders depend on cron
WordPress runs scheduled tasks when someone visits the site. On a quiet site a reminder due a day ahead can go out hours late. We replace that with a server cron, queue messages so one failed SMS does not block the rest, and log what was sent to whom. It is unglamorous work, and it separates reminders customers rely on from reminders they ignore.
Where custom code begins
Typical triggers: a booking that needs two resources at once, pricing that depends on duration and season together, approval steps, staff commission reports, or bookings created by another system. We build these as a companion plugin on the booking plugin's hooks and, where it has one, its API. When scheduling is the core of the business and the rules keep growing, a Laravel application with WordPress as the marketing site is often the calmer long-term choice. For bookings that feed a customer database, see WordPress CRM integration.