| UI or UX | UI + UX - User-controlled rules for notification type, channel, frequency, timing, privacy, and exceptions | UI + UX - Dedicated user or app configuration management surface | UI + UX - Durable user-opened notification history and action drawer | UI + UX - Per-object opt-in control for future updates from a thread, page, channel, space, repository, saved view, or topic | UI + UX - Catch-up stream of recent collaboration and work events with actor, verb, object, type, destination, and triage controls | UI + UX - Transient non-modal status message | UI + UX - Inline recipient reference with autocomplete, stable recipient identity, notification routing, access checks, and broad-audience safeguards | UI + UX - Authorization and access-boundary state |
| UI guidance | Render notification preferences as a structured matrix or grouped settings surface that shows notification type, source, delivery channel, device, frequency, quiet-time rule, preview privacy, override, and current saved state. | Render settings management as a durable configuration surface with a clear Settings or Preferences entry point, grouped categories, current values, setting descriptions, ownership or scope labels, dependencies, save or immediate-apply behavior, status feedback, search or section navigation for larger sets, and reset or restore defaults where appropriate. | Provide a persistent notification entry point, usually a bell or inbox control, with a count that represents new unseen notifications rather than every unread item forever. | Render follow or subscribe as a stateful control attached to the specific object being watched, with current state, target scope, delivery destination, event types, auto-follow reason when present, and an unfollow path. | Render activity feed as a typed event stream where each item names the actor or source app, action, object, workspace or channel, timestamp, preview, event type, read or cleared state when supported, and a stable destination for follow-up. | Render toast notifications in a consistent non-modal region with short status text, clear severity, an optional close control, and at most one concise action. | Render mentions as inline tokens or highlighted text that preserve a stable recipient identity, display name, avatar or team marker, recipient type, and selected state without breaking surrounding editable text. | 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 notification preferences when users need to reduce noise without missing important mentions, assignments, security notices, incidents, reminders, or followed-object updates. | Use settings management when users need to review and change persistent app, account, workspace, notification, privacy, display, integration, or system behavior outside the immediate task flow. | Use a notification center when users receive enough asynchronous system or collaboration updates that they need a durable place to review, triage, and act later. | Use follow / subscribe when users want future changes to a specific object, channel, thread, repository, page, space, saved view, or topic to come to them without repeatedly checking it. | Use activity feed when users need to catch up on recent work or collaboration activity across channels, projects, repositories, tasks, apps, or people without opening every underlying object. | Use toast notifications for low-risk, short-lived feedback after an action completes or background work changes state without requiring the user to stop the current task. | Use mentions when a user needs to call attention to a person, team, channel, role, or group from inside a message, comment, task, document, issue, or thread while keeping the reference embedded in the authored content. | 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 notification preferences page groups Mentions, Assigned work, Followed threads, Security, Digest, and Marketing, with columns for In-app, Email, Push, Banner, and Digest frequency. | A notification settings page groups channels, quiet hours, digest frequency, and workspace scope; each row shows current value, effect, dependency, and whether changes save immediately. | A bell opens a drawer with Unread and All filters, showing comment mentions, approval requests, export results, and background-job failures in newest-first order. | A thread header shows Following, explains replies will appear in the followed-threads list and Activity feed, and offers Unfollow replies from the same menu. | A team activity feed shows Priya mentioned you in #refunds, Build bot marked release-128 failed, Maya reacted to your handoff note, and Rahul merged PR #742, each with icon, timestamp, preview, type filter, and Open action. | Export started appears in the top notification region with a timestamp, close control, and View jobs action that remains available in activity history. | A comment composer opens a suggestion list after @, shows people and teams with avatars, handles, access labels, and keyboard focus, then inserts a mention chip for Priya Rao. | 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 single Notifications off switch disables email, push, badges, and mention banners without saying whether security alerts or approvals still arrive. | A page called Settings mixes billing invoices, destructive account deletion, onboarding tips, profile setup, search results, and global navigation with no grouping or save model. | A red badge says 42 forever because opening the drawer, reading items, and viewing related work never update the count. | A Subscribe button changes to Subscribed without saying whether the user subscribed to a page, all child pages, a space, email, push, or in-app updates. | A page titled Activity shows Update happened cards with no actor, object, type, timestamp, or destination. | Five unrelated toasts pile up over the Save and Continue controls. | The editor highlights every @word as a mention even when it is plain text and has no recipient identity. | A denial page says Something went wrong and shows Retry even though the user lacks a required group. |
| Good UX | A user keeps mentions and assigned-work banners on, moves repository watch updates to daily digest, mutes marketing email, and sees a preview of what will still notify them during quiet hours. | A user turns off weekly digest emails, sees the setting save immediately, keeps urgent security emails enabled, and understands the workspace-level override. | Opening the notification drawer clears the new-notification badge while unread items remain available for later triage. | A user follows a support thread before leaving for a meeting, receives only new replies in the promised destination, then unfollows when the incident closes. | A user filters Activity to mentions and replies, answers one thread inline, clears low-value reactions, saves a custom view for VIPs, and opens a deployment failure in the source app. | A completed archive action shows a short toast and a specific Undo action because the prior state can be restored. | A user mentions @Dana in a private incident note, sees that Dana lacks access, chooses Invite and mention, and the resulting notification opens the exact note. | 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 | A user disables email for a noisy project and still receives duplicate push and desktop banners because those channels live in separate hidden settings. | A user changes a privacy setting thinking it affects only one project, but the value applies to the whole account. | A payment failure that blocks the current checkout is only stored in the notification center and never appears in the task. | A user receives a stream of update emails from a space but cannot tell which page, mention, reply, or watch setting caused them. | A user clears a notification in Activity but the notification center badge stays out of sync and the same event reappears as unread. | Every autosave tick triggers a toast, training users to ignore real status changes. | A user mentions someone in a private channel, the person is not notified, and the sender receives no warning or recovery path. | The app returns a blank screen for a restricted file, so the user cannot tell whether the file is gone, private, or opened with the wrong account. |
| Best fit | Users receive enough notifications that they need control over type, channel, device, frequency, timing, or source. | Users need to inspect and change persistent app, account, workspace, privacy, notification, display, integration, device, or system behavior. | Users receive multiple asynchronous updates across objects, jobs, collaborators, approvals, or reminders. | Users need future updates from a specific object, thread, channel, space, repository, topic, saved view, or query. | Users need to catch up on recent collaboration, app, repository, channel, project, meeting, reminder, or task activity. | Use for short non-blocking confirmation after explicit actions such as save, copy, send, archive, invite, or queue export. | Composed content needs to target people or groups inline. | A signed-in user lacks permission to view, edit, publish, export, delete, approve, share, administer, or configure a resource. |
| Avoid when | The product has only a few low-volume notifications that can be handled by defaults and inline controls. | The task is a one-time transaction, submission, setup wizard, or onboarding flow. | The product has only occasional current-action feedback that a toast or inline status can handle. | The user only needs quick return access without updates. | The surface is primarily content consumption, media browsing, or article-like stream reading. | The message is the only recovery path for a blocking or high-consequence failure. | The user is selecting a structured owner, assignee, approver, or recipient field outside written content. | The user is not signed in and the next step is authentication rather than authorization. |
| Required state | Default notification preferences state. | Settings overview with categories and current values | Closed entry-point state with zero, new-unseen, and unread-but-seen counts. | Not following state. | Default feed state with actor, verb, object, timestamp, source, type icon, preview, scope, and destination for each activity item. | Idle state with no visible toast and a reachable status or history region when applicable. | Empty composer, @ trigger, loading suggestions, no results, and filtered suggestions. | Whole-object access denied state. |
| Accessibility burden | Group preferences with headings and fieldsets for event type, delivery channel, device, and frequency. | Use headings, section labels, fieldsets, and persistent labels so settings groups and controls have clear programmatic names. | Give the entry-point control an accessible name that includes new or unread count without relying only on a red dot. | Give the control an accessible name that includes target type, target name, current follow state, and destination when space allows. | Give the activity feed a heading and expose the current filter, layout, and unread or cleared state in text. | Expose the toast as a status or alert message according to urgency so assistive technologies can announce it without requiring focus movement. | Expose the suggestion list as a labelled popup tied to the editor and announce the number of available mention targets. | Use a heading that identifies the access boundary and a text description that does not rely on lock icons or red color alone. |
| Common misuse | Offering one master notification switch for a complex collaboration product. | Using settings as a dumping ground for unrelated navigation, billing, help, profile setup, onboarding, or destructive account actions. | Treating the badge count, unread count, and total notification count as one number. | Using Follow as a bookmark with no future update delivery. | Using activity feed as an audit log without evidence fields, export, or retention guarantees. | Using a toast as the only feedback for payment, save, permission, upload, or security failures. | Parsing @words after submit without requiring the sender to choose a real recipient. | Treating authorization denial as a generic retryable error. |