Skip to content
authreads Docs

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

  1. Get onboarded
    You 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.
  2. Configure the login application
    Open Applications, edit the application that owns your login page or service, and enable This app signs users in.
  3. Copy the Tenant ID and issue a login password
    Open API and credentials. Copy the public Tenant ID (atr_…), then choose Create credential → Signing users in and issue the reveal-once alcs_… login password. Full detail: Tenant credentials.
  4. Configure your server
    Put 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
  5. Create users
    Add 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.
  6. First login
    A 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 public https origin instead of an internal loopback address.
  • Set session cookies Secure (and an appropriate SameSite) in production — cookies that worked over http://localhost silently 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

SymptomLikely cause
401 on every callWrong 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 fineThat 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 deployToken issuer/audience/signing-key mismatch — your app registration doesn't match what the token carries. See Authentication settings.
User logs in but sees no appsUsually a missing package, or the app isn't included in the assigned package.
Invite/reset emails point nowhereThe auth base URL or redirect paths in Authentication settings are misconfigured.
400 “set password path is not configured”, or nobody can obtain a first passwordThe 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.
Still stuck? Copy-paste requests live in Examples and quick answers in the FAQ.