Notifications Were a Mess of Conflicting Models

Slack's notification system had grown organically for years, and the complexity showed. Desktop and mobile each had separate preference systems with different options and semantics—a “nothing” setting on mobile meant something entirely different from “Off” on desktop. What users were notified about was tightly coupled with how they received notifications: reducing push notifications meant losing in-app awareness entirely. Settings didn’t sync reliably across clients, and power-user controls were scattered with no clear hierarchy.

The consequences were measurable. Notifications ranked among the top three drivers of Customer Experience tickets, with users frequently unsure how to control or understand their settings. The perception of noise wasn’t just about volume—it was about not being able to confidently predict or control what would happen.

One Unified Preference Model

The rebuild centered on consolidating four conflicting preference systems into a single model with three clear channel options: All new posts, Mentions, or Mute. Push notifications got unified on/off toggles across desktop and mobile, and advanced controls—like “badge all unreads” on mobile—were redesigned and made discoverable.

Before: four paradigms. After: one unified model with three options.

The risky part was migration. Moving millions of users from “Off” to “Mentions” at the database level was deemed too dangerous for rollback, so the team used a read-time strategy instead. They introduced a new desktop_push_enabled preference as the sole driver of push notifications. Since it didn't exist before, it could be backfilled safely based on whether users had previously set their state to “off.” Read-time logic then made “off” behave as “Mentions” with pushes disabled—exactly how it already functioned, but now expressed in the new model without interrupting the experience.

// Prefs before
'desktop': everything | mentions | nothing // Push on desktop
'mobile': everything | mentions |nothing // Push on mobile

// Prefs now
'desktop': everything | mentions // Activity on desktop and mobile
'desktop_push_enabled': true | false // Push on desktop
'mobile': everything | mentions | nothing // Push on mobile

This refactor eliminated a major source of confusion: users who thought they’d disabled all notifications were still receiving in-app badges without knowing it. Now “Mentions” means exactly that, and the push toggle explicitly controls interruptions.

Separating “What” from “How”

The old notification modal required a “Save” click after every change, making experimentation unreliable. The new modal auto-saves immediately. More importantly, the redesign decoupled what to notify you about from how to receive those notifications. Users can now see all channel activity but only receive pushes for mentions—without sacrificing one for the other. Cross-platform consistency was achieved by replacing legacy mobile UI code with reusable React components.

Cleaner, more consistent modal with auto-save behavior.

Parity Between Desktop and Mobile

Achieving true state consistency across clients required rewriting some of the oldest pages in Slack’s iOS app, built before the modern architecture. Mobile now matches desktop by default, with the option to override when needed. The new preference hierarchy is explicit:

  • What to notify you about: All new messages, Mentions and DMs (default), or Mute
  • Push notifications: On desktop and mobile (default), desktop only, mobile only, or disabled
  • Advanced: Mobile-specific customization and badge controls

This table showcases all the different user preferences we ended adding/updating on the backend

This required renaming fields and refactoring client logic to store explicit desktop and mobile values, eliminating the ambiguity of a shared sync parameter. Rollback safety was built in: read-time fallbacks ensured push_enabled: false always meant no push, even during reversions.

Operational Lessons

The migration surfaced several pitfalls. A malformed field once reset preferences to Mentions until the data was cleaned and memcache flushed. The team learned that clarity beats cleverness—removing the sync parameter and storing explicit per-client values made behavior predictable.

Sustained Engagement, Not a Spike

Post-launch data showed transformative adoption. Settings engagement increased 5x and remained elevated for weeks—not a one-time curiosity but active ongoing refinement. Users immediately engaged with the decoupled desktop/mobile push toggles, and advanced visibility options like “badge every unread message” saw significant usage. The percentage of users needing per-channel overrides decreased, suggesting better defaults reduced workarounds. The vast majority chose “Mentions and DMs” as their default, while “All new messages” and “Mute” served their niche cases.

A unified notifications model across desktop and mobile.

The legacy system created noise through confusion—unpredictable settings, unreliable state sync, and hidden controls. By aligning the architecture with how users actually think about notifications, the rebuild turned Slack from a source of interruption into a tool for intentional focus. When the system matches mental models, staying informed becomes effortless.