← Back to work
Case 04 · Enterprise systems

Settings nobody revisits until something goes wrong.

Deciding who gets told when a data sync finishes or fails. Configured once, forgotten immediately, and only noticed when an import breaks and the wrong person, or nobody, hears about it.

Work shown with enterprise-identifying details removed. Product name and interface are my own; original assets are not shown.

Role
UX/UI Designer
Users
District IT administrators
Tools
Figma, Claude prototyping, React
Status
Shipped to production
The context

The alerts are the monitoring.

A roster sync runs on a schedule, often overnight, and moves thousands of student and staff records into downstream systems. Nobody watches it happen. The notification email is the entire monitoring layer for most districts, because there is no operations team sitting in front of a dashboard at 3am.

Which means this settings page is not a preferences panel. It decides whether a failure gets noticed.

The problem

Two opposite failures, one screen.

Get it too quiet and an import fails silently. Nobody finds out until a teacher reports a missing roster days later, by which point the bad data has propagated downstream.

Get it too loud and every administrator receives a success email every single night. Within two weeks those messages are filtered into a folder nobody opens, which produces exactly the same outcome as having no notifications at all, except everyone believes they are covered.

A muted alert and a missing alert fail identically. Only one of them looks configured.
What the settings had to make answerable
  • If tonight's import fails, who actually finds out?
  • What is this specific person receiving, and is it more than they need?
  • Who is covering system events as opposed to import events?
  • What happens if this person leaves the district?
The prior settings screen is described from memory rather than shown. The original interface is not reproduced here.
The real design problem

Organize by person, or by event?

Both are legitimate and they answer different questions. A list organized by event answers coverage: who is subscribed to import failures? A list organized by person answers accountability: what is this administrator getting?

You cannot lead with both. Whichever you choose, the other question becomes harder to ask.

The design

People first, with a way back to events.

One
A roster of people, not a matrix of checkboxes
The page is a list of recipients. This matches how the settings actually get changed: someone joins the team, someone leaves, someone complains about the volume. Those are all person-shaped events, and a person-shaped list makes each of them a single row to find.
Two
Collapsed rows that still say something
Each row carries a summary of what that person receives, so the whole roster is scannable without opening anything. A recipient configured to receive nothing says so explicitly rather than looking identical to one who is fully covered.
SystemImportImport · completedNo notifications
Three
A type filter as the way back
Filtering the roster by notification type recovers the coverage question the person-first structure gave up. Filter to import notifications and the list becomes exactly the people who will hear about tonight's run. The primary organization stays person-shaped; the event view is one control away.
Four
Grouping that follows the event source
Preferences nest by where the event comes from, system versus import, with the noisier import events collapsed one level deeper. The events most likely to be over-subscribed require one more deliberate action to turn on.
Design principle at work
When two organizing structures both have a claim, pick the one that matches how the settings get edited, and make the other one a filter. Editing happens far more often than auditing.
The recipient list with summary pills on collapsed rows and one row expanded to its preferences

Collapsed rows summarize coverage; expanding one shows the individual preferences behind that summary.

The part that matters most

Every toggle says what will actually arrive.

A toggle labeled "import communications" tells an administrator nothing about what lands in their inbox or how often. Configuration screens are where wrong assumptions survive longest, because nothing contradicts them until an incident does.

So each preference carries an explanation of what triggers the email and what it contains. Not what the setting is called, what the setting does.

What each explanation has to answer
  • What event sends this
  • How often that happens
  • What is inside the message when it arrives
  • Whether it needs someone to act

That last one is the distinction that changes behavior. An import-completed email is a receipt. An import-failed email is a request for action. Naming the difference at the point of configuration is what lets someone subscribe to the second without drowning in the first.

Try it

The settings, rebuilt and interactive.

I rebuilt this as a standalone prototype with fictional records, embedded below. Add a recipient and watch the summary pill change as you toggle preferences, then filter by notification type to see the coverage view.

Sample data is fictional. Interface rebuilt from scratch in my own design system. Open full screen ↗
The decision

Why person-first won.

Organizing by event would have made coverage auditing the default view, which is arguably the more important question. It would also have made routine edits, adding a new hire or removing someone who left, into a hunt across several event groups.

Person-first won because editing is the frequent task and auditing is the rare one. Someone joins or leaves every few weeks. Someone audits coverage once a year, usually after an incident. Optimizing the layout for the rare task would have taxed every routine edit, and the type filter recovers the audit view in one control.

Impact

Shipped, and in daily use.

The settings are in production. Administrators can see at a glance who is covered, adjust an individual without touching anyone else, and filter the roster to confirm somebody will hear about a failed run before it happens rather than after.

What I learned

Quiet screens carry loud consequences.

Lesson 01
A summary on a collapsed row is worth more than a tidy list.
Rows that say what they contain make the whole roster auditable without a single click. Rows that only show an address make you open every one.
Lesson 02
Name the consequence, not the setting.
Explaining what arrives, how often, and whether it needs action is what lets someone subscribe deliberately instead of enabling everything and filtering it later.
Lesson 03
Over-notifying and under-notifying end in the same place.
An ignored inbox rule and an empty recipient list produce identical outcomes. Only one of them looks configured, which makes it the more dangerous of the two.
Lesson 04
Structure for editing, filter for auditing.
When two organizing principles compete, the one that matches the frequent task should be the layout and the rarer one should be a control.

Nobody opens this page unless something already went wrong. That is exactly why it has to be legible to someone who has not looked at it in a year.

Thanks for reading.