Help Center
DocsResources
Bookable rooms and equipment that automatically lock when a booking page that requires them is booked.
A room, piece of equipment, or other physical asset that should be reserved alongside a meeting.
When a booking page requires a resource, every confirmed booking against that booking page also locks the resource for the booking's start/end window. The database prevents double-booking via a GiST EXCLUDE constraint — so two booking pages pointing at the same conference room cannot both succeed for an overlapping slot, even under high concurrency where two bookers click Confirm at the exact same instant. Whichever booking inserts first wins; the second booker sees a 409 with code RESOURCE_TAKEN and is prompted to pick another time.
Open Admin → Resources.
Fill in the basics.
Save.
Attach to booking pages.
| Field | Description | Type |
|---|---|---|
| Name* | Friendly name shown to hosts and on the booking confirmation. Up to 200 characters. Example: "Conference Room A — Building 3". | text |
| Type* | room | equipment | other. Used for filtering, the colored badge in the resource list, and reporting. | select |
| Capacity | For rooms only. Maximum occupancy. Surfaced on the booking page and in the host email when relevant. | number |
| Location | Physical address, room number, or building. Appended to the calendar event location for in-person bookings so attendees know where to go. | text |
| Description | Optional notes shown to hosts when picking which resource to attach. Use this for amenities ("whiteboard, 65-inch TV, hardwired ethernet"), access notes, or any context the booking page editor should see. | text |
| Active | Toggle off to remove the resource from new selections without deleting historical bookings. Existing booking pages still show the resource attached, but new bookings won't lock it. Use this when a room is under maintenance or a piece of equipment is being retired. | boolean |
- Required — the booking must lock the resource for its full start/end window. The availability dispatcher intersects required-resource busy time, so a slot becomes unavailable when the host is free but the room isn't. If a race happens at the database level, the second booker gets
409 RESOURCE_TAKENand is asked to pick another slot. - Preferred — best-effort. The booking succeeds even if the resource is already taken; the resource is locked when free. Use this for nice-to-have equipment (e.g., a portable whiteboard) where the meeting can still happen without it.
- A booking page can attach multiple resources — e.g., Conference Room A required + a specific demo laptop required. Both are checked at availability time and both must be free for the slot to surface as bookable.
When a booker loads a booking page with required resources, the availability engine evaluates four sources of busy time: existing bookings on the host's booking pages, synced calendar events from Google or Microsoft, CRM activities, andresource bookings for every required resource on this booking page. A slot only appears if all four sources are free for the meeting's full duration plus any configured buffer. So two booking pages that share a conference room and a host can't both display the same 2:00 PM slot — whichever resource is busy first removes the slot.
If a host needs to free a resource (for example, to reschedule another meeting onto the same room), the only safe path is to cancel or reschedule one of the conflicting bookings. Cancelling a booking automatically releases its resource lock; rescheduling moves the lock to the new time. The unique GiST EXCLUDE guarantee on theresource_bookings table means manual edits to that table are not safe — always go through the meeting cancellation or reschedule flow from Bookings or the booker's management link.
- scheduler.admin — required to create, edit, or delete resources. By default, only Super Admin and Admin roles have this scope.
- scheduler.edit — required to attach an existing resource to a booking page from the booking-page editor.
- scheduler.view — required to see the resources list page.
A booker got “RESOURCE_TAKEN”
Two bookers picked the same slot at the same instant on a booking page with a required resource. The database accepted only one; the second is prompted to choose another time. This is working as designed — no double-booking can slip through.
A slot looks available on the host's calendar but not on the booking page
A required resource is busy at that time. Check Bookings (or the resource owner's scheduler) for a conflicting booking on the same room or piece of equipment.
I can't delete a resource
Detach it from every booking page first, or mark it Inactive instead. Inactive resources don't lock new bookings but keep historical resource_bookings intact for reporting.