title: Slack Notifications 2.0 type: system created: 2026-04-24 updated: 2026-04-24 tags: [slack, notifications, preferences, preference-system, user-settings, cross-platform, desktop, mobile, read-time-translation, schema-decoupling] sources: [2026-03-19-slack-how-slack-rebuilt-notifications] related: companies/slack, concepts/read-time-preference-translation, concepts/preference-schema-decoupling, concepts/cross-platform-preference-parity, patterns/read-time-schema-translation, patterns/decouple-what-from-how-in-preferences, patterns/unified-preference-model-for-cross-client-state
Slack Notifications 2.0¶
Slack Notifications 2.0 is the internal name for the rebuild of Slack's notification-preference system, shipped without a disruptive database-level migration via a read-time translation layer mapping legacy preference values to new-world semantics. Canonicalised in the 2026-03-19 Slack Engineering post How Slack Rebuilt Notifications.
Legacy state (before)¶
Four conflicting preference axes across clients:
'desktop': everything | mentions | nothing // Push on desktop
'mobile': everything | mentions | nothing // Push on mobile
Each axis conflated content selection (what to notify about) with delivery channel (push on/off) into a single enum. "A 'nothing' setting on mobile meant something entirely different from 'Off' on desktop." Settings did not reliably sync across clients; advanced controls were scattered across multiple menus.
New state (after)¶
Three preferences with orthogonal axes:
'desktop': everything | mentions // Activity on desktop and mobile
'desktop_push_enabled': true | false // Push on desktop
'mobile': everything | mentions | nothing // Push on mobile
- Activity (in-app badges, counts) is consistent across
clients — driven by
desktop. - Push is independently controllable per platform via
desktop_push_enabled(desktop) andmobile(mobile). - Advanced controls (mobile-specific badges like "badge all unreads") live in a dedicated hierarchy level and no longer compete with primary preferences for discovery.
User-facing hierarchy¶
What to notify you about: All new messages
Mentions and DMs (default)
Mute
Push notifications: desktop and mobile (default)
desktop only
mobile only
disabled
Advanced: mobile-specific customization
badge controls
Migration architecture¶
The load-bearing decision: no database-level migration. Slack explicitly rejected "move everyone from 'off' to 'mentions' at the database level" on rollback-safety grounds and chose a read-time translation approach instead (patterns/read-time-schema-translation).
- Additive write: a new
desktop_push_enabledboolean preference is introduced. Every existing user is backfilled based on whether they previously haddesktop: 'off'— these users getdesktop_push_enabled: false; everyone else getsdesktop_push_enabled: true. This is write-once, no user-visible change, and fully reversible because the legacydesktopvalue is untouched. - Read-time translation: at every read site, the
legacy
desktop: 'off'value is interpreted asdesktop: 'mentions'+desktop_push_enabled: false— exactly the behaviour "as it functions today." The new-world code never has to special-case "off" because the translator returns clean unified values. - Fallback guarantee: "
push_enabled: falsealways means 'no push,' even during rollbacks." The translator is the safety net for version skew between clients and between client/server — in-flight rollbacks don't reset users' push status.
Cross-platform parity¶
Mobile (iOS + Android) was rewritten to match desktop structurally and visually. Slack re-platformed "some of the oldest pages in Slack's iOS app — built before our modern architecture" specifically to support the new shared preference hierarchy. The post cites React-based "reusable React components" replacing legacy mobile-specific UI code in the modal — same schema, same structure, same copy across platforms.
Modal UX¶
Auto-save replaces the legacy save-button pattern. "Users would configure settings, forget to save, and wonder why nothing changed." With auto-save + decoupled activity/push, the user can freely explore the space ("Want to see all activity but only get pushed for mentions?") without incurring a "did my change take effect?" support ticket.
Data integrity failure mode (disclosed)¶
Slack discloses one production incident during the migration: "A malformed field once reset preferences to Mentions until we cleaned data and flushed memcache." Resolution was data cleanup plus memcache flush. Surfaces a preference-system failure shape relevant to any heavily-cached user-setting store: thin validation + aggressive caching + default-value fallback can compound into a silent preferences-reset event affecting many users simultaneously.
Results (disclosed)¶
- Settings-page engagement 5× increase post-launch, sustained for weeks — framed as ongoing active preference refinement, not one-time curiosity.
- Support burden decreased significantly on notification tickets (specifically the "why am I getting notifications?" / "how do I turn off mobile push?" categories).
- Push-toggle adoption "higher than expected" — decoupled desktop/mobile push controls drove immediate user uptake.
- Majority of users chose
Mentions and DMsas default post-migration;All new messagesandMuteserved niche use cases. - Fewer per-channel overrides needed post-launch — better global defaults pushed users away from per-channel customisation as a workaround.
What's not disclosed¶
- Absolute user count migrated; rollout cadence and region staging.
- Where the read-time translator lives (server? client? both?); client-version-skew handling.
- Which storage backend the preferences sit in; caching architecture beyond the memcache flush reference.
- Data-integrity incident root cause (which field was malformed, detection latency, scope of affected users, what validation was added afterwards).
- Rollback window: is
desktop: 'off'still a valid stored value, or has it been opportunistically migrated on subsequent writes? - Post-launch CX-ticket quantitative delta.
Related¶
- concepts/read-time-preference-translation — the canonical concept.
- concepts/preference-schema-decoupling — the what/how split.
- concepts/cross-platform-preference-parity — the unified-across-clients framing.
- concepts/mental-model-preference-coherence — the storage-schema-matches-user-intuition discipline.
- concepts/support-burden-as-architecture-signal — the top-3-CX-ticket-driver diagnostic.
- concepts/explicit-state-over-implicit-sync — removing
the legacy
syncparameter. - patterns/read-time-schema-translation — the migration pattern.
- patterns/decouple-what-from-how-in-preferences — the schema pattern.
- patterns/unified-preference-model-for-cross-client-state — the cross-platform pattern.
- patterns/expand-migrate-contract — canonical six-step schema migration; Slack's approach is a variant where the "migrate" step is effectively deferred indefinitely and translation at reads is the permanent answer.
- companies/slack — the owning company.