Back to compare picker

Permission denied state vs Error state vs Empty state vs Disabled button with no explanation

Choose permission denied state when the current authenticated account lacks the role, group membership, share grant, license, policy exception, or admin approval required to view, edit, publish, export, delete, invite, approve, or manage a resource.

Learn the decision

Match the interaction to the person's task

Choose permission denied state when the current authenticated account lacks the role, group membership, share grant, license, policy exception, or admin approval required to view, edit, publish, export, delete, invite, approve, or manage a resource.

Permission denied state

Use it when: A signed-in user lacks permission to view, edit, publish, export, delete, approve, share, administer, or configure a resource.

Make this state clear: Whole-object access denied state.

Observe the result: A user opens a restricted report, sees which account is signed in, requests viewer access with a reason, then sees that the request is pending with the owner.

Study the full pattern →

Error state

Use it when: A system or task failure blocks expected content or action.

Make this state clear: Normal expected state before failure.

Observe the result: User input and filter context are preserved after failure, and retry returns to recovered content or a clear still-failed state.

Study the full pattern →

Empty state

Use it when: A next setup, creation, import, sample, or access-request action is available or explainable.

Make this state clear: First-use empty state before any objects exist.

Observe the result: Users can create the first project, import existing work, or request access depending on the actual cause.

Study the full pattern →

Disabled button with no explanation

Use it when: Use this anti-pattern entry to audit disabled submit, continue, create, save, delete, publish, invite, export, payment, and setup actions.

Make this state clear: Unavailable action state with visible reason and affected requirement.

Observe the result: Users can satisfy requirements one by one and see the action become available, or submit and receive actionable validation.

Study the full pattern →

Practice the judgment: Imagine this situation: A private report shows a generic server error and sends users into a retry loop even though the server has already returned an authorization denial. Write the person's goal, choose one of these patterns, and show the state that helps the person continue. Use the decision rules and source trail below to explain your choice.

Review the underlying principle →

Decision dimensions

Dimension Permission denied stateError stateEmpty stateDisabled button with no explanation
UI or UX UI + UX - Authorization and access-boundary stateUI + UX - Recoverable failure surfaceUI + UX - Resolved no-data content surfaceUI + UX - Blocked action anti-pattern
UI guidance Show the blocked object or action, current account, permission level, required role, owner, and request path when revealing that information is allowed.Render a persistent error region near the affected content with a specific failure heading, plain-language cause, preserved context, and recovery actions.Keep surrounding context such as table title, filters, or workspace name visible so users know exactly what is empty.Replace a lone greyed-out action with visible requirement text, a checklist, permission message, or enabled validation submit that tells users what blocks progress.
UX guidance Use permission denied state when the system knows the user is authenticated but their role, group, share, license, policy, or approval status blocks a specific object or action.Match the next action to the failure cause: retry transient failures, edit correctable input, use cached fallback for read-only continuity, or provide support reference when recovery is outside the UI.Move users toward the first useful object or prerequisite, and replace unavailable actions with permission or configuration guidance.Help users understand whether the block is missing input, invalid data, permission, quota, dependency, safety policy, or temporary processing.
Good UI A report page says Quarterly revenue report requires Finance viewer access, shows the current account, names the report owner, and offers Request access and Switch account.A failed save state keeps the draft visible and labels the support reference separately from the user-facing explanation.Permission variant explains that projects exist only after an admin grants access and offers Request access instead of Create.Create workspace is paired with visible requirements: enter a workspace name, accept billing terms, and request owner access.
Bad UI A denial page says Something went wrong and shows Retry even though the user lacks a required group.Tiny transient toast for a blocking failure.Oversized decorative art and vague welcome copy that hides the task.Disabled controls hide the only validation feedback from keyboard and assistive technology users.
Good UX A user opens a restricted report, sees which account is signed in, requests viewer access with a reason, then sees that the request is pending with the owner.User input and filter context are preserved after failure, and retry returns to recovered content or a clear still-failed state.Users can create the first project, import existing work, or request access depending on the actual cause.Users can satisfy requirements one by one and see the action become available, or submit and receive actionable validation.
Bad UX Every workspace control is disabled after one missing permission, including safe navigation and read-only tasks.Clearing work after save failure.A primary Create button is shown to a read-only user and fails after activation.Disabled controls hide the only validation feedback from keyboard and assistive technology users.
Best fit A signed-in user lacks permission to view, edit, publish, export, delete, approve, share, administer, or configure a resource.A system or task failure blocks expected content or action.A next setup, creation, import, sample, or access-request action is available or explainable.Use this anti-pattern entry to audit disabled submit, continue, create, save, delete, publish, invite, export, payment, and setup actions.
Avoid when The operation failed for network, server, validation, data, or timeout reasons after permission was granted.Nothing exists yet and the state is expected.The absence was caused by filters or search.The action remains available and returns actionable validation after activation.
Required state Whole-object access denied state.Normal expected state before failure.First-use empty state before any objects exist.Unavailable action state with visible reason and affected requirement.
Accessibility burden Move focus to the permission message when it replaces page content or blocks a workflow.Use appropriate alert or status semantics for newly appearing critical errors.Keep the message in normal reading order near the empty region it explains.Keep requirement text in normal reading order and near the unavailable action.
Common misuse Treating authorization denial as a generic retryable error.Using a transient toast for critical errors.Using marketing copy instead of a task-specific next step.Using disabled state to hide permission, quota, account lock, or system dependency problems.

Permission denied state

UI or UX
UI + UX - Authorization and access-boundary state
UI guidance
Show the blocked object or action, current account, permission level, required role, owner, and request path when revealing that information is allowed.
UX guidance
Use permission denied state when the system knows the user is authenticated but their role, group, share, license, policy, or approval status blocks a specific object or action.
Good UI
A report page says Quarterly revenue report requires Finance viewer access, shows the current account, names the report owner, and offers Request access and Switch account.
Bad UI
A denial page says Something went wrong and shows Retry even though the user lacks a required group.
Good UX
A user opens a restricted report, sees which account is signed in, requests viewer access with a reason, then sees that the request is pending with the owner.
Bad UX
Every workspace control is disabled after one missing permission, including safe navigation and read-only tasks.
Best fit
A signed-in user lacks permission to view, edit, publish, export, delete, approve, share, administer, or configure a resource.
Avoid when
The operation failed for network, server, validation, data, or timeout reasons after permission was granted.
Required state
Whole-object access denied state.
Accessibility burden
Move focus to the permission message when it replaces page content or blocks a workflow.
Common misuse
Treating authorization denial as a generic retryable error.

Error state

UI or UX
UI + UX - Recoverable failure surface
UI guidance
Render a persistent error region near the affected content with a specific failure heading, plain-language cause, preserved context, and recovery actions.
UX guidance
Match the next action to the failure cause: retry transient failures, edit correctable input, use cached fallback for read-only continuity, or provide support reference when recovery is outside the UI.
Good UI
A failed save state keeps the draft visible and labels the support reference separately from the user-facing explanation.
Bad UI
Tiny transient toast for a blocking failure.
Good UX
User input and filter context are preserved after failure, and retry returns to recovered content or a clear still-failed state.
Bad UX
Clearing work after save failure.
Best fit
A system or task failure blocks expected content or action.
Avoid when
Nothing exists yet and the state is expected.
Required state
Normal expected state before failure.
Accessibility burden
Use appropriate alert or status semantics for newly appearing critical errors.
Common misuse
Using a transient toast for critical errors.

Empty state

UI or UX
UI + UX - Resolved no-data content surface
UI guidance
Keep surrounding context such as table title, filters, or workspace name visible so users know exactly what is empty.
UX guidance
Move users toward the first useful object or prerequisite, and replace unavailable actions with permission or configuration guidance.
Good UI
Permission variant explains that projects exist only after an admin grants access and offers Request access instead of Create.
Bad UI
Oversized decorative art and vague welcome copy that hides the task.
Good UX
Users can create the first project, import existing work, or request access depending on the actual cause.
Bad UX
A primary Create button is shown to a read-only user and fails after activation.
Best fit
A next setup, creation, import, sample, or access-request action is available or explainable.
Avoid when
The absence was caused by filters or search.
Required state
First-use empty state before any objects exist.
Accessibility burden
Keep the message in normal reading order near the empty region it explains.
Common misuse
Using marketing copy instead of a task-specific next step.

Disabled button with no explanation

UI or UX
UI + UX - Blocked action anti-pattern
UI guidance
Replace a lone greyed-out action with visible requirement text, a checklist, permission message, or enabled validation submit that tells users what blocks progress.
UX guidance
Help users understand whether the block is missing input, invalid data, permission, quota, dependency, safety policy, or temporary processing.
Good UI
Create workspace is paired with visible requirements: enter a workspace name, accept billing terms, and request owner access.
Bad UI
Disabled controls hide the only validation feedback from keyboard and assistive technology users.
Good UX
Users can satisfy requirements one by one and see the action become available, or submit and receive actionable validation.
Bad UX
Disabled controls hide the only validation feedback from keyboard and assistive technology users.
Best fit
Use this anti-pattern entry to audit disabled submit, continue, create, save, delete, publish, invite, export, payment, and setup actions.
Avoid when
The action remains available and returns actionable validation after activation.
Required state
Unavailable action state with visible reason and affected requirement.
Accessibility burden
Keep requirement text in normal reading order and near the unavailable action.
Common misuse
Using disabled state to hide permission, quota, account lock, or system dependency problems.
Decision rules
  • Choose permission denied state when the current authenticated account lacks the role, group membership, share grant, license, policy exception, or admin approval required to view, edit, publish, export, delete, invite, approve, or manage a resource.
  • Choose error state when a request, load, save, payment, sync, or background job failed even though the user appears authorized to attempt the operation.
  • Choose empty state when the collection or workspace has no content yet, or when a permission-limited collection can safely say no visible items without naming a blocked object.
  • Treat disabled-button-no-explanation as an anti-pattern when a blocked action only appears as an inactive control; replace it with inline, page-level, or modal access guidance that says why the action is unavailable and what recovery exists.
  • Name the blocked object or action only when policy allows the user to know it exists; otherwise use a no-disclosure access message that avoids leaking titles, owners, counts, or paths.
  • State the current account, team, role, or permission level when that helps users self-correct, such as switching accounts or requesting editor access instead of viewer access.
  • Provide a concrete recovery path such as request access, contact owner, switch account, join team, use read-only view, return to allowed area, or open an access request status.
  • Show request outcomes separately from the denial: sent, pending, approved, declined, expired, owner unavailable, or blocked by organization policy.
Inspect live examples
Failure modes
  • A private report shows a generic server error and sends users into a retry loop even though the server has already returned an authorization denial.
  • A known document is presented as an empty folder, so the user cannot request access or check whether they are signed into the wrong account.
  • A publish button is disabled without naming the missing Admin role or offering an owner-assisted path.
  • A denial page leaks the confidential document title to a user who should not know that the document exists.
  • A request access form submits but never shows whether the owner received, approved, declined, or left the request pending.
  • A user with viewer access loses the safe read-only view when only the edit action should be blocked.

Saved items