A table that has to answer questions, not list records.
Redesigning the user management view for a directory sync platform, where tens of thousands of people flow from source systems into downstream directories and this table is the only place an administrator can find out what went wrong.
Work shown with enterprise-identifying details removed. Product name and interface are my own; original assets are not shown.
One person, many identities.
A directory sync platform takes people out of a district's source systems and pushes them into everything downstream: directory groups, workspace tenants, and smaller systems like lunch programs, library catalogs, and bus routing.
A single person is rarely simple. They can arrive from more than one source feed, land in several destinations at once, and carry fields an administrator edited by hand after import. That last part matters more than it sounds, because a manually edited field no longer matches its source and will not be corrected by a resync.
The table was the debugging tool, and it could not debug.
When a teacher cannot log in, when a student is missing from a roster, when someone still holds access they should have lost, the administrator opens this table. It is where every question about a user gets answered.
A conventional user table shows name and status and hides everything that actually explains a problem.
- Which source feed or feeds a person arrived from, when many arrive from more than one
- Which downstream systems they actually reached, and which they did not
- Which fields had been manually overwritten after import, and therefore no longer track the source
- Any attribute outside the fixed column set, even though districts store different attributes and care about different ones
There is no column set that works for everyone.
Districts run different source systems, store different attributes, and care about different things. One administrator is chasing employee IDs, another needs distinguished names for a directory migration, another only ever looks at email.
The instinct is to add every field as a column. That produces a table nobody can read horizontally. The opposite instinct, picking a canonical set, produces a table that fails a different administrator every day.
Four moves, each solving one failure.
- Districts store different attributes, so no fixed column set fits all of them
- The questions that matter are per-person: which feed, which destinations, what changed
- Fields edited by hand after import stop tracking their source, invisibly
- An action on a filtered set can reach far past the rows on screen
- Custom columns chosen from a catalogue, capped at two, oldest replaced
- Every header doubles as its own filter control
- A dedicated column surfacing fields edited by hand after import
- Actions bound to the filtered set, with the exact count named in the confirmation
Column filters turn each header into a control, including columns the administrator added moments earlier.
Delete filtered users is the riskiest control on the page.
A filtered-set action is exactly as sharp as the filter behind it. An administrator who believes they are deleting the ten rows in front of them, when the filter actually holds four thousand, has made an unrecoverable mistake in one click.
So the confirmation does not just ask whether they are sure. It states the real number, and separates it explicitly from what is visible.
- The exact count in the filter, not the count on screen
- That those two numbers are different
- That the action cannot be undone
The table, rebuilt and interactive.
I rebuilt this as a standalone prototype with fictional records, embedded below. Add columns until you hit the cap and watch the oldest drop out, turn on column filters, then open the delete confirmation to see how the filtered count is stated.
Why two columns, and not five?
The cap is a real constraint with real costs. An administrator comparing three attributes at once has to swap one out. A larger allowance would have handled that case, at the price of horizontal scrolling that makes the core columns harder to scan.
Two won because the table’s job is answering a question, not holding data. Once a row stops fitting on screen, the administrator is scrolling sideways to reconstruct a single person, which is the exact failure the redesign existed to fix. Two is the most I could add without reintroducing it.
Shipped, and in daily use.
The redesigned view is in production. Administrators can now answer the questions the table exists to answer: where a person came from, where they went, and whether someone changed them by hand along the way.
Density is a reading problem.
The redesign did not add information to the table. It let each administrator decide which information the table was about.