Skip to content

Designing for Roles ​

The same SaaS product should feel purpose-built for every role that uses it --- admin, manager, and member should each see what they need, nothing more.

Why This Matters ​

Most SaaS products serve multiple roles within an organization. A billing admin, a project manager, and a team member all log into the same app but have completely different goals, permissions, and mental models. Treating them the same way guarantees you serve none of them well.

RoleWhy You Should Care
🏒 OwnerEnterprise deals require granular roles and permissions. Without them, you lose the deal.
πŸ’» DevPermission logic touches every API endpoint and UI component. Bad architecture here means security holes and spaghetti conditionals.
πŸ“‹ PMFeature specs must account for "who sees what." Missing a role consideration mid-sprint causes rework.
🎨 DesignerYou are designing multiple experiences in one product. Each role needs its own user journey.

The Concept (Simple) ​

Think of roles like security badges in an office building. Everyone enters through the same front door, but your badge determines which floors you can access, which rooms you can enter, and which controls you can operate. A visitor sees the lobby. An employee sees their floor. A building manager sees the control room.

Your SaaS app works the same way. The codebase is one product, but the experience adapts based on who is logged in.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              SAME APPLICATION                 β”‚
β”‚                                               β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚   β”‚  ADMIN  β”‚  β”‚ MANAGER  β”‚  β”‚  MEMBER  β”‚   β”‚
β”‚   β”‚         β”‚  β”‚          β”‚  β”‚          β”‚   β”‚
β”‚   β”‚ Full    β”‚  β”‚ Team     β”‚  β”‚ Own work β”‚   β”‚
β”‚   β”‚ control β”‚  β”‚ overview β”‚  β”‚ only     β”‚   β”‚
β”‚   β”‚         β”‚  β”‚          β”‚  β”‚          β”‚   β”‚
β”‚   β”‚ Billing β”‚  β”‚ Reports  β”‚  β”‚ Tasks    β”‚   β”‚
β”‚   β”‚ Users   β”‚  β”‚ Assign   β”‚  β”‚ Profile  β”‚   β”‚
β”‚   β”‚ Config  β”‚  β”‚ Approve  β”‚  β”‚ Submit   β”‚   β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

How It Works (Detailed) ​

Role Hierarchy ​

Most SaaS products follow a hierarchical role model. Understanding this hierarchy is the foundation for every UI decision.

ASCII Role Hierarchy Diagram:

                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚  SUPER ADMIN β”‚  Platform-level (your team)
                    β”‚  (internal)  β”‚  Can impersonate, access all tenants
                    β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚    OWNER     β”‚  Tenant-level
                    β”‚              β”‚  Full access, billing, can delete org
                    β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚    ADMIN     β”‚  Org-level management
                    β”‚              β”‚  Manage users, settings, integrations
                    β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
              β”‚            β”‚            β”‚
       β”Œβ”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”΄β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”
       β”‚   MANAGER   β”‚ β”‚EDITORβ”‚ β”‚  VIEWER   β”‚
       β”‚             β”‚ β”‚      β”‚ β”‚           β”‚
       β”‚ Team mgmt,  β”‚ β”‚Createβ”‚ β”‚ Read-only β”‚
       β”‚ reports,    β”‚ β”‚edit, β”‚ β”‚ access    β”‚
       β”‚ approvals   β”‚ β”‚deleteβ”‚ β”‚           β”‚
       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Permission Matrix:

CapabilityOwnerAdminManagerEditorViewer
View own dataYesYesYesYesYes
View team dataYesYesYesYesYes
View all org dataYesYesYesNoNo
Create contentYesYesYesYesNo
Edit own contentYesYesYesYesNo
Edit others' contentYesYesYesNoNo
Delete contentYesYesYesNoNo
Manage team membersYesYesYesNoNo
Manage all usersYesYesNoNoNo
Change org settingsYesYesNoNoNo
Manage billingYesNoNoNoNo
Delete organizationYesNoNoNoNo
Transfer ownershipYesNoNoNoNo

Admin vs Regular User Experiences ​

The admin experience and the regular user experience often need fundamentally different layouts.

Admin Dashboard:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  [Logo]   Dashboard   Users   Settings   Billing     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚            β”‚                                         β”‚
β”‚  ADMIN     β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  SIDEBAR   β”‚  β”‚ Active   β”‚ β”‚ MRR      β”‚ β”‚ Seats  β”‚ β”‚
β”‚            β”‚  β”‚ Users    β”‚ β”‚ $24.8k   β”‚ β”‚ 38/50  β”‚ β”‚
β”‚  Overview  β”‚  β”‚ 142      β”‚ β”‚ +8% β–²    β”‚ β”‚ 76%    β”‚ β”‚
β”‚  Users     β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚  > All     β”‚                                         β”‚
β”‚  > Pending β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  > Roles   β”‚  β”‚  RECENT USER ACTIVITY              β”‚ β”‚
β”‚  Teams     β”‚  β”‚                                    β”‚ β”‚
β”‚  Audit Log β”‚  β”‚  jane@co  Invited 3 members  2m   β”‚ β”‚
β”‚  Security  β”‚  β”‚  bob@co   Changed plan       15m  β”‚ β”‚
β”‚  Billing   β”‚  β”‚  alice@co Exported report    1h   β”‚ β”‚
β”‚  ────────  β”‚  β”‚  john@co  Failed login (3x)  2h   β”‚ β”‚
β”‚  Settings  β”‚  β”‚                                    β”‚ β”‚
β”‚            β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Regular User Dashboard:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  [Logo]   Dashboard   Projects   Reports    [Avatar] β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚            β”‚                                         β”‚
β”‚  MY WORK   β”‚  Good morning, Sarah                    β”‚
β”‚            β”‚                                         β”‚
β”‚  Dashboard β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  My Tasks  β”‚  β”‚  YOUR TASKS TODAY           3 of 7 β”‚ β”‚
β”‚  Projects  β”‚  β”‚                                    β”‚ β”‚
β”‚  > Active  β”‚  β”‚  [ ] Review Q3 proposal    HIGH    β”‚ β”‚
β”‚  > Archive β”‚  β”‚  [ ] Update client brief   MED     β”‚ β”‚
β”‚  Calendar  β”‚  β”‚  [x] Send weekly report    DONE    β”‚ β”‚
β”‚  ────────  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚  Help      β”‚                                         β”‚
β”‚  Profile   β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚            β”‚  β”‚ MY PROJECTS  β”‚ β”‚ TEAM UPDATES      β”‚ β”‚
β”‚            β”‚  β”‚              β”‚ β”‚                   β”‚ β”‚
β”‚            β”‚  β”‚ Project A    β”‚ β”‚ Bob added 3 tasks β”‚ β”‚
β”‚            β”‚  β”‚ Project B    β”‚ β”‚ Design review @2pmβ”‚ β”‚
β”‚            β”‚  β”‚ + Join more  β”‚ β”‚ Sprint ends Fri   β”‚ β”‚
β”‚            β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Key differences between admin and user views:

AspectAdmin ViewRegular User View
NavigationOrg-wide sections (Users, Billing, Audit)Personal sections (My Tasks, My Projects)
Dashboard KPIsOrg metrics (MRR, seats, active users)Personal metrics (tasks done, deadlines)
Data scopeAll users, all teams, all dataOwn data, team data (if permitted)
Settings accessFull org configurationPersonal preferences only
ToneOperational, monitoringProductive, action-oriented

Permission-Based UI Patterns ​

There are three approaches to handling features a user does not have access to. Each has trade-offs.

PATTERN 1: HIDE
════════════════
Remove the element entirely.

Admin sees:      [Dashboard] [Users] [Settings] [Billing]
Member sees:     [Dashboard]

βœ“ Clean, uncluttered
βœ— User doesn't know the feature exists
βœ— Support confusion ("I don't see a Settings tab")


PATTERN 2: DISABLE
═══════════════════
Show the element but make it non-interactive.

Admin sees:      [Dashboard] [Users] [Settings] [Billing]
Member sees:     [Dashboard] [Users] [Settings] [Billing]
                                         ↑ grayed out, tooltip: "Admin only"

βœ“ User knows the feature exists
βœ“ Reduces support tickets
βœ— Cluttered for low-permission users


PATTERN 3: GATE WITH UPGRADE PATH
═══════════════════════════════════
Show the element, but clicking it shows an upgrade or request-access prompt.

Member clicks [Billing] β†’  "You don't have access to Billing.
                            Request access from your admin."
                            [ Request Access ]

βœ“ Discovery + conversion opportunity
βœ“ User can self-serve the request
βœ— Can feel like a bait-and-switch if overused

When to use each pattern:

PatternUse When
HideFeature is irrelevant to the role (member doesn't need audit logs)
DisableFeature is relevant but restricted (editor can see reports but not export)
GateFeature is a plan upgrade opportunity or access is commonly requested

Team Management Interfaces ​

Team management is one of the most complex UX challenges in SaaS. It touches roles, permissions, invitations, and org structure.

Invite Flow:

TEAM MANAGEMENT FLOW
=====================

Admin clicks "Invite Member"
         β”‚
         β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  INVITE NEW MEMBER              β”‚
β”‚                                 β”‚
β”‚  Email: [________________]      β”‚
β”‚                                 β”‚
β”‚  Role:  [ Manager      β–Ό ]     β”‚
β”‚                                 β”‚
β”‚  Teams: [x] Engineering         β”‚
β”‚         [ ] Marketing           β”‚
β”‚         [x] Product             β”‚
β”‚                                 β”‚
β”‚  [ Cancel ]     [ Send Invite ] β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β–Ό
  Invite email sent
         β”‚
         β–Ό
  User clicks link β†’ Sign up β†’ Lands in workspace
  with assigned role and team access

Team members list pattern:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Team Members                            [ + Invite ]    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                          β”‚
β”‚  Search: [_______________]    Filter: [All Roles β–Ό]      β”‚
β”‚                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ [AV]  Alice Vance        alice@company.co          β”‚  β”‚
β”‚  β”‚       Owner              Last active: 2 hours ago  β”‚  β”‚
β”‚  β”‚                                          [Manage β–Ό]β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚ [BK]  Bob Kim            bob@company.co            β”‚  β”‚
β”‚  β”‚       Admin              Last active: 1 day ago    β”‚  β”‚
β”‚  β”‚                                          [Manage β–Ό]β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚ [CL]  Carol Lee          carol@company.co          β”‚  β”‚
β”‚  β”‚       Editor             Last active: 5 min ago    β”‚  β”‚
β”‚  β”‚                                          [Manage β–Ό]β”‚  β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€  β”‚
β”‚  β”‚ [  ]  dave@company.co    PENDING INVITE            β”‚  β”‚
β”‚  β”‚       Manager            Sent: 3 days ago          β”‚  β”‚
β”‚  β”‚                                  [Resend] [Revoke] β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                          β”‚
β”‚  Showing 4 of 38 members              [1] [2] [3] [>]   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Role-Based Dashboards ​

Rather than one dashboard with permission checks scattered throughout, consider designing distinct dashboard experiences per role.

Decision framework:

Are your roles' daily workflows fundamentally different?
β”‚
β”œβ”€β”€ YES (e.g., admin monitors org, user does tasks)
β”‚   β”‚
β”‚   └──> Design SEPARATE dashboards per role
β”‚        Admin: /admin/dashboard
β”‚        User:  /dashboard
β”‚
└── NO (e.g., everyone works on projects, admins just see more)
    β”‚
    └──> Design ONE dashboard with CONDITIONAL sections
         Show/hide cards and sections based on permissions

Conditional dashboard sections:

SectionOwnerAdminManagerEditorViewer
Welcome + quick actionsYesYesYesYesYes
Personal task listYesYesYesYesYes
Team overviewYesYesYesNoNo
Org-wide metricsYesYesNoNoNo
Billing summaryYesNoNoNoNo
Security alertsYesYesNoNoNo
Pending invitesYesYesNoNoNo

In Practice ​

Common Patterns for Role-Based UI ​

Pattern 1: Role Indicator

Always show the user which role they currently hold. This prevents confusion, especially for users who belong to multiple workspaces with different roles.

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  [Avatar]              β”‚
β”‚  Sarah Chen            β”‚
β”‚  Admin Β· Acme Corp     β”‚   ← Role displayed clearly
β”‚  ──────────────────    β”‚
β”‚  Switch workspace      β”‚
β”‚  Profile settings      β”‚
β”‚  Log out               β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Pattern 2: Inline Permission Feedback

When a user tries an action they cannot perform, explain why inline --- do not just fail silently.

BAD:   Button is gone. User wonders why.
BAD:   "Error: Permission denied."      ← No context

GOOD:  Button is visible but grayed out.
       Tooltip: "Only Admins can export data. Contact your admin."

GOOD:  User clicks "Delete" β†’
       "You need Manager permissions to delete projects.
        [ Request Access ]"

Pattern 3: Role Switcher for Multi-Role Users

Some users hold different roles in different workspaces. A few may even have multiple roles within one workspace (rare but common in small teams where the founder is both admin and user).

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  WORKSPACES                            β”‚
β”‚                                        β”‚
β”‚  ● Acme Corp          Admin            β”‚
β”‚    acme.app.com                        β”‚
β”‚                                        β”‚
β”‚  β—‹ Side Project        Editor          β”‚
β”‚    sideproject.app.com                 β”‚
β”‚                                        β”‚
β”‚  β—‹ Client Inc          Viewer          β”‚
β”‚    client.app.com                      β”‚
β”‚                                        β”‚
β”‚  + Create new workspace                β”‚
β”‚  + Join a workspace                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Multi-Role Design Checklist ​

Use this checklist when designing any new feature.

Before Design:

  • [ ] List every role that will interact with this feature
  • [ ] For each role, define: what can they see? What can they do?
  • [ ] Identify the highest-risk permission (e.g., delete, export sensitive data)
  • [ ] Decide pattern: hide, disable, or gate for each restricted action

During Design:

  • [ ] Design the feature for the LOWEST permission role first (viewer/member)
  • [ ] Layer additional capabilities on top for higher roles
  • [ ] Design the empty/restricted state as carefully as the full state
  • [ ] Ensure role indicators are visible in relevant contexts
  • [ ] Test navigation: can each role find what they need within 2 clicks?

After Design:

  • [ ] Review with engineering to confirm permission checks match the design
  • [ ] Test with actual users of each role (not just admins)
  • [ ] Verify that permission errors surface helpful messages, not raw error codes
  • [ ] Ensure the audit log captures permission-sensitive actions (see security considerations)
  • [ ] Document which API endpoints each role can access

Common Mistakes ​

MistakeConsequencePrevention
Designing only for adminRegular users get a confusing, overpowered interfaceDesign for the lowest role first, then add layers
Hard-coding rolesAdding a new role requires touching every componentUse a permission system, not role checks (can('edit') not role === 'admin')
No escalation pathUsers with insufficient permissions hit dead endsAlways provide a "Request Access" or "Contact Admin" option
Inconsistent patternsSome features hide, some disable, some gateChoose one pattern per feature category and document it
Ignoring role transitionsWhat happens when a user is promoted or demoted?Design for role changes: cache invalidation, UI refresh, notifications
No audit trailAdmins cannot see who did whatLog every permission-sensitive action with actor, action, target, and timestamp

Key Takeaways ​

  • Roles are not just a backend concern --- they fundamentally shape the UI each user sees
  • Design for the lowest-permission role first, then layer capabilities upward
  • Choose consistently between hide, disable, and gate patterns for restricted features
  • Use permission-based checks (can('edit')) rather than role-based checks (isAdmin) in code for flexibility
  • Every restricted action should surface a helpful message explaining why and what the user can do about it
  • Team management UI (invites, role changes, member lists) is deceptively complex --- invest design time proportional to its importance

Action Items ​

RoleNext Step
🏒 OwnerDefine your product's role hierarchy. Start with 3-4 roles max --- you can always add more later.
πŸ’» DevImplement a permission system (can('action', 'resource')) rather than checking role names directly. This makes adding new roles a configuration change, not a code change.
πŸ“‹ PMCreate a permission matrix (like the one above) for your top 10 features. Share it with design and engineering before the next sprint.
🎨 DesignerAudit your current product: for each feature, what does a viewer see? If the answer is "the same as admin but broken," prioritize a role-aware redesign. Review UX patterns in Chapter 16 and ensure your role-based components use the design system from Chapter 17.

Previous: Chapter 17 --- Design System Basics | Related: Chapter 16 --- SaaS UX Principles

The Product Builder's Playbook