Onboarding runbook
The complete path from an invite to a production integration. Follow this once, end to end — every step links to the page that covers it in depth.
From invite to first login
- Get onboardedYou are invited (or sign up) and complete onboarding. This creates your tenant and your owner account in the admin dashboard — nothing for you to configure yet.
- Configure the login applicationOpen Applications, edit the application that owns your login page or service, and enable This app signs users in.
- Copy the Tenant ID and issue a login passwordOpen API and credentials. Copy the public
Tenant ID(atr_…), then choose Create credential → Signing users in and issue the reveal-oncealcs_…login password. Full detail: Tenant credentials. - Configure your serverPut both values in your app's config — the id as plain env, the secret in a secret manager:.env / secret manager
AUTHREADS_TENANT_ID=atr_xxxxxxxxxxxx # public — plain env AUTHREADS_APP_LOGIN_SECRET=alcs_xxxxxxxx... # secret — store in a secret manager - Create usersAdd users from the admin dashboard or the Management API — see Users & teams. There is nothing to copy afterward: a user's identity mirrors into your product automatically on their first login.
- First loginA user logs in through your product. The identity platform authenticates them against your tenant and issues a token carrying their granted app access, which your product enforces.
Suite / multi-app tenants
Step 2 above says “the application that owns your login page or service” as if it were one of the products your users open. In a suite — one login host serving several separate product applications — it usually isn't, and nothing above says what to do with the other apps. Four facts settle it:
- One login credential serves the whole login page, regardless of app. The app login secret is resolved by its own id plus your tenant — the caller never sends an app key — so a single credential authenticates the login page no matter which product the user goes on to open. Which apps a signed-in user can reach is decided separately, by the org-type ∩ role ∩ package matrix.
- The app it's attached to contributes exactly one thing: the user pool. It has no other effect on login.
- One active login credential per app.The platform enforces this, so you can't end up with two live login credentials on the same application by accident.
- Login requires both the app and the tenant to be active. This is the one with a sharp edge for a suite: if you attach the login credential to one of your product apps rather than a dedicated login application, disabling that product disables login for every product— the login credential goes inactive along with the app it's hanging off. Register your login host as its own application (with no product surface of its own) to avoid it, especially when the login host lives on a separate domain from any one product.
Go-live checklist
- Rotate the login password one last time right before production traffic starts, and store the new value only in your secret manager.
- Never commit the secret to source control or put it in a browser-exposed /
NEXT_PUBLIC_*-style variable — the Tenant ID is safe to expose, the secret is not. - Restrict allowed origins for your application to your production domain(s) before removing any development allowances.
- Verify token handling end to end — issuer, audience, and signing-key checks — see Authentication settings.
- Register your production redirect URIs (if you use hosted OIDC) before you deploy — they must match exactly, per environment.
- Honor proxy headers. Behind a load balancer or CDN, configure your edge to overwrite
X-Forwarded-Proto/X-Forwarded-Host, then trust those values only from that proxy so URLs use the publichttpsorigin instead of an internal loopback address. - Set session cookies
Secure(and an appropriateSameSite) in production — cookies that worked overhttp://localhostsilently fail over HTTPS without it. - Use separate credentials per environment. Each tenant/environment is isolated with its own issuer, JWKS, and
aud; never point production at a staging issuer or reuse production secrets locally.
Rotating the login password keeps the previous value working for a 24-hour grace window, so a rotation right before go-live is safe even if a caller hasn't picked up the new value yet — but don't rely on the window as your rollout plan. Update every caller in the same change and confirm they're on the new value, then end the grace window early from the credential's “End rollover window” action rather than leaving the old secret live. Full detail: Store and rotate secrets.
Troubleshooting
| Symptom | Likely cause |
|---|---|
| 401 on every call | Wrong or missing X-Tenant-Id, or the Bearersecret doesn't belong to that tenant. Re-check both against the Tenant Credentials card. |
| 403 for one user, others fine | That user's role, org-type, or package doesn't grant your app — access is the intersection of all three. See Configure your tenant. |
| Every request 401s after deploy | Token issuer/audience/signing-key mismatch — your app registration doesn't match what the token carries. See Authentication settings. |
| User logs in but sees no apps | Usually a missing package, or the app isn't included in the assigned package. |
| Invite/reset emails point nowhere | The auth base URL or redirect paths in Authentication settings are misconfigured. |
400 “set password path is not configured”, or nobody can obtain a first password | The Set passwordpath in Authentication settings is blank. Every user without a password yet — including a brand-new tenant's first user — gets this flow from forgot-password, not the reset flow. See Authentication settings. |