◂ BACK TO HOME

Enterprise Permissions

Redesigning how 150K+ T-Mobile employees get access to internal tools, owned end-to-end by content teams instead of IT tickets.

ROLE Sole designer COMPANY T-Mobile TIMELINE 2025 · 6 months SCOPE 150K+ employees
SCALE
150K+
employees on platform.
MONTH ONE
3,000+
pages permissioned by content teams.
ADMIN LOAD
0
admin interventions needed.
THE CONTEXT

One intranet for 150,000+ employees, permissions owned by content teams.

We were consolidating three platforms into one intranet for 150K+ employees. The support systems around it had to evolve with the platform, not lag behind launch.

I owned design and shared product ownership with product and business teams across requirements, testing, and onboarding.

Partnered with TPM, technical architect, design systems, and accessibility.

THE CONSTRAINT

Access workflows were split across three platforms, and AEM, our new CMS host, had no out-of-the-box permissions management.

THE PROBLEM

Every permission change was an IT ticket. Content teams waited days for access they should have been able to grant themselves.

THE OUTCOME

A permission system content teams run themselves: designed, tested, and shipped end to end.

RESEARCH

Grounding the model in how permissions already work, and who would run this one.

Cross-market analysis (SharePoint, Azure, Airtable) plus interviews with admins, content owners, and compliance.

What authors were already living with

From interviews with content authors, admins, and compliance.

Current tools

Each platform had pieces worth borrowing - and each assumed a technical operator.

Airtable nested AND/OR condition groups for filtering records
Airtable

Visual AND/OR condition nesting. Good model for our dynamic rule creator.

Progressive add-condition pattern keeps it approachable. Users build complexity as needed.

Azure AD dynamic membership rules with simple and advanced rule tabs
Azure AD

Simple vs. advanced rule toggle. Guided builder for most users, raw expressions as an escape hatch.

Dynamic group membership based on attribute rules. Informed our auto-assignment approach.

SharePoint permissions list with groups, users, and named permission levels
SharePoint

Groups and individuals in one list with named permission levels. Clean reference for apply permissions.

Named roles (Full Control, View Only) over checkbox grids. Less cognitive load.

Azure All groups overview with type and membership type columns
Azure Groups

All groups overview with type labels (Microsoft 365, Security) and membership type (Assigned, Dynamic).

Filtering and search built into the list. Reference for our manage groups view.

Four constraints that shaped the model

FAMILIAR CONVENTIONS
Admins expect groups, roles, and inheritance language from SharePoint and Azure, but not admin-console complexity.
NEW OPERATORS
Content authors had never managed access. Defaults had to be safe; power had to be gated, not assumed.
SPRAWL IS THE RISK
Legacy had thousands of unowned groups. Ownership and expiration became non‑negotiable in the model, not policy docs.
OPAQUE DATA
HR attributes read like database columns. I inventoried the UXP attribute set and cut/renamed the defaults so authors could build rules without decoding fields.
THE GROUP MODEL

Four group types, each with explicit ownership and expiration, so groups can’t sprawl.

Dynamic and exception groups shipped at launch; bulk dynamic and nested groups followed later, by request.

ONE GOVERNANCE CONTRACT · ALL FOUR TYPES Owner named at creation · expiration policy attached · membership auditable SHIPPED AT LAUNCH ADDED LATER, BY REQUEST Dynamic DEFAULT Membership from attribute rules e.g. all People Managers Saves immediately · syncs overnight Exception EXPIRING Manual members - contractors, testing, short-lived needs Must renew or it stops granting access Bulk dynamic One rule set generates many groups - one per value of an attribute e.g. a group for every store, or HR in each state Nested Composes existing groups and individuals into one audience Reuse without rewriting rules generates many composed into The later types add no new governance rules - they compose the launch types, so ownership and expiry carry through.
Four types, one governance contract - ownership and expiration attach at creation, and the two later types compose the first two rather than escaping their rules.

Ownership is required at creation, not discovered later in an audit.

Every group names its owners up front. That made accountability visible from day one and gave content teams a clear person to ask when access needed to change.

Set Group Owners: searching and selecting named owners at group creation
Set Group Owners: search, select, and confirm owners before the group exists

Exception groups escalate, then lock, so temporary access cannot quietly stick around.

Renewal prompts appear as the deadline nears. Past the deadline, the group requires review before it can keep granting access.

Exception group card: renew within 30 days warning
Within 30 days: renew before the deadline
Exception group card: past renewal deadline, requires review
Past deadline: review required to restore access
HOW IT WORKS

One loop from group definition to page access, with governance at every step.

Admins define reusable audiences. Authors apply them when content ships. Inheritance and expiration keep the system honest after launch.

ADMIN Group Management AUTHOR Apply Permissions 01 Define groups 02 Apply at publish 03 Cascade 04 Govern spans both roles reusable audiences parent → child expiry closes the loop owner required at creation renew or expire No IT ticket at any step.
One loop, two roles: admins define reusable audiences, authors apply them at publish, and expiry closes it back to definition.
01 · DEFINE
Admins create reusable groups
Dynamic rules for steady audiences, exception groups for temporary access. Ownership and expiration are required, not optional.
02 · APPLY
Authors permission pages at publish
Search pages, see publish and permission status, then apply the right groups before go-live, without an IT ticket.
03 · CASCADE
Inheritance stays a deliberate choice
Parent access can flow to child pages only when an author confirms it. Visible, reversible, auditable.
04 · GOVERN
Exceptions renew or expire
Temporary access escalates as the deadline nears, then locks past renewal, so sprawl cannot quietly accumulate.
TWO SURFACES

The same group model, shown where each role needs it.

Admins start in Group Management: find a group, open details, manage membership and rules. Authors work in Apply Permissions at publish time, with publish and permission status side by side before go-live.

Group Management: group list with New Group menu for Exception, Dynamic, Bulk Dynamic, and Nested
Admins start here - every group type, every owner, searchable in one view
Group Management detail: nested exception group with members, applied pages, activity log, and nested groups table
Group detail - ownership, expiry, nested groups, and activity in one place
Apply Permissions: page list with publish status, permission status, and manage actions
Authors · Apply Permissions: publish status and permission status together
Apply Permissions detail: page metadata, activity log, modify page permissions with groups and update child pages
Page permissions - which groups apply, who applied them, and controls to update child pages
ITERATION

The first two rule builders failed accessibility review. The third borrowed from Salesforce.

The first rule builder exposed three add-buttons whose behavior wasn't obvious even to me, and a table that only allowed rows at the end. I grouped the expressions, moved nesting into a row menu, and darkened the nested signifiers to hit AAA contrast.

The accessibility team rejected it anyway - nested blocks weren't traceable by screen readers, the format broke under standard table CSS, and there was no room for validation errors. The fix came from Salesforce's tree grid: collapsible rows for nested values, sized to hold text and errors at a 1200px floor.

Built for someone who already knew the schema

Dynamic Rule Creator v1: expression rows with three add-buttons beneath
v1: the interaction model assumed the operator already understood the data schema

Better interaction, still not accessible

Bulk Dynamic Rule Creator: For Each row, nested expressions, and open row menu with Nest Expression
Better, and still not accessible - the table model itself was the problem

What shipped

Dynamic Rule Creator v3: collapsible nested rows with reserved error space
Shipped: worked out with the a11y partner, not retrofitted

Labels authors can read, not database columns.

The builder still had to speak HR data. UXP exposed fields like Leader 0-8 with nothing telling an author which one meant VP. I inventoried 39 attributes: cut 15, renamed 15, left 9 unchanged, so rule rows read in plain language. A live syntax view stays available for advanced operators.

As named in UXPWhat authors see
Leader 0 Email Employee - CEO
Leader 3 Email Employee - VP
Leader 8 Email Employee - Manager
Employee Type Pay Type
Department Functional Group

+30 more audited across cut, renamed, and kept.

DESIGNED FOR FIRST-TIME OWNERS

Familiar patterns, safer defaults, and errors caught at the moment of entry.

The platform had no established patterns for search, tables, filtering, or inline validation. I designed them to align with the new design system’s semantic tokens and interaction patterns. Purpose-built for Permissions, reviewed with the DS team and a11y partner, and signed off before ship.

Foundations first
Search, tables, filters, and validation shipped as shared components within Permissions, not generic library widgets reused from elsewhere. Bulk imports flag bad rows inline and skip them, so good entries still proceed.
Search Data table Filters Validation
Group Management filtered to Dynamic: search, group type and owner filters, and results table
The patterns owners use daily - built for Permissions, not borrowed from a generic library
Create Exception Group: member search, bulk import, toast for invalid rows, and per-row inline validation
Create Exception Group: bulk import keeps valid members and flags bad rows inline
KEY DECISION

Inheritance is an explicit author action, never a silent cascade.

Automatic inheritance wasn’t technically feasible at migration scale, and most alternatives were too complex to build or too opaque for authors. Instead, authors choose when parent access flows to child pages, with clear control over which groups apply. Visible, reversible, auditable. A later enhancement let pages inherit from already-permissioned parents, cutting effort further.

Apply Permissions: explicit add-parent and replace-child inheritance actions with confirmation
Inheritance is a decision, not a default - every cascade is confirmed, visible, and reversible

Content is open by default and locked down only where compliance requires it, so most of the intranet stays usable without maintaining permissions on every page.

SYSTEM + SCALE

50+ screens, ~5 flows, one component system.

I built 50+ screens, working through iterations quickly while developing components to keep consistency as we moved toward finalized patterns. That reduced tech debt and made new enhancements faster to ship.

Iterations board with dozens of permission screens organized in color-coded swim lanes
Iterations board - screens organized by flow as the system took shape
Annotated component primitives: New group menu, member actions, dynamic rule rows, expression groups, rule syntax, and pagination
Menus, rule rows, search, and tables - the same primitives composed across every flow
Sprint 1 UX handoff showing two numbered Group Management workstreams with annotated screens
Sprint handoff: annotated screens, requirements, and dev notes - scoped in two-week windows
IMPACT

Model held months after launch. Built to scale safely.

I validated against live HR data before the build finished: SQL, Postman, and cron behavior against real records. That surfaced overnight sync, mismatched attribute labels, and other gaps the spec never mentioned. I wrote the admin/author guides and a failsafe BRD, and onboarded content teams before platform go-live.

3,000+
pages permissioned in month one with zero admin overhead
~30
governed groups active at steady state
0
IT tickets needed for routine access adjustments

Key takeaways

  1. 01
    Governance works when it’s built directly into the model, not documented in static policy files.
  2. 02
    Design for the least-technical owner. Gating complexity makes the system safer for everyone, including admins.
  3. 03
    Surfacing the primary constraints (overnight sync, opaque HR attributes, mismatched labels) required testing against live data, not reading them off the spec.
NEXT CASE STUDY · NO.2
Site Architecture: three platforms, one content structure
OPEN →