Migrate from Keycloak to Zitadel

Moving from Keycloak to self-hosted Zitadel means exporting realm users with password hashes, converting and importing them, then remapping realms, clients and roles. This page covers what maps cleanly, what does not, and what drives effort.

On this page

Migrate from Keycloak to Zitadel: what moves, what changes and how much effort it takes

A team running Keycloak realms that wants to move users and applications to self-hosted Zitadel should know that the documented path exports users with their password hashes and imports them through the Zitadel import API. The export runs with kc.sh export, the zitadel-tools migration utility converts the output so that PBKDF2 password hashes remain usable, and POST /admin/v1/import loads the converted users into Zitadel. After the import, the events API shows user.human.added events for each user, which gives the team a way to confirm that the load matched the export.

The short answer on effort is that it depends on the shape of the Keycloak estate. The number of realms, the number of clients, the roles and role mappings, the federated identity brokers and the password hash settings in use all change the work. A single realm with a handful of clients is a different job from a multi-realm estate with brokered logins and custom hash parameters. DeployOpen plans this work as a fixed-scope engagement that begins with a written inventory of each of those elements. Scope, deliverables and timeline are agreed in writing before the build starts, and the quote follows from that inventory.

The documented path is a user migration. It moves user records, hashed credentials and the attributes the import carries. It does not move applications or their configuration. Redirect URIs, client secrets, scopes, token lifetimes and the way each application reads roles from tokens must be set up again on the Zitadel side as projects and applications. Each application then has to be repointed to Zitadel's issuer and endpoints. Plan the repointing as a separate workstream with its own test cycle, because a user can import cleanly and still fail to sign in to an application that expects the old token claims.

Ask for the inventory to record, per realm, the user count, the password policy, the hash algorithm and iteration settings, the second factors enrolled, the client count by protocol, the role and group structure, the identity brokers and any user federation links such as LDAP. Confirm with the Zitadel migration guide which second factors and passkeys the path carries, since the documented steps cover password hashes. Decide whether users must reset passwords at cutover and how long Keycloak stays available for rollback. The quote should show who handles inventory, mapping design, conversion and import runs, application repointing and test support, and what your team supplies, such as access, a Keycloak copy for testing and sign-off.

Which Keycloak concepts map cleanly to Zitadel and which need design work

This table compares Keycloak concepts with their closest Zitadel equivalents and labels each row as a direct mapping, a design decision or an item to confirm in the Zitadel documentation for your target version. Read the mapping type first, then the migration notes, to see where your team must decide structure before exporting users. The main takeaway is that identities and password hashes move with the documented tooling, while realm structure, role design and authorization logic need planning before import.

Keycloak capabilityZitadel equivalentMigration notesMapping type
RealmsInstances, organizations and projectsDecide whether each realm becomes an instance, an organization or a project. Instances give full data isolation, so use them only for hard tenant boundaries.Design decision
Users and password credentialsHuman users with imported password hashesThe zitadel-tools utility keeps PBKDF2 hashes usable after kc.sh export. Confirm hash handling for any other credential type in your realm.Direct
ClientsApplications within a projectEach Keycloak client needs a Zitadel application with matching redirect URIs, grant types and client authentication. Inventory these before cutover.Design decision
Realm roles and client rolesProject roles and grantsRealm roles and client roles both need a project role model. Flatten or namespace them, then grant them to users or organizations explicitly.Design decision
Identity brokeringIdentity providers per organizationZitadel supports OIDC, SAML and Keycloak as upstream providers. Each customer organization can use a different provider, so map brokers by organization.Design decision
User federation such as LDAPLDAP and OpenLDAP identity providerConfirm attribute mapping, sync behavior and which users remain authoritative in the directory. Test with a sample of accounts before cutover.Confirm in docs
Authentication flows and required actionsLogin policies and actionsRebuild required actions, such as password change or MFA enrollment, using the Zitadel login policy and action options in your target version.Confirm in docs
Sessions and token lifetimesToken and session settings per application or policyConfirm the available lifetime settings and their scope in the target version. Set them again per application and check refresh behavior.Confirm in docs
Fine-grained authorization servicesNo direct equivalentKeycloak policies and permissions have no one-to-one Zitadel object. Choose whether checks move into application code, an external policy service or project role claims.Design decision

How password hashes survive the Keycloak to Zitadel move

The documented Keycloak path is designed to keep existing passwords usable. You export the realm's users with kc.sh export, convert them with the zitadel-tools migration utility, which keeps PBKDF2 password hashes usable, and import the result through POST /admin/v1/import. For most users, this means sign-in works with the password they already know, without a reset campaign. The word "most" matters here. Whether a given account carries over depends on how your realm stores its hashes and which credentials each user holds. Treat the documented path as a hypothesis to test in your environment before anyone promises users that their passwords will carry over.

Start with the password policy in your realm. Record the hash algorithm and the hash iteration count, because these settings shape the exported credential data. Confirm that the algorithm is a PBKDF2 variant the converter supports, and check the iteration handling against the Zitadel migration documentation for the version you plan to run. Then export a small set of test users, convert them, and import them into a non-production Zitadel instance. Sign in with each test account and record the result. If any realm, client or user group uses a different algorithm or a changed iteration value, note it now, because that group needs its own plan before cutover.

Passwords are only one credential type. List every second factor and passwordless method enrolled in the realm, including OTP applications, WebAuthn security keys and any passkeys, and count how many users hold each one. The documented conversion covers password hashes, so do not assume that OTP secrets or WebAuthn registrations will arrive in Zitadel in the same form. Test each credential type with a sample user. Where a type does not carry over, those users will need to enroll again. Zitadel's passkey support includes password login as a fallback, which can ease the step for users who lose a device, but re-enrollment still has to be scheduled and communicated.

Decide the path for users whose credentials cannot be carried over during the design phase, and name the owner of that decision. A forced reset imports the account and requires a new password at first sign-in. It needs a notification channel that reaches users who are not currently signed in, and a help desk prepared for a rise in recovery requests. A just-in-time fallback checks the old credential at sign-in and migrates the account when the check succeeds. It keeps the source system running and reachable for as long as accounts still depend on it, so it needs a defined end date. Confirm the current just-in-time steps in Zitadel's migration guide before you choose, and write the chosen rule into the cutover plan.

Documented tools and APIs for the Keycloak to Zitadel import

Four tools and APIs carry users from a Keycloak realm into Zitadel, in order. Each step produces the input for the next, so a gap at one stage appears later as a missing or failed user. Confirm the versions of Keycloak, the migration utility and Zitadel before the first run.

Export the realm with kc.sh

The kc.sh export command writes a Keycloak realm's users, including their password hashes, to files on disk. It is the starting point for this migration, and the output is sensitive because it contains credentials. Prepare access to the Keycloak host or container and a secured location for the export files. Confirm the export options and file layout against the Keycloak release you run, which the current release notes list as 26.8.1.

Convert users with zitadel-tools

The zitadel-tools migration utility converts the Keycloak export into a format Zitadel can import. Its key property for this migration is that it keeps PBKDF2 password hashes usable, so users can keep their existing passwords after cutover. Prepare a working copy of the export, a mapping from Keycloak realms to Zitadel organizations, and a non-production Zitadel instance for test conversions. Confirm the utility version, the PBKDF2 parameters it supports and the Zitadel version it targets before running it on production data.

Load users with the import endpoint

POST /admin/v1/import is the Zitadel Admin API endpoint that loads the converted users into the target instance. The team needs an API identity with the rights the import requires, a token issued for the target instance, and the organization that will receive the users. Confirm the request body format, batch handling and how repeated imports are treated in the Zitadel release you deploy. Rehearse the call on a non-production instance before the production run.

Verify users with the events API

The Zitadel events API confirms the import from the platform's own record. After loading, query for user.human.added events and compare the count and usernames against the converted export, so gaps surface before users are told to sign in. Prepare a reconciliation script or spreadsheet and keep the export manifest in a controlled location. Confirm the event names, query filters and event retention in the current events API documentation for your Zitadel version.

Mapping realms, clients and roles to Zitadel organizations, projects and applications

A Keycloak realm usually becomes a Zitadel organization inside an instance, and the instance itself is chosen first because it is the isolation boundary. Zitadel treats an instance as a virtual tenant with full data isolation, while organizations hold the projects and users. If customers need separate data stores, separate administrators or separate configuration, give each group its own instance. If they only need separate user populations under one operator, several organizations in one instance may be enough. Confirm this decision with the security and operations owners before any import, because moving a customer between instances later is a migration in its own right. Keycloak clients then map to Zitadel applications inside projects, and each project groups its applications, roles and grants.

Roles need the most careful inventory. Keycloak realm roles are visible to every client in the realm, while client roles belong to one client and can share names with roles in other clients. Export the role list for each realm and each client, then decide which realm roles and client roles become project roles and which become grants that assign those roles to users or groups in a given organization. Composite roles, which bundle other roles in Keycloak, usually need to be flattened into explicit grants so that each permission is visible in Zitadel. Role names that collide across clients need a prefix or a namespace in the project. Ask the application owners to confirm which roles their code checks, because a renamed role is a silent authorization change.

The project boundary is a design decision with lasting consequences. One project per product suits a shared application that serves many customers with the same role catalog, since roles are defined once and granted per organization. One project per customer suits customers who need different role catalogs or who must be administered separately, at the cost of more projects to maintain and more duplicated applications. Many teams settle on a hybrid, with a shared project for common products and dedicated projects for customers with unusual role models. Write the rule down before mapping begins, and test it with one product and two customers, so that the pattern is proven before it is repeated across the estate.

Redirect URIs, client secrets and token claims are rebuilt for each application and then tested, not copied. Redirect URIs must match exactly across development, staging and production, so list each one from the Keycloak client configuration and confirm it against the application's own settings. Generate new client secrets in Zitadel and plan the rotation in every relying party, because a secret is not something to carry across unchanged without a checked cutover. Keycloak protocol mappers that add roles, groups or custom attributes to tokens must be recreated as Zitadel claim behavior, then verified by decoding real tokens for each application. Brokered logins need their own mapping: each customer organization can use a different identity provider, so link each external identity provider to the correct organization and confirm which provider each customer uses.

Sequence for a Keycloak to Zitadel migration with a parallel run and cutover

This sequence moves identities and applications from Keycloak to self-hosted Zitadel in controlled stages. Each stage ends with evidence that the team can review before it moves to the next one, and the final stage retires Keycloak only after a stabilization window agreed in advance.

  1. Inventory realms, clients, roles and brokers

    The team lists every Keycloak realm, client, role, identity broker, user federation link and password hash setting, and records the owner of each application. The inventory notes which clients use which redirect URIs, which external identity providers sign users in, and which password hashing settings apply to stored credentials, since these determine what can be carried over. Application owners review and sign off the register. The step closes when the inventory is approved and every item is marked as migrate, rebuild or retire.

  2. Import a pilot realm into non-production

    The team exports one representative realm with kc.sh export, converts the user file with the zitadel-tools migration utility so that PBKDF2 password hashes remain usable, and imports the result through the Zitadel admin import endpoint. They then confirm the imported users appear as user.human.added events in the events API. Testers run sign-in scenarios: password login with a migrated hash, MFA enrollment, brokered sign-in and token claim checks. The step closes when every sign-in test passes and the team has documented any user who could not authenticate and why.

  3. Map realms and build applications

    The team decides how Keycloak realms map to Zitadel instances, organizations and projects, and how Keycloak clients and roles map to Zitadel applications, project roles and grants. Customers with separate identity providers need their own organization configuration, so that decision is recorded here. Each application is rebuilt in the non-production instance and its tokens are compared with those issued by Keycloak for the same test user. The step closes when the mapping document is approved by application owners and every token difference is either fixed or accepted in writing.

  4. Run both systems in parallel

    Keycloak and Zitadel are both available during the agreed window, and the team migrates users in waves while watching new accounts through the events API. The team must decide in advance which system is authoritative for each change type, including password resets, MFA enrollment, account disablement and role assignments, and how any change made in one system reaches the other. Each day or batch, the team reconciles user counts and attributes between the two systems. The step closes with a reconciliation report showing that all differences have an owner and a resolution, and that the decision rules were followed.

  5. Cut over and retire Keycloak after stabilization

    The team repoints application configuration, redirect URIs and secrets to Zitadel, and places Keycloak in read-only mode once the cutover checklist is complete. A rollback path stays available for the defined stabilization window, which is set in writing before cutover and is not shortened by the team's own convenience. After that window closes with no open authentication incidents, the team archives configuration exports, audit logs and a final backup under the organization's retention policy, then decommissions Keycloak. The step closes when the decommissioning record is signed by the service owner.

What drives the cost and duration of a Keycloak to Zitadel migration

This table lists the factors that most change the effort of moving a Keycloak estate to Zitadel and what to confirm before accepting a quote. Read each row against your own inventory of realms, clients, custom code and applications. The main takeaway is that custom extensions and integrations usually decide effort, while hosting, database operations, upgrades and support continue after cutover.

DriverEffect on effortWhat to confirm in a quote
Realms and usersEach realm maps to Zitadel organizations and projects. User count per realm drives export, conversion and import time and verification work.Realm count, user count per realm, and whether one Zitadel instance or several is planned.
Clients and protocolsEach OIDC or SAML client needs its project application, redirect URIs, grants and token settings checked and retested on Zitadel.Count of OIDC and SAML clients, and which need redesign versus only new endpoints or redirect URIs.
Custom authenticators and protocol mappersCustom authenticators usually need new code and testing. Protocol mappers must be recreated with Zitadel equivalents, checked one by one.Number of custom authenticators and mappers, and whether the quote includes rebuilding and testing each one.
User federation and identity brokersEach LDAP or other federated user store and each brokered identity provider needs a Zitadel identity provider and tested login flows.Which Zitadel identity provider type covers each source, and how per-organization login is tested.
Password hashes and forced resetszitadel-tools keeps PBKDF2 hashes usable. Users whose hashes cannot be carried over need forced resets, which add help desk and support effort.Hash algorithm and iteration settings confirmed, and the expected share of users needing forced resets.
Token and session lifetime redesignAccess, refresh and SSO session lifetimes are set at realm and client level in Keycloak and must be re-decided and tested in Zitadel.Who approves lifetime values, and whether the quote covers refresh and session behavior testing.
Zitadel hosting and PostgreSQLKubernetes with the official Helm chart is the documented high availability route. PostgreSQL 14 to 18 is supported. Hosting and database operations recur.Hosting platform, sizing, backup and restore tests, and who runs upgrades and patching after go-live.
Keycloak deployment model and OperatorOperator-managed realms and clients may need mapping from custom resources. Clustered deployments with synchronous database replication add cutover freeze planning.Whether the Keycloak Operator manages your realms, the update approval mode, and how cutover freeze windows are handled.
Applications whose code or configuration must changeEach application must switch issuer, client IDs, claim names and token validation. Language and framework mix sets the test effort.Number of applications needing code changes versus configuration changes, and who tests each one.

What usually goes wrong in a Keycloak to Zitadel move and how to prevent it

Most problems in a Keycloak to Zitadel move come from data that moves cleanly on paper but behaves differently in production. The cards below cover the failure points we see most often, each paired with the check that catches it before users or applications are affected.

Password hashes that fail to verify

Users exported with PBKDF2 hashes depend on the exact algorithm, iteration count and salt settings from the source realm. The zitadel-tools conversion keeps these hashes usable, but a mismatch can leave some accounts unable to sign in on day one. Prevent this by running a pilot with a copy of real exported users and the realm's actual hash settings, then confirming that a sample of each password policy tier authenticates in Zitadel before the full import.

Claims and roles that drift

Keycloak realm roles, client roles and group memberships must be remapped to Zitadel projects, roles and grants. When a claim name, role key or audience changes, applications can still sign users in while authorizing them incorrectly. Prevent this with a token comparison test for each client: decode tokens issued by Keycloak and Zitadel for the same test users, then compare subject, audience, roles and custom claims field by field.

Redirect URI and client secret gaps

Each application needs its redirect URIs, post-logout URIs and client credentials registered in Zitadel before traffic moves. Missing or mistyped URIs produce sign-in errors that appear only for specific environments or paths. Client secrets may not carry over in the same form, so confirm with your own export what can be reused. Prevent gaps by building a per-client checklist that compares the Keycloak and Zitadel configurations and is signed off before cutover.

Changes made during the parallel run

While Keycloak stays live, users may change passwords, reset credentials or enroll MFA devices. Those changes exist only in Keycloak, so a single bulk import leaves those users with stale credentials or no second factor in Zitadel. Prevent this by setting a cutover window with a final delta export, reimporting changed accounts, and checking the Zitadel events API for user.human.added entries to confirm each record arrived.

Brokered identity providers left unconfigured

Keycloak realms often broker logins to upstream providers such as Entra ID, Okta or Google. Zitadel can federate with these providers too, but each customer organization can use a different identity provider, so the configuration is set per organization rather than inherited from a single realm setting. Prevent gaps by inventorying every brokered provider and its mappers, then testing each organization's sign-in path, including callback URLs and attribute mapping, before go-live.

License review skipped before rollout

Zitadel core, Console and hosted login moved to the GNU Affero General Public License 3.0 with Zitadel v3.0 on 31 March 2025, while Keycloak is licensed under Apache 2.0. The AGPL includes obligations that depend on how the software is modified and offered to users over a network. Prevent surprises by having legal review how your deployment, modifications and any customer-facing use fit the license before the pilot begins, and by confirming which components you plan to use.

What the Keycloak side of the move needs before export

The first decision is which Keycloak version the export will come from. Compare the version in use with the current release, 26.8.1, published October 13, 2026, and read the upgrading guide for every release between your version and the one you export from. Since Keycloak 26.0, the project plans four minor releases a year, and breaking changes in a minor release are opt-in, so a version that was current a year ago may need configuration review before you export. If you run the Red Hat build of Keycloak, check its own support lifecycle as well. Red Hat's product page showed 26.6 as its latest version, so the supported build may trail the upstream release. Record the exact version reported by the running server, not the version in a deployment manifest, which may be out of date.

Next, identify the production database and its exact version. Keycloak supports MariaDB, Microsoft SQL Server, MySQL, Oracle Database, PostgreSQL 14 to 18, EnterpriseDB Advanced, Amazon Aurora PostgreSQL and Azure SQL. The default file database is for development only, so finding it in production is a finding to resolve before the export starts. Also confirm how schema changes are applied. Keycloak migrates its schema automatically at startup by default, but administrators can apply the SQL themselves, which the upgrading guide suggests for large deployments. Confirm which mode you run and whether any migration is pending, because an export taken during an unfinished migration can capture a state you did not intend. Record the number of realms and users so the export and import can be sized and checked later.

Document the high availability design as it runs today. Keycloak describes three architectures: a single cluster, optionally spread across availability zones, a multi-cluster deployment (v2) that does not use an external Infinispan cluster, and the deprecated multi-cluster v1 design that runs a separate Infinispan cluster per site. Both supported designs require a synchronously replicated database. Write down which design you run, where the database replicas sit, and how failover behaves. This matters for the export because the export reads from the live database, and the restore point must reflect a consistent state. If you run v1, treat the move to a supported design as a separate workstream, since v1 is deprecated, and plan it before the migration window rather than during it.

If Keycloak runs under the Keycloak Operator, confirm how the operator is installed and which custom resources manage the deployment. The operator is installed through Operator Lifecycle Manager (the recommended method), with kubectl, or with an experimental Helm chart. It manages Keycloak, KeycloakRealmImport, KeycloakOIDCClient and KeycloakSAMLClient resources. Check whether operator updates use manual approval. The operator documentation strongly recommends manual approval to avoid unintended automatic upgrades. If updates are automatic, an operator upgrade could change the running Keycloak version during your window. Switch to manual approval before the window and name the person who approves changes. Also check whether realm and client configuration lives in these custom resources, because the operator can reapply that state after you have changed it outside the cluster.

Take the export in a controlled window, with a restore point taken immediately before it. Freeze administrative changes and realm edits for the duration, and confirm who can authorize a rollback. Test the restore procedure on a copy of the database before relying on it. The Zitadel Keycloak guide uses kc.sh export, and the conversion step depends on the format that export produces, so the team must confirm the exact export procedure, options and handling of password hashes with the Keycloak documentation and the Zitadel documentation for the versions in use. Ask the Zitadel side to confirm which export format the zitadel-tools utility expects for your Keycloak version. Where those documents differ from your environment, resolve the difference in writing before the window opens.

Questions buyers ask before a Keycloak to Zitadel migration

How much does a Keycloak to Zitadel migration cost, and how is the quote built?

The cost follows from the written scope, so no fixed figure applies before the inventory is complete. A quote usually covers discovery of realms, clients, roles and users, the export and conversion work, mapping realms to Zitadel instances, organizations and projects, repointing applications, testing, cutover support and documentation. Cost rises with the number of realms, clients, custom extensions, federated brokers and applications that depend on specific token claims. Ask for one-time items (discovery, build, testing, cutover) listed separately from recurring items such as hosting, database operations, Zitadel licensing and any support retainer. Zitadel's pricing page lists its Enterprise plan as custom for self-hosted or cloud deployments, so ask for that line separately from the migration work.

How long does a Keycloak to Zitadel migration take?

The duration depends on the inventory, so a dependable schedule comes after discovery. The number of realms, clients, protocol mappers, roles, groups and user records sets most of the work, along with how many applications must change their OIDC or SAML configuration. A single realm with a few well-documented clients is a very different job from a multi-realm estate with custom extensions and many downstream integrations. Ask the partner to show the inventory method, the list of tasks that gate cutover, and the change window your operations team can staff. Confirm the user record count early, because it sets import and verification time.

What must our team provide before a Keycloak migration starts?

The migration cannot start until your team provides access and ownership for the source and target. The main items are:

  • Realm exports access: a maintainer who can run the export (kc.sh export) against the Keycloak deployment, or a secure way to share the output.
  • Client inventory: every client, its protocol, redirect URIs, scopes and the application it serves.
  • Owners for each application: a named person who can approve configuration changes and sign off testing.
  • Test users: accounts in each realm that cover typical roles, MFA setups and any federated sign-in paths.
  • A change window: an agreed period for the final export, import and repointing, with a rollback decision point.

Missing owners are the most common source of delay, so confirm these names before the quote is signed.

Can our internal team migrate from Keycloak to Zitadel without a partner?

An internal team can do the work if it already has the right skills and time to test. The team needs working knowledge of Keycloak administration, including realms, clients, roles, mappers and identity brokering. It also needs PostgreSQL operations, experience deploying Zitadel with Docker Compose, binaries or the Helm chart on Kubernetes, and OIDC or SAML configuration for each application. Scripting is needed to transform the export and call the import endpoint (POST /admin/v1/import), and someone must be able to verify imported users through the events API. The main risk is the first production cutover, which is hard to rehearse without a second run in staging. A fixed-scope engagement with DeployOpen is one option if those skills are thin.

Will existing Keycloak passwords work in Zitadel after migration?

Often yes for users with PBKDF2 password hashes, because the zitadel-tools migration utility converts the Keycloak export so Zitadel can verify those hashes after import. Confirm the hash algorithms each realm uses before planning, since users with other credential types, such as OTP setups, WebAuthn-only accounts or accounts without a local password, need separate handling. Users whose credentials do not carry over need a defined path, such as a forced password reset by email, or a just-in-time approach during a grace period if the Keycloak version and your Zitadel version support it. Passkeys can be enrolled after migration, with password login kept as a fallback. Check each imported user through the user.human.added events.

How are the parallel run and rollback handled during a Keycloak migration?

Keep Keycloak running and unchanged until the cutover is accepted, and archive the final export so the state at cutover can be reproduced. A staging dry run from a fresh export should come before production, with test users signing in to each application. Zitadel can federate login with Keycloak, so one option is to move applications one at a time while Keycloak remains the source for the rest. Rollback means pointing each application's configuration back to Keycloak, which is clean only if user changes made in Zitadel during the run are either frozen or reconciled. Define the freeze point, the session and token handling, and the decision owner in the written scope. Confirm which parallel pattern your Keycloak and Zitadel versions support.

How DeployOpen scopes, delivers and supports the Keycloak to Zitadel migration

DeployOpen scopes each Keycloak to Zitadel migration in writing before work starts, covering the realms, clients and roles to move. We run the export, conversion and import in your own infrastructure, then map realms to organizations, clients to applications and roles to projects. Support after handover is available as a retainer.

How we scope

  • The written scope lists every Keycloak realm, client and role set that moves to Zitadel.
  • Scope also records which users need password hashes preserved and which need a reset.
  • Engagements are fixed-scope, with scope, deliverables and timelines agreed in writing before work starts.

How we build

  • Export users from the Keycloak realm with kc.sh export, including the password hash fields the conversion needs.
  • Convert the export with zitadel-tools so PBKDF2 password hashes stay usable after import.
  • Map realms to organizations, clients to applications and roles to projects, then import through POST /admin/v1/import.

How we hand over

  • Confirm imported users in the Zitadel events API by checking for user.human.added events.
  • Document the mapping, conversion steps and reconciliation results so your team can repeat or audit them.
  • Hand over runbooks and an agreed cutover plan for repointing applications to Zitadel.

How we support

  • Ongoing support, upgrades and continuous testing are available as retainers after handover.
  • Plan Zitadel upgrades against the current release line, checking release notes first.
  • Confirm which Keycloak release and database version the source environment runs before export.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.