Migrate to Kinde for user authentication
Get started
Migrate your users from Supabase Auth to Kinde. Supabase stores passwords as bcrypt hashes, and Kinde supports bcrypt natively — your users can sign in with their existing passwords with no reset required.
auth.users table, which isn’t exposed via the standard API. You export users by running a SQL query in the Supabase dashboard.auth.identities table. These users can be imported by email and will be prompted to re-link their social login on first sign-in.raw_user_meta_data varies by app — the structure of this field depends on what your app stores. Check it in the SQL editor before building your export query.Sign in to your Supabase dashboard and select your project.
Go to SQL Editor in the sidebar.
Run the following query:
SELECT id, email, encrypted_password AS hashed_password, CASE WHEN email_confirmed_at IS NOT NULL THEN 'TRUE' ELSE 'FALSE' END AS email_verified, raw_user_meta_data->>'first_name' AS first_name, raw_user_meta_data->>'last_name' AS last_nameFROM auth.usersWHERE email IS NOT NULL;In the results panel, set the row limit to No Limit so all users are returned.
Select Export and choose Download CSV.
If your app stores names under different keys in raw_user_meta_data (e.g. full_name or name), adjust the query to match. Run SELECT DISTINCT raw_user_meta_data FROM auth.users LIMIT 5; to inspect the structure first.
The SQL query exports columns that mostly match Kinde’s expected names. Rename the one that differs and add the hashing_method column.
| Supabase column | Rename to | Notes |
|---|---|---|
email | email | Required — primary sign-in identifier |
id | id | Keep as-is |
email_verified | email_verified | Keep as-is — TRUE or FALSE |
first_name | first_name | Keep as-is |
last_name | last_name | Keep as-is |
encrypted_password | hashed_password | bcrypt hash — preserves existing passwords |
| (new column) | hashing_method | Add this column and set every row to bcrypt |
For the full list of supported CSV fields — including organizations, roles, and permissions — see Prepare your CSV in the bulk import guide.
If you are importing hashed passwords, enable password authentication in Kinde before importing. See Password authentication.
Your final CSV should look like this:
id,email,first_name,last_name,email_verified,hashed_password,hashing_methodabc-123,bills@company.com,Bill,Smith,TRUE,$2a$10$examplehash,bcryptdef-456,carlosg@company.com,Carlos,Garcia,TRUE,$2a$10$examplehash,bcryptSee the bulk import guide to learn more.
If you need help with your migration, contact Kinde support.