Migrate to Kinde for user authentication
Get started
Migrate your users from Firebase Authentication to Kinde. The process involves exporting user data from Firebase, converting it to NDJSON, and importing into Kinde. Kinde supports Firebase’s modified scrypt password hashes, so migrated users can sign in with their existing password.
passwordHash and salt, you must enter your Firebase project’s hash parameters when you confirm the import in Kinde. You will find the instructions in this guide.organizations array on each user object. Each organization must already exist in Kinde with a matching external_id (provided ID).Make sure you have the Firebase CLI installed, then run:
firebase auth:export users.json --format=jsonThis exports user records including email addresses, display names, UIDs, hashed passwords, and salts. For full details, see the Firebase Auth CLI documentation.
Firebase typically writes a JSON array of user objects (or an object with a users array). Kinde cannot import that file as-is — convert it to NDJSON in the next step.
Kinde accepts a .ndjson file with one user object per line.
Use the jq command-line JSON processor tool to convert the export to NDJSON.
If your export is a JSON array:
jq -c '.[]' users.json > users.ndjsonIf your export is an object with a users array:
jq -c '.users[]' users.json > users.ndjsonYour file should look like this (each user on its own line):
{"email":"user@example.com","localId":"firebase-uid-abc123","emailVerified":true,"displayName":"Alex Smith","passwordHash":"...","salt":"..."}{"email":"other@example.com","localId":"firebase-uid-def456","emailVerified":true,"passwordHash":"...","salt":"..."}The file extension must be .ndjson. Rename the file if needed before uploading.
Firebase does not export organization membership. If you use Kinde organizations, add an organizations array to each user object before import. Organizations must already exist in Kinde with a matching external ID.
disabled (Firebase’s usual field) or userDisabled — when true, the user is imported as suspended in Kinde. If neither field is present, the user is active.Example of one line (pretty-printed here for readability — keep it as a single line in the .ndjson file):
{ "email": "user@example.com", "localId": "firebase-uid-abc123", "emailVerified": true, "displayName": "Alex Smith", "passwordHash": "...", "salt": "...", "disabled": false, "organizations": [ { "external_id": "org_abc001" } ]}You can also include roles and permissions arrays on each organization object, using the same role and permission keys configured in Kinde.
Hash parameters are only required when your export includes password hashes. Users without passwordHash can still be imported without password migration.
Sign in to your Firebase console
In your project dashboard, go to Product categories > Security > Authentication > Users.
Select the three dots menu next to the user table, then select Password hash parameters. A dialog appears.
Copy the parameters and save them securely. You need them to import into Kinde.
In Kinde, go to Users, then select Import users. A dialog appears.
Select Firebase.
Upload your .ndjson file (49MB or less).
On the confirmation screen, enter the Firebase password hash parameters you copied in the previous step.
base64_signer_key)base64_salt_separator)rounds)mem_cost)Select Import and wait for the import to complete.
Review any errors reported after import. Fix the NDJSON file and re-import to resolve them.
Kinde maps the following fields from each NDJSON user object:
| Firebase field | Imported as | Notes |
|---|---|---|
localId | User id (provided ID) | Used to match records on re-import |
email | Email identity | Required for email/password users |
emailVerified | Email verified status | true / false |
displayName | first_name / last_name | Split on the first space |
phoneNumber | Phone identity | Imported if present |
passwordHash | Migrated password hash | Requires hash parameters at confirm |
salt | Per-user salt | Required with passwordHash |
disabled / userDisabled | Suspended status | true → suspended in Kinde |
organizations | Organization membership | Optional — see step 3 above |
The following Firebase fields are not imported automatically:
providerUserInfo (social / federated identities)customAttributes / custom claimsphotoUrl, createdAt, lastSignedInAtIf you need social identities or custom claims, configure the relevant connections in Kinde and use the API or a follow-up process after import.
For the full list of supported fields and hashing methods, see the bulk import guide.
If you need help with your migration, contact Kinde support.