Skip to content

Migrate from Kinde

As the account Owner, go to Settings → Export data and download the JSON export. Kinde includes password hashes together with the hashing algorithm and salt configuration — the most complete self-service export of any hosted provider.

Kinde JSON fieldImport row field
emailemail
first_name + last_namedisplayName
id (kp_…)sourceUserId
hashed_passwordpasswordHash
hashing algorithm (e.g. bcrypt)passwordHashAlgorithm
salt / salt position detailspasswordHashParams (JSON string)
const rows = kindeUsers.map(u => ({
email: u.email,
displayName: [u.first_name, u.last_name].filter(Boolean).join(" ") || null,
sourceUserId: u.id,
passwordHashAlgorithm: u.hashing_method || null, // e.g. "bcrypt"
passwordHash: u.hashed_password || null,
passwordHashParams: u.salt ? JSON.stringify({ salt: u.salt, saltPosition: u.salt_position }) : null,
}));
// POST in batches of 500 — same loop as the Clerk guide, with source: "kinde".

See the Clerk guide for the batching loop and the foreign-key re-mapping SQL — only source: "kinde" and the field mapping differ.

  • Social login carries over by email — same Google/Apple/etc. button, same account, no OAuth app changes.
  • Hashes are stored dormant. Axowl login is passwordless (magic link / social / passkey); the hash+salt material is kept for provenance. See how the import works.