How to Design Roles and Permissions in SaaS

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.

Read More