---
title: "How to build a booking or reservation system on an ecommerce platform"
description: "Booking and reservation patterns on Medusa: tickets, rentals, pre-orders and appointments, preventing double bookings, and a WooCommerce Bookings comparison."
url: https://medusajs.com/kb/tickets-and-bookings/bookings-and-reservations
last_updated: 2026-10-29T06:55:50Z
topic: "tickets-and-bookings"
type: "concept"
applies_to: "Medusa v2.x"
related:
  - "https://medusajs.com/kb/tickets-and-bookings/sell-tickets-and-merch.md"
  - "https://medusajs.com/kb/marketplaces/rental-pricing-availability-deposits.md"
  - "https://medusajs.com/kb/marketplaces/rental-marketplace.md"
  - "https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md"
sources:
  - "https://docs.medusajs.com/resources/recipes/ticket-booking/example"
  - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals"
  - "https://docs.medusajs.com/resources/how-to-tutorials/tutorials/preorder"
  - "https://docs.medusajs.com/resources/commerce-modules/product/selling-products"
  - "https://docs.medusajs.com/resources/commerce-modules/inventory/inventory-in-flows"
  - "https://docs.medusajs.com/resources/commerce-modules/inventory/reservations-lifecycle"
  - "https://docs.medusajs.com/resources/infrastructure-modules/locking"
  - "https://woocommerce.com/products/woocommerce-bookings/"
---

# How to build a booking or reservation system on an ecommerce platform

> 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.

| Pattern | Example | What availability means | Medusa starting point | Status |
| --- | --- | --- | --- | --- |
| Event tickets | Concerts, conferences | A seat or a capacity count per show date | Ticket booking tutorial | Official guide |
| Date-range rentals | Equipment, formal wear | An item is free for a start and end date | Product rentals tutorial | Official guide |
| Pre-orders | Product launches, books | Sell before stock arrives, fulfill later | Pre-orders tutorial | Official guide |
| Time-slot appointments | Classes, consultations | A slot with a capacity on a calendar | No guide; build a slot model on Medusa's framework | Custom |

## 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](https://docs.medusajs.com/resources/recipes/ticket-booking/example) 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](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals) 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](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/preorder) 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 `manage_inventory` disabled, per [Configure Selling Products](https://docs.medusajs.com/resources/commerce-modules/product/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.

1. **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 `validate` hook of `addToCartWorkflow` to reject a taken seat, and the rentals tutorial uses a custom add-to-cart workflow that rejects overlapping dates.
2. **Reservation on order placement.** `completeCartWorkflow` creates 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](https://docs.medusajs.com/resources/commerce-modules/inventory/reservations-lifecycle).
3. **Locks during checkout.** The tutorials wrap cart completion in `acquireLockStep` and `releaseLockStep` from the [Locking Module](https://docs.medusajs.com/resources/infrastructure-modules/locking). 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.

| Capability | WooCommerce Bookings | Medusa |
| --- | --- | --- |
| Booking durations | Days, hours, or minutes | Days in the rentals tutorial; hours or minutes are custom |
| Fixed time slots | Built in | Custom |
| Resources such as staff or rooms | Built in, each with its own availability | Custom module |
| Capacity per booking | Minimum and maximum participants | Inventory per variant, native |
| Buffers between bookings | Built in | Custom |
| Confirmation before payment | Built in | Custom |
| Deposits | Separate Deposits extension, $219 per year | Custom |
| Seat maps | Not listed | Official guide |
| Platform | WordPress plugin | Headless Node.js backend with Store and Admin APIs |

## 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.

## Documentation

- [Implement a Ticket Booking System with Medusa](https://docs.medusajs.com/resources/recipes/ticket-booking/example)
- [Implement Product Rentals in Medusa](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/product-rentals)
- [Implement Pre-Orders in Medusa](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/preorder)
- [Reservations Lifecycle](https://docs.medusajs.com/resources/commerce-modules/inventory/reservations-lifecycle)
- [Locking Module](https://docs.medusajs.com/resources/infrastructure-modules/locking)

## Related

- [Sell event tickets and merch on one site without Eventbrite fees](https://medusajs.com/kb/tickets-and-bookings/sell-tickets-and-merch.md)
- [Rental pricing, availability and security deposits](https://medusajs.com/kb/marketplaces/rental-pricing-availability-deposits.md)
- [Build a peer-to-peer rental marketplace: build vs buy](https://medusajs.com/kb/marketplaces/rental-marketplace.md)
- [How to build a fully custom checkout flow](https://medusajs.com/kb/headless-checkout/custom-checkout-flow.md)
