Sell time, not stock. Crystallize booking turns any product into a bookable resource: meeting rooms, rental equipment, fitness classes, consultations or car hire. You set the rules once with reusable booking policies. Shoppers see live availability and hold a slot while they check out. Your team manages every booking from one reservations calendar.
Some products are sold as a slot of time rather than a unit of stock. A meeting room, a piece of rental equipment, a fitness class, a consultation, a car hire — the shopper is not buying one of many identical items from a warehouse, they are reserving a specific window during which that resource is theirs.
Booking turns an ordinary product into a bookable resource. Instead of tracking how many units remain in stock, Crystallize tracks when the product is free: it reads availability for a requested window, holds the slot while the shopper checks out, and records the result as a reservation. This page is the overview — it explains the moving parts and how they fit together, then points you to the pages that cover each one in depth.
You meet four things, in this order:
A reusable set of time rules: how much buffer to leave around each reservation, how far ahead a shopper may book, how late a booking may still be cancelled, and how long a held slot survives before it is released. You create policies once, under Settings, and reuse them across many products.
A product becomes bookable when you open its Booking section, pick a policy, and define its pool — the thing being booked. One policy can back many products.
Once the product is published, the storefront reads availability for a requested window and places a hold on the slot while the shopper checks out. Availability and holds are served by the Shop API.
The Reservations view is where staff see everything that has been booked, on a calendar or a list, and where they can cancel a booking or block time by hand.
A product cannot be made bookable until a policy exists to point it at, and nothing reaches the storefront until the product is published. Reservations only appear once shoppers or staff start booking.
A pool is what a bookable product actually books against, and every bookable product has exactly one of two kinds:
You choose the kind in the product's Booking section. Switching from one to the other replaces the pool, so a product is only ever a capacity pool or a unit pool — never both.
When you make a product bookable, it takes a snapshot of the policy's terms at that moment. Editing the policy later does not reach back and change products already configured against it — they keep the terms they were configured under. The Booking section flags the difference and offers to re-apply the policy; the product only adopts the new terms once you do, and the change reaches the storefront on the next publish.
The storefront reads published data. Choosing a policy, defining a pool, or re-applying a policy does nothing on the storefront until the product is published — until then the storefront treats the product as not bookable. Unpublishing works the same way in reverse: it disables booking for that product.
Every held or booked slot is a reservation, and it moves through a small set of states:
The happy path is Pending → Confirmed → Completed. A hold that is left uncommitted lapses to Expired and frees the slot; a cancellation takes an active reservation to Cancelled. Only storefront holds expire — staff blocks have no deadline and stay until they are cancelled.
Every reservation records its source, which tells you who put it there:
In the Crystallize app, every policy duration is entered as a value plus a unit — seconds, minutes, hours or days. Across the APIs the same durations are expressed as a whole number of seconds. Booking windows — the start and end of a reservation — are always in UTC.
In the app, two permissions gate the feature: booking policies (create, read, update, delete), which controls the Settings editor, and product booking (read, update), which controls a product's Booking section and the Reservations view. A user who cannot read product booking sees neither.
On the storefront and admin side, access to the Shop API is scoped by token. Reading availability and placing holds during checkout need a token scoped to cart, order and booking; the administrative surfaces — staff blocks and the reservation calendar — additionally need the booking:admin scope.
Each part has its own page:
For storefront integration — reading availability, holding a slot through the cart, and confirming a booking — see the Shop API pages.