How to build a booking or reservation system on an ecommerce platform
- Type
- Applies to
- Medusa v2.x
- Updated
Short answer
To build bookings on Medusa, pick a pattern first: event tickets, date-range rentals, pre-orders, or time-slot appointments. Medusa has official tutorials for tickets, rentals and pre-orders, built as custom modules linked to its products, carts and orders. Double bookings are prevented with add-to-cart checks, inventory reservations and workflow locks.
Which booking pattern fits your business
A booking system sells access to a limited resource at a specific time: a seat at a show, a camera for three days, or a 30-minute appointment. Each pattern tracks availability differently, so pick the pattern before you pick the tool. Medusa has official guides for three of them and the building blocks for the fourth.
How Medusa supports bookings
Medusa is a commerce platform with a framework for custom modules, workflows, and API routes. A booking feature in Medusa is a custom module that stores the booking data, linked to Medusa's products, carts, and orders, so you reuse its pricing, promotions, payments, and order management.
- The ticket booking tutorial adds venues, rows, seats, and show dates. It creates one variant per show date and row type and sets its inventory to the row's seat count.
- The product rentals tutorial adds rental configurations (minimum and maximum days) and rental records with start and end dates. It checks for overlapping rentals and prices the rental per day.
- The pre-orders tutorial lets customers buy a variant before it's available and fulfills the order automatically when it is.
Services and appointments that need no shipping or stock tracking are a documented product setup: no shipping profile and Copy to clipboardmanage_inventory disabled, per Configure Selling Products.
How to prevent double bookings in Medusa
Double booking happens when two customers buy the same slot at the same time. Medusa gives you three layers to stop it.
- Availability check on add to cart. Medusa checks a variant's available inventory when it's added to a cart. The ticket booking tutorial consumes the Copy to clipboard
validatehook of Copy to clipboardaddToCartWorkflowto reject a taken seat, and the rentals tutorial uses a custom add-to-cart workflow that rejects overlapping dates. - Reservation on order placement. Copy to clipboard
completeCartWorkflowcreates an inventory reservation for each item, which lowers the available quantity until the item is fulfilled or the order is canceled. See the reservations lifecycle. - Locks during checkout. The tutorials wrap cart completion in Copy to clipboard
acquireLockStepand Copy to clipboardreleaseLockStepfrom the Locking Module. Those locks are keyed on the cart, so key a lock on the slot or variant if two carts can race for it. The default in-memory provider is for development only; use the Redis or PostgreSQL provider in production.
Medusa does not hold a slot while it sits in a cart. If you need a timed hold, such as 10 minutes to finish checkout, build it as a custom hold record that a scheduled job expires.
Medusa compared with WooCommerce Bookings
WooCommerce Bookings is a paid WordPress extension, listed at $249 per year as of October 2026. It ships booking rules out of the box. Medusa ships the commerce engine and official example code, and you build the booking rules you need.
When Medusa is not the right choice for bookings
- You run a salon or studio and want calendar booking working this week without a developer. A scheduling SaaS or WooCommerce Bookings is faster.
- Your bookings have no commerce around them: no catalog, no cart, no add-ons. A dedicated scheduling tool is simpler.
- Medusa fits when booking is part of a larger store, when you need a booking model the plugins don't support, or when you want to own the code and the data.
Common questions
Does Medusa have a built-in booking calendar?
No. Medusa has no native booking calendar. The official rentals tutorial adds a date picker and availability checks by day, and time-slot calendars are custom work.
Can Medusa hold a booking slot while the customer checks out?
Not by default. Medusa checks inventory when an item is added to a cart and reserves it when the order is placed, so a timed hold during checkout is a custom record that a scheduled job expires.
How do I sell appointments or services in Medusa?
Create a product with no shipping profile and with inventory management disabled, as the Configure Selling Products guide describes. Slot availability, staff and buffers are custom models you add in a module.
Is Medusa an alternative to WooCommerce Bookings?
Medusa is an alternative when you need a headless backend and custom booking rules. WooCommerce Bookings ships time slots, resources and buffers out of the box, while Medusa gives you the commerce engine and official examples to build them.