User Management
Invite coaches and players, set roles, and link users to roster players.
BenchOS programs are multi-user. The head coach typically holds the Admin seat and invites assistant coaches, support staff, and players in. This page covers how to manage that — inviting people, setting roles, customizing permissions, and linking player users to their roster row.
The hub is Settings → Staff & Permissions at /settings/users. This page is admin-only.
Roles
Three roles, each with a different default lens on the program:
- Admin — Full control. Invites and removes users, customizes permissions, and has the highest access on every artifact (generate / edit / view).
- Coach — Day-to-day staff. Generates and edits practice plans, game briefs, dev plans, scouting, and roster. Cannot manage users or change program settings.
- Player — Roster member with limited, scoped access. Sees finalized (not draft) practice plans and game briefs, the playbook, and only their own development plan, dev card, and player profile. Cannot see scouting reports, weekly reports, or other players' development data.
Roles have hard floors — protections you can't override even with custom permissions. Coaches can never escalate to user management; players can never see scouting or other players' dev data.
The People tab
/settings/users opens to the People tab. It lists every active member and pending invitation in a single table:
- Person — name, avatar, email
- Role — Admin / Coach / Player
- Linked player — the roster row linked to this user (Players only)
- Status — Active, Invited, or Inactive
A search box filters by name or email. Two filter chip rows narrow by Role (All / Admins / Coaches / Players) and Status (All / Active / Invited / Inactive).
Inviting someone
Click Invite in the top-right of the People tab. The Invite member modal asks for:
- Email (required)
- Role (required) — defaults to Coach
- Linked player — only appears when Role is set to Player. Pick from the dropdown of unlinked roster rows. (If no unlinked players exist, the modal tells you to add the player to the roster first.)
Click Send invite. BenchOS creates a pending invitation and sends an email containing your name, the program name, and a magic link to accept. The invite stays valid for 14 days.
Pending invitations appear in the People list with status Invited and two icons: a send arrow to resend and an X to revoke.
What the invitee sees
The recipient clicks the magic link and lands on /invite/accept:
- If they're not signed in, they're routed through login first (the token follows them).
- If they sign in with an email that doesn't match the invitation, they're signed back out with an "email mismatch" error.
- On a successful match, their account is created (or reused if they already belonged to another program), the membership is created, the linked player wiring is set up if applicable, and they land on the Dashboard.
Common error states the invitee might see: invalid token, expired (>14 days), revoked, or already accepted — each with guidance to ask the inviter to resend.
Managing a member
Click any active member row to open the Member detail drawer. From here you can:
- Change role — Admin ↔ Coach. (Player roles can't be changed.)
- Deactivate the member, which removes their access while preserving their history. Reactivate them at any time from the Inactive filter.
- See Linked player (Players only) and Invited by (read-only).
One safeguard: if you're the only Admin in the program, you can't demote or deactivate yourself. A lock icon appears with the explanation.
Linking users to roster players
Player users are tied to a specific roster row — that's how they see only their own data. Linking happens in two places:
- From the invite modal — pick the roster row from the Linked player dropdown when sending the invite (Player role only).
- From the Roster page — each row has a Roster Access cell:
- No user yet → an Invite button opens the invite modal with that player pre-selected.
- Invited, not accepted → an Invited pill with Resend and Revoke buttons.
- Active user → the user's avatar and an Active link that opens their Member drawer.
A roster player can only be linked to one user account, and a Player user can only be linked to one roster player. The linking is bidirectional and gets cleaned up if you revoke the invitation or deactivate the member.
Roles & Permissions tab
Switch to the Roles & Permissions tab to see the permission matrix. Resources are grouped into four expandable sections — Plans, Library, People, Settings — and each row shows the default permission level for Coach and Player on that resource (None / View / Edit / Generate).
You can review the matrix here today. Per-role permission customization is the foundation for an upcoming feature; for now, defaults plus hard floors govern what each role can do.
Multiple programs
If you (or a member) belong to more than one program, the Program Switcher in the app sidebar shows a dropdown with every program you have access to. Clicking another program switches your active context — useful for coaches who run multiple teams or staff who consult across programs.
If you only belong to one program, the switcher just shows that program's name as a static label.