Skip to main content

Passes

Module-gated

The /passes and /customer-passes endpoints need the Store module. Calls return 403 module_disabled when it is off.

A pass is something a shop sells once and the customer uses on later bookings: a season pass, a 10-visit card, a summer membership. A pass can also charge every month and take a percentage off every booking instead: see Memberships. Each pass has:

  • a name and a price
  • visits: a number, or unlimited (null)
  • how long it works: between two dates (valid_from, valid_to, both days included, in the shop's time zone), or a set time from the day it is bought (valid_for with valid_for_unit months or days). A pass uses one or the other, never both
  • what it covers, for experiences and for rental items separately: all of them, chosen categories (a parent category covers its subcategories), chosen items, or none (experience_applies_to, rental_applies_to)
  • who can buy it (who_can_buy): everyone (the booking page, POS and the app), staff_only (POS, the app, the API and Dash; never the booking page) or off (not for sale; passes already sold keep working)

One pass is for one named holder. When a customer buys a pass they get a customer pass with its own code, for example PASS-7QKM-B4RT, emailed once the order is paid.

Every customer pass carries its own valid_from and valid_to. For a dated pass they are the pass's dates. For a pass that runs from purchase, valid_from is the day it was sold on the shop's calendar and valid_to is valid_for months or days later: a 12-month pass sold on 2026-10-23 works through 2027-10-23, and one sold on 2027-02-10 works through 2028-02-10. A month that has no matching day ends on its last day (one month from January 31 ends on February 28).

Using a passโ€‹

A pass brings one booking line to zero, using one visit for each person, group or rental unit on it (two crafts on a per-group price use two visits). With fewer visits left than the line needs, it covers what it can and the rest is charged. Each use reports visits_used. The same pass goes on one line per booking.

WhenWhat happens to the visit
The booking is written (API, POS, Dash) or the customer presses Pay onlineHeld - it comes off visits_left
The booking is confirmed or paidUsed
A draft, quote or requestStays held until it is confirmed
The booking is cancelled, a draft is discarded, a request is declined, or an online checkout is never paid (60 minutes)Released - the visit goes back
The booking moves to another dateStays used; the person stays free at the new date's price

Scopesโ€‹

EndpointScope
GET /passes, GET /passes/{id}, POST /passes/check, GET /customer-passes, GET /customer-passes/{id}, GET /customer-passes/{id}/paymentsstore:read
POST /passes, PATCH /passes/{id}, DELETE /passes/{id}, POST /customer-passes, POST /customer-passes/{id}/cancelstore:write
POST /bookings/{id}/passes, DELETE /bookings/{id}/passes/{visit_id}, POST /bookings/{id}/membership, DELETE /bookings/{id}/membershipbookings:write

Pages in this sectionโ€‹

  • Manage passes - list, get, create, update and delete the passes a shop sells
  • Customer passes - the passes customers hold, and issuing one
  • Check a code - would this code work on this item and day
  • Use a pass on a booking - on a new booking, or one that already exists
  • Memberships - monthly passes with a member discount: cancel one, its monthly charges, the discount on a booking