Real-time User Sync via Zitadel Webhooks (Actions v2)
2 min read
Available from release 2026.08
Starting with release 2026.08, Unique supports real-time user synchronization via Zitadel Actions v2 webhooks. This replaces the 5-minute polling delay with near-instant event delivery (~1-3 seconds).
How it works
When enabled, the scope-management service registers itself as a webhook target with Zitadel on startup. Zitadel then sends HTTP POST requests to the scope-management service whenever user or organization events occur (e.g., user created, user deleted, profile updated, role changed).
The following events are handled in real-time:
Organization created, updated, or removed
User created (including self-registration)
User profile updated
User removed
Username changed
User metadata set or removed (including group claims)
User grant/role assignments changed
Fallback mechanism
The existing scheduled user-sync job (every 5 minutes) is kept as an automatic fallback. If the webhook delivery fails (e.g., during a service restart), the polling job catches up on missed events during its next run. A deduplication mechanism ensures that events are never processed twice, even when both the webhook and the polling job handle the same event.
Prerequisites
Zitadel v3.4.5 or later (uses the
/v2beta/Actions API)The
ZITADEL_WEBHOOK_ENDPOINTenvironment variable must be set on the scope-management service to the URL reachable from Zitadel (e.g.,http://backend-service-scope-management:8094/webhook/zitadel-events)ZITADEL_GRPC_HOSTandZITADEL_PATmust be configured (same as for the existing user-sync)
Note theZITADEL_PATmust haveIamOwnerpermissions to be able to create the actions webhook via
Configuration
Environment Variable | Required | Description |
|---|---|---|
| No (opt-in) | URL that Zitadel will POST events to. Must be reachable from the Zitadel instance. When not set, only the polling sync is used. |
| Yes (existing) | Zitadel API URL |
| Yes (existing) | Personal Access Token for the Zitadel service user. The service user must have the |
No additional setup is needed in Zitadel — the service automatically registers the webhook targets and event subscriptions on startup.
Verification
On service startup, check the logs for:
Zitadel Actions v2 registration complete— confirms the webhook target was registeredReusing existing target— on subsequent restarts, confirms the existing target is being reusedHandling webhook event— confirms events are being received in real-time
If ZITADEL_WEBHOOK_ENDPOINT is not set, the log will show:
ZITADEL_WEBHOOK_ENDPOINT not configured — skipping Actions v2 registration