Password hashes: what carries over
Be realistic here. The WorkOS User object and the List users response contain no password or hash fields. The WorkOS docs describe importing hashes into WorkOS (password_hash with password_hash_type), and we found no documented way to export them. Whether WorkOS support will produce a hash file for you is something to ask them. We have not confirmed it.
So the default outcome is that imported users have no password hash and set a new password on first sign-in through your password reset flow. If WorkOS does give you a hash file, the importer takes it through --hashes, one JSON object per line. Checking those bcrypt hashes at sign-in needs a verifiers.bcrypt function, see Lazy password migration.
Step 1: export users
The List users endpoint returns up to 100 users per page and a cursor inlist_metadata.after (API reference).
{"object": "list", "data": [...]}), or several pages as newline delimited JSON. Note that the Node SDK returns camelCase property names for some fields. The importer reads the API’s snake_case names (first_name, email_verified, external_id), so export the raw JSON from the REST API, or map the keys back before writing the file.
Step 2: dry run, then import
What maps
Not imported: profile pictures, organization memberships and roles, SSO and directory sync connections, MFA factors, sessions. Users who signed in through social providers or SSO have no linked account records in the export, so they reconnect the provider on first sign-in. Recreate SAML or OIDC connections with the SSO guides.
Cutover
- Import and check the counts with
theauth migrate verify. - Move sign-in to theAuth. WorkOS sealed sessions cannot be read without WorkOS, so everyone signs in once.
- Tell users without an imported hash to use password reset, or sign in with their social or SSO provider.
Related
Import users
The importer, dry runs, conflicts and the CLI.
Coexist with your IdP
Keep WorkOS in front of enterprise customers while the rest move.