Overview
When a workspace is fully booked for a requested range, members currently just get a 409. A waitlist converts that dead end into demand capture: join the queue, get notified the moment a cancellation frees the slot.
Proposed Design
New module backend/src/waitlist/. WaitlistEntry: userId, workspaceId, requestedStart, requestedEnd, seatCount, status (WAITING, NOTIFIED, CONVERTED, EXPIRED, CANCELLED), notifiedAt.
Flow:
POST /waitlist — allowed only when the requested range genuinely has insufficient seats (validate against the live availability from [BE-01]).
- On booking cancellation/expiry ([BE-08]/[BE-03]) for that workspace: find the oldest WAITING entry whose range now fits → status NOTIFIED, send notification + email with a booking deep link, start a claim window (
WAITLIST_CLAIM_HOURS, default 24).
- If the member books within the window (detect on booking creation), mark CONVERTED; when the window lapses, a job expires the entry and notifies the next in line.
GET /waitlist/me, DELETE /waitlist/:id (leave queue); admin list per workspace.
Acceptance Criteria
Dependencies
Blocked by [BE-01]. Uses the jobs module ([BE-03]) for claim-window expiry.
Notes for Contributors
Emit the existing WebSocket notification plus email. Comment below to be assigned.
Overview
When a workspace is fully booked for a requested range, members currently just get a 409. A waitlist converts that dead end into demand capture: join the queue, get notified the moment a cancellation frees the slot.
Proposed Design
New module
backend/src/waitlist/.WaitlistEntry:userId,workspaceId,requestedStart,requestedEnd,seatCount,status(WAITING, NOTIFIED, CONVERTED, EXPIRED, CANCELLED),notifiedAt.Flow:
POST /waitlist— allowed only when the requested range genuinely has insufficient seats (validate against the live availability from [BE-01]).WAITLIST_CLAIM_HOURS, default 24).GET /waitlist/me,DELETE /waitlist/:id(leave queue); admin list per workspace.Acceptance Criteria
Dependencies
Blocked by [BE-01]. Uses the jobs module ([BE-03]) for claim-window expiry.
Notes for Contributors
Emit the existing WebSocket notification plus email. Comment below to be assigned.