The notifications settings panel had become a junk drawer. Slack OAuth with a connect/disconnect flow. A channel selector dropdown. A legacy webhook URL field. An email body textarea for customizing order emails. A multi-select for choosing which events trigger notifications. All crammed into one card, serving different purposes at different levels of abstraction, requiring different mental models to understand.
It got replaced with a grid.
Four rows: New Lead, Quote Sent, Sale, Status Change. Two columns: Email, SMS. Each cell is a toggle switch. On or off. The entire notification preference surface reduced to eight binary decisions. Half the code, twice as useful.
The Slack integration panel disappeared from the UI but not from the codebase. The service, the routes, the controller, the OAuth flow — all still functional, just not presented. Removing UI is not removing capability. Sometimes a feature needs to go quiet while you figure out whether it's earning its complexity.
SMS notifications were new. A sms_notification column on the tenant settings table, stored as a comma-delimited string and exploded to an array on read — matching the pattern every other notification field already uses. The settings store gained smsNotification: [] alongside the existing email preferences. Toggle helpers in the component handle the difference between the two formats: email notifications use {title, value} objects (a legacy shape), SMS notifications use plain strings. Two formats, one grid, same mental model for the user.
The old panel asked users to understand OAuth, webhooks, event types, and email templates. The new one asks them to answer a question they already know the answer to: when this happens, do you want to know about it, and how?