Availability Controls
Pricing is half the story — what is sellable at all is the other half. Owners need to close out specific dates (Diwali staff break), close specific rooms (renovation), pause an entire property, or hide it from one channel without affecting others.
The four control levers
Date block
Mark specific dates as unsellable for a room type — e.g. "Dec 24 closed for staff retreat". Doesn't affect existing bookings on those dates.
Room toggle
Disable a single physical unit (Room 304 is being repainted). Inventory drops by 1 for that type across all dates until re-enabled.
Room type disable
Hide the entire room type from search without deleting it. All physical units of that type become unsellable.
Property pause
Take the entire property offline. No new bookings on any channel. Existing bookings honored unless owner cancels them explicitly.
Inventory grid (the source of truth)
Internally, availability is a matrix: date × room-type × channel. Each cell stores three numbers:
| Number | Meaning |
|---|---|
total | Physical units of this type, minus units in out_of_order or out_of_service. |
booked | How many are reserved (confirmed bookings + active holds). |
blocked | Manually closed (date blocks + channel blocks). |
Sellable = total − booked − blocked. If <= 0 → "Sold out" badge on public search.
Inventory grid UI
| Room type | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Deluxe King (6) | 6 | 6 | 5 | 5 | 2 | 1 | 4 | 6 | 6 | 5 | 0 | 0 | 5 | 6 |
| Family Suite (4) | 4 | 4 | 3 | 3 | 2 | 2 | 4 | 4 | 4 | 4 | 3 | 3 | 4 | 4 |
Date block dialog
Select a date range
Drag across the grid or use the date picker.
Pick a reason
maintenance·owner_stay·seasonal_close·renovation·other(free text).Choose scope
All room types, or specific ones. Optional channel-only scope (e.g. block on Airbnb but not direct).
Confirm impact
If there are existing bookings on these dates, show a warning. Block only blocks new sales; existing bookings stand.
Overbooking protection
The single biggest pain in multi-channel hospitality. ABc prevents it three ways:
1. Hold during checkout
When a guest hits "Continue to payment", we create a 10-minute hold that decrements availability. If payment fails or times out, the hold expires automatically.
2. Optimistic concurrency
Confirm endpoint takes a version of the inventory row. Race condition? The slower request fails fast with HTTP 409 and the UI re-quotes.
3. Channel safety buffer
Owners can configure: "Always reserve 1 unit out of OTA sync." Stops a Booking.com push that crosses with a direct booking.
Min / max stay rules
Beyond block / unblock, dates can carry restrictions:
| Rule | Effect |
|---|---|
min_nights | Booking must span at least N nights covering this date. e.g. "Min 3 nights during Christmas week". |
max_nights | Cap on long-stays. |
closed_to_arrival | Guest cannot check in on this date (but mid-stay is fine). |
closed_to_departure | Guest cannot check out on this date. |
min_advance_days | Must book at least N days before check-in (used with non-refundable / promo rates). |
Property pause flow
Existing confirmed bookings still happen. If the owner needs to cancel them too, they must do it one-by-one with a clear reason — every cancellation triggers a refund per the booking's policy and a notification to the guest.