Selling appointments or bookable services through WooCommerce means a product isn’t just “add to cart” anymore — the customer picks a date and time slot, that slot has limited capacity, the booking belongs to a specific customer, and they may need to cancel it later. Each of those needs to be enforced on the server, not trusted from the browser. This guide covers what a booking setup needs and how to get one running on a standard WooCommerce store.
What a Booking Setup Actually Needs
- Availability rules — which days and time slots are offered, how far ahead, and how much lead time before a slot.
- Per-slot capacity — a slot for one appointment stops being offered once it’s taken; a slot for a class of ten stops at ten. This has to be an atomic check, or two customers checking out at the same second can both land in the last spot.
- Ownership — a booking belongs to the customer whose order created it, set once from the order, never from a later request. Otherwise one customer can view or cancel another’s booking.
- Cancellation — the customer can cancel their own upcoming booking from My Account, scoped to their account at the database query.
Setting One Up
- Start from a working WooCommerce store. A simple product is the base — the booking layer sits on top of it.
- Install a booking plugin and enable booking on the product from its Product Data tab. HDWebmobile Booking & Appointments is the one we build and maintain; it turns any simple product into a bookable service and confirms the booking when the order completes.
- Set availability. Choose the days, the slot length, how many bookings a slot holds, the minimum lead time, and how many days ahead customers can book.
- Decide what happens when a slot fills between add-to-cart and checkout. The order should still complete normally, with the store notified to reschedule — not silently double-book the slot.
- Test the cancellation flow. Place a test booking, cancel it from My Account, and confirm the slot frees up and another account can’t see or touch that booking.
| Concern | Wrong way | Right way |
|---|---|---|
| Slot capacity | Check availability, then write — a race between the two | Atomic claim (a database uniqueness constraint) so the last spot can only go once |
| Booking ownership | Trust a customer or booking id from the request | Set once from the order’s own customer id, never read from a later request |
| Viewing / cancelling | Look up by booking id alone | Scope every query to the logged-in customer’s account |
What to Check Before Going Live
Run a real booking end to end on desktop and mobile: pick a slot, pay, see it under My Account, cancel it, confirm the slot reopens. Then log in as a second test customer and confirm they can’t see or cancel the first customer’s booking even if they guess the URL. Booking is a flow customers rely on showing up correctly — a slot that double-books or a cancellation that doesn’t release is worse than not offering booking at all. For another WooCommerce build-out walkthrough in the same spirit, see How to Turn Your WooCommerce Store Into a Multi-Vendor Marketplace.
If you want a bookable-services setup built and tested for your store, get in touch.
Frequently Asked Questions
Can I sell appointments without a dedicated booking plugin?
Not really — a plain WooCommerce product has no concept of a date, a time slot, or slot capacity. You need a booking layer to add availability, capacity, and a cancellation flow.
What happens if two people book the last slot at the same time?
With a correctly built plugin, only one succeeds — the slot is claimed with an atomic database operation, so the second checkout is handled gracefully (the order still completes and the store is notified) rather than both being confirmed.
Can customers cancel their own bookings?
Yes, from a bookings section under My Account, scoped to their own account. They should never be able to see or cancel another customer’s booking, even by changing an id in the URL.
Featured image: original illustration.
