Migrate from Auth0
1. Export from Auth0
Section titled “1. Export from Auth0”Create a bulk user export job
via the Management API (POST /api/v2/jobs/users-exports) — output is newline-delimited JSON with
user_id, email, name, and metadata. Hashes (bcrypt) arrive separately via the support ticket,
keyed by user_id.
2. Import
Section titled “2. Import”const hashByUserId = loadHashExport(); // from the support-ticket file, if you got oneconst rows = auth0Users.map(u => ({ email: u.email, displayName: u.name || null, sourceUserId: u.user_id, // "auth0|…", "google-oauth2|…", … passwordHashAlgorithm: hashByUserId[u.user_id] ? "bcrypt" : null, passwordHash: hashByUserId[u.user_id] || null,}));// POST in batches of 500 with source: "auth0" — loop as in the Clerk guide.Gotchas
Section titled “Gotchas”user_idencodes the connection (auth0|,google-oauth2|,github|…). Keep the full string insourceUserId; social users need no hash at all — they carry over by email.- Unverified emails: imported users start as
Pendingeither way, and their first magic-link sign-in verifies the address — Auth0’semail_verifiedflag doesn’t need translating. - Rules/Actions don’t migrate. Inventory what your Auth0 Rules did (claims, allowlists) and map them to App Group settings before cutover.
- Hashes are stored dormant — see how the import works.