Migrate to Kinde for user authentication
Get started
Export your users from your existing auth system, prepare a CSV, and import them into Kinde. Users with migrated password hashes can sign in immediately with no password reset required.
If you need to catch new registrations or password changes during the migration window, combine this with the API approach or run a second import after the cutover.
email,first_name,last_name,email_verified,hashed_password,hashing_method,external_organization_idbills@company.com,Bill,Smith,TRUE,$2a$10$examplehash,bcrypt,abc001carlosg@company.com,Carlos,Garcia,TRUE,$2a$10$examplehash,bcrypt,abc001lliu@company.com,Lee,Liu,FALSE,,, xyz002Configure your Kinde business with the same auth strategies as your existing provider. See before you migrate.
Export instructions vary by provider. Select yours:
If you are migrating from your own system, prepare the data to match the format described below.
Import files must be 49MB or less. This applies to Custom CSV, Auth0 NDJSON, FusionAuth NDJSON, and Custom NDJSON imports. Format your export with the following columns.
Required column:
| Column | Notes |
|---|---|
email | Minimum required field |
Recommended columns:
| Column | Notes |
|---|---|
first_name, last_name | User’s name |
email_verified | TRUE or FALSE |
id | Your provider’s user ID — helps match records during re-imports |
phone | International format, e.g. +61555111555 |
external_organization_id | Organization ID to import the user into. Comma-separate multiple values |
role_key | Role key(s) to assign. Comma-separate multiple values |
permission_key | Permission key(s) to assign. Comma-separate multiple values |
external_organization_id is NOT the same as the Organization code in Kinde (which is Kinde-assigned). Use the ID from your own system.
Password columns:
Include these if you’re migrating hashed passwords:
| Column | Notes |
|---|---|
hashed_password | The hashed password string |
hashing_method | See supported methods below |
salt | Optional — extra characters added to strengthen the hash |
salt_position | prefix or suffix — required if salt is included |
salt_format | Format of the salt, e.g. hex or string |
Supported hashing methods:
| Method | Salt | Salt position |
|---|---|---|
bcrypt | — | — |
md5 | Optional | Required if salt included |
sha256 | Optional | Required if salt included |
crypt | Optional | — |
wordpress | Optional | — |
Kinde substitutes $2b with $2a on import. These are interchangeable unless the hashes were generated on OpenBSD.
Provide the hash in hex format. For salt_format, specify hex for a hex-encoded salt (e.g. 68656c6c6f for hello). By default, the salt is treated as a plain string.
Check for errors before importing:
Review the CSV for missing or duplicate values. Kinde will report errors after import. Records that have already been imported without changes are skipped on re-import.
In Kinde, go to Users, then select Import users.
Select your import type:
Follow the on-screen prompts to upload your file.
Review any errors reported after import. Fix the CSV and re-import to resolve them.
For full instructions, see Import or update users in bulk.
If users can still register or change their password while you migrate, you’ll miss them. Options:
is_password_reset_requested.Kinde does not notify users when they are imported. Plan your own communication, especially if you’re changing their sign-in experience (e.g. adding MFA or moving to passwordless).
If you need help with your migration, contact Kinde support.