Browse the docs

Take bookings, run waitlists and check people in

Customers book a session or a whole series, for themselves, a guest or someone they book for (a child, a pet), and pay online or at the door. When it’s full they can join the waitlist, and you mark who came or let them check themselves in.

On your website, a Book button or a link ending in ?book= and the offering opens the booking window: customers pick what to book, a session or a time, and who’s coming: themselves, someone they book for (a child or a pet they add once) or a guest. Signed in, they pick which pack or membership pays, or pay instead. Before paying they see each person with their price, any discount or the pack that covers them, a payment plan’s dates and amounts for a series, and the total. They can use a gift card or store credit, and choose what to pay when you let them pick. Then they pay on your Stripe account while their place is held, with a countdown. Every booking email has a link to the booking’s own page, where they see it, check in, move it, send someone else or cancel. Cancelling says what comes back before they confirm. Their bookings also show on their account page on your site.

A booking holds every seat it needs while the customer pays: 15 minutes on your site, longer when they book through an AI assistant or you send them a pay link. Paid, the seats are theirs. If the hold runs out and someone else takes the last spot before their payment lands, the payment is refunded in full and they go on the waitlist.

A series is on sale only while every session in it has room. If drop-ins fill one date, the series comes off sale. To keep it on sale, set seats aside for series buyers: drop-ins can’t take those.

Packs and memberships pay for bookings they cover. We use the one that costs the customer least (an unlimited membership first, then the credit that runs out soonest), and they can pick another or pay instead. A series uses one visit per session. A membership pays only for its holder’s own place; a pack can pay for a guest or someone they book for too. Booked with a friend who pays, both places are held together until the payment lands. If a pack doesn’t have enough left, they’re told how much it has and offered another pack. Someone waiting in line with a pack is let in on it when a seat frees.

Members can book early: set how many days ahead customers can book, and members with early booking get their extra days on top. Everyone else sees when booking opens. An admission only for members is left off your booking page and refused to anyone without the membership.

Waitlists: each session has its own, and each series has one too. When a seat frees up, the session’s waitlist comes first. Someone waiting for a series is offered a place only when every session has room. An offer holds the spot for them for your waitlist policy’s claim window (2 hours if you haven’t set one) and sends them a link to pay. Free or paid at the door, they’re in straight away. If they don’t pay in time, the offer goes to the next person, and they can join again.

Customers can cancel under your cancellation policy: within the free window they get their money back, after it the late share. A pack’s visit or a membership’s booking comes back within the free window (up to 12 hours before if you haven’t set a policy). One person can cancel from a booking for several people and the rest stay booked. They can also move to another date of the same offering, keeping what they paid, or hand their spot to someone else.

Checking in: mark who came on the session’s roster, or let customers check themselves in from an hour before it starts, with the link in their booking or the 6-digit code you show at the door. For open hours and walk-ins, check someone in at the door and they’re booked and checked in at once. Marking someone a no-show charges your no-show fee to the card they paid with. If they paid at the door, nothing is charged. Marking them as came after all gives the fee back. Undo puts them back to not marked yet.

When you book someone in yourself, add a note (a birthday, a high chair) and, if it’s full, book them anyway: the session makes room for them. A free booking’s party size can change later; a paid one is cancelled and booked again.

For agents

For appointments, lessons and rentals where customers pick their own time, see “Take appointments and standing bookings”. offerings.enroll takes admissionId, sessionIds (one for a one admission, or several back-to-back ones for one longer visit, or none with waitlist and span to wait for the next available time, up to flexCount for flex, none for a series), the buyer (customerId for the owner, or name with email/phone), attendees (self, guest with a name, or dependent with the buyer’s dependentId from customers.dependents; amountMinor for pay what you want), more (further admissions in the same checkout, each with its own admissionId, sessionIds and attendees: two camp weeks, or two children in different weeks, in one sale and one hold, up to 10 places; not with waitlist; offerings.review takes the same more), seats (party size), pay (card or door, for what no pack or membership pays), grantId (the pack or membership that pays, from offerings.coverage; left out, the cheapest one that covers each place is used; none to pay instead), codes, tender (gift cards by code and store credit by grantId from commerce.storedValue, paid first), waitlist, the business’s quotedWaitMinutes, waitUntil (waiting for the next available time: only a time that starts before this, like tonight), note, the business’s over (book it even when it’s full), landing (where the visit came from, for attribution), textReminders (they ticked the consent to text reminders), a payment plan (installments: count, and dates or every, with agreeToRenewal and the termsVersion from commerce.previewSale; refused with the plan’s words to show without them), taxZip (the customer’s ZIP code; a booking is taxed at the session’s location, so it’s only asked for when that location has no address saved) and an optional requestId to retry safely. It answers status (held with payment or payAt/holdUntil, confirmed, waitlisted, or full with canWaitlist) and enrollments, with due: forms or records still to take after booking, each with its status (“Studio waiver for Sam due by Sat, Oct 3”). A members-only admission (requires: membership:<key>) is refused without the membership, and a session not open to the customer yet is refused with the date it opens. Its other requirements (ages, forms to sign, records, approval) are checked too: see “Ask for ages, waivers and records before people book”. offerings.review shows a customer’s booking before it’s made, with the same admissionId, sessionIds (or start on demand), attendees, seats, grantId, codes, tender, pay, installments and taxZip: each attendee with the cover that pays for them or why they’re refused (“Sam is 12. Wheel is for ages 14 and up.”), the steps to take before booking and those due after, and the sale for the rest (each line’s label with any discount, total, dueNow, later, terms, and a plan’s renewal words with termsVersion; tax, the sales tax as its own line, and askZip when it needs their ZIP code first). offerings.coverage takes admissionId, sessionIds, attendee, seats (and customerId for the business) and answers options (each grantId with its name, words like “Uses 1 visit. 5 visits left.”, its cost, what’s left, ok, a reason when it can’t, and buyMore when a pack has run low), the default, opens (publicAt and this customer’s at), membersOnly and member. offerings.cancelEnrollment takes enrollmentId (the business may pass refund: policy, all or none) and answers creditsBack for a pack or membership. offerings.transfer takes enrollmentId and toSessionId, seats (a new party size, only for a free booking), or attendee, and the business’s over; offerings.note sets a booking’s note; a new attendee is checked against the admission’s requirements like a booking (refused for an age, needs: portal for a customer’s own form to sign first, the rest due). offerings.markAttendance takes sessionId, enrollmentId and status (attended, no_show, excused, or expected to undo a mark) and, for a party, count who came. offerings.checkIn takes a check-in token, or sessionId with code (customer), enrollmentId (staff) or door (a walk-in: the buyer, seats, span for a visit over back-to-back sessions, pay, over, note) plus an optional requestId. offerings.roster lists who’s coming to a session (each with requirements, whether each form or record is met, missing or expired, and flags that hold check-in), the waitlist and its checkInCode; offerings.enrollment reads one booking, with its note and its own page (manageUrl). offerings.places takes offeringId, from and days and lists that offering’s bookings by day (party, span, first session, its attendance, note) and who’s waiting. offerings.get answers seriesOnSale per series admission. What customers see: offerings.bookable (optional offeringId) lists what’s on sale in the owner’s order, each offering with its place, with the booking page’s groups (each heading and its offeringIds; the rest show after them) and each admission’s price, payWhatYouWant, dueNow, and for a series onSale and the full sessions that took it off sale, leaving out members-only admissions, which offerings.memberBookable (same shape, optional offeringId) lists for the signed-in member who can book them; offerings.openSessions takes offeringId, date and seek and answers the sessions with remaining seats. offerings.booking takes enrollmentId and answers a customer’s booking as its page shows it: when, place with mapUrl for directions, money (what’s left to pay and how, like “Pay $25 at your visit”) and paid, sessions with checkIn and checkInUrl, due (forms or records it still waits on, worked out from what the admission asks for, each key with its label and status like “Studio waiver due before Tue, Oct 6”; check-in waits until they’re in; offerings.requirementLink with enrollmentId and that step answers a fresh single-use url whose page leads back to the booking once it’s done), and cancel with the confirm words, refundMinor and payments still to come. offerings.checkIns lists the sessions the signed-in customer can check in to now, and with none open, their next session with when check-in opens and its calendarUrl.