
A project manager opens a request, checks the details, and looks for the approval button. It is missing. A colleague can see it. An administrator suggests trying another browser.
The interface has turned an access rule into a support problem.
Roles and permissions shape everyday work in SaaS products. They determine which records people can find, which fields they can change, and who can move a task forward. When those rules are unclear, users cannot tell whether they lack access, missed a step, or encountered a broken feature.
To design roles and permissions in SaaS, define the action, the records it applies to, and the conditions that allow it. Then specify the interface behavior for both allowed and restricted states. A permission matrix becomes useful when every rule leads to a predictable screen, message, and next step.
For Dworkz, this connects directly to the work of designing complex B2B products: making operational rules understandable at the moment someone needs to act.
Start with responsibilities and workflows
A list of Admin, Manager, and Member roles is a starting point. It does not explain how the product should behave.
Consider a purchase-request application. One person prepares a request, another reviews it, and a third manages user access. Those responsibilities raise different questions:
Who can see requests across departments?
Who can change a draft?
Can an approver change the request they are reviewing?
Can someone approve their own submission?
What happens when a request is returned for changes?
Does managing accounts grant access to business records?
Map the workflow before deciding what each role includes. Identify who creates the work, who owns it, who reviews it, and what happens when it moves between them.
This prevents a common design mistake: giving users broad permissions because a narrower workflow has never been defined.
Separate roles from permissions and scope
A role groups permissions around a responsibility. A permission authorizes a particular action. Scope identifies where that permission applies.
In role-based access control, or RBAC, permissions are associated with roles, and users receive authorized role assignments. NIST also describes constraints that can limit which combinations of responsibilities a user may exercise. NIST’s RBAC overview provides the underlying model.
For product design, use four questions:
Element | Question | Purchase request example |
|---|---|---|
Role | What responsibility does this person have? | Requester or Approver |
Action | What can they do? | View, edit, submit, approve |
Scope | Which records does this apply to? | Own requests or assigned departments |
Conditions | When is the action available? | Draft status, approval limit, different submitter |
“Approvers can approve requests” is incomplete.
“Approvers can approve submitted requests in their assigned departments, within their approval limit, provided they did not submit the request” is a rule that design and engineering can implement together.
Avoid creating a separate role for every department, amount threshold, or ownership exception. Reusable roles can be combined with record attributes and relationships. The implementation may use role-based, attribute-based, or relationship-based controls; the interface still needs to explain the resulting access clearly.
How to build a SaaS permission matrix
The following matrix describes an illustrative purchase-request product. It is a design example, not a Dworkz client implementation.
The roles are:
Observer: monitors requests in assigned departments.
Requester: creates and maintains their own requests.
Approver: reviews submitted requests in assigned departments.
Access administrator: manages role assignments and department scope.
All access remains within the active organization. “Assigned departments” means the departments explicitly included in that user’s access.
Action | Observer | Requester | Approver | Access administrator |
|---|---|---|---|---|
View requests | Assigned departments | Own requests | Assigned departments | No business-record access from this role |
Create a request | No | Yes, in an authorized department | No | No |
Edit request details | No | Own drafts or returned requests | No | No |
Submit for approval | No | Own complete drafts or returned requests | No | No |
Approve or return | No | No | Submitted requests in scope and within approval limit; never own submissions | No |
Manage access | No | No | No | Assign permitted roles and scope within delegated authority |
This model deliberately separates access administration from business approval. A person who manages accounts does not automatically gain permission to approve purchases.
A person may hold more than one role. In this example, applicable grants combine, while organization boundaries and the prohibition on self-approval still apply. A Requester who is also an Approver can create requests and review other people’s requests. They cannot approve their own.
Document this combination rule explicitly. Otherwise, designers may assume the strictest role wins while engineers implement the union of all permissions.
The matrix is also bounded. Exporting, deleting, sharing, and viewing sensitive fields require their own decisions. Permission to view a request should not silently authorize every action available around it.
Map permissions to interface behavior
A permission matrix records policy. An interface specification describes how users experience that policy.
For each meaningful rule, define the visible content, available controls, explanation, and recovery path.
Situation | Interface behavior | Example message or action |
|---|---|---|
User can view but cannot edit | Show readable details and status; omit editing tools | “View only. You can review this request but cannot change it.” |
Requester can edit their draft | Show editable fields, Save draft, and Submit for approval | “Draft. Only you can edit this request.” |
Requester opens their submitted request | Show readable details and a workflow explanation | “Submitted for approval. Details are locked during review.” |
Eligible approver opens a submitted request | Show review information and decision controls | “Approve request” and “Return for changes” |
Approver opens their own submission | Show the review context and explain the restriction | “Another approver must review requests you submit.” |
User follows a link to an inaccessible request | Show a safe access state without protected record details | “This request is unavailable or you don’t have access.” |
Access changes during editing | Stop the prohibited action and explain what happened | “Your editing access changed. Your latest changes were not saved.” |
The distinction between the third and fifth rows matters. One action is blocked by workflow state; the other is blocked by a responsibility rule. Sending both users to an administrator would misdiagnose the problem.
Design view-only access in SaaS
View permission should produce a useful screen.
An Observer opening a request might need its purpose, amount, owner, status, and decision history. Present those details as readable content. A page filled with disabled input fields makes information harder to scan and implies that editing is the expected way to use the screen.
Keep text legible. Preserve navigation, filtering, sorting, and links to other records the user may access. Remove editing affordances that add no value.
Be precise about what “view” includes. Access to a request does not necessarily include confidential attachments or every field. Define any narrower permissions before designing the layout.
If a restricted field’s existence may be disclosed, a label such as “Restricted information” can explain the gap. If even its existence is sensitive, omit the field and its value entirely.
Example: An Observer can read a request’s business purpose and status. They cannot open a confidential attachment. The interface either explains the attachment restriction or omits the attachment, according to the disclosure policy.
Never send a protected value to the browser and merely cover it with a visual mask. OWASP recommends enforcing authorization in trusted application layers and checking permissions on every request; hiding a control is not an access boundary. OWASP Authorization Cheat Sheet
Design edit permissions around ownership and workflow
“Can edit” rarely means “can edit everything at any time.”
In the example product, Requesters can edit their own requests while those requests are Draft or Returned. Submission locks the details while an Approver reviews them.
That gives the same person three different experiences:
Request state | Requester experience | Relevant next step |
|---|---|---|
Draft | Editable form with save and submit controls | Complete required information and submit |
Submitted | Readable details with a review status | Wait for the decision |
Returned | Editable form with the reviewer’s reason | Revise and resubmit |
Do not describe a submitted request as “You don’t have permission to edit.” That suggests a role assignment could fix the problem.
Use the actual reason:
This request is being reviewed. Details are locked after submission. If changes are needed, the approver can return it for revision.
If the product supports withdrawal, specify who can withdraw a request and when. Do not add a convenient Withdraw button without defining its effect on pending reviews and notifications.
Also decide which fields become editable after a return. Changing a description may have different consequences from changing the department, requester, or amount.
Design approval permissions and review flows
Approval deserves its own permission and interaction design.
Editing changes the request. Approval records a decision about a particular version of that request. Combining these into a broad “Manage” permission obscures who is accountable for what.
An approval screen should answer:
What am I approving?
Which version am I reviewing?
What changed since the previous submission?
Is this within my authority?
What happens after I confirm?
For an eligible Approver, a confirmation might read:
Approve request PR-1048 for $8,400? This records your approval of the current request version and moves it to Approved. Approve request · Cancel
In this example, approval does not initiate payment. If a real product triggers payment, publication, provisioning, or another consequential action, say so explicitly.
For a request above the approver’s limit, explain the route forward:
This request exceeds your approval limit. A reviewer with a higher limit must approve it.
Only show “Route to another approver” if the user has that capability and the workflow supports it.
For someone reviewing their own submission:
Another approver must review this request. You cannot approve requests you submit.
These messages explain the rule without asking users to decode a permission code.
The system also needs to protect against stale decisions. If another person changes or processes the request while the approval screen is open, recheck its status and version before recording approval. Ask the reviewer to inspect the updated request when necessary.
When to hide, disable, or show read-only controls
There is no universal rule that unavailable actions should always be hidden or always be disabled. Choose based on relevance, discoverability, and what may safely be disclosed.
Treatment | Use it when | Example |
|---|---|---|
Hidden | The action is irrelevant to the role or would reveal protected capabilities | Omit access-management navigation for an Observer |
Disabled with an explanation | The action is relevant and a clear condition blocks it | Show approval as unavailable on the approver’s own submission |
Read only | The information is useful and visible, but changes are prohibited | Show submitted request details as readable content |
Access-restricted page | The user reaches a resource they cannot open | Explain the access limitation without exposing the record |
Pending access state | An access request exists and is awaiting a decision | Show its status instead of offering repeated submissions |
A disabled control needs an explanation users can actually reach. Put essential information in visible text or an accessible help element. Do not rely only on a hover tooltip attached to a disabled button.
Keep different causes distinct:
Permission: “Your role cannot edit requests.”
Scope: “You don’t have access to this department.”
Workflow: “This request has already been approved.”
Validation: “Add a business purpose before submitting.”
Plan availability: “Custom approval routing is not included in this plan.”
The appropriate next step differs in each case. An upgrade prompt will not resolve a missing role. A permission request will not fix incomplete form data.
Where revealing the specific cause would expose protected information, use a less specific message.
Give restricted states a practical next step
“Access denied” ends the interaction without helping the user recover.
Where policy allows, explain the limitation and offer an appropriate route: return to the request list, switch to an organization the user belongs to, or request a specific access grant.
An access-request flow should identify the capability and scope being requested. “Request permission to edit Marketing requests” is more useful than “Request more access.”
Show where the request goes, whether a reason is required, and what happens after submission. Once sent, display a pending state. Approval of the access request should update the relevant interface.
Offer this path only where access can actually be requested. Do not display it for another organization’s private record or imply that every restriction is negotiable.
Distinguish an empty list from a restricted one as well. “No requests in your assigned departments” communicates the visible scope. “No requests exist” makes a broader claim the application may not be authorized to support.
Apply permissions to tables search and bulk actions
Permissions affect more than detail pages.
A saved view should preserve filters and presentation preferences; opening it must still respect the viewer’s current access. Sharing a view should not silently grant access to the records behind it.
Search results, autocomplete, dashboard totals, exports, and notifications need their own disclosure rules. A hidden record can still be exposed through a title, count, attachment name, or email preview.
Bulk actions require particular care because selected records may have different eligibility.
Suppose an Approver selects ten visible requests. Six are eligible, two are their own submissions, one exceeds their limit, and one has already been approved.
A useful interface could say:
6 of 10 selected requests can be approved. Two are your submissions, one exceeds your limit, and one is already approved. Review 6 eligible requests
This example assumes those reasons are safe to reveal because the user can already view the records.
Define whether the operation processes eligible records or requires the entire selection to qualify. Never silently drop ineligible records. Show the exact scope before confirmation and the outcome afterward.
If a request changes during processing, report that result separately. The selection summary is a preview, not a guarantee that every action will still be allowed.
Make access administration understandable
Administrators need to understand the consequences of assigning a role.
Replace vague descriptions such as “Full access” with specific summaries:
Approver Can view requests in assigned departments and approve submitted requests within an assigned limit. Cannot edit request details or approve their own submissions.
Show role, scope, and conditions together. An Approver role without a department or approval limit may be incomplete.
Where access comes from multiple sources, explain the effective result:
“Can approve Marketing requests up to $10,000 through the Department Approvers group.”
Before changing a shared role, show who will be affected. Before removing an approver, identify pending work that may need reassignment.
Constrain delegation too. An access administrator should only grant permissions within their authority. Sensitive business-role assignments may require a separate approval policy.
Turn the matrix into design and QA acceptance criteria
A permission matrix should travel with the interface specification and test scenarios.
For each important capability, document the allowed state, the denied state, and the transition between them.
Test scenario | Expected interface | Expected system behavior |
|---|---|---|
Requester opens their draft | Editable fields and submission controls | Permit authorized updates |
Requester opens someone else’s request without another grant | Safe restricted state | Return no protected record data |
Requester opens their submitted request | Readable details and review explanation | Reject edits while submitted |
Approver opens an eligible request | Decision controls and review context | Recheck scope, status, limit, submitter, and version |
Approver opens their own submission | Explain why approval is unavailable | Reject self-approval |
Access is revoked while a form is open | Explain that the action can no longer be completed | Reject the unauthorized write |
User switches organizations | Show the new organization’s authorized context | Prevent access across organization boundaries |
Test direct links and application requests as well as visible controls. OWASP recommends denying access by default and validating authorization on every request, including requests that bypass the interface.
If a save fails because edit permission changed, preserve unsaved work only where policy still permits it. Revoked viewing access may require clearing protected content rather than keeping a local copy.
Keep the matrix current when workflows change. A new status, sharing feature, or export action can introduce access decisions that the original design never addressed.
Measure whether users understand access
A permission model can be technically correct and still create daily confusion.
In usability testing, ask people to explain what they can do before they act:
“Can you change this request?” “Why is approval unavailable?” “What would you do to get access?” “Which records will this bulk action affect?”
Track task completion by role, failed-action reasons, access-related support requests, and delays caused by unclear ownership or review routes.
Do not treat every denied action as a usability failure. Some restrictions are intentional and necessary. Look for cases where users cannot understand the reason or identify the next legitimate step.
Make permissions part of the product experience
The most useful permission matrix connects responsibility to behavior. It tells the team who can act, which records are in scope, what conditions apply, and what the interface should communicate when an action is unavailable.
Start with one important workflow. Define view, edit, and approve separately. Design the restricted states alongside the successful ones. Then verify that the implemented behavior matches the rules.
Dworkz is a San Francisco–based UI/UX design and development firm helping B2B SaaS teams make complex products easier to use. If roles, approvals, and access rules are making everyday work harder, let’s talk about designing a clearer experience.
FAQ
What is a permission matrix in SaaS?
A permission matrix maps roles to actions on resources. For product design, it should also capture scope and conditions, such as ownership, department, workflow status, and approval limits.
What is the difference between a role and a permission?
A permission allows a specific action, such as viewing a request or approving it. A role groups permissions around a responsibility. The same role may apply within different scopes, such as one project or department.
Should restricted actions be hidden or disabled?
Hide actions that are irrelevant or should not be disclosed. Show an unavailable action with an accessible explanation when users benefit from understanding the restriction. Use a readable view when access to information is allowed, but editing is not.
Should administrators automatically have access to everything?
Define administrative authority explicitly. Managing users, reading business records, changing sensitive settings, and approving transactions are separate capabilities. Combine them only when the organization’s operating model calls for it.
How do permissions interact with workflow states?
A user may have permission to perform an action only in certain states. A Requester may edit a draft but lose that ability after submission. The interface should explain the state-related restriction rather than suggest the user needs a different role.
Is hiding a button enough to enforce permissions?
No. Hidden or disabled controls communicate what users can do. The application must independently enforce authorization when data is requested or an action is attempted.


