Connect client tenants
Rollout reads at your clients whether everything is ready for the switch: account, license, groups, MFA and laptop. For this you create one app registration with read-only permissions, without a password or secret, and each client grants consent once.
App registration "Rollout – Readiness"
In Rollout, under Setup, there's an assistant that generates a PowerShell script creating both app registrations (Login and Readiness) correctly in one go. Below is what that script does, so you can review it or do it by hand.
- New registration, multi-tenant
Entra → App registrations → New registration
- Name:
Rollout – Readiness - Supported account types: Accounts in any organizational directory (multi-tenant: clients grant consent to this app)
- Redirect URI (Web):
https://<your-domain>/toestemming
- Name:
- Read permissions only
API permissions → Add a permission → Microsoft Graph → Application permissions:
Permission Used for User.Read.AllDoes the account exist, is it enabled, which licenses GroupMember.Read.AllIs the employee in the right groups LicenseAssignment.Read.AllLicense assignment and free licenses AuditLog.Read.AllLast sign-in, MFA registration, hypercare DeviceManagementServiceConfig.Read.AllAutopilot registration of the laptop DeviceManagementManagedDevices.Read.AllLaptop in Intune, compliant, last sync DeviceManagementApps.Read.AllRequired apps assigned Organization.Read.AllTenant name and domains (to detect a wrong tenant ID) Optional for migration checks:
MailboxSettings.ReadandBitlockerKey.ReadBasic.All.Don't click "Grant admin consent" for your own tenant unless you use it as a test client yourself.
- No secret: federation with Vercel
Instead of a password, the app registration only trusts your Vercel project. So there's nothing that can leak.
First in Vercel: project → Settings → Security → Secure backend access with OIDC federation: on, mode Team.
Then in Entra: Certificates & secrets → Federated credentials → Add credential → Other issuer:
Field Value Issuer https://oidc.vercel.com/<team-slug>Subject identifier owner:<team-slug>:project:<project-name>:environment:productionAudience https://vercel.com/<team-slug>(change the default!)Name vercel-<project-name>-productionCase-sensitive: copy it exactly. Do not create a client secret or certificate.
- Note the application ID
It becomes
GRAPH_CLIENT_IDin step 4. It isn't a secret.
With federation there's no key to your clients' tenants: on every request Vercel proves "I am this project", and Microsoft only trusts that one project. Even someone with access to the code or the database can't reach your clients. Self-hosting without Vercel? Then use a certificate or a managed identity, see Self-hosting.
Connecting a client
You do this per client, in the app itself (Project → Connection → Connect client). Only an administrator can link a tenant to a client.
Scroll here or press play.
Two locks on every tenant
Rollout only reads from a tenant if it passes both locks:
- Lock 1: allowlistTenant ID is in GRAPH_ALLOWED_TENANTS, outside the app and the database
- Lock 2: own clientThe tenant belongs to a client of your organization (Row Level Security)
- Only then readOnly the read permissions the client approved
Adding a new client is therefore deliberately a manual step: add the tenant ID to GRAPH_ALLOWED_TENANTS and redeploy. Even if someone managed to create a client with a foreign tenant ID in the database, Rollout won't read there.
Check
- Test connection on a test tenant shows green for the permissions
- The app registration has no client secret and no certificate, only a federated credential
- An engineer (not an administrator) can't enter a tenant ID for a client