Use an organizations / tenant model, not a single user pool
A user belongs to one or more organizations. Authentication is per-organization. Authorization is per-organization. This is the load-bearing decision; getting it wrong creates a multi-year refactor.
Buy the identity platform, don't build
Auth0, Microsoft External ID, WorkOS, Stytch, FrontEgg all do this well. The build cost for a homegrown CIAM that survives compliance is 18+ engineer-months.
Customer SSO via the identity platform's native federation
Auth0 Organizations + WorkOS handle the SAML/OIDC complexity. Don't build the federation layer yourself.
SCIM for customer-driven provisioning
Enterprise customers will ask for SCIM (and pay for it). RFC 7643+7644 conformant; tested against Okta + Entra + Workday IdPs at minimum.
External authorization (Cerbos / OpenFGA / OPA)
Stuffing authorization into the application code = authorization drift across services. External PDP keeps the policy in one place + auditable.