Migration
Migrate from Auth0
Stop paying per-MAU. AuthMe gives you the same features — OAuth 2.0, social login, MFA, organizations — without the cloud bill.
Why migrate from Auth0?
$0/mo
No per-MAU charges
Auth0 charges $23/1000 MAU on paid plans
Unlimited
Users, no paywall
Auth0 free tier limited to 7,500 MAU
Full data
ownership
Your servers, your data, your rules
No vendor
lock-in risk
Open source, self-hosted, forkable
Feature Mapping
| Auth0 | AuthMe | Notes |
|---|---|---|
| Tenant | Realm | Same isolation concept |
| Application (SPA) | Client (public) | PKCE enforced |
| Application (Regular Web) | Client (confidential) | With client secret |
| Application (M2M) | Client (service account) | Client Credentials grant |
| Roles | Roles | Realm and client-level roles |
| Organizations | Organizations | B2B multi-tenancy |
| Social Connections | Identity Providers | OIDC/SAML brokering |
| Enterprise (SAML) | Identity Providers (SAML) | Full SP mode |
| Database Connections | Local Users | Default user store |
| Rules / Actions | Plugins / Webhooks | Event-driven extensions |
| Branding | Realm Theming | Custom login pages |
| Logs | Events / Audit Logs | Login + admin events |
Step-by-Step Migration
1
Export Auth0 Users
Use the Auth0 Management API to export your users with their metadata and roles.
# Export users via Auth0 Management API
curl -X POST "https://YOUR_DOMAIN.auth0.com/api/v2/jobs/users-exports" \
-H "Authorization: Bearer ${MGMT_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"format": "json",
"fields": [
{"name": "user_id"},
{"name": "email"},
{"name": "name"},
{"name": "user_metadata"},
{"name": "app_metadata"}
]
}' 2
Deploy AuthMe
Start AuthMe and create your realm.
# Start AuthMe
docker compose up -d
# Create a realm matching your Auth0 tenant
curl -X POST "http://localhost:3000/admin/realms" \
-H "x-admin-api-key: ${ADMIN_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "my-app",
"displayName": "My Application"
}' 3
Create OAuth Clients
Recreate your Auth0 Applications as AuthMe clients. Match client IDs where possible.
# Create a client for your SPA
curl -X POST "http://localhost:3000/admin/realms/my-app/clients" \
-H "x-admin-api-key: ${ADMIN_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"clientId": "my-spa",
"name": "My SPA",
"type": "public",
"redirectUris": ["http://localhost:3000/callback"],
"webOrigins": ["http://localhost:3000"]
}'
# Create a client for your API
curl -X POST "http://localhost:3000/admin/realms/my-app/clients" \
-H "x-admin-api-key: ${ADMIN_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"clientId": "my-api",
"name": "My API",
"type": "confidential"
}' 4
Import Users
Import your exported Auth0 users into AuthMe. Since Auth0 uses BCrypt, users will need to set new passwords (or use social login).
# Import users to AuthMe
# Note: Auth0 BCrypt hashes cannot be directly imported.
# Users will receive a password reset email on first login.
curl -X POST "http://localhost:3000/admin/realms/my-app/users" \
-H "x-admin-api-key: ${ADMIN_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"emailVerified": true,
"requirePasswordReset": true
}' 5
Migrate Social Connections
Recreate your Auth0 Social Connections as AuthMe Identity Providers.
# Add Google as an Identity Provider
curl -X POST "http://localhost:3000/admin/realms/my-app/identity-providers" \
-H "x-admin-api-key: ${ADMIN_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"alias": "google",
"displayName": "Google",
"providerId": "oidc",
"enabled": true,
"config": {
"clientId": "your-google-client-id",
"clientSecret": "your-google-client-secret",
"issuer": "https://accounts.google.com",
"authorizationUrl": "https://accounts.google.com/o/oauth2/v2/auth",
"tokenUrl": "https://oauth2.googleapis.com/token"
}
}' 6
Swap the SDK
Replace the Auth0 SDK with the AuthMe SDK in your application. The API is similar.
// Before: Auth0 SDK
import { Auth0Client } from '@auth0/auth0-spa-js';
const auth0 = new Auth0Client({
domain: 'your-tenant.auth0.com',
clientId: 'my-spa',
redirectUri: window.location.origin,
});
// After: AuthMe SDK
import { AuthmeClient } from 'authme-sdk';
const authme = new AuthmeClient({
url: 'https://auth.example.com',
realm: 'my-app',
clientId: 'my-spa',
redirectUri: window.location.origin + '/callback',
});
// Same methods work!
await authme.login();
const user = authme.getUserInfo();
await authme.logout(); Important Notes
- Password hashes: Auth0 uses BCrypt which cannot be directly imported. Users will need to reset passwords or use social login.
- Social logins: Users who authenticated via Google/GitHub can log in immediately if you configure the same OAuth app credentials.
- Rules/Actions: Convert Auth0 Rules to AuthMe Plugins or Webhooks — both support custom logic on auth events.
- Custom domains: Update your DNS to point your auth domain to your AuthMe instance.
- Testing: Run AuthMe in parallel with Auth0 during migration. Test all flows before full cutover.