Case study /01
ShiftPick — the rota, without the group chat
Shift management for multi-site teams. Rotas are published once, staff claim what suits them, and nobody can book onto work they are not cleared for.
The challenge /01
Most rotas are run out of a group chat.
A manager posts the week’s shifts into a message thread. Three people reply at once claiming the same slot. Somebody’s certification lapsed two months ago and nobody noticed. The rota gets edited, reposted, and now two versions are circulating.
The failure is not scheduling — it is that the rota has no single authoritative copy, and no idea who is actually cleared to work each role.
Our approach /02
Publish once. Let the team self-serve against permissions.
Shifts are published a single time to one list that everyone reads from. Staff claim what suits them rather than waiting to be assigned, which removes the manager from the middle of every swap and cover request.
Permissions do the safety work. People only see shifts they are cleared for, and clearance comes from documents an admin has actually reviewed — not from a checkbox someone ticked about themselves.
The product /03
What we built /04
A working platform on a database that enforces its own rules.
- Three permission tiers, so staff only ever see shifts matching their clearance
- Document review workflow — accounts stay pending until an admin approves the upload
- Shift claiming with a waitlist, so full shifts still capture demand
- Peer-to-peer shift swaps settled by a one-time swap code and completed by a database trigger
- Availability records, so managers publish against what people can actually work
- Announcements broadcast to the whole team from one place
- Auto-issued employee numbers via a database trigger
- Embedded AI assistant with guest and authenticated modes
Swap execution and permissions live in Postgres as row-level security policies and triggers rather than in client code. A user cannot claim a shift they are not cleared for even if they call the API directly.
Key capabilities /05
Tech stack /06
- React 18
- Tailwind CSS
- Supabase (Postgres)
- Row-level security
- Database triggers
- REST API
- OpenRouter