The ZITADEL Quick Start Guide | ZITADEL Docs

Get Started

The ZITADEL Quick Start Guide

In this guide, you’ll set up a Zitadel account and configure it to work with our pre-built example applications. You can simply clone the repository, follow the console setup, and have a working authentication flow in minutes.

Get Started with ZITADEL Cloud

Set up your ZITADEL account and organization to begin managing identities for your applications.

1. Create your Account and Organization

You first need access to the ZITADEL Cloud Customer Portal. This is the administrative hub for managing your billing, teams, and instances.

  1. Sign Up: Go to zitadel.com and select Sign Up.
  2. Onboarding: Follow the prompts to verify your email and set up your Portal Team.
  1. Access: Once authenticated, you will be redirected to the Customer Portal dashboard.

2. Quick Onboarding

Complete the brief onboarding questions. This data helps us prioritize the development of new features, SDKs, and integrations that matter most to our community.

3. Create your ZITADEL instance

An Instance is a fully isolated identity environment with its own users, policies, and data. Most developers use separate instances to isolate Development, Test, and Production workflows.

Follow these steps to deploy your first instance:

  1. Start: Click Create Instance on your dashboard.
  2. Identity: Provide an Instance Name (e.g., dev-environment). This will be used to generate your default domain (e.g., dev-environment-xxxx.zitadel.cloud).
  3. Locality: Select your Region.
  1. Admin Setup: Create your Instance Administrator. This user has "root" permissions to manage all organizations, policies, and settings within this specific instance.
  2. Deploy: Review your settings and click Create Instance.

4. Create your Project and Application

In ZITADEL, Applications are grouped into Projects. This allows multiple applications (like a React frontend and a Go backend) to share the same roles and role assignments.

Launch the Management Console

Click Create your app. This opens the Management Console for your instance in a new tab. Log in using the Admin credentials you just created.

Step 1: Define your Project

Step 2: Review Default Settings

ZITADEL automatically configures the best security settings for your selected framework.

AngularASP.NET CoreAstroDjangoExpress.jsFastAPIFastifyFlaskFlutterGoHonoLaravelNestJSNext.jsNuxtQwikReactSolidStartSpringSymfonySvelteVue.js

5. Collect your Integration Keys

AngularASP.NET CoreAstroDjangoExpress.jsFastAPIFastifyFlaskFlutterGoHonoLaravelNestJSNext.jsNuxtQwikReactSolidStartSpringSymfonySvelteVue.js

To connect your application to ZITADEL, you need two primary settings. These are typically stored as environment variables in your project.

  1. Client ID Navigate to Settings in the left sidebar. This is the unique public identifier for your React application.
  2. Issuer URL Click on URLs in the left sidebar to find your Discovery Endpoint. - The Value: Copy the issuer URL (e.g., https://your-instance.zitadel.cloud). - Why it matters: ZITADEL supports OIDC Discovery. By providing just the Issuer URL to your SDK, the library automatically finds the login, logout, and token endpoints for you.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

  1. Client ID & Client Secret Copy the client id and secret from the modal. The client id is the unique public identifier for your application. Note: If you missed copy the secret, you can generate a new one in the Actions dropdown.
  2. Issuer URL Click on URLs in the left sidebar to find your Discovery Endpoint. - The Value: Copy the issuer URL (e.g., https://your-instance.zitadel.cloud). - Why it matters: ZITADEL supports OIDC Discovery. By providing just the Issuer URL to your SDK, the library automatically finds the login, logout, and token endpoints for you.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need two primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need two primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need two primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need two primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need three primary settings. These are typically stored as environment variables in your project.

To connect your application to ZITADEL, you need two primary settings. These are typically stored as environment variables in your project.

Integrate ZITADEL into your App

How the Authentication Flow Works

ZITADEL handles the complexity of the OIDC handshake so your app stays secure without manual token management.

  1. Login: App redirects the user to ZITADEL with a PKCE challenge.
  2. Auth: User authenticates on the ZITADEL hosted login page.
  3. Exchange: ZITADEL returns an Auth Code, which the app exchanges for an Access Token.
  4. Tokens: The app shows the Access and ID Token
  5. Logout: The app clears local tokens and terminates the ZITADEL session.

1. Prerequisites

AngularASP.NET CoreAstroDjangoExpress.jsFastAPIFastifyFlaskFlutterGoHonoLaravelNestJSNext.jsNuxtQwikReactSolidStartSpringSymfonySvelteVue.js

2. Get the Example Project

AngularASP.NET CoreAstroDjangoExpress.jsFastAPIFastifyFlaskFlutterGoHonoLaravelNestJSNext.jsNuxtQwikReactSolidStartSpringSymfonySvelteVue.js

git clone https://github.com/zitadel/example-auth-angular.git
cd example-auth-angular
git clone https://github.com/zitadel/example-auth-astro.git
cd example-auth-astro
git clone https://github.com/zitadel/example-auth-dotnet.git
cd example-auth-dotnet
git clone https://github.com/zitadel/example-auth-django.git
cd example-auth-django
git clone https://github.com/zitadel/example-auth-expressjs.git
cd example-auth-expressjs
git clone https://github.com/zitadel/example-auth-fastapi.git
cd example-auth-fastapi
git clone https://github.com/zitadel/example-auth-fastify.git
cd example-auth-fastify
git clone https://github.com/zitadel/example-auth-flask.git
cd example-auth-flask
git clone https://github.com/zitadel/zitadel_flutter.git
cd zitadel_flutter
git clone https://github.com/zitadel/zitadel-go.git
cd zitadel-go
git clone https://github.com/zitadel/zitadel-auth-hono.git
cd zitadel-auth-hono
git clone https://github.com/zitadel/example-auth-laravel.git
cd example-auth-laravel
git clone https://github.com/zitadel/example-auth-nestjs.git
cd example-auth-nestjs
git clone https://github.com/zitadel/example-auth-nextjs.git
cd example-auth-nextjs
git clone https://github.com/zitadel/example-auth-nuxtjs.git
cd example-auth-nuxtjs
git clone https://github.com/zitadel/example-auth-qwik.git
cd example-auth-qwik
git clone https://github.com/zitadel/example-auth-react.git
cd example-auth-react
git clone https://github.com/zitadel/example-auth-solidstart.git
cd example-auth-solidstart
git clone https://github.com/zitadel/example-auth-spring.git
cd example-auth-spring
git clone https://github.com/zitadel/example-auth-symfony.git
cd example-auth-symfony
git clone https://github.com/zitadel/example-auth-sveltekit.git
cd example-auth-sveltekit
git clone https://github.com/zitadel/example-auth-vue.git
cd example-auth-vue

3. Configure your Credentials

AngularASP.NET CoreAstroDjangoExpress.jsFastAPIFastifyFlaskFlutterGoHonoLaravelNestJSNext.jsNuxtQwikReactSolidStartSpringSymfonySvelteVue.js

  1. Copy+paste the .env.example to .env
  2. Update the ZITADEL_CLIENT_ID and ZITADEL_DOMAIN with the client id and issuer you collected in Step 5.
PORT=3000
NG_APP_ZITADEL_DOMAIN="https://your-zitadel-domain"
NG_APP_ZITADEL_CLIENT_ID="your-client-id"
NG_APP_ZITADEL_CALLBACK_URL="http://localhost:3000/auth/callback"
NG_APP_ZITADEL_POST_LOGOUT_URL="http://localhost:3000/auth/logout/callback"
NG_APP_ZITADEL_POST_LOGIN_URL="/profile"
  1. Copy+paste the .env.example to .env
  2. Update the ZITADEL_CLIENT_ID, ZITADEL_CLIENT_SECRET and ZITADEL_DOMAIN with the client id and issuer you collected in Step 5.
NODE_ENV=development
PORT=3000
SESSION_SECRET="your-very-secret-and-strong-session-key"
SESSION_DURATION=3600
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-zitadel-application-client-secret"
ZITADEL_CALLBACK_URL="http://localhost:3000/api/auth/callback/zitadel"
ZITADEL_POST_LOGIN_URL="/profile"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/api/auth/logout/callback"
NEXTAUTH_URL="http://localhost:3000"
PORT=3000
SESSION_DURATION=3600
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-randomly-generated-client-secret"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/auth/logout/callback"
  1. Copy+paste the .env.example to .env
  2. Update the ZITADEL_CLIENT_ID and ZITADEL_DOMAIN with the client id and issuer you collected in Step 5.
PY_ENV=development
PORT=3000
SESSION_SECRET="your-very-secret-and-strong-session-key"
SESSION_DURATION=3600
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-randomly-generated-client-secret"
ZITADEL_CALLBACK_URL="http://localhost:3000/auth/callback"
ZITADEL_POST_LOGIN_URL="/profile"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/auth/logout/callback"
NODE_ENV=development
PORT=3000
SESSION_SECRET="your-very-secret-and-strong-session-key"
SESSION_DURATION=3600
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-zitadel-application-client-secret"
ZITADEL_CALLBACK_URL="http://localhost:3000/auth/callback/zitadel"
ZITADEL_POST_LOGIN_URL="/profile"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/auth/logout/callback"
PY_ENV=development
PORT=3000
SESSION_SECRET="your-very-secret-and-strong-session-key"
SESSION_DURATION=3600
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-zitadel-application-client-secret"
ZITADEL_CALLBACK_URL="http://localhost:3000/auth/callback"
ZITADEL_POST_LOGIN_URL="/profile"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/auth/logout/callback"

No action required for this step. The issuer and client Id will be passed directly when running the app (next step)

No action required for this step. The issuer and client Id will be passed directly when running the app (next step)

  1. Copy+paste the .env.example to .env
  2. Update the ZITADEL_CLIENT_ID, ZITADEL_CLIENT_SECRET and ZITADEL_DOMAIN with the client id and issuer you collected in Step 5.
  3. Generate app key, this will update the APP_KEY variable in the .env file
php artisan key:generate
APP_KEY="your-app-key"
APP_ENV=local
APP_DEBUG=true
SERVER_URL="http://localhost:3000"
SERVER_PORT=3000
DB_CONNECTION=sqlite
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-randomly-generated-client-secret"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/auth/logout/callback"
  1. Copy+paste the .env.example to .env.local
  2. Update the ZITADEL_CLIENT_ID, ZITADEL_CLIENT_SECRET and ZITADEL_DOMAIN with the client id and issuer you collected in Step 5.
NODE_ENV=development
PORT=3000
SESSION_SECRET="your-very-secret-and-strong-session-key"
SESSION_SALT="your-very-secret-and-strong-session-salt"
SESSION_DURATION=3600
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-zitadel-application-client-secret"
ZITADEL_CALLBACK_URL="http://localhost:3000/auth/callback/zitadel"
ZITADEL_POST_LOGIN_URL="/profile"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/auth/logout/callback"
NODE_ENV=development
PORT=3000
SESSION_SECRET="your-very-secret-and-strong-session-key"
SESSION_DURATION=3600
ZITADEL_DOMAIN="[https://your-instance.zitadel.cloud/](https://your-instance.zitadel.cloud/)"
ZITADEL_CLIENT_ID="zitadel-client-id"
ZITADEL_CLIENT_SECRET="zitadel-client-secret"
ZITADEL_CALLBACK_URL="http://localhost:3000/api/auth/callback/zitadel"
ZITADEL_POST_LOGIN_URL="/profile"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/api/auth/logout/callback"
NEXTAUTH_URL="http://localhost:3000"
NODE_ENV=development
PORT=3000
SESSION_SECRET="your-very-secret-and-strong-session-key"
SESSION_DURATION=3600
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-zitadel-application-client-secret"
ZITADEL_CALLBACK_URL="http://localhost:3000/api/auth/callback/zitadel"
ZITADEL_POST_LOGIN_URL="/profile"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000"
NEXTAUTH_URL="http://localhost:3000"
NODE_ENV=development
VITE_PORT=3000
VITE_SESSION_SECRET="your-very-secret-and-strong-session-key"
VITE_SESSION_DURATION=3600
VITE_ZITADEL_DOMAIN="https://your-zitadel-domain"
VITE_ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
VITE_ZITADEL_CLIENT_SECRET="your-zitadel-application-client-secret"
VITE_ZITADEL_CALLBACK_URL="http://localhost:3000/auth/callback/zitadel"
VITE_ZITADEL_POST_LOGOUT_URL="http://localhost:3000/api/auth/logout/callback"
  1. Copy+paste the .env.example to .env
  2. Update the ZITADEL_CLIENT_ID and ZITADEL_DOMAIN with the client id and issuer you collected in Step 5.
NODE_ENV=development
PORT=3000
VITE_ZITADEL_DOMAIN="https://your-zitadel-domain"
VITE_ZITADEL_CLIENT_ID="your-client-id"
VITE_ZITADEL_CALLBACK_URL="http://localhost:3000/auth/callback"
VITE_ZITADEL_POST_LOGIN_URL="/profile"
VITE_ZITADEL_POST_LOGOUT_URL="http://localhost:3000"
SPRING_PROFILES_ACTIVE=development
PORT=3000
SESSION_SECRET="your-very-secret-and-strong-session-key"
SESSION_DURATION=3600
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-randomly-generated-client-secret"
ZITADEL_CALLBACK_URL="http://localhost:3000/auth/callback"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/auth/logout/callback"
APP_SECRET="your-app-secret-key"
SERVER_URL="http://localhost:3000"
SERVER_PORT=3000
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-randomly-generated-client-secret"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/auth/logout/callback"
SESSION_SECRET="your-very-secret-and-strong-session-key"
SESSION_DURATION=3600
# Example: https://my-org-a1b2c3.zitadel.cloud
ZITADEL_DOMAIN="https://your-zitadel-domain"
ZITADEL_CLIENT_ID="your-zitadel-application-client-id"
ZITADEL_CLIENT_SECRET="your-zitadel-application-client-secret"
ZITADEL_CALLBACK_URL="http://localhost:3000/auth/callback/zitadel"
ZITADEL_POST_LOGIN_URL="/profile"
ZITADEL_POST_LOGOUT_URL="http://localhost:3000/auth/logout/callback"
NEXTAUTH_URL="http://localhost:3000"
  1. Copy+paste the .env.example to .env
  2. Update the ZITADEL_CLIENT_ID and ZITADEL_DOMAIN with the client id and issuer you collected in Step 5.

4. Build and Run

AngularASP.NET CoreAstroDjangoExpress.jsFastAPIFastifyFlaskFlutterGoHonoLaravelNestJSNext.jsNuxtQwikReactSolidStartSpringSymfonySvelteVue.js

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

Make sure to replace the [zitadel_issuer] and [zitadel_client_id] with your own value before running the command

flutter run -d chrome --web-port=4444 --dart-define zitadel_url=[zitadel_issuer] --dart-define zitadel_client_id=[zitadel_client_id]

Your app will be live at http://localhost:4444.

Make sure to replace the [zitadel_domain] (use the domain from the issuer without the https://) and [zitadel_client_id] with your own value before running the command

go run example/app/app.go --domain [zitadel_domain] --key XKv2Lqd7YAq13NUZVUWZEWZeruqyzViM --clientID [zitadel_client_id] --redirectURI http://localhost:8089/auth/callback

Your app will be live at http://localhost:8089.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

make start

Your app will be live at http://localhost:3000.

Success! 🚀

You’ve successfully integrated ZITADEL into an application.

Prevent Settings Misconfiguration Lockouts

Login policy settings misconfigurations that occur during the testing phase can easily lead to a lockout. To ensure you don't lose access to your instance:

  1. Generate a backup PAT: Create a Service Account Personal Access Token with the IAM_OWNER role to revert any login UI misconfigurations using the API.
  2. Add a second Instance Administrator: Always designate at least one second instance administrator.

What’s next?

Need help? Join our Discord community or explore the full Documentation. Happy coding!

Prefer watching over reading? Check out our video walkthrough of this quickstart.

Was this page helpful?

Instances\ \ Overview of ZITADEL Instances—the virtual tenants providing full data isolation and independent settings.

On this page

Get Started with ZITADEL Cloud 1. Create your Account and Organization 2. Quick Onboarding 3. Create your ZITADEL instance 4. Create your Project and Application Launch the Management Console Step 1: Define your Project Step 2: Review Default Settings 5. Collect your Integration Keys Integrate ZITADEL into your App How the Authentication Flow Works 1. Prerequisites 2. Get the Example Project 3. Configure your Credentials 4. Build and Run Success! 🚀 What’s next?

Zitadel AI Assistant

Hey there, I’m the Zitadel AI assistant 🤖 — throw your questions my way!

AI answers can be wrong. Please don't share secrets, credentials or personal data.

Need Help?