WorkestraDocs
PlatformCalendar & Scheduling

Conference Rooms & Resources

Book physical rooms, desks, and equipment as part of a meeting — required or optional, calendar-aware, conflict-checked.

Some meetings need a room. Some need a specific piece of equipment (a projector, an interview rig, a podcast booth). Workestra models these as resources — bookable physical assets the workspace owns, attached to booking links as required or optional.

When a slot is computed, the resource's calendar is consulted just like a host's. When the booking confirms, the resource's calendar gets a hold for the duration. Two simultaneous bookings can't double-book the same resource.

Resources picker on the booking link form

Screenshot needed — resource picker on the form's Advanced tab with required + optional resources

What counts as a resource

Resource typeExamples
RoomConference room, board room, interview room
DeskHot desk, dedicated workstation
EquipmentProjector, podcast rig, interview camera, demo laptop
VehicleField service van (also fits FSM workflows)

Each resource has a name, a type, an optional capacity (for rooms — "max 6 people"), and a calendar — by default Workestra's internal calendar (just scheduling_calendar_events filtered by resource_id), with optional Google or Microsoft sync if your room is also a calendar-resource in Google Workspace or M365.

Manage resources at /calendar/admin/resources.

Adding a resource

Path: /calendar/admin/resourcesNew resource. Admin role required.

FieldWhat it does
Name"Boardroom A", "Hot desk #3", "Interview camera kit"
TypeRoom / Desk / Equipment / Vehicle
CapacityOptional — for rooms, the seat count
DescriptionOptional notes (location floor, equipment included)
External calendarOptional. Connect a Google or Microsoft calendar so external bookings on that calendar block the resource too
Working hoursOptional. When the resource is bookable. Defaults to 24/7.

Resources are workspace-scoped. They're not tied to a specific booking link until you attach them.

On the booking link form's Advanced tab, two pickers appear when Conference rooms / resources is enabled:

PickerWhat it means
Required resourcesA slot is only available if all required resources are free at that time. The booking writes a hold to each.
Optional resourcesThe attendee picks from a dropdown on the booking page. The slot is available if at least one optional resource is free.

A common pattern: an interview link with one required interview camera kit and a list of optional rooms ("Room A, Room B, Room C — pick one"). The interviewer's calendar, the camera kit's calendar, and the chosen room's calendar all get holds.

How availability is computed

The slot engine runs through hosts as before, then layers resources:

  1. For each candidate slot, every required resource must be free
  2. For each candidate slot, at least one of every optional resource group must be free
  3. The remaining slots are presented

A "free" resource means no row in scheduling_resource_holds overlapping the slot, and no event on the connected external calendar overlapping it.

What gets written when the booking confirms

ObjectEffect
scheduling_calendar_eventsThe booking row, as normal
scheduling_resource_holdsOne row per attached resource (required + chosen optional), linking back to the booking
External calendars (if connected)An event on the resource's calendar with the booking title + attendees

If a resource booking conflicts (e.g. a calendar event was added directly to the resource's Google calendar between slot computation and confirmation — a TOCTOU race), the booking is rejected and the user is told to pick another slot. The host's hold isn't double-booked.

Cancellation and reschedule

When a booking is cancelled or rescheduled, the corresponding scheduling_resource_holds rows are released or updated. External calendar events on the resource's calendar are deleted or moved.

What's NOT supported

  • Capacity-overflow logic — you can't book a resource at "120% of capacity" or share a room between two simultaneous meetings. One booking, one hold.
  • Resource-side approval — there's no "request room, approve, then confirm" workflow. If you need approval gating, use the host-approval flow on the booking link itself.
  • Per-room pricing — paid bookings are per-link, not per-resource. If you charge for a room, build it into the link's price.
  • Multi-resource calendars on one row. Each resource has its own calendar.