Skip to main content

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

FieldTypeDescription
tenantIdstringRequired - Tenant scope
clubIdstringOptional - Club scope for overrides
resourceTypeResourceTypeOptional - Apply to specific resource type
memberTierstringOptional - Apply to specific membership tier
minAdvanceHoursnumberMinimum hours before start time to book
maxAdvanceDaysnumberMaximum days in advance to book
guestLimitnumberMaximum guests per reservation
maxActiveBookingsnumberMaximum concurrent active reservations
priorityWindowHoursnumberEarly booking window for premium members
minDurationMinutesnumberMinimum reservation duration
maxDurationMinutesnumberMaximum reservation duration
bufferMinutesnumberBuffer time between consecutive bookings

REST API

List Rules

GET /facility-booking-rules?tenantId=1&clubId=10&resourceType=TENNIS_COURT

Query Parameters:

  • tenantId (required) - Tenant scope
  • clubId (optional) - Filter by club
  • resourceType (optional) - Filter by resource type
  • memberTier (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:

  1. Resource-specific rule (if resourceId is set)
  2. Resource type + member tier rule (if both are set)
  3. Resource type rule (if resourceType is set)
  4. Member tier rule (if memberTier is set)
  5. Club-level default (if clubId is set)
  6. 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 days
  • Booking is less than minimum advance time of X hours
  • Guest count exceeds limit of X
  • Member has X active bookings (max: Y)
  • Duration X minutes is below minimum of Y minutes
  • Duration X minutes exceeds maximum of Y minutes