Protected case study

This project is under NDA. Enter the password to view it.

← See all works
See all works

Client identity & access

An enterprise identity layer inside a B2B platform. Every company is its own tenant with its own products, roles and admin.

My Role
Sole product designer (UI/UX)
Platform
Web · Enterprise B2B platform
Scope
Research, IA, UX, UI, prototype

Identity & Access Management is the layer that lets a whole company into the platform: clients sign in with their own work accounts, and their IT admin decides who can open which product — without a single support ticket.

Our client is not a person but a company with hundreds of employees. Before IAM, someone on our side decided by hand which product to open for each of them, so onboarding a client stretched into weeks of work, one ticket per person.

Sole designer on the product: the brief was worked through with the BA and PM, while the MVP scope and what to cut from the first version I defined myself — against one criterion: the client must manage access without us. The principle behind the solution: federate identity, keep authorization — the client’s provider (Okta, Entra ID, Ping) answers “who is this person”, our IAM answers “what are they allowed to do”.

The exception that had to be designed. Not every client has a provider of their own. For those we keep the accounts on our side — the same single-field screen, the same flows — because enterprise buyers expect both paths to exist.

500
users at the start — the platform began with them
5 500
users three years later — client company employees sign in through their own provider
3 mo.
for the first version, so the scope was laid out across iterations
2
levels of administration on one set of components — our admin and the client’s admin

How the integration is split

The client’s provider owns people, we own access. Two channels run between the sides: federation for people, and machine-to-machine for the client’s services, which never touch the provider.

The client’s provider — Okta, Entra ID, Ping Employees Groups Passwords and MFA source of truth about peopleemployees are created and disabled there Our IAM Organizations Roles Products Mappings M2M applications Audit log source of truth about access SAML / OIDCpeople The client’s backend services M2M · client credentialsnever touch the provider operators come from Hub — they are not created in IAM

What one grant is made of

One grant reads as one sentence. Remove any part and the request is denied. A user belongs to exactly one organization, and that rule keeps every screen inside the tenant.

User in Organization can open Product with role Role for Operators any part missing — no access

Four steps to onboard a client

The first two steps are on our side, the next two the client does alone. No account is created in advance: just-in-time provisioning creates it at first sign-in, with access already applied.

1Organization and domainscreated by our admin, domainsare verified 2Provider connectedSAML / OIDC federationwith the client’s directory 3Groups mappedgroup → products, roles,operators; the team is invited 4Employee’s first sign-inthrough their own provider,access already applied our side the client’s side
iam.app/organizationsLive
01Organization list

The entry point for our internal admin: every client company with its onboarding state — domains, provider, products, users.

  • The organization is the unit of work. Everything about a client lives inside it: domains, provider, products, roles, people.
  • The onboarding state is visible in the list. Unverified domains and an unconfigured provider are the reason a client cannot sign in yet.
  • Search by name and by domain. A client is looked up the way they are referred to in correspondence.
iam.app/organizations/newLive
02Creating an organization

Onboarding a client starts here: the name, the email domains and the identity provider.

  • A domain is what binds a person to a tenant. The work email domain routes the sign-in to the right organization, so verifying domains is a mandatory step.
  • The provider is connected at the same step. SAML or OIDC — from there the client’s employees sign in with their work account.
  • A claimed domain is transferred, not duplicated. One domain routes sign-in to one organization — so instead of an “already exists” error the interface shows who owns it and what the transfer takes.
  • Configuration errors are visible right away. While the provider does not respond, the organization stays in an onboarding state rather than “created”.

The domain already belongs to another company

One domain can route sign-in to only one organization, so it cannot simply be added twice — it is transferred with a key.

Domain enteredwhile creating an organization Domain is claimedby whom is visible Transfer keyissued by integration on a ticket Sign-in comes hereremoved from the previous organization without the key the domain stays with the previous one
iam.app/org/settingsLive
03Connecting the client’s provider

The step right after the organization is created: domains are not verified yet, the provider is not connected — and until it is, there is nothing to configure access with. The screen walks through the two steps of exchanging settings with the client’s IT team.

  • The setup happens on two sides. Some values the client sets on their end, some we hand over — so the screen shows both what has to be sent and what has to come back.
  • The integration state is part of the interface. “Not connected” → “test sign-in needed” → “connected”: the admin sees which step it stopped at, without asking anyone.
  • Sending the settings to the IT contact is built into the screen. It used to be correspondence outside the system, so the step is now recorded in the log.
  • A provider counts as connected once a sign-in has gone through it. Saved settings are not enough — otherwise the client would learn about a breakage from their own employees.

Connecting the provider: who does what

The integration is an exchange of settings between two systems. Until the test sign-in passes, the organization stays in an onboarding state.

OUR SIDE THE CLIENT’S SIDE Domains verifiedsign-in knows where to go Settings sentto the client’s IT contact Setup on their endan app in their own IdP Metadata backSAML / OIDC Test sign-innot passed yet — not connected Provider connectedemployees sign in on their own
iam.app/org/settings/mappingLive
04Automatic role assignment

The rules that turn a group from the client’s directory into products and roles — access is recomputed at every sign-in instead of being granted by hand.

  • The rule belongs to the organization, not to a person. One record describes access for everyone who falls into the group — including whoever joins tomorrow.
  • Recomputed at sign-in, not on save. So the screen shows not “who already has it” but what will apply: a change in the client’s directory arrives on its own.
  • Roles the client maintains by hand are kept out of the automation. Without that caveat admins were not willing to switch it on — auto-assignment would overwrite their exceptions.
  • Without a connected provider the rule is unavailable. There are no groups yet, so the block shows a state rather than an empty form.

How the rule fires

Every sign-in follows the same path: the client’s provider reports the groups, the rule expands them into access.

Employee signs inwork email The client’s providerhands over the groups Organization rulegroup → products and rolesleaves manual roles alone Access appliedbefore the first screen recomputed at every sign-in — a group change at the client arrives on its own
iam.app/org/operatorsLive
05Operators

The operators access is bounded by: they come from the platform, they are not created here.

  • The operator list is not invented in IAM. It comes from Hub — otherwise there would be a second definition drifting away from reality.
  • An operator is part of the grant. Without it the access record is incomplete and the request is denied.
iam.app/org/usersLive
06Organization users

The client’s employees: access, roles, operators, invitation status and last sign-in.

  • The account is created at first sign-in. The invitation is the last step, not the first: there is no need to create a user in advance.
  • Bulk operations on what the search found. Search by emails, then change access for the whole group at once.
  • Deactivation is visible in the status. A deactivated employee stays in the list with their history, but without access.
iam.app/org/rolesLive
iam.app/org/rolesLive
iam.app/org/roles/newLive
07Roles & permissions

The client’s roles and what each of them opens: products, permissions and where it applies.

  • A role is a set of permissions in specific products. It does not replace or widen membership in the organization.
  • Where a role applies and who holds it is visible. That answers “what changes if I touch it”.
  • Unused roles are flagged. Roles with nobody assigned and no usage are material for cleanup.
  • A role is created from a product, permissions and where it applies. Roles are more often created from an example, so there is a start from an existing one; permissions belong to a product, and the grant level and properties (default role, system role) are set here too.
  • The second mode is the permission matrix. Roles are laid out as columns, so the difference between them reads along a row; the “only differences” filter drops matching permissions, and rows with nobody assigned or switched off are surfaced at the top.
iam.app/org/auditLive
08Audit log

Changes to the organization, people and access: who, what, when and with what result.

  • The log answers questions after the fact. Who granted access and when — from records, not from anyone’s memory.
  • Filters by actor, object and result. Provider failures show up here as well — it is the first place to look when someone complains about signing in.
iam.app/bannersLive
09Banners

The announcements the platform shows to client users: schedule, audience and publication state.

  • The banner state is part of the list. Draft, scheduled, live and expired are visible at once, so there is no need to open a record to see what is showing now.
  • The audience is defined with the same entities as access. Organizations and products — not a separate recipient list.
iam.app/inviteLive
10Sign-in by invitation

An employee’s first sign-in: the invitation takes them to their own provider, and access is already applied.

  • The invitation does not create a password. It links a person to an organization; identification is done by the provider.
  • Access is applied before the first sign-in. A person lands inside already holding the products and roles from the group mapping.
  • Product manager

    Held the business priority — the MVP line was drawn along it: from my side came the flows and the cost of each option, and the scope was cut against that priority — SCIM and the role builder were deferred deliberately. The design part of planning and presenting solutions to stakeholders was mine.

  • Business analyst

    The de facto product owner and the main partner on the solution. The technical side of identity sat with him: how Okta, Entra ID and other providers behave, SAML and OIDC exchanges, which claims and groups come back, where a provider departs from the spec. His mechanics turned into screens and states, then the flows were walked back step by step — what the system can know at each point and what it cannot. That is where the single-field sign-in, the group-to-role mapping and the exception roles come from.

  • Engineers

    Every flow was walked through with the team before the sprint — including empty states, loading, errors, stale links and repeat sign-in. Where the identity stack made a solution expensive, the design changed; where it opened up a possibility, that possibility was requested. Design QA on the build at the end of the sprint.

  • QA

    Received the scenarios and edge cases built into the design: someone else’s domain, a revoked group, a deactivated account, an expired invitation — so that testing covered the intent, not just the happy path. Their findings came back into interface details: error texts, states, dead ends.

Next project
Atlas