Booking Rules
Configure booking policies for facility reservations including advance windows, guest limits, and duration constraints.
Overview
Booking rules define constraints for making reservations. Rules can be set at:
- Tenant level - Default rules for all resources
- Club level - Override tenant defaults for a specific club
- Resource type level - Rules specific to a resource type (e.g., all tennis courts)
- Member tier level - Different rules for different membership tiers
Rule Properties
| Field | Type | Description |
|---|---|---|
tenantId | string | Required - Tenant scope |
clubId | string | Optional - Club scope for overrides |
resourceType | ResourceType | Optional - Apply to specific resource type |
memberTier | string | Optional - Apply to specific membership tier |
minAdvanceHours | number | Minimum hours before start time to book |
maxAdvanceDays | number | Maximum days in advance to book |
guestLimit | number | Maximum guests per reservation |
maxActiveBookings | number | Maximum concurrent active reservations |
priorityWindowHours | number | Early booking window for premium members |
minDurationMinutes | number | Minimum reservation duration |
maxDurationMinutes | number | Maximum reservation duration |
bufferMinutes | number | Buffer time between consecutive bookings |
REST API
List Rules
GET /facility-booking-rules?tenantId=1&clubId=10&resourceType=TENNIS_COURT
Query Parameters:
tenantId(required) - Tenant scopeclubId(optional) - Filter by clubresourceType(optional) - Filter by resource typememberTier(optional) - Filter by member tier
Get Single Rule
GET /facility-booking-rules/:id?tenantId=1
Create Rule
POST /facility-booking-rules
Content-Type: application/json
{
"tenantId": "t-1",
"clubId": "c-1",
"resourceType": "TENNIS_COURT",
"minAdvanceHours": 1,
"maxAdvanceDays": 14,
"guestLimit": 3,
"maxActiveBookings": 3,
"minDurationMinutes": 30,
"maxDurationMinutes": 120,
"bufferMinutes": 0
}
Update Rule
PUT /facility-booking-rules/:id?tenantId=1
Content-Type: application/json
{
"maxAdvanceDays": 21,
"guestLimit": 4
}
Delete Rule
DELETE /facility-booking-rules/:id?tenantId=1
GraphQL API
Query Rules
query BookingRules {
facilityBookingRules(filters: {
tenantId: "t-1"
clubId: "c-1"
resourceType: TENNIS_COURT
}) {
id
resourceType
minAdvanceHours
maxAdvanceDays
guestLimit
minDurationMinutes
maxDurationMinutes
}
}
Create Rule
mutation CreateBookingRule {
createFacilityBookingRule(data: {
tenantId: "t-1"
clubId: "c-1"
resourceType: TENNIS_COURT
minAdvanceHours: 1
maxAdvanceDays: 14
guestLimit: 3
}) {
id
resourceType
}
}
Example Configurations
Tennis Courts
{
"resourceType": "TENNIS_COURT",
"minAdvanceHours": 1,
"maxAdvanceDays": 14,
"guestLimit": 3,
"maxActiveBookings": 3,
"minDurationMinutes": 30,
"maxDurationMinutes": 120,
"bufferMinutes": 0
}
Swimming Pool
{
"resourceType": "SWIMMING_POOL",
"minAdvanceHours": 0,
"maxAdvanceDays": 7,
"guestLimit": 4,
"maxActiveBookings": 2,
"minDurationMinutes": 60,
"maxDurationMinutes": 180,
"bufferMinutes": 15
}
Squash Courts
{
"resourceType": "SQUASH_COURT",
"minAdvanceHours": 1,
"maxAdvanceDays": 7,
"guestLimit": 1,
"maxActiveBookings": 2,
"minDurationMinutes": 45,
"maxDurationMinutes": 90,
"bufferMinutes": 5
}
Function Rooms
{
"resourceType": "FUNCTION_ROOM",
"minAdvanceHours": 24,
"maxAdvanceDays": 90,
"guestLimit": null,
"maxActiveBookings": 5,
"minDurationMinutes": 60,
"maxDurationMinutes": 480,
"bufferMinutes": 30
}
Rule Precedence
When multiple rules could apply, the most specific rule takes precedence:
- Resource-specific rule (if
resourceIdis set) - Resource type + member tier rule (if both are set)
- Resource type rule (if
resourceTypeis set) - Member tier rule (if
memberTieris set) - Club-level default (if
clubIdis set) - Tenant-level default
Validation Errors
When a booking violates rules:
{
"statusCode": 400,
"message": "Booking exceeds maximum advance window of 14 days",
"error": "Bad Request"
}
Common validation errors:
Booking exceeds maximum advance window of X daysBooking is less than minimum advance time of X hoursGuest count exceeds limit of XMember has X active bookings (max: Y)Duration X minutes is below minimum of Y minutesDuration X minutes exceeds maximum of Y minutes