Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Configure how user attributes from a source of identity are synchronized for target user accounts
Attribute synchronization ensures that identity attributes in target systems remain up to date with the corresponding attributes in the source of truth. Veza Lifecycle Management provides configuration at two levels to control how and when attributes are synchronized.
At the action level, there are two distinct options to govern provisioning and user update processes:
Create accounts - Turn this setting on for the action to create user accounts that don't exist in the target system. When it is off, users that don't already exist are skipped.
Update existing accounts - Turn this setting on for the action to update existing active user accounts with attribute changes from the source of truth. When it is off, existing active users are not modified, and changes apply only when a user is created or reactivated.
At the attribute level, the Apply On setting has two explicit choices that define how and when attribute values are applied to user accounts:
Create only - The attribute value is set only when creating new user accounts
Create and update - The attribute value is set for new accounts and updated for existing accounts when changes are detected
Both levels must be properly configured for an attribute to be continuously synchronized. For example, to keep an employee's department updated:
Turn on Update existing accounts on the Provision Account action
Set Apply On to Create and update for the department attribute
How Veza applies an update to an existing account depends on the target integration. For Active Directory, see .
Create and update (continuously sync attributes that change during employment):
Given Name, Surname
Department
Title
Manager
Cost Center
Create only (preserve stable identifiers):
Active Directory sAMAccountName
Email Addresses (for Email Write-Back action)
A write-back Provision Account action that maps email to update existing records in a Human Resources Information System (HRIS) is the exception: set Apply On to Create and update for that attribute. See .
This configuration ensures that dynamic attributes remain up to date while preserving stable identifiers.
AD Distinguished Name (DN)
AD User Principal Name (UPN)
AD Email
Send an email, call a webhook, or open a ServiceNow ticket as a step in a workflow, and configure notifications on other actions.
The Send Notification action is a workflow step. When the workflow reaches it, it sends an email, calls a webhook, or opens a ServiceNow ticket. Because it runs inside the workflow, it can run under a condition and after other actions, and its email can use attributes that earlier actions produced.
This page also covers Action Notification Settings, which add a notification to another action. Lifecycle Management offers three ways to send a notification:
Choose by what the message is for:
Policy notification: watch for a kind of event across the policy, such as every failed action or every time a safety limit is reached. It is the only way to notify on events that happen outside a workflow run, such as Extraction Processing Failed. See .
Action Notification Settings: report the outcome of one action, typically its failure.
Send Notification action: send a message as a step in the workflow, for example after the identity's accounts are created, only when a condition is met, as a ServiceNow ticket, or to a webhook that reports a result back to the workflow.
All three use the same recipient fields and the same .
Example Use Cases:
Alert IT staff when provisioning is complete
Notify the identity's manager of access changes (see )
Create a service desk ticket for any manual steps
Send standardized notifications using custom templates across workflows
When configuring email notifications (either as a Send Notification action or in Action Notification Settings), you can choose which template to use:
Default template: Uses your organization's default template for Action Succeeded or Action Failed notifications if one is set, and otherwise the action's built-in template. A default template for Action Succeeded applies to every Send Notification email and every action success email that uses Default template, in every policy.
Custom template: Uses a reusable custom email template you've created, allowing consistent messaging across multiple workflows
Custom templates support placeholders for dynamic content such as identity names and workflow names. Which placeholders are filled depends on the notification type; see . See for placeholder reference and template management.
Email notifications have four recipient fields. The same fields appear on the Send Notification action, in Action Notification Settings, and in policy notifications:
Select Recipient (Veza Action): an email Veza Action, which sends to the one address it stores.
Recipients: email addresses you enter.
Recipients From User's Attributes: identity attributes that hold email addresses.
Email Formatters: expressions that build an address from the identity's attributes.
If you select an email Veza Action, Veza sends only to the Veza Action's address. Selecting one clears the other three fields and makes them unavailable. Without a Veza Action, Veza sends one email addressed to everyone the other three fields resolve to.
Policy notifications for the Action Failed, Workflow Task Failed, and Extraction Processing Failed events are sent without the identity's attributes. On those events, Recipients From User's Attributes and Email Formatters resolve no addresses, so use Recipients or a Veza Action.
Templates have no placeholder for the identity's manager, and a template can't look up another entity. To send a notification to the manager, add the manager as a recipient in one of two ways:
The identity has an attribute with the manager's email address: select that attribute in Recipients From User's Attributes, for example manager_email.
The identity has only a manager ID: add an that uses to look up the manager's email address. For example, {manager_id | FROM_ENTITY_ATTRIBUTE, "OktaUser", "employee_id", "email"} finds the Okta user whose employee_id matches the identity's manager_id and sends to that user's email.
To notify both the identity and the manager, also select the identity's own email attribute, such as email, in Recipients From User's Attributes. Both people receive the same email.
Email Formatters build a recipient address from the attributes of the identity being processed, for cases where no attribute holds the full address. They're available on Send Notification actions, in Action Notification Settings, and in policy-level notifications. On Send Notification actions, Available in Veza v2026.9.7 and later.
To add a formatter, select Add Formatter under Email Formatters, then enter an expression in the Formatter field. Expressions use the same syntax as : place attribute names in curly braces and add transformation functions with a pipe. Use Then Apply to run more functions on the result. For example:
{email | LOWER} sends to the identity's email address in lowercase.
{first_name}.{last_name}@company.com builds an address from the identity's name.
Formatters read attributes from the policy's source of identity, including secondary sources. You can add more than one formatter to reach different recipients for the same identity.
Addresses from formatters are added to the addresses in Recipients and Recipients From User's Attributes. A formatter that can't be evaluated or doesn't produce a valid email address is skipped, and the notification goes to the remaining recipients. If no recipients remain, no email is sent. When a notification uses an email Veza Action, the recipient fields, including Email Formatters, are unavailable.
When a Send Notification action uses the Webhook notification type, the payload Veza sends includes a returnPostUrl field. The receiving system can use this callback URL to report a result back to Veza after it finishes processing, for example after it opens a ticket, completes an approval, or provisions an account in another system.
The action's wait-for-response duration, in seconds, controls whether Veza waits for that result:
0: Veza doesn't wait. The action completes when the webhook is sent.
Greater than 0: Veza waits up to that many seconds and uses the returned result as the action's result. If no result arrives in time, the action fails with a timeout error.
To return a result, the receiving system sends a POST to the returnPostUrl, authenticated with a Veza API token for a user with the Administrator, Operator, or OAA Push . The URL points to the endpoint for the job. Useful fields in the request body include:
info_messages: status strings such as ticket numbers, approval decisions, or notes, recorded against the job.
output_entities: entities the downstream system created or changed.
error_message, any_changes, and any_created: outcome details for the job.
The returned result is stored on the job. Review the job on the Integration Jobs tab of the page, or retrieve it with the API.
Where to set it up
Open the policy, then Policy Settings > Notifications
In the workflow editor, select an action, then Action Notification Settings. Available on every action except Send Notification and Pause
Add the action to a workflow
When it sends
When an event of the selected type occurs in any workflow in the policy
When the action fails, or when it succeeds and made changes
When the workflow reaches it
Notification types
Email, Webhook
Email, Webhook
Email, Webhook, Service Now
Notification Type
On the Send Notification action, select Email, Webhook, or Service Now. In Action Notification Settings, select Email or Webhook
Send a notification if
(Action Notification Settings only) Select Changes were made successfully, The action failed, or both. A success notification is sent only when the action made a change, so an action that runs without changing anything sends nothing
Only send if prior actions resulted in a change
(Send Notification action only) Send only when an earlier action in the workflow made a change
Select Email Template
(Email notifications only) Select a custom email template, or Default template. Default template uses the template your organization set as the default for Action Succeeded or Action Failed notifications, if there is one, and otherwise the action's built-in template. See
Recipients
(Email notifications only) Enter one or more email addresses, separated by commas
Recipients From User's Attributes
(Email notifications only) Select identity attributes that hold email addresses. The list shows only text attributes whose name contains mail or manager
Email Formatters
(Email notifications only) Build recipient email addresses from the identity's attributes with transformer expressions. See
Webhook Configuration
Configure webhooks to trigger on success, failure, or both by specifying the URL to send the payload and optional auth header for the POST request
Select Recipient (Veza Action) / Select Existing Webhook / Select Config
Select an existing Veza Action for pre-configured email or webhook settings. The field label depends on the notification type. An email Veza Action replaces the other recipient fields; see
This guide explains how to configure identity override attributes in Lifecycle Management to address scenarios where user attributes at the source of identity are incorrect, slow to update, or temporarily need adjustment for policy execution.
Identity override attributes allow Lifecycle Management administrators to override the value of any user attribute set at the source of identity. These overrides take precedence over actual values during Lifecycle Management workflows.
Identity override attributes address operational challenges where the source of identity doesn't immediately reflect ground truth:
Incorrect or slow-to-update attributes:
Employee termination: An employee has been terminated and needs immediate deprovisioning, but the termination status is not yet reflected at the source of identity
Role changes: An employee has immediately changed roles and needs new birthright access, but the role change and the new manager haven't been updated in the source system
Contract extensions: A contractor's end date has been extended, but the extension isn't reflected yet at the source of identity
Missing manager data: The source of identity is missing a manager value, but this information is required for downstream application provisioning
Emergency access control:
Security incidents: Immediate access restrictions are needed before HR systems can be updated
Temporary access grants: Providing temporary access while permanent changes are processed
Before you configure identity override attributes, verify that override values comply with organizational policies and data standards, and assess the downstream impact of attribute changes. Ensure:
You have administrative access to Veza Lifecycle Management
You understand which source identity attributes need to be overridden
You have identified the specific identities requiring attribute overrides
You understand that overrides only affect Lifecycle Management workflows, not Access Visibility
Veza supports overrides for various property types from the source of identity:
Text properties (e.g., Department, Manager, Job Title)
Date properties (e.g., Activated At, Hire Date, End Date)
Numeric properties (e.g., Employee ID)
Boolean properties (e.g., Active status, Enabled flags)
You can view, create, edit, and delete overrides from the identity details view.
Click Lifecycle Management in the navigation sidebar, then select the Identities tab.
Locate the identity requiring an attribute override.
2.1. Use the Search by name field to find the specific user
2.2. Click on the identity name to show more information in the sidebar
2.3 Click Details to open the expanded details view
Open the identity's Properties tab:
The identity details view provides visibility into both original and overridden values. A visual indicator will highlight any attributes with overrides:
Properties: Use this tab to show side-by-side comparisons of actual values from the source of identity and override values
Overview: This tab includes a consolidated view of all active overrides for an identity
To change the value of an attribute override:
Navigate to the identity's Properties tab. Access the same identity detail view where you created the override.
Locate the attribute with an active override. Find the attribute showing "yes" in the Override column.
Edit the override value.
3.1. Click the Actions menu (three dots) for the overridden attribute
3.2. Select Edit Override from the dropdown menu
3.3. Modify the Override Value in the dialog 3.4. Click Save to apply the changes
To remove an override:
Access the identity's Properties tab. Navigate to the identity detail view with active overrides.
Identify the override to remove. Locate the attribute with "yes" in the Override column.
Clear the override.
3.1. Click the Actions menu (three dots) for the overridden attribute
3.2. Select Clear Override from the dropdown menu
3.3. Confirm the action when prompted
The attribute will revert to using the source of identity value, and the Override column will show "no".
The current implementation supports overrides at the individual identity level. Note that any attribute overrides are not reflected in the Veza Access Graph.
Lifecycle Management only: Attribute overrides affect only Lifecycle Management workflows and policy execution
Access Visibility unchanged: The Access Graph and Access Visibility features continue to use the actual source of identity values
Source system independence: Overrides do not modify data in the originating identity providers or HR systems
You should typically use overrides as temporary measures while addressing root causes in source systems. Maintain clear records of why each override was implemented and the business justification.
Consider the following best practices when implementing attribute overrides:
Regular review process: Establish periodic audits of active overrides to ensure they're still necessary
Monitor policy impact: Review workflow execution logs to confirm that overrides produce expected policy outcomes. You can review the identity details Activity tab and the Lifecycle Management Activity page to ensure that override values are applied as expected during provisioning, deprovisioning, and other lifecycle actions.
Emergency response procedures: Establish clear protocols for when and how to use overrides in approved scenarios.
Run a Lifecycle Management workflow outside the extraction cycle, for one identity or for many identities at once
Lifecycle Management runs a policy's workflows during the normal extraction cycle. To run a workflow outside that cycle, use Run Workflow Manually. For example, re-run a joiner workflow for a new hire, or apply a new workflow to identities that already exist.
You can run a workflow manually in two ways:
For one identity: from the identity's ⋮ menu on the Identities page
For multiple identities: from the workflow's card on the policy's published version
The two entry points have different availability rules. See When the option is unavailable.
A manual run also runs a workflow that is disabled in the policy, once, for the identities you select.
Running a workflow manually requires the Administrator role. See .
The policy's published version must contain at least one workflow.
Go to Lifecycle Management > Identities.
Open the ⋮ menu for the identity, on its row or in its details view.
Select Run Workflow Manually.
In the Manually trigger workflow for identity dialog, select a workflow from the Workflow list.
When the run is queued, a message confirms that the workflow was triggered for the identity. If the selected workflow has no actions, a warning states that the workflow has no actions, and nothing runs.
To follow the run, open the Workflow Tasks tab of the page. The Started Manually column shows Yes for manual runs.
Run a workflow for every identity in a policy, for identities you select, or for identities that match a filter.
Go to Lifecycle Management > Provisioning > Policies and open the policy.
In the Policy Versions panel, open the published version's .
Select the Workflows tab.
On the workflow's card, open the ⋮ menu and select Run Workflow Manually.
The filter uses the same syntax as workflow trigger conditions. See the . Select Identities based on properties is unavailable when the policy has no data source attributes.
Only run identities currently matching this workflow's condition is cleared by default, so the workflow runs for every selected identity. With it selected, Veza skips any selected identity that does not currently match the workflow's trigger condition.
A confirmation message states that tasks are being created for the selected identities. Select View Workflow Tasks to open the Workflow Tasks tab of the page, filtered to this run. For Select All and filter runs, tasks are created in the background, so the tab fills in as the run progresses.
On the Identities page, Run Workflow Manually appears only when the policy is running. A paused or initial policy does not qualify.
On a workflow card, Run Workflow Manually is unavailable when the workflow cannot be run manually, and a tooltip gives the reason:
Starting with Veza v2026.11.2, both entry points require an enabled policy, and a paused policy no longer qualifies. A manual run requested through the API for a policy that is not enabled returns an error. In earlier releases, a workflow card on a paused policy offers Run Workflow Manually, and its tooltip reads The policy must be enabled or paused to run a workflow manually.
Permanently remove user accounts from target systems.
Permanently removes user accounts from target systems. Unlike the DEPROVISION_IDENTITY action which disables or suspends accounts while preserving audit records, DELETE_IDENTITY performs complete account removal.
Example Use Cases:
Database user cleanup after employee offboarding
Compliance with data deletion policies (e.g., GDPR right to be forgotten)
Removing test or temporary accounts
The Properties tab displays both original attribute values and any existing overrides.
Create a new attribute override:
4.1. Find the attribute you want to override in the properties table
4.2. Click the Actions menu (three dots) for that attribute
4.3. Select Create Override from the dropdown menu
Set the override value in the Create Override dialog:
5.1. Enter the desired override value in the Override Value field
5.2. For date attributes, use the calendar picker to select the appropriate date and time
5.3. For text attributes, type the new value directly
5.5. Click Save to apply the override, or Cancel to discard changes
The Create Override modal displays the attribute name and the current actual value for reference.
Verify the attribute override is active:
The Override column now shows "yes" for the modified attribute
The Override Value column displays your custom value
The override count updates in the Property Overrides filter (e.g., "1 Override")
View the override summary in the identity details Overview tab:
7.1. Return to the Overview tab for the identity
7.2. Check the Property Overrides section to see all configured overrides for the identity
7.3. Each override displays the attribute name, override value, and actual value from the source
Select Run Workflow.
In the Run workflow manually dialog, under Select Identities, choose one option:
Select All: run the workflow for every identity in the policy.
Select Identities individually: select up to 100 identities from a list of active identities. If you select more than 100, the dialog shows Select at most 100 identities and Run Workflow is unavailable.
Select Identities based on properties: enter a SCIM filter on identity attributes. Select Show matching identities to open the matches in a new tab. After you enter a filter, the button shows how many identities match, up to More than 1,000 matching identities.
Optionally, select Only run identities currently matching this workflow's condition.
Select Run Workflow.
Publish a policy version to run a workflow manually
The policy has no published version yet. Publish a version, then run the workflow from it.
Only workflows in the published version can be run manually
You are viewing a draft or a retired version. Open the published version instead.
The policy must be enabled to run a workflow manually
On the Provisioning Policies page, open the policy's ⋮ menu, select Enable, and confirm. See Policy state versus workflow versioning state.
Service account lifecycle management
Contractor account removal after project completion
Entity Type
The data source and target entity type to permanently delete
Action Unique Identifier
Attribute used to locate the user account for deletion (e.g., username, email, or account ID)
Action Attribute Mappings
Define how to identify and match the user for deletion. See for more details
Shared Attribute Mappings
Shared transformation rules across multiple delete actions
Provision Account Actions
Reference to previous Provision Account actions for unique identifier resolution
Supported Integrations:
Active Directory (Users and Managed Service Accounts)
Okta
Azure AD (Users). Veza deletes the user through Microsoft Graph, and Microsoft Entra ID keeps deleted users for 30 days, during which they can be restored. See Azure AD provisioning
Google Cloud (Google Workspace Users)
PostgreSQL
MySQL
OracleDB
GitHub
AWS RDS (MySQL, PostgreSQL, OracleDB)
Custom Application
Managing identities and identity override attributes in Veza Lifecycle Management
Identities are the core entities in Lifecycle Management. They represent the people in your organization, sourced from HR systems, identity providers, ITSM platforms, payroll systems, custom OAA applications, or flat files. See Integrations for the full list of supported identity sources.
View, search, and manage identities from configured sources
Customize identity attributes to override values from the source of identity
Source of Identity: The authoritative system (such as Workday or Okta) that provides identity data
Identity Attributes: Properties like first name, last name, email, department, and manager
Override Attributes: Custom attributes that can supplement or override source-provided values
- How source attributes map to Veza
- Computed attributes for advanced logic
Rotate cryptographic keys in Azure Key Vault.
Rotates cryptographic keys in Azure Key Vault by creating a new key version. The action targets one or more named keys in a specified vault and runs rotations concurrently (up to five keys in parallel). Each key's result is reported individually, so partial success is possible.
Configure automation policies, workflow triggers, notifications, and access reviews in Lifecycle Management
Policies define the rules and actions for managing identities throughout their lifecycle. Workflows within policies execute based on specific conditions, automating processes such as onboarding, role changes, and offboarding.
Reset user passwords in target systems.
Resets user passwords in target systems. Configuration options and behavior vary by integration.
Example Use Cases:
Reset passwords for new users who must change on first login
Enforce password rotation policies
Recover from account lockouts
Supported Integrations:
Azure Key Vault
Only supported provider. Requires an Azure datasource configured with Key Vault permissions
The Veza app registration must have the rotate operation on the target Key Vault. The List permission used for extraction is not sufficient. Grant the rotation permission using the model the vault uses:
RBAC model (recommended): Assign the Key Vault Crypto Officer role to the Veza app registration on the target vault. This role includes the keys/rotate permission.
Access policy model (legacy): Under Key Permissions, add Rotate, Get Rotation Policy, and Set Rotation Policy.
Microsoft recommends RBAC over access policies for new vault deployments. See Azure RBAC versus access policies and the Azure Key Vault integration.
Each Rotate Key run appears on the Activity page: the run as a job on the Integration Jobs tab, and each key's result as an event on the Events tab. These records have no associated identity, so only users with the Administrator or Operator role can see them.
{{ROTATED_KEY_COUNT}}
Count of keys successfully rotated
{{FAILED_KEY_COUNT}}
Count of keys that failed to rotate
Data Source
The Azure Key Vault datasource providing credentials for the vault
Vault Name
Name of the Azure Key Vault (3-24 characters, alphanumeric and hyphens, must start and end alphanumeric)
Key Names
One or more key names to rotate. Each key gets a new version; the previous version is not deleted
Entity Type
The target integration and entity type (e.g., AD User, Okta User)
Supported Integrations:
Enforce password change on login
For Active Directory and Azure AD, the Reset Password action can force the user to change their password at next login. Google Workspace does not provide a Reset Password action. See the support matrix.
Password output (Early Access)
When password output is enabled, the new password generated by this action is available to subsequent workflow actions via transformer expressions. Use {EntityType.password} syntax, such as {ActiveDirectoryUser.password} in a Send REST Payload action.
This is useful in workflows where a password reset must be confirmed or forwarded to an external system, such as an employee self-service portal.
SCIM filter syntax for workflow conditions
Configure email templates and webhooks
Trigger compliance reviews from LCM workflows
Policies: Top-level configuration for a source of identity that defines which workflows apply
Workflows: Sequences of actions that execute when specific conditions are met
Trigger Conditions: Boolean expressions using SCIM filter syntax (e.g., is_active eq true)
Actions: Tasks like creating accounts, assigning groups, or sending notifications
Access Profiles - Define birthright entitlements for provisioning actions
Attribute Transformers - Format attributes when provisioning accounts
Create and configure automation policies for identity sources
The controls on the policy page and the policy version page
Define workflow triggers and provisioning actions
Delegate Access Profile creation to specific users and groups with the Creator permission set and profile type visibility.
By default, only Administrators can create Access Profiles in Lifecycle Management. Administrators can grant the Creator permission set to specific users and groups, allowing them to create new profiles. Users who create a profile automatically become its Owner. Owners can edit the profiles they own, but not other profiles. Administrators retain full access to all profiles.
Creator is a single tenant-wide grant on Access Profiles. It is not scoped to an individual Access Profile Type.
Where a user can create Access Profiles depends on their role:
Lifecycle Management: The Access Profiles pages require the Operator role, so only Operators can use Creator permission there.
Access Hub: When the Access Profiles page is visible in , users with other roles who hold Creator permission can also create Access Profiles from that page. Administrators control whether the page is visible in .
You have the Administrator role on the root team. An Administrator scoped to a sub-team cannot grant or revoke these permissions.
To create Access Profiles from Lifecycle Management, the users receiving permissions have the Operator role. Users with other roles can create Access Profiles only from Access Hub.
The users receiving permissions can see at least one Access Profile Type. See .
To assign Access Profile creation permissions to users or groups:
Go to Access Profiles > Access Profiles.
Click Settings.
On the Access Profile Settings page, go to the Permissions step.
The step lists the users and groups that currently have creation permissions.
Click Add Permissions
Result: Users and groups with Creator permission can now create Access Profiles for each profile type they can see. To grant profile type visibility, see .
Creator permission alone does not allow a user to create an Access Profile. The user must also hold the Viewer permission set (not the Veza Viewer role) on at least one Access Profile Type. Without it, the type does not appear in the Create Access Profile form, and an API request specifying that type returns a not-found error.
To grant visibility of a profile type:
Go to Access Profiles > Access Profile Types.
Locate the profile type, then select Manage Permissions from its actions menu.
In Type, select USER or GROUP, then select the user or group in Name.
The permission applies as soon as you make a selection. There is no save step. See .
Viewer permission on the profile type is required even when Enable Multiple Access Profile Types is inactive and all Access Profiles use a single type. In that mode, the Access Profile Types page is not reachable from the navigation menu, so you cannot use its Manage Permissions action.
Instead, designate the user or group as an owner of an existing Access Profile that they are allowed to manage. Designating an owner automatically grants Viewer permission on that profile's type, and in this mode every profile uses the same type. At least one Access Profile must exist; if none does, an Administrator must create one first.
Confirm that the user or group already holds Creator permission. Only users and groups with Creator permission can be designated as owners.
On the Access Profiles > Access Profiles page, select Manage Owners from the actions menu of that Access Profile.
In the Manage Owners dialog, select USER or GROUP in Type, select the user or group in Name, and click Add.
Result: The user or group can select this profile type when creating an Access Profile.
To confirm that permissions were assigned correctly:
On the Permissions step of the Access Profile Settings page, review the list of assigned users and groups.
Each row shows the user or group name and its type.
Assigned users should now see the Create button on the Access Profiles page.
Users without permissions will not see the Create button.
To revoke Access Profile creation permissions:
Go to Access Profiles > Access Profiles and click Settings.
Go to the Permissions step.
Locate the user or group to remove.
Click the Remove Permission (trash can) icon next to the user or group. The permission is removed immediately, with no confirmation prompt. You do not need to click Save.
Result: The user or group can no longer create new Access Profiles or be designated as an owner, unless the user holds Creator permission through a group. They keep Owner permissions on profiles they own, and read-only access to other existing profiles.
- Overview of the permission sets system
- Understanding Access Profiles and their role in Lifecycle Management
- Profile type configuration and visibility permissions
- Veza role definitions and capabilities
Query the Veza Access Graph for entities during workflow execution.
Queries the Veza Access Graph for entities during workflow execution. This is a read-only lookup that does not create or modify entities. Retrieved nodes are available to subsequent actions and conditions in the workflow.
Example Use Cases:
Verify a user exists and is active in a target system before submitting a provisioning request (e.g., check that an OktaUser is active before assigning an application)
Look up entity attributes from the graph to use in downstream transformer expressions
Check if a role or group exists before attempting to assign it
The SCIM filter supports dynamic template variables (e.g., {attribute_name}) that resolve at runtime using values from previous actions. See for details on template syntax.
Rather than re-running an identical query on every execution, Get Node From Graph can reuse a result Veza already computed. A stored result is reused only while it is less than five minutes old, measured from the time that result completed. Past five minutes the action runs a new query, so workflows act on values from the most recent extraction instead of a day-old snapshot.
This five-minute bound is specific to Lifecycle Management graph reads. Other callers of the same query service use its default of 24 hours, which is what this action used before the bound was introduced.
Two related behaviors affect what a workflow sees:
When a matching query is still running, the action uses that query's result rather than starting another, regardless of when the query began.
Lifecycle Management keeps a separate ten-minute cache for the single-node lookups used by other actions, such as relationship management. The five-minute bound applies to this action's queries and does not shorten that cache.
The staleness window is not configurable.
This example shows a workflow that checks if a user exists and is active in Okta before submitting a provisioning request:
Trigger condition: employment_status eq "ACTIVE" — fires for new hires or active employees
Get Node From Graph action: Query for OktaUser with filter email eq {email} — looks up the user by their email address in the Okta integration
Condition Expression: OktaUser.is_active eq true checks the
Each retrieved node is an entity from the Access Graph with the following data:
Retrieved nodes are added to the workflow context and can be used in three ways:
Add a condition after the action and set its Condition Type to When this condition matches. The condition expression is evaluated against the source identity and the nodes that earlier actions retrieved, so it can reference a retrieved node's attributes by prefixing them with the entity type (for example, OktaUser.is_active eq true). The condition controls which subsequent actions execute.
Subsequent Get Node From Graph or actions can reference retrieved node attributes in their SCIM filters and payloads using transformer template variables. The transformer service resolves {EntityType.attribute} expressions against the accumulated nodes.
For example, if a Get Node From Graph action retrieved an OktaUser node with login = "jsmith@company.com", a subsequent action's filter could reference {OktaUser.login} to use that value.
Note: The entity type prefix is case-sensitive and must match the graph type exactly (e.g.,
OktaUser, notoktauser). Attribute names are case-insensitive.
Multiple Get Node From Graph actions can run in sequence. Each action's results accumulate in the workflow context, so later actions and conditions can reference nodes from any earlier action. This enables multi-step lookups — for example, first look up a user, then look up their manager.
Introduction to Lifecycle Management with Veza
Veza's Lifecycle Management (LCM) solution empowers organizations to automate and streamline the management of user identities and access rights throughout the employee lifecycle. From onboarding to role changes and offboarding, automated LCM workflows ensure that the right people have the correct access at the right time.
Automated Provisioning and De-provisioning: Streamline granting and revoking entitlements as employees join, move within, or leave the organization
Environment-wide Synchronization: Keep user attributes and access rights consistent across applications and platforms
Customizable Workflows: Design tailored processes for different lifecycle events and user segments
Compliance and Audit Support: Maintain detailed records of access changes to support compliance and audit efforts
Integration with Identity Providers: Integrate with identity providers and HR systems, import HR data from CSV, or use a custom OAA template
Reference documentation:
- Conceptual guide to the different evaluation systems
- SCIM filter syntax for workflow conditions
- Complete list of transformation functions
- Formatter-based profile assignment
Policies define the rules and actions for managing identities throughout their lifecycle. They specify what actions should occur when there are changes in a source of identity, such as when a user is created or their attributes change.
After configuring a policy for a source of identity in your organization, Veza Lifecycle Management tracks the source for changes. When employee records are added or changed, actions will trigger based on the workflows and actions specified in the policy. Learn more about .
Workflows are sequences of actions within a policy that execute based on specific conditions. They enable automation of lifecycle management processes such as onboarding, role changes, and offboarding.
Workflows only execute actions on users that meet specific conditions, and Policies can contain more than one Workflow. This enables you to create a single policy for your source of identity that contains multiple workflows, with one applying to new hires, another applying to terminated employees, and so on for the different JML scenarios you want to automate. Learn more about .
Access Profiles define sets of entitlements (such as group memberships or role assignments within a target application) that should be granted to users based on their role within the organization (or another distinguishing attribute). You can use Access Profiles to define both Business Roles – segments of employees, and Profiles – collections of entitlements in a target application.
Assigning Business Roles to the Profiles they should inherit enables you to define the birthright entitlements for different types of employees in your organization. You can then assign those Business Roles when configuring workflows that add or remove access to an application. Learn more about .
Lifecycle Management Actions are tasks performed within a workflow, such as creating a user account, assigning group memberships, or disabling an account. Actions can be combined to trigger in sequence when there are changes in the source of identity. Actions can run for any identity that meets the workflow conditions, or only apply when action-level conditions are met. Learn more about available .
Transformers allow you to modify and format user attributes when synchronizing data between systems, ensuring consistency and compatibility when creating users across applications.
Lifecycle Management will provision new users with these attributes and can keep their accounts up-to-date when there are changes in the source of identity. Target entity attributes can be set to specific values or use metadata from the source of identity, and support a range of transformation functions. Learn about .
Lifecycle Management uses several systems that evaluate identity attributes, each serving a distinct purpose:
Workflow Conditions: SCIM filter expressions that determine whether workflows and actions execute (e.g., is_active eq true). Output is boolean.
Attribute Transformers: Formatter expressions that determine what value an attribute should have (e.g., {first_name | UPPER}). Output is a string.
Dynamic Access Profiles: Formatter expressions that resolve to Access Profile names at runtime (e.g., dept-{department | LOWER}
These systems can work together. For example, workflow conditions can embed transformer syntax for dynamic date comparisons. For a guide to when and how to use each, see .
Customize email notifications sent during Lifecycle Management events and Access Request workflows. You can personalize messaging, add branding, and include event-specific information through placeholders. Learn more about .
Enable Integrations: Configure your data sources and enable them for Lifecycle Management.
Define Access Profiles: Create profiles that map your organizational structure to application-specific entitlements.
Create Provisioning Policies: Automate identity management processes. See .
Configure Workflows: Design workflows within policies to handle specific lifecycle events.
For an overview of Lifecycle Management configuration using Okta, Workday, and Active Directory, see .
For API documentation, see .
Integrate Access Reviews with Lifecycle Management workflows
This guide explains how to create Access Reviews from Lifecycle Management workflows and troubleshoot common issues.
Lifecycle Management (LCM) policies can trigger Access Reviews automatically using the . When a workflow runs and conditions match, Veza queues and creates an access review campaign based on the configured certification plan.
Use LCM-triggered access reviews to:
Automatically certify access when employees change roles (movers)
Review permissions before offboarding (leavers)
Introduction to Lifecycle Management implementation, dashboard, and activity monitoring in Veza
Start here to understand Lifecycle Management fundamentals, monitor your LCM environment, and track workflow execution.
Configure Integrations: Enable your identity sources and target applications for LCM. See Integrations.
Set Up Identities: View and manage identities from your configured sources. See Identities.
Create Access Profiles: Define birthright entitlements for user segments. See Access Profiles.
Build Policies: Automate JML workflows with conditions and actions. See Policies.
For an end-to-end walkthrough using Workday, Okta, and Active Directory, see How-to: Workday, Okta, and Active Directory.
Architecture overview and foundational concepts for deploying Lifecycle Management
Monitor policy status, workflow execution, and identity health at a glance
Track and audit all LCM actions, errors, and events
In Type, select whether to add a user or a group:
USER: Assign permissions to individual Veza users
GROUP: Assign permissions to a Veza Group (all members receive permissions)
In Name, select the user or group, then click Add.
The Name list shows only users or groups that do not already have permissions assigned. For users, it also excludes disabled users, service accounts, and Veza support users.
Repeat steps 5-6 to add more users or groups.
Click Done to save the permissions.
Click Done.
Veza Groups - Creating and managing user groups for permission assignment
OktaUserOktaUserEntity Type
(Required) The type of entity to query in the Access Graph (e.g., OktaUser, AwsIamRole). Selected from a dropdown populated by the graph schema.
Filter
(Optional) A SCIM filter expression to narrow results (e.g., active eq true). Supports transformer template variables that reference values from previous actions.
Limit
(Optional) Maximum number of nodes to return. Default: 100. Maximum: 1000.
Properties to Get
(Optional) Specific entity properties to include in the results. Leave empty to return all available properties.
id
The entity's unique graph identifier
type
The entity type (e.g., OktaUser)
properties
A key-value map of the entity's attributes (filtered by Properties to Get, or all properties if not specified)
Enforce periodic re-certification based on identity attribute changes
The sections below cover configuration options and troubleshooting for reviews created by LCM workflows.
Common scenarios:
All results filtered: Veza created the review but then deleted it because all rows already appeared in recent in-progress reviews
Entity type mismatch: The policy identity type does not match the access review query, and no identity graph relationship exists to resolve it. Veza displays this error: "No matching node type found for identity type {type}"
Missing workflow configuration: The Access Review workflow is not configured or not linked to the policy
LCM-triggered reviews always run when a workflow executes, but Veza deletes the review if it has no results after filtering.
Veza compares each row against the last five in-progress reviews (by default) for the same workflow. The system excludes rows that appeared in any of those reviews. If all rows are excluded, Veza deletes the review rather than completing it with zero results. Veza does not send notifications for deleted reviews.
To verify a review was created and deleted:
Check Veza Events for the review creation and deletion
Review Lifecycle Management event logs for the workflow execution
Note: Deleted LCM-triggered reviews do not appear in the Reviews list (unlike manually-created empty reviews, which do appear)
LCM and Rule-triggered Access Reviews automatically exclude unchanged results. Veza enables this setting by default, and you cannot disable it for these review types.
When Veza creates a review, it compares each row against the last five in-progress reviews for the same workflow (sorted by start time, newest first). The system excludes rows that appeared in any of those reviews, leaving only new or changed access to review.
This behavior:
Applies automatically to all LCM_TRIGGERED and RULE_TRIGGERED reviews
Compares against the last five in-progress reviews by default (configurable by Veza support)
Cannot be changed through the UI or API
Does not apply to manually-created or scheduled reviews
If filtering excludes all rows, Veza deletes the review rather than completing it with zero results. Veza does not send notifications for deleted reviews, but the deletion appears in Veza Events.
LCM-triggered access reviews require the policy identity entity type to match the entity type defined in the access review query. Veza resolves this match in the following order:
Direct match in source node types: The policy identity type matches directly
Direct match in destination node types: The policy identity type matches the destination
Linked nodes through the identity graph: Veza follows graph relationships to find a connection (for example, WorkdayWorker → ActiveDirectoryUser)
If none of these resolve, the review creation fails with the error: "No matching node type found for identity type {type}".
Example: If your policy tracks WorkdayWorker identities and your review expects ActiveDirectoryUser entities, Veza still creates the review successfully if there is a defined relationship (for example, WorkdayWorker → ActiveDirectoryUser) in the identity graph. If no such mapping exists, the review creation fails.
Access Reviews can include enriched columns that display additional identity attributes (such as department or manager from a Human Resources Information System (HRIS)). However, Veza skips enrichment when the identity mapping is ambiguous.
When Veza skips enrichment:
If a single account or entity maps to multiple identity nodes in the graph (for example, one Active Directory account maps to two different WorkdayWorker records), Veza intentionally skips enrichment rather than arbitrarily choosing one.
Result:
Veza still creates the review successfully
Enriched columns appear but remain empty for affected rows
Veza logs a trace-level warning: "Skipping enriching nodes due to finding multiple linked nodes"
Resolution:
Review your identity mappings to ensure each account maps to a single identity. Ambiguous mappings often indicate data quality issues in source systems (such as duplicate employee records).
When creating access reviews through LCM workflows, you can configure a custom review name using attribute transformers. This is useful when a workflow creates multiple reviews and you need to differentiate them.
Common use case (Movers): When employees change roles, a single workflow run can trigger multiple access reviews. Custom names help reviewers identify which review corresponds to which change.
Transformer syntax:
Use curly braces to reference identity attributes:
Review for {name} → "Review for John Smith"
{department} Access Review - {name} → "Engineering Access Review - John Smith"
{job_title} Certification → "Senior Engineer Certification"
See Attribute Transformers for the complete transformer syntax reference.
Dry Run verification:
Custom review names appear in Dry Run results, allowing you to verify the name format before the workflow runs in production. This helps catch transformer syntax errors or missing attributes early.
Access Reviews: Complete guide to configuring and managing access certification campaigns
Access Reviews configuration: Creating and configuring certification plans
CREATE_ACCESS_REVIEW action: Configuring the workflow action settings
Attribute Transformers: Customizing review names with dynamic attributes
Format and transform identity attributes
Configure email templates and webhooks
Trigger compliance reviews from LCM workflows
Supported identity sources and targets
Common questions and troubleshooting
System Attributes - Computed attributes for advanced logic
Monitor LCM activity and policy status
View and manage identities from your sources
Create and configure automation policies
Define workflow triggers and provisioning actions
Manage birthright entitlements and business roles
Add deliberate delays between workflow actions.
Introduces a deliberate delay in the workflow execution.
Example Use Cases:
Allow time for system propagation between actions
Implement rate limiting in multi-step workflows
Coordinate timing with external processes
Filter, inspect, and export bulk dry run results, and review the dry run history for a Provisioning Policy
After a bulk dry run completes, review its results to confirm which workflows matched, which attribute values would change, and whether any identity produced errors. A bulk dry run evaluates a policy version against many identities and records what would happen, without contacting the target systems.
To start a dry run, see .
A bulk dry run has completed. See .
You have the Administrator or Operator role. See .
You can open the results of a bulk dry run in these ways:
Automatically create access review campaigns during lifecycle events.
Automatically creates access review campaigns during lifecycle events. This action bridges Lifecycle Management with Veza Access Reviews, enabling automated certification workflows triggered by identity lifecycle changes.
Example Use Cases:
Review contractor access 30 days after onboarding to ensure appropriate permissions
Certify elevated permissions after role changes or promotions
Trigger periodic access reviews based on employment anniversaries
Evaluate a workflow condition or an attribute formatter against sample values, in the workflow editor or in a policy version's read-only view
Test evaluates a condition or a formatter against sample attribute values, in the workflow editor or in a policy version's read-only view. It does not run the workflow.
Two dialogs are available:
A workflow trigger condition or a condition node, in the Test Condition dialog
An attribute formatter, in the Test Formatter dialog
Both dialogs are available in the workflow editor. They are also available in the read-only view of a policy version, except for the formatters listed in .
Assign or remove group memberships, roles, and access entitlements for identities.
Controls entitlements such as group memberships and role assignments for identities.
Example Use Cases:
Add users to appropriate security groups, roles, permission sets, or other access-grant entities
Remove users from groups during role changes
Update entitlements when employees move between departments
Pause Duration (seconds)
Number of seconds to pause the workflow
From the dry run history: Open the Bulk Dry Run History page, open the run's actions menu (⋮), and select Show Results. See View dry run history.
From the dry run banner: On the policy page or a version page, select Show Dry Run Results in the dry run banner.
The top of the Dry Run Results page identifies the run and summarizes its outcome:
Policy Version: The version that the dry run evaluated
Started At and Duration: When the run started and how long it took
Identities Processed: The number of identities selected for the run. The card reads All before the count when the run processed every selected identity.
Workflows to Run: The number of workflows that matched
Actions Run: The number of actions that would run
If the draft policy was edited after the run finished, the page warns: The draft policy was edited after this dry run finished, so evaluation results may not be accurate.
To test the policy again, select Start New Bulk Dry Run. The button is unavailable while a dry run for the policy is in progress. During that time, a banner reads Dry run in progress or Another dry run is in progress. Select Show Dry Runs in the banner to open the dry run history.
The results table lists the predicted result items for the matched identities. Each row is one identity and the workflow it matched:
Identity: The identity that was evaluated. Select the name to open the Result Details panel.
Workflow to Run: The workflow that the identity matched
Actions Run: The number of actions that would run
Attribute Changes: The attributes whose values would change
Errors: Errors that occurred during evaluation
Department: The identity's department
The table also includes column groups for the identity's source entity types, with one column for each property. These property columns are hidden by default; use the column selector to show them. A dot at the start of a row marks an identity with one or more expected attribute value changes.
Use the table's filter bar to narrow the results:
Name: Shows identities whose name contains the text you enter
Workflows to Run: Shows results for the selected workflow
Has Actions Run: Select True to show results where actions would run, or False for results without actions
Has Attribute Changes: Select True to show results where one or more attribute values would change
Has Errors: Select True to show results with evaluation errors
Use the Has Attribute Changes filter to find identities whose attribute values differ from the state the policy defines, without reviewing every identity.
The Attribute Changes column lists up to three changed attributes. When more attributes would change, select the +N button to list the rest.
In the result details, a changed attribute shows the value the policy would write, with the current value struck through beneath it. When Veza has no current value recorded for the attribute, the comparison uses the value observed in the Access Graph. When neither value exists, such as for a new account, only the new value appears.
Select an identity in the results table to open the Result Details panel:
Identity, Policy, and, when the policy would assign access profiles, Expected Access Profiles
Expected: The number of actions that would make changes (Actions Run) and the number of attribute values expected to change (Attribute Changes)
Workflows to Run: Each matched workflow, with the number of actions and attribute changes it would produce. Expand a workflow to see its actions and attributes. Turn on Show only Attribute Values Expected to Change to hide unchanged attributes.
Errors and Messages: Errors and evaluation messages for the identity
When the new dry run activity experience is enabled for your tenant, selecting an identity opens a full-screen Predicted Result view instead of the side panel. Each row also has a Details button that opens the same view.
This view shows the workflow as a diagram. Select a condition or action in the diagram to see how it evaluated and how it is configured. Use Previous and Next, or search by identity or workflow, to move between the results on the current page of the table.
The Bulk Dry Run History page lists the bulk dry runs for a policy.
Go to Lifecycle Management > Provisioning > Policies.
Select a policy, then open a version from the Policy Versions panel.
Select Dry Run and select See Bulk Dry Run History.
You can also open the page from the Provisioning Policies list: open the policy row's actions menu (⋮) and select See Bulk Dry Run History. The policy page offers the same option from the Policy Versions panel.
For each dry run, the page shows:
Version
The policy version that the dry run evaluated
Filter
The filter used to select identities
Processed Identities
The number of identities processed
Status
Pending, In Progress, Succeeded, Canceled, or Failed
Started At
When the run started
Open the run's actions menu (⋮) for these options:
Show Results opens the Dry Run Results page for a run that is not in progress.
Cancel Dry Run stops a run with the status In Progress. Canceling cannot be undone. A Pending run can't be canceled from the page.
Export results to keep them beyond the retention period or to analyze them in other tools.
The export includes every result that matches the current filters, not only the current page, and only the visible columns. Set both on the Dry Run Results page first. Column visibility resets each time you open the page, so show any property columns you need again before each export.
Select Export > Export to CSV.
Optionally, select Excel-compatible (UTF-8 BOM).
Select Export.
Remain on the page until the download starts. The file is named exported-dry-run-results.csv.
Veza keeps bulk dry run results for 30 days after they were last viewed, then permanently deletes them. Opening a run's results restarts the 30-day period. The Bulk Dry Run History page displays the same notice. Export any results you need to keep.
Automatically review access for high-risk roles or sensitive systems
Create access reviews when users join specific departments or teams
The Create Access Review action editor contains the following settings, stored in the action's certification_creation_plan object:
Review Configuration
Yes
The Access Workflow (review configuration) where the certification is created
Review Name
No
Name of the certification. Supports attribute transformers (e.g., Review for {name}). Custom names appear in Dry Run results
Reviewers
No
Primary level reviewer assignment (manager, resource owners, or designated reviewers)
The Review Name field accepts attribute transformers, so the name a review receives depends on the identity that triggered the workflow. Test the formatter from the action editor before saving the policy.
In the Review Name section of the Create Access Review action, select Test.
In Test Review Name Formatter, enter a sample value for each attribute the formatter references. Veza detects the attributes in the formatter and displays one input for each. Timestamp attributes accept ISO 8601 or RFC 3339 values, such as 2026-01-31 or 2026-01-31T09:15:32Z.
Select Test Formatter.
The generated name appears under Formatter Output. When the formatter produces more than one candidate value, the first four appear with an option to display the rest. If the formatter cannot be evaluated, the error replaces the output and Save stays disabled until you correct the formatter.
Selecting Save in the modal writes the edited formatter back to the action.
Veza evaluates the formatter on the server against the policy's current version, so results reflect the transformers and lookup tables that version defines. Conditional (IF) formatting is not available on this field.
A lifecycle event triggers a workflow containing the CREATE_ACCESS_REVIEW action
The action evaluates its settings against the identity that triggered the event
A review campaign is queued in Veza Access Reviews
The review campaign is created and assigned to the designated reviewers
Reviewers receive notifications to certify or revoke the identified access
CREATE_ACCESS_REVIEW generates two notification events:
CREATE_ACCESS_REVIEW_QUEUED
Immediate
Sent when the review creation is queued
CREATE_ACCESS_REVIEW
Asynchronous
Sent when the review campaign is created
You can configure email notifications or webhooks for both events to track review creation progress. See Notification Templates for configuration details.
Related Topics:
Access Reviews from Lifecycle Management: Behavior, filtering, entity matching, and troubleshooting
Access Reviews documentation: Configuring certification plans and managing reviews
Access Profiles: Managing birthright entitlements included in reviews
The policy has at least one workflow with a trigger condition, a condition node, or an action with an attribute formatter.
To change a condition or a formatter from the dialog, the policy has a draft version. Published and retired versions open in read-only view, where a change can be tested but not applied.
The Test Condition dialog evaluates a condition string against entered values, or values copied from an existing identity.
Open the dialog:
In the workflow editor, select Test under the condition field: Identity matches this condition on the workflow trigger, or the condition field on a condition node. Test is unavailable until the condition string is valid.
In read-only view, select Test in the workflow or condition details. See Test in read-only view.
Under Test Values, enter a value for each attribute that the condition references.
To use the attribute values of an existing identity instead, select Fill From Identity. In the Fill From Identity dialog, select an identity in the Identity list, then select Fill Values. The list contains only identities in this policy.
Select Test Condition.
Review the result under Evaluation Results. See .
Optional: In the workflow editor, edit the string in the Condition field and select Test Condition again.
In the workflow editor, select Apply Condition to use the changed string in the workflow, or select Cancel to close the dialog without changing the workflow. Apply Condition is available only when the condition string is valid and differs from the original string.
Veza evaluates the condition against the configuration of the policy version under test, including the date format and time zone that WHEN() expressions use. See Set the date format and time zone.
Evaluation Results shows a clause-by-clause breakdown of the condition:
A Matched or Not Matched badge shows whether the test values satisfy the condition.
Under Condition Expression, the dialog evaluates each clause separately and highlights any clause that cannot be evaluated.
For the operators and syntax that conditions support, see the Trigger conditions reference.
The Test Formatter dialog evaluates a formatter against sample values for the attributes it references.
Select Test next to the formatter. For where Test appears in the workflow editor, see Testing Transformers Inline. For read-only view, see Test in read-only view.
Review the formatter under Attribute Details.
Under Formatter Testing, enter sample data for each attribute.
Select Test Formatter and review the Formatter Output.
The read-only view is the version page of a published or retired version, and of the draft version when it is not open in the workflow editor.
Open a workflow, condition, or action node's details on the version page's Workflows tab and select Test. Test is also available in the details of a shared attribute mapping.
In read-only view, both dialogs work as follows:
The Condition field, and the Attribute Details fields of a formatter, are locked. The test uses the condition or formatter shown in the dialog.
Test values remain editable. In the Test Condition dialog, Fill From Identity is available.
The footer shows only Close.
Read-only view does not offer Test for date formatters, access review name formatters, or email formatters. To test these formatters, open the draft version in the workflow editor. Test is also not available in dry run result details.
Dynamically assign access based on user attributes (department, location, role)
Access Profiles to Remove
Static Access Profiles whose entitlements will be revoked from the identity when the action runs. Use this to selectively remove specific access without affecting other existing entitlements.
Dynamic Access Profiles to Remove
Attribute transformer expressions that resolve to Access Profile names to remove at runtime. Enables attribute-based removal logic, such as removing access profiles derived from a user's previous department or role. See for expression syntax.
Entitlement Removal
Which of the identity's existing entitlements the action removes before applying the new set. None removes nothing. All not listed in this action removes every existing entitlement that this action does not assign. Only what Veza has a record of granting removes only entitlements that Veza granted and preserves those added by other means. Only birthright, where Veza has a record of granting further restricts removal to entitlements that Veza granted as birthright entitlements. Use Access Profiles to Remove instead when you need to selectively revoke specific entitlements rather than all existing ones.
Access Profiles to Add
Static Access Profiles to assign to the identity. See for more details about managing birthright entitlements.
Dynamic Access Profiles to Add
Attribute transformer expressions that resolve to Access Profile names to assign at runtime based on user attributes. See for details.
Update HRIS systems with email addresses created during onboarding workflows.
Updates a Human Resources Information System (HRIS) or other identity source with an email address created earlier in the same workflow. This ensures the source of identity (such as Workday) contains the employee's new corporate email address, and keeps records consistent across systems.
The address comes from an upstream action, usually Create Email. This action has one setting, Entity Type: you choose where the address is written, not what gets written. It writes the address the upstream action produced without modifying it, so you cannot select among several addresses or reformat one. To set the identity source's email to a value you choose, use Provision Account instead.
Example Use Cases:
After creating an Exchange Server mailbox during onboarding, write the new email address back to the Workday Worker record
Update an OAA-based HRIS source with email addresses generated by provisioning workflows
Supported Integrations:
A workflow containing a Write Back Email action must also contain an action that produces an email address, earlier in the same workflow branch. Two kinds of action qualify:
A Create Email action.
A Provision Account action against an integration that provisions a mailbox as part of the sync. Google Workspace is the only integration that provisions a mailbox this way.
Veza checks this when you publish or update the policy and rejects a workflow that does not satisfy it, rather than letting it fail during a run. This check applies to Write Back Email actions only, and it validates the structure of the workflow rather than what happens during a run. A workflow that passes the check can still fail at run time. If a condition skips the upstream action, or its sync does not surface the provisioned address, the Write Back Email action records an ACTION_FAILED event in the activity log.
This requirement is why a workflow that provisions Active Directory or Azure AD from Workday cannot use Write Back Email unless it also creates a mailbox. Provisioning an Active Directory or Azure AD account does not by itself produce an email address that this action can write. To write an address back to Workday in those workflows, map email on a write-back action.
Both can set an identity source's email address, and for Workday both write the same field. They differ in where the value comes from.
Choose Write Back Email when the workflow provisions the mailbox and you want that address in the HRIS. Choose Provision Account when the authoritative address comes from another system: an account Veza created in Active Directory or Azure AD, a downstream IdP, or another HRIS field. For a Workday example that reads the address from the Access Graph, see .
In a typical Workday-to-Active Directory onboarding workflow, Write Back Email is the third step:
Provision Account creates the AD user account from the Workday Worker.
Create Email creates an Exchange Server mailbox, generating the email address.
Write Back Email writes the new email address back to the Workday Worker record.
A second Provision Account action, targeting Active Directory and mapping only email, sets the address on the AD user account.
This ensures that the Workday record reflects the employee's corporate email immediately after onboarding, without manual HR data entry.
For the full workflow configuration, see the in the Actions overview. For Exchange Server setup, see .
Create email accounts in Exchange Server or Azure AD as part of onboarding workflows.
Creates email accounts for identities through integrated email providers. This action is typically used in onboarding workflows alongside Provision Account and Write Back Email to provision a user account, create their email, and update the HR system with the new address.
Example Use Cases:
Create Exchange Server mailboxes for new employees during onboarding
Provision Azure AD email accounts as part of identity lifecycle workflows
Generate email addresses using transformer-based formatting (e.g., {first_name}.{last_name}@company.com)
Supported Integrations:
In a standard onboarding policy, Create Email is used as the second step after creating the user account:
Provision Account creates the user account in Active Directory or the target system.
Create Email creates the email account in Exchange Server, generating the email address using attribute transformers.
Write Back Email updates the source of identity (for example, Workday) with the newly created email address.
A second Provision Account action, targeting Active Directory and mapping only email
See the in the Actions overview for a complete workflow.
Step-by-step guides for common Lifecycle Management tasks and configurations
These guides provide step-by-step instructions for common Lifecycle Management tasks and configurations.
End-to-end example using Workday as source, with Okta and AD as targets
Automatically assign Microsoft 365 licenses during onboarding
- Common questions and troubleshooting
- Architecture overview
- Monitor workflow execution and policy status
Execute integration-specific operations such as ServiceNow table inserts.
Executes integration-specific operations that extend beyond standard Lifecycle Management action types. CUSTOM_ACTION enables integrations to define specialized operations with flexible attribute schemas tailored to their unique capabilities.
Example Use Cases:
Insert records into ServiceNow tables when employees join or change roles
Create ServiceNow incidents or requests as part of onboarding workflows
Update ServiceNow CMDB records during employee lifecycle events
Log audit records for compliance tracking
Supported Integrations:
For detailed configuration examples including incident creation and audit logging, see .
Temporarily pause specific workflows or actions in a policy without removing configuration
This guide explains how to disable individual workflows or actions within a Provisioning Policy. Disabling allows you to temporarily pause specific parts of a policy without deleting or modifying the underlying configuration.
Use this option when developing workflows to support:
Managing gradual rollouts: Enable actions one at a time to verify each step before activating the next
Troubleshooting issues: Isolate problematic actions without removing configuration
Completed At
When the run finished
Duration
How long the run took
Entity Type
The data source and target entity type to create an email for
Action Attribute Mappings
Define how email attributes should be formatted. See Transformers for details
Provision Account Actions
Reference to a previous Provision Account action for unique identifier resolution
Exchange Server
Requires VezaProvisioner service on the Exchange Server host. See Exchange Server Provisioning for setup
Azure AD (Entra ID)
Creates email-enabled accounts via Microsoft Graph API
Validate policy behavior before enabling production execution
Filter, inspect, and export bulk dry run results and history
Evaluate a condition or formatter against sample values, including in read-only view
Review and export the differences between two policy versions
Pause or stop automation without deleting configurations
Run a workflow outside the extraction cycle, for one identity or many at once
Explain failed runs, summarize a policy's runs, and diagnose why a policy did not run with Access AI
Delegate Access Profile creation to specific users and groups
Configure a profile type that provisions accounts with no entitlements
Fallback Reviewers
No
Reviewers to assign if automatic assignment fails
Review Duration
Yes
Number of days to review: time from certification start when reviews are due
Creation Instructions
No
Publish immediately (sends the review to reviewers on creation) or Create as a draft (requires manual publishing)
Entity Type
The target integration and entity type to operate on
Action Attribute Mappings
Map source attributes to target table fields. The required table attribute sets the table to insert records into (e.g., incident, sc_request, u_custom_table). See Transformers for more details
ServiceNow
Insert records into any ServiceNow table
No
No, disabled in write-back mode
Workday target
Workday Worker, directly
Workday Account, writing through to its linked worker
Entity Type
The HRIS or identity source entity type to update with the email address (e.g., Workday Worker)
Workday
Writes email to the Worker record via the Workday API
Oracle HCM
Writes email to the Oracle HCM employee record
HiBob
Writes email to the HiBob employee record
OAA Custom HRIS
Writes email to custom HRIS identity providers integrated via Open Authorization API
Value written
The address an upstream action just created
Any value you map with a transformer
Attribute mapping
None. You pick only the entity type
Full transformer support
Upstream requirement
Create Email, or a Google Workspace sync
None
Creates identities
Workflow Testing: Disable production actions while testing new workflow logic
Disabling a workflow pauses it. The workflow does not run during policy execution, and Veza skips all conditions and actions within it. During the pause, Veza retains each identity's trigger history, the birthright access profiles the workflow granted, and its failure and retry state.
Go to Lifecycle Management > Provisioning > Policies.
Select a policy and open its draft: click Create Draft, or Go to Draft Version if a draft exists. On the workflow's card, open the ⋮ menu and select Workflow Settings.
Turn off the Enable workflow toggle.
Click Save.
Click Publish to apply the change.
The policy editor displays disabled workflows and actions with a "Disabled" tag.
You can also disable specific actions within a workflow without disabling the entire workflow. When you disable an action, any nested conditions and actions under the disabled action are also skipped, but other actions in the workflow continue to run normally.
Open the workflow editor.
Select the action you want to disable.
Turn off the Action Enabled toggle in the action settings.
Click Save.
Disabled workflows are evaluated by default during dry run simulations. This allows you to preview what would happen if you re-enabled a disabled workflow and validate trigger conditions and action configurations before making them active.
When you run a dry run simulation, the results show what actions would run if the workflow were enabled.
To re-enable a disabled workflow or action, turn the Enable workflow toggle (in Workflow Settings) or the Action Enabled toggle (in the action settings) back on and save. A re-enabled workflow does not run again for identities it processed before you disabled it.
Conceptual guide to the different condition and transformer systems in Lifecycle Management and when to use each
Lifecycle Management automates identity provisioning across your applications. When an employee joins, changes roles, or leaves, workflows answer two questions: Should this person get access? And what should their account look like?
This document explains the building blocks: conditions that control when things happen, and transformers that control what values are set.
These terms are used throughout Lifecycle Management documentation.
Purpose: Determine whether a workflow should execute based on identity attributes.
Syntax: SCIM filter expressions that evaluate to true or false.
Example:
When to use: Gate workflow execution based on identity state, department, location, employment type, or other attributes.
See for complete syntax documentation.
Purpose: After a workflow trigger matches, determine whether subsequent actions should run.
Syntax: Same SCIM filter syntax as workflow triggers.
Example:
When to use: Create branching logic within a workflow where different actions apply to different identity subsets.
See for configuration details.
Purpose: Construct attribute values when syncing identities to target systems.
Syntax: Formatter templates with optional pipeline functions.
Examples:
When to use: Transform source attributes into the format required by target systems (usernames, email addresses, distinguished names, etc.).
Transformers also support IF/ELSE conditional logic to select different values based on identity attributes. See for complete documentation.
Purpose: Dynamically determine which Access Profile to assign based on identity attributes.
Syntax: Formatter templates (same as attribute transformers) that resolve to Access Profile names.
Example:
If user's department is "Engineering", this resolves to the Access Profile named dept-engineering.
When to use: Assign Access Profiles based on department, location, role, or other attributes without creating separate workflow conditions for each combination.
See for complete documentation.
Conditions and transformers can work together. Workflow trigger conditions can embed transformer syntax for dynamic value comparisons.
This condition triggers a leaver workflow when an employee's last day falls within a 2-day window around today:
Breaking it down:
The syntax {\| FUNCTION \| ...} (pipe immediately after opening brace) indicates a transformer with no source attribute—it starts directly with a function like NOW.
See for more examples.
- Complete SCIM syntax for workflow triggers
- Formatter syntax and pipeline functions
- All available transformation functions
- Formatter-based profile assignment
Managing and monitoring Lifecycle Management from a central dashboard
The Lifecycle Management Dashboard provides a centralized interface for monitoring automatic provisioning and deprovisioning of user access - both birthright access granted by Veza Lifecycle Management and just-in-time access granted by Veza Access Reviews. This dashboard gives you an at-a-glance view of your configuration, status, and recent activity.
The dashboard is the primary landing page for Lifecycle Management and Access Requests and can help with routine monitoring, error resolution, policy validation, activity review, and integration health checks.
The dashboard is organized into several key sections:
Provisioning Policies: Shows the total number of policies and up to three of them with their status
Access Profiles: Shows configured Access Profiles and usage metrics
Identities: Provides a visualization of managed identities
Integrations: Top enabled for Lifecycle Management and Access Requests along with any error statuses
Access Requests: Tracks pending and completed access requests
Errors: Displays recent Lifecycle Management and Access Requests errors requiring attention (past day, week, or month)
Recent Activity: Shows the most recent Lifecycle Management and Access Requests
To navigate to more detailed information, click on any section heading to open the related overview. Click on specific items (such as a policy or integration) to view or edit configuration details.
From the dashboard, you can perform common tasks including:
Create a new policy: Click Create Provisioning Policy in the Provisioning Policies section
Configure Access Profiles: Click the "Create Access Profile" button in the Access Profiles section
Set up a new integration: Click the "Set up Integration" button in the Integrations section
Monitor system health: Review the Errors section for any issues
The Provisioning Policies section shows the total number of policies and lists up to three of them. Each listed policy shows its name, associated identity source, number of identities managed, and current status, for example Running or Stopped. When more than three policies exist, select View all to open the full list.
You can create new policies with the Create Provisioning Policy button, see which policies are actively running, access detailed configuration by selecting a specific policy, and verify that policies in "Running" status should be active. Learn more about .
The Access Profiles section shows the total number of configured access profiles and provides a visual representation of profile activity. Access profiles define sets of entitlements granted to users based on their roles.
You can see the total number of configured profiles, create new ones using the "Create Access Profile" button, view profile activity and utilization, and access detailed configuration by clicking into the section. Learn more about .
The Identities section provides a visual representation of all identities managed through Lifecycle Management and Access Requests. The chart displays the distribution of identities by type or status, giving you an immediate understanding of your identity landscape.
This visualization helps you understand the overall composition of your managed identities, identify distribution patterns across different categories, and track changes in identity distribution over time.
The Integrations section lists all systems connected to Lifecycle Management and Access Requests, displaying the total number of integrations, error status and counts, recently created integrations, and last update timestamps. For each integration, you can see its name and type, current status (including error indicators), and last update timestamp. You can set up new integrations using the "Set up Integration" button, identify and troubleshoot integration errors, and view all integrations by clicking "View all." Review this section regularly to identify any integrations with error states. See for more information.
The Access Requests section tracks pending access requests, recently completed requests, and request status (Pending, Completed, Rejected, Cancelled). This section provides visibility into the access request process, allowing you to monitor request volume and status, track completion rates, and identify potential bottlenecks in the access request workflow.
The Errors section displays any Lifecycle Management and Access Requests errors that require attention. When functioning normally with no issues, this section will display "No issues found." If errors occur, this section will list the specific errors, provide context about when and where they occurred, and offer guidance on troubleshooting and resolution. Check this section regularly for any reported issues.
The Recent Activity section shows a chronological log of Lifecycle Management and Access Requests events, including event type, timestamp, affected identity, and entity name. Examine this section to identify any unusual patterns or failed operations. This activity log helps you track recent actions, verify that expected changes have occurred, identify patterns or issues in lifecycle events, and monitor the overall health of your Lifecycle Management or Access Requests implementation.
After familiarizing yourself with the dashboard:
Disable or suspend user accounts while preserving audit trails.
Disables or suspends user accounts in target systems when employees or contractors leave the organization. Unlike Delete Account, which permanently removes accounts, Deprovision Account preserves the account and its audit history while revoking access — allowing for potential reactivation if needed.
Example Use Cases:
Disable Active Directory accounts and move leavers to a terminated users OU
Suspend Okta accounts while preserving group membership history for audit
Revoke access and reassign resources when employees transition out of the organization
Lock accounts during investigations while maintaining forensic records
The exact deprovisioning behavior depends on the target application and the method configured in the action. Integrations may support one or more of the following:
Not all integrations support both methods. The Deprovision Type dropdown lists the methods the integration supports, and appears only when more than one is available.
See the in the Actions overview for a complete Active Directory offboarding configuration.
Review the differences between two versions of a Provisioning Policy, and export them to CSV
Use Compare Versions to view what changed between two before you publish a draft, or to review how a policy changed over time. The comparison lists every added, modified, and removed item, grouped by the part of the policy it belongs to, with the value in each version side by side.
For the layout of the policy page and the , see .
The policy must have more than one version. For a policy with one version, the ⋮ menu on the Provisioning Policies page still shows Compare Versions, but the comparison shows only Pick two different versions to see a comparison.
Comparing versions requires the Administrator or Operator role. See .
Use Access AI in the Lifecycle Management workflow editor to draft and refine condition strings and formatters, then apply the suggestions you choose.
The Create with AI button in the Lifecycle Management workflow editor, and on a shared attribute mapping's edit panel (a Transformer in earlier releases), opens the Access AI panel for the LCM Policy Agent. Describe the condition or the transformed value you want in plain language, and the agent suggests the matching syntax with a short explanation. The suggestion appears as an action card in the Access AI panel, and you decide whether to apply it. Applying a suggestion updates the form field only. Saving the workflow or the shared attribute mapping saves the change.
The button appears next to these fields:
Condition strings
The Identity matches this condition
Track recent changes: Review the Recent Activity section for a log of recent events
Filter activity by time period: Use the time period dropdown (e.g., "Past day") to adjust the view
Shared Attribute Mappings
Shared transformation rules across multiple deprovisioning actions
Action Attribute Mappings
Target attributes to update during deprovisioning (e.g., update distinguished_name to a terminated OU)
Disable
Disables the account login while preserving the account and its data
Active Directory: disables the account; Okta: deactivates the user
Suspend
Temporarily suspends the account (may be reversible without full reactivation)
Okta: suspends the user session
Entity Type
The data source and target entity type to deprovision
Deprovision Type
The deprovisioning method to use (Disable or Suspend, depending on the integration)
Remove all entitlements
Whether to remove existing group memberships and role assignments. Use Entitlements Excluded from Removal to keep specific entitlements
Entitlements to Add
Entitlements to assign after deprovisioning (e.g., move to a "Terminated Users" group)
End all active sessions for the account
Force-terminate active sessions after deprovisioning (supported integrations only)
Go to Lifecycle Management > Provisioning > Policies.
Open the ⋮ menu on the policy's row.
Under Versions, select Compare Versions.
To start from the policy page instead, open the policy and select Compare Versions in the Policy Versions panel. The panel shows the button only when the policy has more than one version.
In From, select the earlier version. If the policy has a draft, From starts on the published version. If the policy has no draft, both pickers start on the published version, so select an earlier version here.
In To, select the later version. If the policy has a draft, To starts on the draft.
The page lists the changes by section, with a count of changes above the results, such as 12 Changes.
Each picker entry shows the version number and, for the published version or a draft, its state, for example From: Published (version v3). You can also select retired versions. A retired version shows no state, for example From: (version v1).
If the same version is selected in From and To, the page shows Pick two different versions to see a comparison.
The page groups changes into sections and shows only the sections that contain changes:
Workflows
Shared Attribute Mappings
Transformer Functions
Entity Aliases (early access; see Entity Aliases)
Lookup Tables
Properties
Password Rules
Each section is a table with these columns:
Name
The item that changed, such as a workflow or a shared attribute mapping
What Changed
The setting or field that changed
Change Type
Added, Modified, or Removed
From
The value in the From version
To
The value in the To version
If the two versions have no differences, the page shows No changes between the selected versions.
Use the filters above the results to narrow the list:
Workflow: in the Workflows section, show only changes to the selected workflows. This filter does not affect the other sections.
Change Type: show only Added, Modified, or Removed changes, or any combination of them.
If no changes match the filters, the page shows No changes match the current filters. Clear the filters to show all changes again.
Open the Export menu in the page header.
Select Export to CSV.
Veza downloads a file named <policy name>_v<from>_vs_v<to>_changes.csv, with spaces in the policy name replaced by underscores. The file contains the rows that match the current filters. It has a Section column followed by the Name, What Changed, Change Type, From, and To columns. In the CSV, Change Type holds ADDED, MODIFIED, or REMOVED.
The Export menu is not shown while the same version is selected in From and To, or when no changes match the filters.
When the draft is ready, publish it from its version page. See Header actions.
To review every version of the policy, including retired versions, open Version History.
Formatter (template)
String
Decide WHICH Access Profile to assign
Formatter (template)
String (profile name)
No (use nested conditions)
Yes
Can embed transformers
Yes, for dynamic values
N/A (is the transformer)
Then Apply
Only within embedded values
Yes (| UPPER | LOWER)
sys_attr__is_moverPolicies - Creating and configuring Provisioning Policies
Condition
A SCIM filter expression that evaluates to true/false
department eq "Engineering"
Transformer
A complete attribute mapping configuration
Maps email to target, with formatter {first_name}.{last_name}@co.com
Formatter
The template string within a transformer that constructs the value
{first_name}.{last_name}@company.com
Then Apply
A transformation applied within a formatter using the pipe (|) character
UPPER, LOWER, SUBSTRING
Decide IF a workflow runs
SCIM filter
Boolean
Decide IF a subsequent action runs
SCIM filter
Boolean
is_active eq true and department eq "Engineering"job_level ge 5 and location sw "US-"{first_name}.{last_name}@company.com{first_name | LOWER}.{last_name | LOWER | SUBSTRING, 0, 10}dept-{department | LOWER}is_active eq true
and customprop_lastdayofwork le "{| NOW | UTC_TO_TIME_ZONE, \"-05:00\" | DATE_ADJUST_DAY, 0 | DATE_FORMAT, \"DateOnly\"}"
and customprop_lastdayofwork gt "{| NOW | UTC_TO_TIME_ZONE, \"-05:00\" | DATE_ADJUST_DAY, -2 | DATE_FORMAT, \"DateOnly\"}"is_active eq true
SCIM condition
Check if employee is active
customprop_lastdayofwork le ...
SCIM condition
Compare last day to threshold
{| NOW | UTC_TO_TIME_ZONE, "-05:00" | ...}
Embedded transformer
Generate "today in EST" dynamically
Purpose
Gate execution
Construct values
Output
Boolean (yes/no)
String (the value)
Base syntax
SCIM filter (eq, le, and, or)
Template ({attribute})
Decide WHAT value an attribute should have
Supports IF/ELSE
A condition node, when its condition type is not Always.
Formatters
The Formatter of an attribute on an action that maps attributes, such as Provision Account (named Sync Identities in earlier releases), Deprovision Account, Reset Password, or Create Email, once a destination attribute is set. Structured attributes and the fallback formatter have no button.
The unique identifier attribute of those actions.
The Formatter of a shared attribute mapping.
Create with AI requires all of the following. If any is missing, the Create with AI button does not appear.
The LCM Policy Agent: Lifecycle Management includes it. See Access Agent availability.
Access AI turned on: See Enabling Access AI.
The Administrator role. Only administrators can edit Lifecycle Management workflows and shared attribute mappings. See Roles.
The LCM Policy Agent reads the policy's configuration with your own permissions, not an elevated service identity. It reads the policy's identities only when you ask it to test a condition or formatter, and it does not read run data. The agent does not save workflows: a suggestion takes effect after you apply it and save the workflow.
Open Lifecycle Management, select a policy, and open the workflow in the workflow editor.
Open the field to draft:
For the trigger condition, select the Trigger box. In the trigger panel, locate the Identity matches this condition clause.
For a condition node, select the node on the canvas.
Select Create with AI. The Access AI panel opens. If the field is empty, the agent drafts a new condition string. If it has a value, the panel offers suggested actions, such as Test this condition against identities and Change or add to this trigger. See .
Describe the condition in plain language, for example: "Active Workday workers in the Engineering department whose start date is within the next 7 days".
Review the Condition String action card, which contains the suggested condition and an explanation.
Select Apply Condition to write the suggestion into the field, replacing its current value. The card then reads Condition Applied. To decline the suggestion, select Reject. The card then reads Rejected. Continue the conversation to ask for another suggestion.
Review the value, and save the workflow.
Apply Condition is available only while a condition field is open on a workflow editor page. On any other page, the card shows Go to Workflow instead, which opens the workflow.
Open Lifecycle Management and select a policy. For an action, open the workflow in the workflow editor.
Select the action and locate the attribute to format. For a shared attribute mapping, open it for editing instead.
Select Create with AI next to the Formatter field. The Access AI panel opens, and the agent receives the destination attribute, the entity type, and the current formatter if one is set. If a formatter is set, the panel offers suggested actions, such as Try this formatter on a few identities and Change or add to this formatter.
Describe the value in plain language, for example: "Lowercase the first initial and full surname, joined with a period, then append @example.com".
Review the Formatter for attribute action card. Pipeline functions in the suggestion appear under Then apply:.
Select Apply Formatter to write the suggestion into the Formatter field, replacing its current value. The card then reads Formatter Applied. To decline the suggestion, select Reject.
Review the value, and save the workflow or the shared attribute mapping.
When the suggestion includes pipeline functions, applying it also replaces the Then Apply value. When it has none, the existing Then Apply value is left unchanged, so clear it yourself if it no longer applies.
Apply Formatter is available only while a formatter field for the same destination attribute is on screen. If you close the attribute or move to another action, return to it to apply the suggestion. The formatter card has no Go to Workflow button.
When the field is empty, Create with AI starts a new thread with the LCM Policy Agent. When the field has a value, the panel opens on an empty chat, and a suggested action you select starts a new thread with the LCM Policy Agent. The agent keeps the context it was opened with, such as the policy and the field, across every turn in that thread, so follow-up requests do not need to restate it.
To return to a past thread, open Access AI > Threads in the main navigation. To rename, move, or delete a thread, use Rename Thread, Move Thread, or Delete Thread in the thread's options menu.
LCM Policy Agent: what the agent can do, where it appears, and what it requires.
Policies: workflow triggers, conditions, and actions.
Trigger Conditions Reference: SCIM filter syntax for condition strings.
Transformer Reference: formatter functions and the Then Apply pipeline.
Route Send REST Payload actions through Insight Points for custom OAA integrations
Lifecycle Management supports four integration pathways for custom applications. This document covers configuring the OAA Write Framework pathway with Insight Point routing for Send REST Payload actions.
When using the Send REST Payload action in Lifecycle Management workflows, requests execute from the Veza control plane by default. For target APIs that are on-premises or behind a firewall, you can configure a Custom Provider (OAA integration) to route requests through an Insight Point agent instead.
This configuration enables:
On-premises API access: Call internal APIs that aren't accessible from the public internet
Network isolation: Route requests through your own infrastructure for security compliance
Hybrid deployments: Mix cloud-based and on-premises targets in the same workflow
You DO NOT need this configuration if:
Your target API is publicly accessible
You're calling cloud services (SaaS APIs, webhooks)
Your Send REST Payload actions work without selecting a data source
You NEED this configuration if:
Your target API is on-premises or in a private network
The API is only accessible from specific network locations
You need requests to originate from an Insight Point agent
Without Data Source (Default):
With Data Source (Insight Point Routing):
When a Custom Provider is configured with external_lifecycle_management_type: SEND_REST_PAYLOAD:
The provider's data source appears in the Send REST Payload action's Data Source dropdown
Selecting it routes the HTTP request through the associated Insight Point
The Insight Point agent executes the request from within your network
This setting is configured via the Veza REST API. It is not currently available in the Veza UI. The provider configuration only sets up Insight Point routing—the actual request URL, HTTP method, payload, and authentication are configured per-action in the .
Provisioning required: provisioning must be true when setting external_lifecycle_management_type
No internal app name: Cannot be used with internal_app_name (these are mutually exclusive)
No
Once configured, the Custom Provider's data source will appear in the Send REST Payload action configuration:
In the policy editor, add a Send REST Payload action
In the Data Source field, select your configured Custom Provider
Configure the URL, method, headers, and payload as needed
The request will route through the associated Insight Point
You can use together with Insight Point routing:
REST Auth Credentials: Handle authentication (OAuth2, Bearer tokens, etc.)
Data Source selection: Routes the request through an Insight Point
When a Data Source is selected, both the token acquisition request and the subsequent REST request execute through the Insight Point. This means Login to Bearer and OAuth2 credential types work correctly against token endpoints that are not publicly accessible—the entire authentication flow remains within your private network.
If no data sources appear in the Send REST Payload action's Data Source dropdown:
No providers configured: Verify you have at least one Custom Provider with external_lifecycle_management_type: SEND_REST_PAYLOAD
Provisioning not enabled: Check that provisioning: true is set on the provider
No data source created: Push an OAA payload to create a data source for the provider
Include provisioning: true in your API request along with the external_lifecycle_management_type field.
The data_plane_id is required when creating a provider with external_lifecycle_management_type: SEND_REST_PAYLOAD. Ensure you have a deployed Insight Point and include its ID in your create request.
The provider is referenced by one or more Provisioning Policies. Remove the provider from all policies before changing its external_lifecycle_management_type.
If requests fail when routed through an Insight Point:
Network connectivity: Verify the Insight Point can reach the target API
Firewall rules: Ensure outbound HTTPS is allowed from the Insight Point to the target
DNS resolution: Confirm the target hostname resolves from the Insight Point's network
TLS certificates: If the target API uses an internal or self-signed CA certificate, the Insight Point will fail with tls: failed to verify certificate: x509: certificate signed by unknown authority
: Overview of integration pathways (Native, SCIM, OAA Write Framework, and direct REST, XML, and SQL actions)
: Action configuration, variable substitution, and response handling
: Centralized authentication management for Send REST Payload actions
: Alternative LCM option using SCIM endpoints (requires configuration_json)
Create groups, roles, or distribution lists in target systems from an integration row on the Lifecycle Management Integrations page.
Creates entitlements (groups, roles, or distribution lists) in target systems. This action supports creating new entitlements, renaming existing ones, and synchronizing entitlement membership. It is not offered in the workflow editor. Run it from the Create Entitlement option in an integration row's action menu under Lifecycle Management > Integrations. The Activity page lists it as Create Group.
Example Use Cases:
Create department-specific Active Directory security groups
Provision Okta groups for new teams or projects as part of organizational changes
Create Azure AD distribution groups for new departments
Create AWS IAM Identity Center groups for team-based access management
Automatically add newly created entitlements to Access Profiles for downstream provisioning
When an existing entitlement ID is provided, the action renames the entitlement rather than creating a new one. This is useful when organizational changes require updating group or role names while preserving existing membership and access.
When Sync Members is enabled, the action compares the current entitlement membership against the expected member list and:
Adds members that should be present but are missing
Removes members that are present but should not be
Tracks individual member operations, reporting successes and failures separately
This enables precise entitlement membership management as part of lifecycle automation.
Newly created entitlements can be automatically added to an . This enables workflows where creating an entitlement in one step makes it available for assignment in subsequent Manage Entitlements actions, connecting dynamic entitlement creation with birthright access provisioning.
CREATE_ENTITLEMENT generates three notification event types:
You can configure email notifications or webhooks for these events. See for configuration details.
Configure an Access Profile Type that provisions local user accounts in a target system without granting specific entitlements.
This guide explains how to configure an Access Profile Type that creates local user accounts in a target system without adding relationships to specific entitlements (such as groups, roles, or permissions).
Use this approach when you need to:
Provision user accounts for application access without granting specific roles or group memberships
Create accounts that will receive entitlements later through a separate process (such as manual assignment or another workflow)
Support "application access only" scenarios, where the goal is a working account rather than entitlement-level access
Group
name
Optional: mailEnabled, isSecurityGroup
Azure AD
Distribution Group
name
Optional: identity, alias (Exchange distribution groups)
AWS IAM Identity Center
Group
Per-group attributes
Creates IAM Identity Center (SSO) groups
Entity Type
The data source and target entitlement type to create (e.g., Active Directory Group, Okta Group, Azure AD Group, AWS SSO Group)
Attributes
Key-value pairs defining the entitlement properties (e.g., name). Available attributes depend on the target integration
Access Profile (Optional)
An Access Profile to associate with the newly created entitlement. When specified, the entitlement is automatically added to the profile after creation
Sync Members
When enabled, synchronizes the entitlement's membership to match the expected member list, adding missing members and removing unexpected ones
Active Directory
Group
name
Creates security groups
Okta
Group
name
Creates Okta groups
CREATE_ENTITLEMENT
Sent when an entitlement is created
RENAME_ENTITLEMENT
Sent when an existing entitlement is renamed
SYNC_ENTITLEMENT
Sent when entitlement membership is synchronized
Azure AD
Yes
Set to SEND_REST_PAYLOAD to enable routing
data_plane_id
Yes
Insight Point ID (UUID) to execute requests (create only). Find at Integrations > Insight Points in the UI.
configuration_json. Including it in the request will cause a validation error. Authentication is configured per-action using the Cannot change type while in use: external_lifecycle_management_type cannot be changed while the provider is referenced by Provisioning Policies. Remove the provider from all policies before changing this field.
OVA deployment: See Custom Certificate Configuration
Install script deployment: See Using Custom Certificates
Insight Point: Agent deployment, connectivity requirements, and high availability
Open Authorization API: Custom integration development
name
Yes
Display name for the Custom Provider
custom_template
Yes
OAA template type (typically application)
provisioning
Yes
Must be true to enable Lifecycle Management
external_lifecycle_management_type
curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
-H "Authorization: Bearer {API_KEY}" \
-H "Content-Type: application/json" \
--data '{
"name": "On-Prem HR System",
"custom_template": "application",
"provisioning": true,
"external_lifecycle_management_type": "SEND_REST_PAYLOAD",
"data_plane_id": "{INSIGHT_POINT_ID}"
}'curl -X PATCH "https://{VEZA_URL}/api/v1/providers/custom/{PROVIDER_ID}" \
-H "Authorization: Bearer {API_KEY}" \
-H "Content-Type: application/json" \
--data '{
"provider": {
"id": "{PROVIDER_ID}",
"provisioning": true,
"external_lifecycle_management_type": "SEND_REST_PAYLOAD"
},
"update_mask": {
"paths": ["provisioning", "external_lifecycle_management_type"]
}
}'Before you configure this feature, ensure you have:
Administrator access to Veza Lifecycle Management settings
An LCM-enabled integration that supports the Provision Account action (such as Active Directory, Okta, or Snowflake)
A policy with a Provision Account action configured for the target integration (see Policies and Conditions and Actions)
An account-only Access Profile grants access to an application without attaching any entitlement relationships. The account itself is created by the Provision Account action in your policy; the account-only profile ensures no groups, roles, or permissions are added.
When an identity is assigned an account-only Access Profile:
The policy's Provision Account action uses its Action Unique Identifier to check whether the identity already has an account in the target integration.
If no account exists and the action has Create accounts turned on, Veza creates a local account using the attribute transformers you configured.
No entitlement relationships are created. The account exists but has no group memberships, role assignments, or permissions.
The attributes written to the new account (such as username, email, and department) depend on the transformers configured in the Provision Account action. See Attribute Transformers.
Open Access Profiles > Access Profile Types.
Click New Access Profile Type.
Enter the basic information:
Name: A descriptive name (for example, "Application Access Only").
Description: The purpose of the type (for example, "Creates local accounts without granting specific entitlements").
In the Integrations section, select one of the following:
Limit to a single integration type: Restricts profiles to integrations of a specific type (such as any Active Directory integration).
Limit to a single integration: Restricts profiles to a specific integration instance.
Select Create account only.
When enabled, this setting:
Disables adding direct entitlements to Access Profiles of this type
Disables inheritance from other Access Profiles
Removes the Entitlements options, since profiles of this type grant no entitlements
Configure additional options as needed:
On Create Behavior: The default state for new Access Profiles of this type (Default, State Disabled, State Enabled, or State Enabled by Admin).
Access Request Policy: The default policy for access duration and approval workflows.
Click Create Access Profile Type.
For the full reference on profile type options, see Access Profile Types.
After you create the profile type, create an Access Profile that provisions accounts to a specific integration:
Open Access Profiles > Access Profiles.
Click Create.
In Create Access Profile, choose your account-only profile type under Access Profile Type (for example, "Application Access Only"), then click Next.
Confirm the target integration where accounts will be created.
Enter a Name and optional Description.
Click Save to save the Access Profile.
For account provisioning to work, the policy that governs these identities must include a Provision Account action for the target integration:
Open Lifecycle Management > Provisioning > Policies.
Edit the policy that governs the identities you want to provision.
In the workflow, confirm a Provision Account action that:
Targets the same integration as your Access Profile
Has Create accounts turned on so new accounts can be created
Has attribute mappings for the required fields (such as username and email)
Publish the policy version.
For details on configuring Provision Account and attribute transformers, see Provision Account and Attribute Transformers.
Assign identities to the account-only Access Profile through any of the standard methods:
Birthright (policy workflows): Automatic assignment based on identity attributes and workflow conditions
Access Requests: User-initiated requests with approval workflows
Manual assignment: Direct assignment by an administrator
When an identity receives the profile, the policy's Provision Account action creates the account (if it does not already exist) with the attributes mapped by your transformers, and no entitlement relationships are added.
This example creates Active Directory accounts with no group memberships.
Profile type:
Name: "AD Account Only"
Integrations: Limit to a single integration type → Active Directory
Create account only: Enabled
Provision Account attribute mapping (configured in the policy). Map source identity attributes to the target Active Directory attributes:
sAMAccountName ← {first_name}.{last_name}, with a fallback such as {first_name}.{last_name}{NEXT_NUMBER(1, 10)} to resolve duplicate usernames
mail ← {email}
givenName ← {first_name}
sn ← {last_name}
department ← {department}
When an identity is assigned an Access Profile of this type, Veza creates an Active Directory user account with these attributes but does not add the user to any security groups. For conflict handling when a generated username already exists, see Fallback Formatters.
Access Profile Types - Full reference for profile type configuration
Access Profiles - Creating and managing Access Profiles
Policies - Configuring automated workflows
Provision Account - The action that creates accounts
- All available workflow actions
- Mapping identity attributes to target systems
Configure fallback formatters for uniquely identifying attributes during identity synchronization
Fallback formatters can help resolve conflicts when provisioning identities with unique attributes. This is particularly useful when automated provisioning requires unique identifiers, but the standard generated values are already in use.
When provisioning new identities through Lifecycle Management, unique attributes like usernames, login IDs, or email addresses must not conflict with existing values. Fallback formatters provide an automated way to generate alternative values when conflicts arise, ensuring provisioning can proceed without manual intervention.
You can configure fallback formatters when configuring a Provision Account Action to ensure new users can be onboarded efficiently, regardless of naming conflicts.
The most common use case for fallback formatters is handling username conflicts. For example:
Your organization uses a standard username format of first initial + last name (e.g., jsmith for John Smith).
When multiple employees have similar names, this can lead to conflicts:
John Smith already has jsmith
Jane Smith already has jsmith1
James Smith already has jsmith2
When Jennifer Smith joins, the fallback formatter automatically assigns jsmith3, maintaining your naming convention while ensuring uniqueness.
Fallback formatters can be configured as part of the "Provision Account" action within a Lifecycle Management workflow:
Edit or create a Provisioning Policy
Edit the workflow containing the Provision Account action
In the Provision Account action configuration, click Add Fallback
Configure the to use as a fallback pattern for the unique attribute that might experience conflicts
Several transformers can be used for implementing fallback formatters depending on your specific use case.
A typical approach is to use the NEXT_NUMBER transformer, which is specifically designed to generate sequential numerical alternatives when naming conflicts occur.
The NEXT_NUMBER transformer:
Generates a set of sequential integers as strings
Takes two parameters: BeginInteger (starting number) and Length (how many numbers to generate)
Is unique among transformers in that it returns multiple values, making it ideal for fallback scenarios
In addition to NEXT_NUMBER, other transformers can be valuable for creating fallback formatters:
Using Random Alphanumeric for Unique Usernames:
This could generate usernames like jsmith8f3d instead of sequential jsmith1, jsmith2, etc.
Using UUID for Guaranteed Uniqueness:
This would append the first 8 characters of a UUID, creating identifiers like jsmith-a7f3e9c2.
When configuring a fallback formatter with the NEXT_NUMBER transformer:
Select the attribute that requires uniqueness (e.g., username, email)
Configure the primary pattern (e.g., {first_initial}{last_name})
Add a fallback using the NEXT_NUMBER transformer to generate sequential alternatives:
This will generate up to 10 alternatives: jsmith1, jsmith2, ... jsmith10
Here are some commonly used fallback patterns:
When Lifecycle Management attempts to provision a new identity with a unique attribute value that already exists:
The system first tries the primary format (e.g., jsmith)
If a conflict is detected, it automatically tries the first alternative using the NEXT_NUMBER transformer (e.g., jsmith1)
If that value also exists, it tries the next alternative (e.g., jsmith2)
This automated conflict resolution ensures provisioning can proceed without manual intervention, even when your standard naming conventions result in conflicts.
Create or update user accounts in target systems by synchronizing identity attributes.
Synchronizes identity attributes between systems, with options to:
Create new identities if they don't exist
Update attributes of existing identities
Enable continuous sync to keep attributes aligned with the source of truth
Example Use Cases:
Use lookup tables to transform identity attributes for target systems
You can use Lookup transformers to convert identity attributes from a source system into appropriate values for target systems based on CSV reference tables. This is particularly useful when mapping values between systems that use different naming conventions, codes, or formats for the same conceptual data.
For example, you might need to transform a "Location" attribute from Workday (which might be stored as location codes like "MN001") into corresponding values for country, country code, or city names in a target system.
Use Table Lookup Transformers when:
You need to map source attribute values to different values in target systems
You have standardized reference data that must be consistent across applications
Computed properties for advanced workflow triggering and conditional transformations in Lifecycle Management
System attributes are computed properties that Lifecycle Management automatically generates during identity processing. These attributes enable advanced automation scenarios by providing runtime information about identity changes and transformation results.
System attributes use two prefix conventions: sys_attr__ for computed boolean flags evaluated each extraction cycle (such as sys_attr__is_mover) and sys_attr_changed__ for per-property change detection attributes that are also re-evaluated each cycle. Neither can be manually set or modified.
A boolean attribute that indicates whether an identity has undergone changes to monitored properties during the most recent extraction.
Type: Boolean Persistence: Transient (re-evaluated each extraction cycle) Available in: Workflow trigger conditions
Configuration: Define monitored properties in the policy configuration:
{first_name}{last_initial}{NEXT_NUMBER(1, 10)}
johns, johns1, johns2
This process continues until either:
A unique value is found
All alternatives from the NEXT_NUMBER range are exhausted (in which case an error would be reported)
{first_initial}{last_name}
{first_initial}{last_name}{NEXT_NUMBER(1, 10)}
jsmith, jsmith1, jsmith2, etc.
{first_name}.{last_name}
{first_name}.{last_name}{NEXT_NUMBER(1, 10)}
john.smith, john.smith1, john.smith2
{username}@domain.com
{username}{NEXT_NUMBER(1, 10)}@domain.com
jsmith@domain.com, jsmith1@domain.com
{first_name}{last_initial}
Combined Condition Example:
The attribute is re-evaluated on every extraction cycle. It is set to true when any property in mover_properties changes, and cleared otherwise. For identities that are unchanged in an extraction, it is explicitly removed from the stored identity record. It is excluded from change detection to prevent recursive updates.
A persistent boolean attribute that indicates whether an identity is new in Veza — either appearing for the first time, or returning after being removed from its source system.
Type: Boolean Persistence: Stored with identity record; cleared after the first extraction cycle where the identity appears Available in: Workflow trigger conditions
When this attribute is set:
The identity has no prior record in Veza and appears for the first time in an extraction.
The identity was previously removed from its source system (for example, a terminated employee) and has returned in a new extraction cycle. Veza treats this as a new identity so that joiner workflows fire for re-hires.
When this attribute is not set:
The identity already has an existing active record in Veza from a prior extraction cycle, regardless of any attribute changes.
The identity changed one or more properties but has a continuous record in Veza. Identities with attribute changes are indicated by sys_attr__is_mover or sys_attr_changed__<property>, not sys_attr__is_new_identity.
Trigger condition examples:
A transient attribute that provides a preview of the transformation result during conditional evaluation.
Type: String Persistence: Transient (exists only during IF statement evaluation) Available in: Conditional transformers only
Usage Example - Conditional Domain Addition:
The above transformer will check if the transformed email already contains "@", preserve existing email addresses, and add domain only when needed.
A transient attribute that provides the character length of the transformation result during conditional evaluation.
Type: Number Persistence: Transient (exists only during IF statement evaluation) Available in: Conditional transformers only
Usage Example - Progressive Username Truncation:
For "Leonevenkataramanathan Foster":
First check (≤30 chars): leonevenkataramanathan.foster (30 chars - passes first condition)
If >30 chars, second check (≤20 chars): leonevenkataramana.foster (25 chars - fails second condition)
If >20 chars, fallback: l.f (3 chars - always succeeds)
Alternatives with NEXT_NUMBER: l.f2, l.f3, l.f4
Preview attributes work with the NEXT_NUMBER transformer for generating unique alternatives:
This evaluates the base value length before applying numbering, ensuring the final result (including numbers) meets constraints.
Only one NEXT_NUMBER transformer is allowed per conditional branch.
A family of dynamic boolean attributes that indicate which specific properties changed on an identity during the most recent extraction.
Type: Boolean Persistence: Transient (reset each extraction cycle) Available in: Workflow trigger conditions
How it works: When Veza processes an extraction event and detects that a property has changed since the previous extraction, it sets sys_attr_changed__<property_name> eq true on that identity's node. All sys_attr_changed__ attributes are cleared at the start of each extraction cycle, so they reflect only the changes in that extraction.
When this attribute is not present: If a property did not change in an extraction, its sys_attr_changed__ attribute is absent from the identity record — it is not set to false. This means the condition sys_attr_changed__department_name eq false will not match identities whose department did not change; it will simply not match at all. To trigger a workflow only when a property has not changed, omit the sys_attr_changed__ check and rely on the attribute value directly.
For new identities, Veza sets sys_attr_changed__<property> eq true for all properties, treating their first appearance as a change from non-existence.
Trigger condition examples:
Please note that sys_attr__is_mover is a persistent flag set when any property in the policy's mover_properties list changes. It does not identify which property changed. sys_attr_changed__ attributes are transient and per-property. They are set for all changed properties regardless of the mover_properties configuration.
Secondary entity attributes: For secondary entity nodes (such as a Human Resources Information System (HRIS) record attached to an identity), prefix the attribute name with the entity type followed by a period:
The entity type prefix matches the integration entity type name shown in the policy configuration. Without the prefix, the condition applies to the primary identity node.
The trigger condition editor autocompletes
sys_attr_changed__and then suggests available attribute names. After typing or selecting the prefix, enter the property name to complete the attribute.
Trigger Conditions Reference - Complete SCIM filter syntax for workflow conditions
Transformer Functions Reference - Complete list of transformation functions
Transformers - Attribute transformation concepts and examples
Policies - Configuring mover properties and workflows
{first_initial}{last_name}{RANDOM_ALPHANUMERIC_GENERATOR(4)}{first_initial}{last_name}-{UUID_GENERATOR() | SUB_STRING,0,8}{first_initial}{last_name}{NEXT_NUMBER(1, 10)}{
"mover_properties": ["department", "manager_id", "title", "location"]
}sys_attr__is_mover eq truesys_attr__is_mover eq true and department eq "Engineering" and is_active eq true# Joiner workflow for all new identities, including re-hires
sys_attr__is_new_identity eq true and employment_status eq "ACTIVE"
# New hire into a specific department, combined with sys_attr_changed__
sys_attr__is_new_identity eq true and sys_attr_changed__department_name eq true and department_name eq "Engineering"IF sys_attr__would_be_value co "@"
{email | LOWER}
ELSE
{email | LOWER}@company.comIF sys_attr__would_be_value_len le 30
{first_name | LOWER}.{last_name | LOWER | NEXT_NUMBER, 2, 3}
ELSE IF sys_attr__would_be_value_len le 20
{first_name | LOWER | FIRST_N, 10}.{last_name | LOWER | NEXT_NUMBER, 2, 3}
ELSE
{first_name | LOWER | FIRST_N, 1}.{last_name | LOWER | FIRST_N, 1 | NEXT_NUMBER, 2, 3}IF sys_attr__would_be_value_len le 15
{username | NEXT_NUMBER, 2, 5}
ELSE IF sys_attr__would_be_value_len le 15
{username | FIRST_N, 13 | NEXT_NUMBER, 2, 5}# Triggers only when department changes TO Sales
department_name eq "Sales" and sys_attr_changed__department_name eq true
# Triggers when manager changes for active employees in specific departments
sys_attr_changed__managers eq true and employment_status eq "ACTIVE" and (department_name eq "Engineering" or department_name eq "Marketing" or department_name eq "Sales")
# Triggers when any of several properties change for active employees
(sys_attr_changed__department_name eq true or sys_attr_changed__job_title eq true or sys_attr_changed__managers eq true) and employment_status eq "ACTIVE"
# Triggers only when BOTH a chain-level field AND manager change in the same extraction
(sys_attr_changed__customprop_management_chain_level_03 eq true or sys_attr_changed__customprop_management_chain_level_04 eq true) and sys_attr_changed__managers eq true# Trigger when department changes on a Beeline HRIS record (secondary source)
OAABeeline_CSVHRISEmployee.sys_attr_changed__department eq true
# Combine with a primary identity attribute value check
OAABeeline_CSVHRISEmployee.sys_attr_changed__cost_center eq true and employment_status eq "ACTIVE"Create new user accounts in target systems when employees join
Update user attributes when information changes in HR systems
Ensure consistent user information across multiple platforms
Entity Type
The data source and type of identity to sync (e.g., Okta User, Azure AD User)
Create accounts
When on, creates an account for an identity that doesn't already exist. Off by default, which skips identities that don't already exist.
Update existing accounts
When on, existing active accounts are updated whenever the workflow runs. When off, changes apply only when an account is created or reactivated. Turn it on to keep attributes in sync after initial creation.
Reactivate inactive accounts
When on, reactivates an inactive account when its identity is found active again in the source. On by default.
Shared Attribute Mappings
Password output (Early Access)
When password output is enabled, the password generated during identity creation is available to subsequent workflow actions via transformer expressions. Use {EntityType.password} syntax to reference it, such as {OktaUser.password} in a Send REST Payload action.
This is useful in joiner workflows where Veza provisions a new account and needs to pass the generated password to a downstream system such as an HR portal or ticketing API.
A Provision Account action can target one of the policy's own identity sources, updating the system of record instead of a downstream application. Use this to push a value the workflow produced, most often an email address, back into an HR system such as Workday.
When you select a target that is also an identity source on the policy, the action switches to write-back mode automatically and shows Writing back to Identity Source. In this mode:
Creating new identities is disabled. A write-back action only updates records that already exist.
Guest account creation and invitations are hidden.
The attributes you can map are limited to those the identity source accepts as writable.
Which attributes are writable depends on the integration. Workday, for example, accepts username and email on the Workday Account entity, and applies the email value to the linked worker's primary work email. See Workday provisioning.
To configure one, map the unique identifier plus each attribute you want to write. Veza uses the unique identifier to locate the record, and the action fails if the mapping omits it. For a Workday email write-back, the minimum mapping is id and email.
If a mailbox address is assigned outside Veza after the account exists, the address is available in Veza only after the next extraction of that system. This example writes that address to Workday without submitting an empty email for workers who have no mailbox.
Workday is the policy's source of identity, and Lifecycle Management is enabled on the Workday integration. See Enabling provisioning.
Veza extracts the Azure AD or Active Directory integration that holds the mailbox address.
You have reviewed the Workday email update behavior.
In the policy workflow, select Add New Action > Provision Account, and set Entity Type to Workday Account.
Turn on Update existing accounts. Otherwise, the action does not update existing workers.
In addition to the required id mapping, map email to this conditional transformer:
IF sys_attr__would_be_value co "@"
{employee_id | FROM_ENTITY_ATTRIBUTE, "AzureADUser", "employee_id", "email", ""}
ELSE
{email}For email, set Apply On to Create and update.
Test the policy with a before you publish it.
Because the condition references sys_attr__would_be_value, Veza evaluates the IF branch lookup first and tests its result. When the lookup finds no matching user, or a user with no email, it returns an empty value, the condition fails, and the ELSE branch maps the worker's current email value instead.
When you adapt the example:
Keep the empty default (""). Without it, a lookup that finds no match is an error, and the action fails.
For Active Directory, replace "AzureADUser", "employee_id" with "ActiveDirectoryUser" and an attribute that Veza extracts for Active Directory users, such as "account_name". Veza does not extract employee_id for Active Directory users, so also replace the input before the | with a Workday attribute that holds the matching value.
To write a value produced earlier in the same workflow instead, see Referencing attributes from earlier actions.
A Provision Account action makes the target account's attributes available to later actions in the same workflow. Reference them by qualifying the attribute with the entity type:
A bare placeholder such as {email} reads only the source-of-identity record that triggered the workflow, so it does not return values the workflow wrote to a target system. Use the qualified form for that. When several actions write the same entity type, the most recent value takes precedence.
This is what makes a two-step write-back possible: provision the account in the target system, then map the identity source's email attribute to the address the first action produced. After a Create Email action, the new address is also available to every later action as {email_address}.
Three limits apply:
Order matters, and Veza does not check it. Unlike the Write Back Email action, a Provision Account write-back action is not validated for ordering. Placed before the action that produces the value, it publishes without error and then writes an empty or stale value at run time. Structure the policy so that the write-back occurs after the action that creates the account.
A sync that changes nothing might not publish its mapped values. When an action finds the target already up to date, later actions see only the attributes the target system itself returned, not every mapped field.
Available attributes vary by integration. For example, Active Directory re-reads the account after writing, so {ActiveDirectoryUser.email} reflects the stored value. Azure AD returns the user principal name but not mail (use {AzureADUser.principal_name} to retrieve the address of a newly created Azure AD account).
Enforce password change on login forces a newly created user to change their password the first time they sign in. The setting appears on the Provision Account action only for target systems that support it.
Active Directory
✅
✅
Azure AD
❌
✅
Google Workspace
✅
— (no Reset Password action)
For Active Directory, this setting is part of a broader password policy that also controls password complexity and can deliver the generated password through an event notification — see Active Directory provisioning. For Google Workspace, only the change-on-login behavior is configurable — see Google Cloud provisioning. For the Reset Password action, see Reset Password.
{ActiveDirectoryUser.email}
{AzureADUser.principal_name}You need to extract different pieces of information from a single attribute value
You have complex mapping requirements that built-in transformers cannot support
Geographic Information:
Transform location codes to country, region, city, or time zone information
Map office codes to physical addresses or facility types
Organizational Mapping:
Convert department codes to department names or business units
Map cost centers to budget codes or accounting categories
System-Specific Configurations:
Transform job titles to role designations in target systems
Convert skill codes to certification requirements or training needs
The Table Lookup Transformer references CSV-based mappings between source and destination values. When synchronizing user attributes, Veza:
Takes the source attribute value
Looks up this value in the specified lookup table
Returns the corresponding value from the designated return column
Applies this value to the target attribute
Lookup tables are CSV files with columns that map values from a source of identity to destination values. Each row represents a mapping entry. The first row must contain the column headers.
For example, a location mapping table might look like:
To create a new lookup table:
Open a draft version of your policy (you can only add lookup tables to a draft) and select the Workflow Components tab
Select the Lookup Tables card
Click + on the card. When the policy has no lookup tables yet, you can also click Create Lookup Table
Provide a Name and optional Description for the lookup table
Drag a CSV file or click Browse to upload your reference data (one CSV file, up to 10 MB)
Review the preview of the uploaded rows
Click Save to store the lookup table
From the Lookup Tables card, you can:
Export the table's CSV
Edit the table's name, description, or CSV. Renaming a table also updates the formatters that reference it by its old name
Delete tables that are no longer needed. Delete is unavailable while an action, workflow, condition, transformer, or transformer function still references the table
To update an existing lookup table:
Create a new policy draft version.
Delete the CSV from the existing lookup table (do not delete the table itself).
Upload the updated CSV.
Publish the draft.
To use a Table Lookup Transformer in a common or action-synced attribute:
In Destination Attribute, choose the attribute on the target entity that will be updated
In Formatter, choose the source attribute to transform
In Then Apply, enter the lookup function: the lookup table name, the column to match against, the column containing values to return, and (optionally) a default value to return when no match is found.
Then Apply holds the function chain on its own, with no braces and starting with a pipe, for example | LOOKUP, "locationTable", "location_code", "city". Veza applies it to the value that Formatter produces.
The equivalent complete expression, used wherever a single field carries both the source value and its transformations, is:
Where:
<value> is the source attribute to transform (for example, location)
<table_name> is the name (or ID) of the lookup table to use
<column_name> is the column in the table to match against
<return_column_name> is the column containing the value to return
<default_value> is an optional value to return when no matching row is found. Omit it to make the transformation fail when there is no match. See .
Separate the function name from its parameters with a comma, and enclose each parameter in double quotes, as shown above. Veza matches the table name and both column names exactly, including case.
Assuming a user has "location": "CA001" and a lookup table named locationTable structured as shown earlier:
{location | LOOKUP, "locationTable", "location_code", "city"}
"Los Angeles"
{location | LOOKUP, "locationTable", "location_code", "state"}
"California"
{location | LOOKUP, "locationTable", "location_code", "state_code"}
"CA"
You can combine lookup transformations with other transformation functions in a pipeline:
This would look up the state_code corresponding to the location value and convert it to lowercase.
By default, when a source value is not found in the lookup table, the transformation fails for that attribute. To return a fallback value instead of failing, supply an optional fourth parameter that sets a default value:
When the source value is not found in the table, the transformer returns the default value (Unknown location in this example) instead of failing. To return an empty string on a miss, pass an empty default ("").
The default value applies only when the lookup runs but finds no matching row. It does not cover configuration errors: if the lookup table, the match column, or the return column cannot be found, the transformation still fails, even when a default value is provided.
For full coverage, ensure your lookup table includes entries for all possible source values that may be encountered during provisioning, or supply a default value to handle unmatched inputs.
To ensure robust provisioning workflows, include all expected values in your lookup table, validate source data before implementing lookup transformations, and test transformations with representative data sets.
Lookup tables are immutable and automatically deleted when no longer referenced by any policy version
Multiple policy versions can reference the same lookup table (for example, an active version and a draft version)
Lookup tables are defined at the policy level and can be referenced by any transformer within the policy
Lookup tables can have multiple columns to support different transformations from the same reference data
Standardize Naming: A lookup-based transformer references the table by the Name you gave it when you created it (or by its table ID), not by the CSV file name. Apply consistent conventions for both the table and columns.
Document Mappings: Add descriptions for each lookup table to explain its purpose
Validate Data: Ensure lookup tables are complete and accurate before using them in transformers. Consider how lookup tables will be maintained over time, especially for values expected to change.
Value not found in lookup table
Add the missing mapping to the lookup table, or supply a default value as the fourth LOOKUP parameter
Incorrect column name referenced
Check the column names in your lookup table (they are case-sensitive). A default value does not cover this error
Lookup table name not found
Check that the name matches the table's Name exactly, including case, and that the table exists in the same policy version
Unexpected transformation results
Verify the lookup table content and ensure the correct columns are specified
location_code,state_code,state,city
MN001,MN,Minnesota,Minneapolis
CA001,CA,California,Los Angeles
TX001,TX,Texas,Houston
TX002,TX,Texas,Austin{<value> | LOOKUP, "<table_name>", "<column_name>", "<return_column_name>", "<default_value>"}{location | LOOKUP, "locationTable", "location_code", "state_code" | LOWER}{location | LOOKUP, "locationTable", "location_code", "city", "Unknown location"}Consolidate multiple records for the same person in a single source of identity into a single authoritative record before policy workflows act on them.
A Duplicate Resolution Rule consolidates multiple records for the same person within a single source of identity into one authoritative record. The rule applies during workflow processing, so policy workflows act on a single resolved identity rather than once per duplicate.
The most common case is a contractor-to-employee conversion in a Human Resources Information System (HRIS), where the contractor record and the new employee record coexist until the contractor record is closed.
Configure a rule in the Veza UI, where it appears as Duplicate identity resolution in a policy's identity source settings, or through the policy update API. Both write the same fields.
Use a Duplicate Resolution Rule when one source of identity can produce more than one record for the same person, and a policy should act on only one of them:
Contractor-to-employee conversion: an HRIS keeps the open contractor record while creating a new employee record for the same person.
System-generated duplicates: a source of identity emits a placeholder record alongside the real one during onboarding.
Merged data sources: a CSV upload or custom OAA connector merges feeds that share individuals.
A rule resolves duplicates within one source of identity. Each source carries its own rule, and a rule never matches a person across two sources. Cross-source correlation is handled by the policy's primary and secondary source configuration. See .
For each extraction of the source of identity:
Veza groups identities that share the same values for all of the configured deduplication key properties.
Veza applies the ranking rules to choose the authoritative record in each group. When no rule produces a single winner, the record with the lowest entity ID is kept. Entity IDs are compared as text, not as numbers, so 10 sorts before 9.
Veza hard-deletes the other records in the group before workflows evaluate the resulting identity. No soft-deleted record remains, so a dropped duplicate cannot be restored through the Lifecycle Management rehire flow.
Veza skips any group larger than the configured max_duplicate_group_size. Every record in a skipped group passes through unresolved, and workflows run for each one. A large group usually means that a deduplication key property is not unique to one person.
Clearing a rule does not restore the records it dropped. If the source still emits them, they return on the next extraction as new identities, and no downstream state from the original records is carried over.
Duplicate resolution produces few visible signals:
No deletion event is emitted for a dropped record. An Identity No Longer in Sources notification does not fire for records dropped by a rule.
The kept record is marked. Veza sets the system attribute sys_attr__has_duplicates to true on the surviving identity. This attribute is excluded from change detection, so setting it does not trigger a workflow.
Counts are recorded internally. Veza records backend metrics, including lcm.duplicate_identities_resolved_total
Available in Veza v2026.5.25 and later.
A permission set that allows updating Lifecycle Management, such as an administrator role.
A policy with a source of identity selected. The controls stay disabled until a source is chosen, because the property list comes from that source's entity type.
At least one completed extraction of that source, so that its properties are available.
Open Lifecycle Management and select a policy.
Click Policy Settings.
Open the step for the source of identity:
For the primary source, open the Primary Identity Source step.
The policy creation wizard includes both steps, so a rule can also be configured when a policy is created.
The Duplicate identity resolution dialog contains three settings:
In Match on these properties, select the properties whose combined values identify one person. Records that share the same values for all selected properties are duplicates. The list contains the properties Veza discovered for the source's entity type; internal sys_attr_ properties are not selectable.
In Maximum group size, set the largest group that Veza resolves. The field appears after at least one match property is selected, with a default of 3 and a range of 2 to 20. Veza resolves no records in a group that exceeds the limit.
Under Ranking Rules, click Add ranking rule
Ranking rules are evaluated in order. The first rule that produces a single winner decides the outcome. A rule that leaves a tie, or matches no records, passes the group to the next rule. Use the arrows beside a rule to reorder it, and the delete icon to remove it.
For example, to keep the most recently hired active record, and the most recently updated record when none is active:
Rule #1: filter is_active eq true, sort by hire_date, Descending selected.
Rule #2: sort by last_updated, Descending selected.
Click Save in the dialog. This stores the rule in the settings form but does not apply it.
Click Save on the Policy Settings page.
The rule takes effect on the next extraction of that source of identity. See .
The Duplicate identity resolution section summarizes a configured rule: its match properties, maximum group size, and a numbered table of ranking rules. With no ranking rules, the summary reads "None — record with the smallest entity ID is kept."
Click Edit to change the rule, or Remove to clear it. Remove does not ask for confirmation.
The rule is stored on the policy, not on a policy version:
primary_duplicate_resolution_rule on the Policy, for the primary source of identity.
duplicate_resolution_rule on each entry in secondary_source_of_identities, for secondary sources.
Set both through the policy update endpoint, with the policy object as the request body:
Validation rejects a rule that sets ranking_rules or max_duplicate_group_size without dedup_key_properties.
Matching on dedup_key_properties is exact and type-aware:
Strings are compared byte for byte, so case and whitespace are significant.
Values of different types do not match: the string "1" and the number 1 are different.
Element order in lists and structs is significant: [1, 2] does not match [2, 1].
Sorting by order_by is case-insensitive. Two sort values that differ only in case are a tie, which passes to the next ranking rule.
Validation trims whitespace around a scim_filter before parsing it, but the rule does not trim it at run time. A padded filter can therefore pass validation and then fail to parse during an extraction. An unparseable filter matches every candidate, which makes that ranking rule ineffective without failing the run. Send filters without leading or trailing whitespace. The Veza UI trims filters on save.
A candidate against which the filter cannot be evaluated is scored as not matching, so it can lose its group and be deleted.
: policy endpoints, including the update endpoint above. updates a policy version and does not carry these fields.
: policy structure and lifecycle.
: identity behavior, including reconciliation of primary and secondary sources of identity.
Group identities that share an email. Prefer records where is_active is true, then the most recently hired.
Group identities that share an employee_id. Prefer active records, then employees over contractors, then the most recently hired.
Group identities that share both employee_id and country, with the default ranking.
Send an empty object:
An empty object is the only way to clear a rule. When a request omits the rule or sends null, the API keeps the rule already stored on the policy, because the Policy Settings page does not include the rule in every request it sends.
Safely preview policy changes and validate workflow logic before enabling policies in production
This guide explains how to use dry run simulations to test Provisioning Policies before enabling them in production. Dry run evaluates workflow logic and shows what actions would occur without making actual changes to target systems.
Use dry run testing to:
Validate that workflow trigger conditions match the intended identities
Preview what provisioning or deprovisioning actions would occur
Test policy changes safely before deployment
Troubleshoot when workflows are not triggering as expected
Before testing with dry run:
Create or edit a Provisioning Policy with at least one workflow
Ensure your source of identity contains test identities or representative data
Use single-identity dry run to test how a specific identity would be processed by a policy.
Go to Lifecycle Management > Provisioning > Policies.
Select a policy, then open a version from the Policy Versions panel.
Click Dry Run and select Single Dry Run. Alternatively, on the Provisioning Policies list, open the policy row's ⋮ menu and select Single Dry Run.
Go to Lifecycle Management > Identities.
Search for an identity and click to view its details.
Click the ⋮ menu and select Policy Dry Run.
Select a policy and optionally customize attributes.
You can also select Policy Dry Run from an identity's ⋮ menu in the Identities table.
Use bulk dry run to test a policy against multiple identities at once. You can test against all identities or filter to a specific subset.
Go to Lifecycle Management > Provisioning > Policies.
Select a policy, then open a version from the Policy Versions panel. Open the Dry Run menu and select Bulk Dry Run. Alternatively, on the Provisioning Policies list, open the policy row's ⋮ menu and select Bulk Dry Run.
Choose your identity selection method:
Only one bulk dry run can run for a policy at a time. To follow its progress, see .
A single-identity dry run shows what would happen if the policy ran for the selected identity.
The Workflows Run section shows which workflows triggered for the identity and why. If no workflows matched, verify that the identity's attributes meet the workflow trigger conditions.
The Actions Run section lists all actions that would run, including:
User accounts that would be created or updated
Attributes that would be synced
Access profiles that would be assigned or removed
Relationships (group memberships) that would be added or removed
Click View Details on any action to see its full configuration, including sync attributes, relationship mappings, REST payload contents, and password rules.
When a dry run returns "0 changes", the selected identity does not meet any trigger conditions in the policy's workflows. This is not an error; it means the identity would not be processed by this policy.
To filter and export bulk dry run results, review previous bulk dry runs, and check how long Veza keeps results, see .
Disabled workflows are evaluated by default during dry run simulations. This means you can test workflow logic before enabling it in production. The dry run results show what actions would run if the workflow were enabled.
To learn how to disable workflows, see .
Dry run has several important limitations:
Dry runs validate trigger and condition matching but do not evaluate:
The Only the first time the identity matches workflow setting (the setting that prevents re-triggering for identities that already matched)
Property change detection (for sync workflows)
Scheduled triggers
"Skip if action has already been run" action flags
These behaviors only execute in live policy runs. Test these scenarios with individual identities in a controlled environment before full deployment.
No integration testing: Dry run does not check whether integrations are functioning properly or whether target systems are accessible. A broken integration might cause workflow-defined changes not to be applied when the policy runs.
No action validation: Dry run evaluates whether workflow conditions are met, not whether actions would succeed. It does not validate that changes could be successfully applied.
Simulation only: Dry run identifies actions that would execute but does not perform them.
Test with representative identities: Select identities that represent different scenarios (new hires, role changes, terminations) to validate all workflows in your policy.
Simulate attribute changes: Modify identity attributes during dry run to test trigger conditions such as department changes, employment status updates, or location transfers.
Test edge cases: Use dry run to test unusual scenarios that might not occur frequently, such as same-day rehire after termination or simultaneous department and location changes.
Before publishing a policy version:
Automatically determine who should approve an access request based on runtime context, access profile metadata, and lookup tables.
Dynamic Approvers is an Access Requests feature that lets Veza automatically determine who should approve an access request based on runtime context, access profile metadata, and external data.
Instead of assigning static approvers in a policy, you will configure a transformer pipeline that processes request attributes, access profile properties, and lookup tables to compute approver email addresses when the request is submitted.
Use Dynamic Approvers when approval routing will depend on metadata that can vary per request. For example, this can enable workflows in which Access Profiles assigned a specific cost center are routed to the appropriate approver group, or to assign managers based on department code.
When an access request is submitted, Veza evaluates any policy steps configured with a Dynamic Approver:
Veza considers the name of the Access Profile or Catalog Definition being requested, and any custom properties set on that profile.
Each transformer function in the Dynamic Approver pipeline runs in sequence, processing the available attributes to produce an intermediate or final output.
The final transformer function must output one or more approver email addresses.
Veza assigns those email addresses as approvers for that policy step.
The following attributes are available as inputs to transformer expressions:
Custom property attributes (access_profile_properties.* and catalog_definition_properties.*) are populated from the custom attribute definitions configured in . The attribute names available in the transformer editor reflect the definitions currently configured in your tenant.
Transformer expressions use the same syntax as Lifecycle Management : {attribute} for a direct reference, or {attribute | FUNCTION, arguments} to apply a function.
The most common function for Dynamic Approvers is LOOKUP, which resolves a value by looking it up in a . Lookup tables are CSV-based reference tables that map values between systems — for example, mapping department codes to approver email addresses. They are uploaded and managed within Provisioning Policy configurations.
The LOOKUP syntax is: {value | LOOKUP, "table_name", "match_column", "return_column"}
For example:
This takes the department custom property value from the Access Profile, looks it up in the dept_approvers lookup table by matching the dept_code column, and returns the corresponding approver_email value. See for details on creating and managing lookup tables.
You can chain multiple transformer functions. Use {last_output} in a subsequent step to reference the output of the previous step.
Go to Lifecycle Management > Access Requests > Settings.
Select the Access Request Settings tab.
Scroll to the Dynamic Approvers section and click Create Approver.
Enter a Name and optional Description.
This example resolves a department code to approver usernames via a lookup table, then appends a domain to produce email addresses.
Step 1 — Look up approver usernames from department code
Output Type: String List
Step 2 — Convert usernames to email addresses
Output Type: String
Before linking a Dynamic Approver to a policy, use the built-in test configuration to verify it resolves to the expected approver emails.
In the Create or Edit Dynamic Approver dialog, scroll to Test Configuration.
Under Test Source, select Access Profile or Catalog Definition, then choose a specific record to test with.
Optionally, add Policy Properties — key-value pairs that simulate additional request context during testing.
Click
If the test returns no results or an unexpected value, check that the referenced lookup table is populated, the custom property values are set on the selected profile, and the attribute names match your definitions.
Once a Dynamic Approver is configured, link it to an approval step in an Access Request Policy:
Go to Lifecycle Management > Access Requests > Policies.
Create or edit a policy.
Under Approver Settings, add or edit an approval step.
Set the step category to Dynamic.
When an access request matches this policy, Veza runs the selected Dynamic Approver pipeline at request time to determine the approver(s) for that step.
Shared transformation rules across multiple Provision Account actions
Action Attribute Mappings
Create, format, and modify the specified target attributes. See Transformers for more details
Action Unique Identifier
The attribute Veza uses to locate an existing user when syncing. Defaults to the integration's primary identifier (for SCIM integrations, userName)
Enforce password change on login
Force newly created users to change their password at first login. Availability varies by target system — see Enforce password change on login.
ServiceNow
✅
— (no Reset Password action)

Optionally, modify identity attributes to simulate changes (such as a department transfer or status change).
Click Show Results.
Click Show Results.
Select All: Test against every identity in the policy
Select Identities individually: Choose specific identities from a searchable list
Select Identities based on properties: Enter a SCIM filter expression to target identities by attribute values (for example, department eq "Engineering" or is_active eq true). Select Show matching identities to open the matches in a new tab. After you enter a filter, the button shows how many identities match.
Click Perform Dry Run.
Policy workflows process the authoritative record.
The Identities page changes only after the next extraction. Until the source of identity is extracted again, the page still lists the records that the rule will drop.
For an additional source, open the Additional Identity Sources step. The section is at the bottom of that source's card, below the enrichment options.
Locate the Duplicate identity resolution section. If no rule exists, it reads "Not configured. Workflows treat every record as a distinct identity."
Click Add Resolution.
Filter: a SCIM filter expression, such as is_active eq true. Records that match rank above records that do not. The filter evaluates only the candidate record, so it cannot reference related entities.
Sort: a property to sort by, such as hire_date. Select Descending to prefer the highest value.
Save stays disabled until every rule sets a filter or a sort property.
A record that lacks a key property, or holds a null value for it, is not grouped and passes through unchanged.
dedup_key_properties
array of strings
Property names whose combined values identify a person. All properties must match for two records to be duplicates; list order does not matter. Names are matched exactly against the record's own properties, so nested or dotted paths are not supported. Reserved sys_attr_ names, empty or whitespace-only names, and duplicate entries are rejected.
ranking_rules
array of RankingRule
Ordered rules for choosing the authoritative record. Each rule applies to ties left by the previous one. If empty, the lowest entity ID wins.
max_duplicate_group_size
integer
Largest group that Veza resolves. Range: 2-20. Send 0 or omit the field to use the default of 3. Out-of-range values are clamped when the rule runs. Larger groups pass through unresolved.
scim_filter
string
SCIM filter expression. Matching candidates rank above those that do not. The filter sees only the candidate identity, not related entities.
order_by
string
Property to sort by within the scim_filter match group, or the primary sort when scim_filter is empty. Supports strings, numbers, booleans, and lists of strings. Matched by exact name; nested or dotted paths are not supported.
descending
bool
If true, order_by sorts in descending order.
String
Custom property value set on the Access Profile
catalog_definition_properties.<name>
String
Custom property value set on the Catalog Definition
Under Transformer Functions, click Add Transformer Function to add one or more steps:
Enter a formatter expression using the available attributes.
Set the Output Type:
String — the step produces a single value (e.g., one email address or an intermediate string).
String List — the step produces a comma-separated list of values (e.g., multiple email addresses from a LOOKUP that returns multiple rows).
Click Create to save.
Under Dynamic Approver Settings, select the Dynamic Approver pipeline to use.
Optionally, configure any users or groups that should always be assigned alongside the dynamic approver.
Save the policy.
access_profile_name
String
Name of the Access Profile being requested
catalog_definition_name
String
Name of the Catalog Definition being requested
last_output
String
Output from the previous transformer function
access_profile_properties.<name>
PUT /api/private/lifecycle_management/policies/{policy_id}
PATCH /api/private/lifecycle_management/policies/{policy_id}{
"primary_duplicate_resolution_rule": {
"dedup_key_properties": ["email"],
"ranking_rules": [
{ "scim_filter": "is_active eq true" },
{ "order_by": "hire_date", "descending": true }
],
"max_duplicate_group_size": 3
}
}{
"primary_duplicate_resolution_rule": {
"dedup_key_properties": ["employee_id"],
"ranking_rules": [
{ "scim_filter": "is_active eq true" },
{ "scim_filter": "worker_type eq \"Employee\"" },
{ "order_by": "hire_date", "descending": true }
],
"max_duplicate_group_size": 3
}
}{
"primary_duplicate_resolution_rule": {
"dedup_key_properties": ["employee_id", "country"],
"ranking_rules": [],
"max_duplicate_group_size": 3
}
}{
"primary_duplicate_resolution_rule": {}
}{access_profile_properties.department | LOOKUP, "dept_approvers", "dept_code", "approver_email"}{access_profile_properties.department | LOOKUP, "dept_approvers", "dept_code", "approver_usernames"}{last_output}@company.comMap application entitlements to user populations based on common roles, functions, levels, or locations in the organization.
Access Profiles govern how application entitlements are assigned to employees across your organization. These profiles define how birthright access should be granted based on segmentation criteria, such as business role, job function, seniority level, location, or group membership. Access Profiles are used by the Manage Entitlements action to assign users to specific groups, roles, permission sets, or other access-granting entities when specific conditions are met.
Profiles can be configured hierarchically to create a fine-grained model for assigning access to different employee groups. Administrators can position child profiles beneath a parent profile, with each child profile inheriting the parent profile's entitlements.
For instance, a parent profile might be "Sales" (defining all the application entitlements that an individual belonging to the Sales organization should be granted), with child Profiles for "Account Executive," "Sales Engineering," "Sales Operations," and "Inside Sales." Each child Profile will have additional application entitlements specific to those roles. With these profiles configured, a workflow in policy for sales engineers can use just the "Sales Engineering" Profile, which includes the access defined by the "Sales" profile.
Since workflows in Provisioning Policies can apply these Profiles at all stages in a user's lifecycle, defining Profiles enables Veza to serve as a source of truth for birthright entitlements for all employees. Access Profiles also define what access-granting relationships to remove from users during de-provisioning workflows.
The access granted by a Profile can be defined by both:
Explicitly-defined, application-specific entitlements, such as roles, groups, permission sets, etc., within the Profile. A single Access Profile can support granting one or more entitlements across one or more applications simultaneously.
Any entitlements inherited from a parent Profile.
The example below shows Business Roles for teams, managers, and all employees, along with Profiles for different applications. When configuring workflow actions, administrators can choose from one or more Business Profiles to assign the entitlements granted by the child Profiles.
Veza offers two types of built-in Access Profile types for defining birthright entitlements by user segments:
Profiles are a type of Access Profile used to define access-granting relationships (such as user assignments to groups or roles) within the applications you will provision to users. Profiles are intended to represent a specific set of entitlements across one or more applications that should be granted based on a user's segmentation criteria.
Profiles should be configured in coordination with the application owner, who will best understand the exact permissions and privileges granted by various groups, roles, and other entitlements in each specific application.
Business roles are a type of Access Profile used to model your organization's structure, based on a hierarchy of job functions, locations, and titles. Ideally, by itself, a Business Role should not describe specific entitlements but can inherit relationships from other Profiles. These will usually be named according to logical segments that should be assigned to different applications with different levels of access, such as "Sales," "QA Contractors," or "Engineering Managers."
Business Roles can inherit Profiles to enable a hierarchical approach to birthright access management. You should draft and review Access Profiles to create a map of user entitlements for each application (such as "GitHub Developers" or "Salesforce Administrators").
Create Business Roles that align with your organizational structure, especially considering location, business unit, and functional organization. Then, configure these Business Roles to inherit Profiles that describe the birthright entitlements granted to different user populations.
To create and manage Access Profiles, go to Access Profiles > Access Profiles.
Click Create.
In the Create Access Profile dialog, choose the Access Profile Type to create, then click Next:
Business Role: Business roles are intended to represent logical units within your organizational structure, and can inherit entitlements defined in other Access Profiles. Use Business Roles to establish segmentation criteria based on location, role, business unit, or functional organization.
After saving an Access Profile, you can view its details, edit it, or disable and re-enable it (Disable and Enable in its actions menu) on the Access Profiles > Access Profiles page.
When configuring a policy to include the Manage Entitlements action, you can select any active profile for the target data source. You can also use Dynamic Access Profiles to resolve Access Profile names at runtime based on user attributes. See for details.
Reapply Now recomputes which identities currently qualify for an Access Profile and immediately queues grant jobs for the profile's entitlements. It does not wait for the next scheduled reapply.
Select Reapply Now in the profile's actions menu (⋮), on the Access Profiles > Access Profiles page or on the profile's details page, then select Reapply Now in the Reapply this access profile now? dialog. The option is not offered for the profiles listed on a profile's Inherited Profiles tab.
If Reapply Now is missing, check that:
The signed-in user has permission to update the Access Profile.
The profile's has Create a new entitlement if none exists enabled.
The user who created the profile was matched to a Lifecycle Management identity when they created it. Veza matches users to identities with User to Identity Matching in Lifecycle Management > Settings > Identity Settings. See . A profile created by a user with no matching identity does not offer Reapply Now.
Access Profiles can have designated owners who are responsible for managing and maintaining the profile. Owners have elevated permissions to configure the profile, manage its lifecycle, and create additional profiles.
Both Veza Users and Veza Groups can be assigned as Access Profile owners:
Individual Users: Any Veza platform user with the appropriate permissions
Veza Groups: Both Customer Managed groups (created in Veza) and SCIM Managed groups (provisioned from identity providers). See for details on group types and management
To be eligible as an Access Profile owner, a user or group must hold the Creator permission set for Access Profiles. This is a single tenant-wide grant that is not scoped to an individual Access Profile Type. Users can also qualify through membership in a group that holds the grant.
Grant Creator permission: An Administrator on the root team assigns the Creator permission set on the Permissions step of the Access Profile Settings page (Access Profiles > Access Profiles > Settings). See for the procedure.
Assign as Owner: When a user or group holds Creator permission, you can designate them as owners of individual Access Profiles. Users and groups without the grant do not appear in the Manage Owners dialog.
When a user or group is designated as an Access Profile owner, they automatically receive three distinct permissions:
Owner permission on the specific Access Profile
Read: View the profile's configuration, entitlements, and metadata
Update: Modify the profile's settings, labels, descriptions, and assigned relationships
Create: Perform create operations within the profile context
These permissions allow owners to manage their assigned profiles and to create profiles of any type they can see.
Access Profile owners are managed through the Access Profiles interface:
Navigate to Access Profiles > Access Profiles.
Locate the Access Profile in the list.
Click the Actions button (⋮) for that profile.
Select Manage Owners from the dropdown menu.
Custom Attributes are admin-defined metadata fields that can be set on individual Access Profiles. You can use them to tag profiles with organizational context such as cost center, team, compliance classification, or region.
These custom property values are available as parameters during dynamic approval rule evaluation, and support Access Requests approval routing driven by profile metadata. For example, this can enable tagging Access Profiles with a specific cost center and routing them to the appropriate approver group. See for configuration details.
Before custom properties can be set on individual profiles, an administrator must define the allowed attributes:
Navigate to Access Profiles > Access Profiles.
Click Settings in the page header.
In the settings sidebar, select Custom Attribute Definitions.
Add one or more attribute definitions. For each attribute, specify:
Custom attribute schemas are applied across all Access Profiles in the tenant. Definitions cannot be set on individual profile types. Catalog Definitions share the same list: Settings > Custom Attribute Definitions on the Catalog Definitions page edits these definitions too.
Once schemas are defined, a Custom Properties section appears when creating or editing any Access Profile:
In the Access Profile create or edit form, scroll to the Custom Properties section.
Click Add Custom Property.
In the dialog, select the Property (attribute name) and enter or select an Attribute Value.
If the attribute definition includes predefined values, the value field is a dropdown.
To edit custom properties for an existing profile, select it from the Profiles list to view details. In the header, locate the Custom Properties section and click to add or remove properties.
Custom property values are validated against the current definitions. Property names must match a defined attribute, and values must come from the predefined list when one is configured.
Custom property values are included in the API response when retrieving or listing Access Profiles via the custom_properties field (private API).
Understanding the Lifecycle Management Activity page for tracking provisioning and access request operations
The Activity page (named Provisioning Activity before Veza v2026.11.2) provides visibility into all provisioning operations performed by Veza's Lifecycle Management system, including the operations that access requests run. It serves as a record of all activities, including successful actions, errors, and failures. To open it, go to Lifecycle Management > Activity.
A Provisioning Policy defines automated workflows that execute when changes occur in a source of identity. The Activity page tracks all aspects of these operations through a hierarchical structure:
Policies define the overall automation framework for managing identities
Workflows determine which actions should be executed for specific identities
Actions represent specific operations to be performed on target systems
Jobs are individual tasks executed as part of actions
Events record atomic changes resulting from successful jobs
The Activity page provides four views of this activity across different tabs: Workflow Tasks, Workflow Actions, Integration Jobs, and Events.
When the page opens, a Workflow Tasks stats card shows live totals of Scheduled, Waiting, and Running tasks, followed by Finished and Errored counts under Last 24 Hrs. Use this card to get an at-a-glance health check without applying any filters. Scheduled and Waiting counts show how much work is pending, and Running shows what is actively executing.
Each tab can help track recent actions, verify that expected changes have occurred, identify patterns or issues in lifecycle events, and monitor the overall health of your Lifecycle Management implementation.
The Events tab shows individual changes made to entities and relationships within the system. Each event represents an atomic change resulting from a successful action.
The Integration Jobs tab displays individual jobs executed as part of actions. Jobs represent specific tasks performed on target systems, such as creating a user account or updating attributes. Use this tab to review whether individual jobs executed successfully or encountered an error and could not be completed.
runs started from NHI Security also appear on this tab and the Events tab. They have no associated identity, so only users with the Administrator or Operator role can see them.
The Workflow Actions tab shows high-level operations triggered by workflows. Actions typically involve one or more jobs that work together to accomplish a specific goal.
See for more details on supported actions and configuration options.
The Workflow Tasks tab displays workflows executed for specific identities. Workflows represent a sequence of actions executed as part of a Lifecycle Management .
For each identity, Lifecycle Management follows this process:
Validation: The system validates the identity against workflow trigger conditions
Execution Determination: The system determines whether execution is needed based on:
Identity state (e.g., CREATED, CHANGED, UNCHANGED)
The workflow's Only the first time the identity matches setting
The Activity page provides filtering and search options to help locate particular events:
Filter by recent extraction: Use the Recent Extractions filter to select one of the five most recent extraction events (shown with provider logo, relative timestamp, and policy name). Selecting an extraction scopes the Workflow Tasks table to that run in a single click, without manually entering a time range.
Filter by time period: Use the date range filters to focus on a date range
Search by identity or entity: Use the search fields to find activities related to unique identities or entities
Filter by event type or state
What happened in the last extraction? Open the Recent Extractions filter and click the relevant extraction to scope Workflow Tasks to that run instantly.
Is provisioning running now? Check the Workflow Tasks stats card at the top of the page. The Scheduled, Waiting, and Running totals update live without any filtering.
Troubleshoot a failed action: Go to the Integration Jobs tab, filter by State = Errored, and open the failed job. Switch to the Workflow Actions tab for context on the broader operation that spawned the failing jobs. To have Access AI explain the failure, see .
Veza maintains all Lifecycle Management activity logs for audit purposes. These logs are retained even if the associated integration is removed, maintaining a full historical record of all provisioning operations.
Note: Events shown on the Activity page are distinct from the system-wide Event Logs found in the Veza Administration section.
Review the Activity page after extractions complete to verify expected workflow execution. For large policies, trigger evaluation and workflow execution can take several minutes to complete. Allow time for processing before reviewing activity.
For advanced monitoring requirements, you can build custom dashboards using Veza's query and dashboard features to track Provisioning Policy health metrics. Contact Veza Support for guidance on building LCM-specific monitoring dashboards for your deployment.
Understanding and configuring different types of Access Profiles for Lifecycle Management and Access Requests
Access Profile Types determine the behavior of for Veza Lifecycle Management and Veza Access Requests. They define common characteristics such as:
Whether the profile can inherit entitlements from other profiles
If the profile can grant entitlements in one or more target applications
The maximum number of entitlements the profile can grant
Details: Enter the Access Profile Name and Description. You should follow a standard naming convention for all profiles to help identify them, describing the employee segment or applications the Access Profile applies to.
Labels: Labels are available for quickly finding access profiles when configuring actions in a policy. Apply and create labels as needed to organize your Access Profiles by employee segment and the applications they apply to.
Entitlements: Select one of the two cards:
Get Suggested Entitlements: Access Profile Intelligence suggests entitlements based on identities that you choose. See Getting suggested entitlements.
Assign Entitlements Manually: Choose the target data source and the specific entities that the profile governs access to (such as Google Cloud Platform > Google Group).
This step is not available for Access Profiles with the "Business Role" type.
Access Profile Inheritance: Click Assign Inherited Access Profiles to pick one or more Access Profiles to grant those business roles or entitlements. This step is not available for Access Profiles of type "Profile".
Click Save.
The profile is enabled.
Delete: Remove the Access Profile
Enables full control over the profile's configuration and lifecycle (disable and enable)
Creator permission for all Access Profiles (tenant-wide), granted directly to the owner
Owner eligibility already requires Creator permission, so this grant adds a capability only for a user who qualified through group membership. That user keeps the direct grant after leaving the group (see the warning below).
Viewer permission on the Access Profile Type
Read: View details about the profile type configuration and requirements
Scoped to the specific Profile Type of the owned profile
In the Manage Owners dialog:
Use the Type dropdown to select USER or GROUP.
Use the Name dropdown to select the specific user or group to add as an owner.
View and manage existing owners in the list below.
Click Done to save changes.
Name — the attribute key used to identify the property on profiles.
Type — currently String is the only supported type.
Available Values (optional) — a predefined list of allowed values. When set, the value field becomes a dropdown selector when editing a profile. To add a value, type it in Add new available values and press Enter or click Add. Pasting a list with one value per line adds every value at once. Veza skips duplicates. Use the Search values… box to find a value in a long list, and the remove button on a value's row to delete it.
Save the settings.
If no predefined values are set, the field accepts free text.
Save the profile.
Manage Access Profile Creation Permissions - Delegate Access Profile creation to specific users and groups
Executive Employees
Active Directory
Executive Employee - Manager US (Active Directory Group)
US Engineering Managers
Active Directory
Engineering - Manager US (Active Directory Group)
Azure Helpdesk Role
Azure
Helpdesk Administrator (Azure AD Role)
Google Asia Employees
Google Cloud
Google Asia Employees (Google Group)

Entitlement Entity
The entitlement entity involved, if applicable
Started At
When the job started
Completed At
When the job completed
Duration
How long the job ran
Identity
The identity associated with the job
State
The current state of the job (Completed, Errored)
Any Changes
Whether the job resulted in changes to the system
Provisioning Policy
The policy that ran the job (hidden by default)
Completed At
When the action completed
Duration
How long the action ran
State
The current state of the action (Completed, Errored)
Jobs Started
Number of jobs initiated by this action
Any Changes
Whether the action resulted in changes to the system
Provisioning Policy
The policy that ran the action (hidden by default)
Started At
When the workflow started
Completed At
When the workflow completed
Duration
How long the workflow ran
State
The current state of the workflow (Completed, Errored). An error icon next to the name and state marks a task that is Completed with errors: an action or condition failed, and the workflow continued as configured
Provisioning Policy
The policy the workflow belongs to (hidden by default)
Started Manually
Whether the workflow was started manually (Yes) or by an automatic policy evaluation (No)
Last execution time (for unchanged identities)
Task Creation: If execution is needed, a workflow task is created
Action Execution: The system executes conditions and actions via the task runner
Result Storage: The result is stored as an event on the Activity page
Filter by Started Manually: In the Workflow Tasks tab, use the Started Manually filter to show only manually started workflows or only automatically started ones
Filter by source: Available starting with Veza v2026.11.2. On the Events and Integration Jobs tabs, set Source to Access Request for the activity of access requests, or to Workflow for all other activity, such as policy workflows and actions run from an integration. Veza shows the filter when the tenant can have access request activity.
Find tasks completed with errors: Available starting with Veza v2026.11.2. In the Workflow Tasks tab, set Completed With Errors to Yes to list tasks where an action or condition failed and the workflow continued, for example because Continue if this action fails is set on the action. The task details show a Completed with errors banner.
View error messages: Click the link in a row's first column to open its details panel, which shows the full error message
Export activity for compliance: On the Events tab, use the export button to download a CSV or PDF. Activity logs are retained indefinitely, even if the associated integration is later removed.
Event Type
The type of event that occurred (for example, Remove Entitlement, Add Entitlement, or Update Account)
Timestamp
When the event occurred
Success
Whether the event completed successfully (True/False)
Identity
The identity associated with the event
Account / Group
The account or group affected by the event (hidden by default)
Parent
The name of the action or access request that initiated the job
Parent Type
Whether the job came from a Workflow Action or an Access Request
Integration
The target integration
Job Type
The type of action (e.g., Provision Account, Manage Entitlements)
Workflow
Name
The name of the action
Action Type
The type of action (e.g., Provision Account, Manage Entitlements)
Workflow
The workflow that ran the action
Identity
The identity associated with the action
Started At
Name
The name of the workflow
Identity
The identity for which the workflow was executed
Entity Type
The type of entity processed by the workflow (hidden by default)
Created At
When the workflow task was created (hidden by default)
Scheduled For
The workflow that ran the action, if applicable
When the action started
When the workflow was scheduled to run, if applicable
The specific integrations where entitlements can be granted
Veza provides built-in profile types, such as Profiles and Business Roles, for hierarchical management of birthright entitlements by employee population. You can also create new profile types to meet your organization's Access Requests and Lifecycle Management needs.
Access Profiles define collections of entitlements within one or more target applications that can be assigned to an identity. Depending on the profile type, an access profile can include certain groups or roles, or inherit entitlements from another profile.
For example, you can create different types to organize profiles by:
Applications: Granting access to an application without specific entitlements, such as access to Zoom, a video conference platform
Single Entitlements: Defining a single entitlement within a single application, such as a user being added to the DNS Admin group in Active Directory or the Domain Name Administrator role in Entra ID
Application Entitlements: Defining multiple entitlements within a single application, such as access to several Okta Groups
Multi-Application Entitlements: Defining multiple entitlements across different applications, such as for site reliability engineers who need access to GitHub, AWS, Jira, and Snowflake, along with one or more roles and group memberships within each of those applications
Business Roles: Inheriting combinations of other profile types to model sophisticated access privileges, such as all US Call Center employees inheriting US Employee access
Use Access Profile Types to set rules for all profiles using that type. You can create new profile types to implement Lifecycle Management and Access Requests based on the access you grant to employees and the conditions under which it is granted.
You have the Administrator role.
Enable Multiple Access Profile Types is active (see the note below).
Open Access Profiles > Access Profile Types.
Click New Access Profile Type.
In the sidebar, configure the new type:
Basic Information shown when creating Access Profiles:
Name: Display name for the profile type, shown when creating new Access Profiles.
Description: Extended description to document the purpose of the profile type.
Instructions: Optional custom instructions for using the profile type, shown when creating new profiles. This is useful if allowing self-service Access Profile creation.
On Create Behavior: Set the default policy state for Access Profiles created with this profile type:
Default: Uses Veza's default behavior (currently equivalent to State Disabled, but this may change in future releases).
State Disabled: The Access Profile is created but remains inactive until it is explicitly enabled.
State Enabled: The Access Profile starts active and is immediately functional with no additional action required.
Entitlement Sources:
Allow inheritance from other Access Profiles: When enabled, profiles with this type can use another access profile to specify the exact entitlements.
Allow direct entitlements: When enabled, you will specify the exact entitlements when creating a profile with this type. When disabled, profiles with this type can only inherit entitlements from another profile.
At least one of these two options must be enabled, unless Create account only is selected.
Access Request Policy: Choose the default Access Request Policy to apply access duration controls and approval workflow.
Allow overwrite of Access Request Policy: Enable selection of an alternative policy when Access Profile creators and owners create Access Profiles of this type.
Integrations: Choose if the Access Profile of this type supports multiple integrations, integrations of a single type, or a single instance of a single integration:
Allow multiple integration types: Profiles can have specific entitlements in more than one target integration type (such as one or more entitlements from any Active Directory or Okta integration).
Limit to a single integration type: Entitlements must be within integrations of a specific type (such as one or more entitlements from any Okta integration).
Limit to a single integration:
Entitlements: Set the maximum number of entitlements that can be added to profiles with this type (0 for unlimited entitlements).
Access Profile creators and owners can choose specific entitlements when editing the profile.
Create a new entitlement if none exists: Configure the CREATE_ENTITLEMENT action to run when the policy is applied, including:
The target integration and entity type to create.
Click Create Access Profile Type to save the changes.
After saving a profile type, you can edit or delete it on the Access Profiles > Access Profile Types page. A profile type cannot be deleted while Access Profiles are using it.
To control which users and groups can see and select a profile type, select Manage Permissions from the profile type's actions menu.
To view profiles with a specific type, choose a profile type and click Show Access Profiles. This button appears only for types that are in use.
The Manage Permissions option on a profile type controls visibility. Assigning a user or group in this dialog grants the Viewer permission set, scoped to that one profile type. This permission set is not related to the Veza Viewer role.
Viewer permission on a profile type is required for a user to:
See the profile type in the Access Profile Types list
Select the profile type when creating an Access Profile
Update existing Access Profiles of that type, or run a dry run on them
Profile types a user cannot see are omitted from these lists without an explanatory message.
Permissions assigned in the Manage Permissions dialog apply immediately when you select a user or group; there is no save step. The Remove button also applies immediately, without a confirmation prompt. If a group is assigned, all group members inherit the permission. See Veza Groups for details on group management.
Creating an Access Profile requires two separate grants: Viewer permission on the profile type, and the tenant-wide Creator permission set for Access Profiles. To create Access Profiles from Lifecycle Management, a user also needs the Operator role. Creator is granted on the Permissions step of the Access Profile Settings page (Access Profiles > Access Profiles > Settings) and is not scoped to a profile type. Without Creator permission, the Create button does not appear on the Access Profiles page, even for users who can see a profile type. See Grant Access Profile creation permissions.
Designating a user or group as the owner of an Access Profile automatically grants them Viewer permission on that profile's type, so an explicit assignment here is not required for owners. Removing a user or group as an owner does not revoke this Viewer permission.
When working with Access Profile Types, consider the following best practices:
Consistent Naming: Use clear, descriptive names for profile types that indicate their purpose and scope
Appropriate Granularity: Create profile types with the right level of granularity for your organization's needs
Documentation: Add thorough descriptions and instructions to help others understand when to use each profile type
Inheritance Planning: Carefully plan which profile types should inherit from others to create a logical hierarchy
Regular Review: Periodically review profile types to ensure they continue to meet your organization's needs
Good Hygiene: Eliminate profile types that are no longer in use (when the count of Access Profiles with that type equals zero)
The Provisioning Policy page summarizes a policy's most recent run and lists its versions. Each version page holds that version's workflows.
Selecting a Provisioning Policy opens the policy page, which summarizes the policy's most recent run and lists its versions. Workflows and workflow components belong to a version, so you view and edit them on that version's version page.
You can edit only the draft version. Published and retired versions open read-only. For how versions move between draft, published, and retired, see Policy Version and Policy Draft Mode.
Users without the Administrator role see both pages without the buttons that change the policy. Running a dry run requires the Administrator or Operator role. See Roles.
To open the policy page, go to Lifecycle Management > Provisioning > Policies and select a policy's row. The breadcrumb reads Provisioning Policies > policy name.
The header shows the policy name and, when one is set, its description. Below them, a summary bar shows:
Run Status: the policy's current run status. For the statuses, see .
Last published or Last modified: a policy with a published version shows Last published, with when and by whom. A policy with no published version shows Last modified, with when it was last changed.
Identity Sources: the policy's source of identity.
Additional Identity Sources: shown only when the policy has secondary sources of identity. Select Details to list them.
The header also has these buttons:
Two kinds of notice can appear above the header:
A safety limit alert, when a safety limit stopped processing. See .
A dry run banner, described in .
The Last Policy Run panel summarizes the policy's most recent run.
Before the first run, the panel reads No Policy Runs. A policy run starts when Veza receives an extraction from one of the policy's identity sources.
After a run, the panel shows:
The source of identity, with Started At (when Veza began processing the run) and Extracted At (when the source data was extracted).
Run time: how long the run took, or has taken so far.
The three , Analyze Identities, Evaluate Workflows, and Execute Workflows, each with its status.
A warning when a
Select View Details to open the full run details. See .
The Policy Versions panel lists the policy's draft version first, then its published version. Each version card shows:
Version number and a Draft or Published badge
The number of workflows in the version
Last Edited: when the version was last edited, and by whom
Select a card to open that version's .
Retired versions do not have cards. A single row with a Retired badge, such as Versions 1 - 3, summarizes them. To view or restore a retired version, use .
When a policy has more than one version, the panel also shows:
Version History: opens .
Compare Versions: compares two versions of the policy. See .
The panel's More Actions (⋮) menu has these items. Veza hides the menu when it has no items.
Discard Draft, when the policy has both a draft and a published version. Discarding deletes the draft and cannot be undone. In the Confirm Discard dialog, select Discard.
See Bulk Dry Run History: opens the Bulk Dry Run History page. See .
Version History opens a full-screen page titled policy name Version History. It lists every version of the policy, including retired versions. Select a version to view its configuration.
For the draft version, select Publish to publish it, or Discard Draft to delete it. Each asks for confirmation. Publish is unavailable until the draft differs from the published version.
For a retired version, select Restore as Draft Version, then select Restore in the Restore as Draft Version dialog. The retired version's configuration replaces any existing draft. Restore as Draft Version is unavailable when the retired version uses an access profile that has since been deleted.
When a bulk dry run of the policy completed in the last three days, a banner above the header shows when it completed. Select Show Dry Run Results to open its . While a newer bulk dry run is in progress, the banner reads Dry run in progress. Select Show Dry Runs to open the dry run history.
On the policy page, the banner covers dry runs of any version. On a version page, it covers only dry runs of that version.
To open a version page, select a version card in the Policy Versions panel. Veza also opens the draft's version page after you select Create Draft or Go to Draft Version.
The breadcrumb reads Provisioning Policies > policy name > Version number - state. The page title shows the version number with a Draft, Published, or Retired badge.
The version page header has these controls:
More Actions (⋮): shown only on the draft's version page when the policy has more than one version. It contains Discard Draft.
Dry Run: a menu with Single Dry Run, Bulk Dry Run, and See Bulk Dry Run History. See and .
A version button that depends on the version you are viewing:
Publishing does not start an extraction. See .
The Workflows tab lists the version's workflows as cards, with a count above the list. Select a card to display that workflow's conditions and actions. When are on, the workflow tree shows plain-English descriptions of trigger and condition strings.
To test a condition or formatter from this view, see .
On the draft version, select Create above the list to add a workflow. A version with no workflows reads No Workflows Created and shows a Create Workflow button instead. See .
Each workflow card has an unlabeled menu (⋮) with these options:
The Workflow Components tab lists the version's reusable components by category, with a count for each:
Select a category to display its components in a table. On the draft version, select + on a category to add a component to it. Properties has no + button. Edit properties from the category's table instead.
Readable conditions show a plain-English description of each trigger and condition string in the workflow tree.
When readable conditions are on, the description replaces the string in the tree, and an AI icon marks it. Hover over a description to see the expression it describes.
Trigger: one description covers the whole trigger, such as the identity sources that run the workflow, whether identity properties must have changed, and any schedule or grace period. Only the trigger-condition part is AI-generated, and the rest comes from the trigger settings.
Condition nodes: each condition string has its own description. A condition set to Always has none.
Selecting a node shows its description above the original expression in the details panel: under Run Workflow for a trigger, or under Run Condition for a condition node.
Descriptions update as the tree is edited, including unsaved changes. Veza generates a description the first time a tree that contains the string is opened, and saves it for other viewers of the policy. A new description can take a few seconds to appear. When Veza can't generate one, the node shows the original expression.
After Veza Support enables readable conditions, the setting is on by default and applies to every user in the tenant. Changing it requires the Administrator role on the root team. See .
Go to Lifecycle Management > Settings > AI Capabilities.
Turn Show readable conditions in the policy tree on or off.
Select Save.
When the setting is off, the tree shows the original expressions, and Veza stops generating descriptions.
Assigning Microsoft 365 licenses to users based on Workday attributes during the onboarding process
This guide explains how to automatically assign Microsoft 365 licenses to users as part of a Workday-triggered onboarding workflow. License assignment is a common requirement when provisioning new employees who need access to Microsoft productivity tools like Outlook, Teams, and SharePoint.
When a new employee is hired in Workday, you can configure Veza Lifecycle Management to:
Create a user account in Azure AD
Assign the appropriate Microsoft 365 licenses based on employee attributes (department, role, location)
Optionally enable email functionality
State Enabled by Admin: The Access Profile is created disabled and requires an administrator (not a regular user) to enable it.
Create account only (if limited to a single integration): Create an account without specific entitlements.
Any member conditions (ANY to apply to all identities, or restricted by a condition expression).
Attributes for the created entities using the specified formatters.
Turning on Reapply on a schedule (under Reapply Access Profile) to periodically recreate and reapply entitlements if removed within the target system.
CREATE_IDENTITY
Update Account
SYNC_IDENTITY
Disable Account
DISABLE_IDENTITY
Delete Account
DELETE_IDENTITY
Add Entitlement
ADD_RELATIONSHIP
Remove Entitlement
REMOVE_RELATIONSHIP
Create Group
CREATE_ENTITLEMENT
Rename Group
RENAME_ENTITLEMENT
Access Request Completed
ACCESS_REQUEST_COMPLETE
Extraction Processing Failed
EXTRACTION_EVENT_FAILED
Identity No Longer in Sources
IDENTITY_DELETED_FROM_SOURCES
Invalid Identity Summary
INVALID_IDENTITIES_DETECTED
Four counts: Identities Run, Tasks Created, Tasks Blocked, and Tasks Errored. When Tasks Blocked or Tasks Errored is above zero, select the count to open the Workflow Tasks tab of Activity, filtered to that run and task state.
Restore as Draft Version
Replaces the policy's draft with the retired version's configuration, after you confirm in the Confirm Restore as Draft Version dialog. Unavailable when the version uses an access profile that has since been deleted.
Published version of an enabled policy. Otherwise unavailable, with a tooltip that explains why. Before Veza v2026.11.2, a paused policy also qualifies
Runs the workflow for identities you select. See .
See Notes
The workflow has notes
Displays the workflow's notes.
Delete Workflow
Draft version only
Deletes the workflow after you confirm.
Actions
Entity Aliases
Create Draft
The policy has no draft version
Creates a draft version from the published version and opens the new draft's version page.
Policy Settings
Any policy
Opens the policy's settings. Changes there apply to every version of the policy. See Policy Settings.
Show Raw JSON
When the option is enabled for your tenant
Displays the complete policy configuration as JSON. See the LCM FAQ.
Published, and a draft exists
Go to Draft Version
Opens the draft's version page.
Published, and no draft exists
Create Draft
Creates a draft version from the published version and opens it.
Draft
Publish
Publishes the draft. The button is unavailable, with the tooltip Edits need to be made before publishing, until the draft differs from the published version.
Edit Workflow
Draft version only
Opens the workflow in the editor.
Workflow Settings
Draft version only
Opens the workflow's settings, including its execution guardrails. See Disable workflows and actions.
Clone Workflow
Draft version only
Opens a copy of the workflow in the editor.
Shared Attribute Mappings
Lookup Tables
Properties
Password Rules
Transformer Functions
Retired
Run Workflow Manually
This automation ensures consistent license assignment, reduces manual IT work, and helps control licensing costs by assigning only the licenses each employee needs.
The following diagram shows the license assignment flow:
Before starting this implementation, ensure you have:
Workday Integration: Configured Workday for Lifecycle Management as your source of identity
Azure AD Integration: Configured Azure AD for Lifecycle Management as a target system with the following permissions:
Directory.ReadWrite.All
Group.ReadWrite.All
GroupMember.ReadWrite.All
User.EnableDisableAccount.All
Completed Extractions: At least one successful extraction for each integration
Available Licenses: Sufficient Microsoft 365 licenses in your Azure AD tenant for the license SKUs you plan to assign
Administrative Access: Veza administrative access to create Provisioning Policies
Before configuring the workflow, map your organization's license requirements to Workday attributes:
Full-Time
Any
ENTERPRISEPACK
Microsoft 365 E3
Full-Time
Engineering
ENTERPRISEPREMIUM
Microsoft 365 E5
Create a policy using Workday as the source of identity:
Navigate to Lifecycle Management > Provisioning > Policies
Click Create Provisioning Policy
Configure the policy in the wizard:
Provisioning Policy Name: Workday Azure License Provisioning
Description: (Optional) Describe the policy purpose
Primary Identity Source: Select your Workday integration (the entity type is shown alongside the integration name)
Click Create to create the policy
Add a workflow that triggers when new employees are hired:
Edit your policy and click Create Workflow
Configure the workflow trigger:
Workflow Name: New Employee Onboarding
Condition: is_active eq true (optionally add AND hire_date ge "2024-01-01T00:00:00" to limit to employees hired after a specific date). The date format follows ISO 8601 (RFC 3339) syntax.
Only the first time the identity matches: Cleared (the workflow runs on every extraction where the identity matches, not only the first time it matches)
First, create the user in Azure AD:
In your workflow, click Add New Action
Select Provision Account
Configure the action:
Description: Create Azure AD user from Workday
Entity Type: Azure AD User
Integration: Your Azure AD integration
Create accounts: On (Veza creates users that don't already exist)
Update existing accounts: On (Veza keeps attributes in sync after creation)
Configure attribute mappings:
principal_name
{username}@yourdomain.com
Create and update
display_name
{first_name} {last_name}
Create and update
mail_nickname
{username}
Create and update
Before adding the license assignment action, create Access Profiles that contain the license entitlements:
Navigate to Access Profiles > Access Profiles
Click Create
Configure the profile:
Name: Microsoft 365 E3 License
Description: Standard Microsoft 365 E3 license assignment
Add an entitlement:
Integration: Your Azure AD integration
Entity Type: Azure AD License
Entitlement: Select "Microsoft 365 E3" (or your specific SKU)
Click Save
Repeat this process to create additional Access Profiles for different license types:
Microsoft 365 E3 License
ENTERPRISEPACK
Standard employees
Microsoft 365 E5 License
ENTERPRISEPREMIUM
Engineering department
Microsoft 365 Business Basic
O365_BUSINESS_ESSENTIALS
Contractors
Now add the license assignment using Manage Entitlements with your Access Profiles:
Click Add New Action
Select Manage Entitlements
Configure the action:
Description: Assign Microsoft 365 licenses
Access Profiles to Add: Select the appropriate Access Profile(s)
Entitlement Removal: None (to preserve any manually assigned licenses)
For assigning the same license to all employees:
Condition: (leave empty for all users matching workflow)
Access Profiles to Add: Select "Microsoft 365 E3 License"
Entitlement Removal: None
For different licenses based on department, add multiple Manage Entitlements actions with conditions:
Engineering Department (E5):
Condition: department eq "Engineering"
Access Profiles to Add: Select "Microsoft 365 E5 License"
Entitlement Removal: None
All Other Departments (E3):
Condition: department ne "Engineering"
Access Profiles to Add: Select "Microsoft 365 E3 License"
Entitlement Removal: None
Full-Time Employees:
Condition: worker_type eq "Full_Time"
Access Profiles to Add: Select "Microsoft 365 E3 License"
Entitlement Removal: None
Contractors:
Condition: worker_type eq "Contractor"
Access Profiles to Add: Select "Microsoft 365 Business Basic"
Entitlement Removal: None
If you want to ensure Exchange Online is configured:
Click Add New Action
Select Create Email
Configure the action:
Description: Enable Exchange Online mailbox
Entity Type: Azure AD User
Integration: Your Azure AD integration
Ensure your actions execute in the correct order:
Provision Account - Creates the user account (must run first)
Manage Entitlements - Assigns licenses via Access Profiles (requires user to exist)
Create Email (optional) - Enables mailbox (requires user and license)
Use the drag handles in the workflow editor to reorder actions if needed.
Select your policy
Click Dry Run and select Single Dry Run
In the Identity field, select an employee from the dropdown
Click Show Results to verify:
User creation attributes are correct
License assignment action is included
No errors are reported
Identify a test user in Workday (or create one in a test environment)
Ensure the test user matches your workflow conditions
Enable the policy and trigger a sync
Verify in Azure AD:
User account was created
Correct license(s) are assigned
Usage location is set
To assign multiple licenses to a single user, you can either:
Option 1: Create an Access Profile with multiple entitlements
Create a single Access Profile containing multiple license entitlements, then reference it in one Manage Entitlements action.
Option 2: Add multiple Manage Entitlements actions with different Access Profiles
When employees change roles, you may need to update their licenses:
Create a Mover Workflow with the condition: department changed
Add a Manage Entitlements action with:
Entitlement Removal: All not listed in this action (removes old licenses)
Add conditional license assignments for the new role
To remove licenses when employees leave:
In your Leaver Workflow, add Deprovision Account action:
Remove all entitlements: Yes (removes licenses along with other entitlements)
Deprovision Type: Not shown. Azure AD supports only Disable, which Veza applies automatically.
Alternatively, use Manage Entitlements with Entitlement Removal set to All not listed in this action before deprovisioning.
Azure Lifecycle Management - Azure AD integration reference
Workday Integration - Workday configuration
Action 1: Manage Entitlements
- Description: Assign base Microsoft 365 license
- Access Profiles to Add: Microsoft 365 E3 License
Action 2: Manage Entitlements
- Description: Assign Power BI Pro license
- Condition: department eq "Analytics" OR department eq "Finance"
- Access Profiles to Add: Power BI Pro License
Action 3: Manage Entitlements
- Description: Assign Visio license
- Condition: department eq "Engineering"
- Access Profiles to Add: Visio Plan 2 Licensehire_date
{hire_date | DATE_FORMAT, "2006-01-02"}
The reference date for Go time layouts is Mon Jan 2 15:04:05 MST 2006. Common format patterns:
2006-01-02
2024-03-15
ISO date only
2006-01-02T15:04:05Z07:00
2024-03-15T09:30:00-07:00
Full ISO 8601 with time zone
01/02/2006
03/15/2024
US date format
For more transformer options, see Attribute Transformers.
Contractor
Any
O365_BUSINESS_ESSENTIALS
Microsoft 365 Business Basic
first_name
{first_name}
Create and update
last_name
{last_name}
Create and update
department
{department}
Create and update
job_title
{job_title}
Create and update
usage_location
US
Create and update
Manage user identities and lifecycle automation in Veza, including synchronization, access profiles, and workflow triggers for joiner, mover, and leaver processes.
Identities in Veza Lifecycle Management represent a top-level view of an individual user, used to automate provisioning and deprovisioning across systems, applications, or services.
This can include birthright access managed throughout the user's lifecycle, triggered by joiner, mover, or leaver events, as well as ad-hoc, just-in-time access granted upon approval of an access request.
Identities can refer to users who may be employees, contractors, or external collaborators (partners). Active Directory Managed Service Accounts are also supported, with a simplified action set. See Active Directory provisioning.
With Lifecycle Management, workflows defined within policies dictate the users’ onboarding, job-function change, and offboarding processes, ensuring that corresponding identities have precisely the access they need as their roles evolve or their status within the organization changes. Similarly, access granted to identities may also change as just-in-time access requests are fulfilled or revoked.
The Lifecycle Management > Identities page serves as a central hub for viewing identities known to Lifecycle Management and Access Requests, as well as performing actions on individual identities.
Identities are populated into Lifecycle Management by first identifying the entire user population by integrating their source of identity and creating and enabling a policy that uses that data source. A policy does not require configured workflows to begin populating identity data. Enabling a policy against an identity source is sufficient to start the Identities table. This may require enabling a built-in integration for your identity source (e.g., Workday integration), uploading user data in CSV format (CSV Upload integration), or using a custom OAA connector.
See for detailed information on integrating the source of identity.
For Integration management using APIs, see .
Identities are maintained through synchronization with the identity sources. Syncing identities ensures that all systems reflect the most current user state, whether through onboarding, role changes, or attribute updates, keeping access aligned, consistent, and audit-ready.
The Provision Account action is used for the automatic synchronization of user identities between an authoritative source (such as an HR system or identity provider) and target systems. In the Lifecycle Management workflow, Provision Account works alongside other key actions:
Manage Entitlements (handling group/role memberships)
Deprovision Account (removing access when users leave the organization)
Synchronization is executed through Provisioning Policy workflows. Policy workflows can be defined with triggers and actions to synchronize changes in your identity source with target systems. Additionally, SCIM (System for Cross-domain Identity Management) or OAA (Open Authorization API) can enable identity sync for a wide range of target applications that don't have a built-in Veza integration, but do expose standard user and group management APIs or support bulk data export.
See for more information on usage.
See for detailed information.
Active Directory supports appending values to multi-value attributes during Provision Account actions. This allows you to add new values without replacing existing ones.
For detailed information about appending multi-value attributes, including supported attributes, syntax, and examples, see in the Transformers documentation.
Note: The display name is not the primary unique identifier, as multiple users may share the same first and surname.
When an identity has multiple sources (primary and secondary), the Identities table displays attributes based on the active status of each source. The "active" status is determined by the is_active field in each source of identity, which typically represents employment or account status (e.g., an active employee in Workday, an active contractor account in a secondary system).
Display Priority:
This behavior ensures the table reflects the most current and relevant source of identity information. For example, when an employee terminates (primary source becomes inactive) but remains as an active contractor in a secondary source, their attributes are displayed from the contractor system.
To start, you can use filtering options to locate specific identities or analyze a group of identities based on standard criteria. The following filters are available on the Identities overview:
Search by name: Locate specific individuals using a name-based search
Department filter: View identities by organizational unit
Status filter: Filter by Active or Inactive employment status
Access Profiles filter: Find identities with specific profile assignments
For each identity record, administrators can perform actions through the Actions menu:
View Details: Access identity information, attribute history, and related accounts
Policy Dry Run: Simulate a policy for the identity without making changes
Run Workflow Manually: Manually run a workflow in a policy
Request Access: Launch an Access Request for additional access (requires Veza Access Requests).
See for customizing the Request Access Template.
Click on your selected identity to open the Identity Details view.
The following fields in the Identity Details view are populated with the current user's information:
Title: The user’s position title.
Email: The user's email address.
Integrations: A list of assigned integrations. When you click a specific provider, the Integration page opens, displaying the provider's detailed information, including its Entity Categories distribution.
Access Profiles: A list of assigned Access Profiles to the identity. When you click on a specific profile, its detailed information page appears, displaying its status (either Draft or Published). You can also edit the Access Profile if needed.
When executing a policy where user attributes at the source of identity are incorrect, slow to update, or temporarily need adjustment, you can override the existing attribute with a different value until the issue is corrected. For more information, see .
Here are some examples of incorrect or slow-to-update attributes:
Employee termination: An employee has been terminated and needs immediate deprovisioning, but the termination status is not yet reflected at the source of identity
Role changes: An employee has immediately changed roles and needs new birthright access, but the role change and the new manager haven't been updated in the source system
Contract extensions: A contractor's end date has been extended, but the extension isn't reflected yet at the source of identity
Missing manager data: The source of identity is missing a manager value, but this information is required for downstream application provisioning
To create an Override Value, perform the following:
Select an identity by name.
Click Details.
Click Properties in the Details menu.
Click Actions (three dots icon)
The Internal Metadata tab on the Identity details view exposes Lifecycle Management's internal sync state for an identity. This is useful when troubleshooting stuck syncs, correcting identity mismatches, or forcing a resync after source-of-identity corrections.
For example, if an HR system initially created an employee with the wrong employee ID and the identity was already synced to a target system, Lifecycle Management retains the original mapping in its internal metadata. Correcting the employee ID at the source alone does not clear the stale mapping. The Internal Metadata tab allows administrators to clear the stuck mapping directly, so the next sync cycle picks up the corrected identity.
Enabling the tab
The Internal Metadata tab is hidden by default. To enable it:
Go to Lifecycle Management > Settings > Identity Settings.
Under Display Settings, enable the Show internal metadata toggle.
Click Save.
Enabling this setting requires the administrator role. Once enabled, the Internal Metadata tab appears as the last tab on all Identity detail views.
Metadata sections
The tab displays the following categories of internal state. Use the dropdown to select which sections to display. By default, Provisioned Accounts, Action Run Info, and Workflow Failures are shown. Provisioning Records is available but not displayed by default.
Clearing metadata
Action Run Info, Workflow Failures, and Provisioning Records each have a section-level Clear button that removes all stored metadata for that category. For Provisioned Accounts, clear buttons appear on each individual entity mapping, allowing you to remove specific mappings without affecting others.
Clearing metadata does not modify the target system. It removes Lifecycle Management's record of the prior sync, so the next sync cycle treats the identity as if it has not been synced before and performs a full sync from the identity source.
A confirmation dialog appears before any clear operation. Clearing metadata should be done infrequently and only when the stored state is known to be incorrect.
Audit logging
All metadata edits are recorded as IDENTITY_METADATA_EDIT events in the page. Each event includes the identity, the fields that changed, and the previous and new values.
Click the overflow icon (three dots) to display options for performing actions on the identity. Next, click on the desired action:
Policy Dry Run
Run Workflow Manually
Request Access
Show in Graph
Delete Identity (shown only for deleted identities)
Use Run Workflow Manually to run a workflow for one identity outside the normal extraction cycle. See .
Requests Access allows for additional or temporary access grants, particularly when a user’s current access is insufficient for their duties.
Use the Request Access option in the Identity Details view to grant access to a specific user while reviewing their detailed information. You can grant access to the user through the following:
Access Profiles option
A collection of entitlements that are granted as part of the user’s identity lifecycle requirements. Access Profiles can:
Define reusable collections of entitlements across multiple target systems by business roles, departments, or functions
Automate consistent access provisioning
Manage access profile types and their capabilities
See and for more information.
To grant an Access Profile, perform the following:
Click the Access Profiles radio button.
The Choose from Access Profiles window appears.
Enter a Reason for granting the Access Profile for the user.
Select an existing Access Profile from the dropdown menu.
Account option
The Account option creates an account in a target system, where user access is provisioned or deprovisioned as part of the identity lifecycle process.
To request an account, perform the following:
Click the Account radio button.
The Request an Account window appears.
Enter a Reason for granting the account to the user.
Select an existing Integration from the dropdown menu.
Entitlements option
Granting Entitlements to a user provides specific access permissions (roles, permissions, group memberships) required to perform their responsibilities.
Note: By granting Entitlements to a specific user, you pre-fill an Access Request with the appropriate configuration settings and policy.
To grant an Entitlement, perform the following:
Click the Entitlements radio button.
The Request Grant Access window appears.
Enter a Reason for granting the Entitlement for the user.
Select an existing Integration from the dropdown menu.
Use the Show in Graph option to display a graph that represents all assigned Access Profiles, Apps, and Entitlements, including all associations.
This is a graphical representation of John Smith’s assigned access and entitlements to roles/groups.
How source system properties become Veza attributes
When connecting to integrated systems (see Veza Integrations), Veza ingests properties from the source systems (e.g., Workday, Okta, Active Directory) and normalizes them into standardized attributes that appear when configuring Workflow trigger conditions, configuring Actions, and in Identities views.
While these standardized attributes are intended to ensure consistent naming across different systems, it is important to understand that some attributes may appear differently than their original names in the source system.
You can retrieve the original attribute names for enabled Lifecycle Management integrations using the ListLifecycleManagerDatasources API.
Veza normalizes all property names for consistency:
The following normalization rules typically apply:
Source properties are converted to lowercase
Any spaces and hyphens become underscores
Special characters removed
CamelCase converted to snake_case
Custom fields are identified with a
The following sections include some examples of how Veza handles attributes from common integrations.
Veza recognizes and standardizes many common attributes across source systems:
Veza will make conversions to some attribute names from the source integration. For example, sAMAccountName in Microsoft Active Directory is shown as account_name for Active Directory Users in Veza Access Graph.
Workday → Veza
Okta → Veza
Active Directory → Veza
Some integrations support custom property extraction for organization-specific fields from custom reports or extended schemas:
Always prefixed with customprop_
Automatically discovered during extraction once enabled
Follow standard normalization rules (lowercase, underscores)
Examples:
customprop_department_code - Custom department identifier
customprop_employeeou - Organizational unit
customprop_region - Geographic region
Some entity attributes are computed by Veza, and not derived from source data:
sys_attr__is_mover - Identity has changed monitored properties
sys_attr__would_be_value - Preview value in conditional transformers
sys_attr__would_be_value_len - Preview value length in conditional transformers
See for details.
When configuring a Workflow trigger condition or an action that syncs attributes, you can choose from available attributes using a dropdown menu.
Primary Source - Attributes from the main identity source appear without prefixes:
Secondary Sources - Attributes from additional sources are prefixed with the entity type:
Lifecycle Management uses two different expression syntaxes depending on the context:
In Workflow Conditions (SCIM Filter Syntax):
Trigger conditions use SCIM filter syntax to evaluate boolean expressions. See for complete documentation.
In Transformers (Formatter/Pipeline Syntax):
Attribute transformers use curly braces and pipes to produce output values. See for complete documentation.
With Secondary Sources (in Conditions):
- Computed attributes for advanced scenarios
- Modifying and combining attribute values
- Using attributes in workflow conditions
Organizational department from the source of identity
Used for access assignment and reporting
Provisioning Policy
Associated Provisioning Policy
Links identity to a specific Lifecycle Management workflow
Access Profiles
Assigned Access Profiles with counts
Shows current access assignments
Last Changed At
Timestamp of the most recent update
Tracks synchronization and change activity
Matched Workflows
Associated Lifecycle Management workflow name
Identifies which policy workflow manages the identity
Inactive
Inactive
Primary source (default)
Integrations filter: Filter by source integration system
Provisioning Policy filter: View identities managed by specific policies
Matched Workflows filter: Identify identities that have triggered automation
Not in a Workflow: Find identities outside automated workflows
Show in Graph: Visualize identity relationships and access patterns
Matched Workflows: The workflows that the identity matched.
Primary: The Primary identifier is configured (True or False) to be the authoritative attribute for matching or locating an identity.
Secondary Identities: An associated name is connected to the primary identity.
ID: The Identification number assigned to the primary identity.
Active: The user’s identity is active if True. Otherwise, False when inactive.
Last Changed: A time frame (in days, weeks, months) when the identity was last changed.
Security incidents: Immediate access restrictions are needed before HR systems can be updated
Temporary access grants: Providing temporary access while permanent changes are processed
The Create Override window appears. The Property Name and Actual Value fields are populated.
Enter an Override Value.
Click Save.
Enter an Expiration Time in Hours or Days.
Use the arrows to select an Expiration Time in Days, where 0 means no expiration.
Click Create.
Based on the integration you selected, the Target Entity Type is automatically populated.
Use the arrows to select the Target Entitlements.
Use the arrows to select an Expiration Time in Days, where 0 means no expiration.
Click Create.
Name
Identity display name
The full display name is an attribute composed of the user's given name and surname.
Status
Current lifecycle status (Active/Inactive)
Indicates employment status.
Property Overrides
Shows "Yes" if identity has custom attribute overrides
Identifies identities with manual attribute modifications (overriding attributes from your source of identity)
Active
Any
Primary source
Inactive
Active
Secondary source
Active
Active
Primary source (default)
Provisioned Accounts
Target system entities that are mapped ("stuck") to this identity. Each entry shows the datasource, entity type, and entity ID. When a sync creates or updates a target account, Lifecycle Management records the mapping here so future syncs update the same target entity.
Action Run Info
Per-action execution state, including the action name, current state, and last run timestamp.
Workflow Failures
Failure tracking per workflow, including first and last failure timestamps and the number of consecutive failures.
Provisioning Records
Target relationship bindings (such as group memberships) that Lifecycle Management has established for this identity.

Department
customprop_System-computed fields are identified with the sys_attr__ prefix
string
Department name
Engineering
title
string
Job title
Senior Engineer
business_title
string
Business position
Senior Engineer
manager
string
Manager reference
managers
list
List of managers
[John Smith]
is_active
boolean
Active status
true
hire_date
date
Employment start date
2024-01-15
cost_center
string
Financial allocation
CC-1000
cost_center
Financial allocation
Employee Type
employee_types
List (e.g., Full Time)
Manager
managers
List of manager names
department
Department name
manager
manager
Manager's email/ID
member_of
List of group DNs
department
department
Department name
title
title
Job title
customprop_project_codeEmployee ID
employee_id
Spaces → underscores
BusinessTitle
business_title
CamelCase → snake_case
Cost-Center
cost_center
Special chars removed
Department Code
customprop_department_code
Custom fields prefixed
employee_id
string
Employee identifier
E-98765
email
string
Primary email
Worker ID
workday_id
Unique worker identifier
Employee ID
employee_id
Employee number
Business Title
business_title
Job position
login
login
Username
email
Primary email
status
status
ACTIVE, SUSPENDED, etc.
sAMAccountName
account_name
Pre-Windows 2000 login
distinguishedName
distinguished_name
Full LDAP path
userPrincipalName
user_principal_name
user@domain format
workday_id
employee_id
business_title
hire_date
email
customprop_department_codeOktaUser.login
OktaUser.department
AzureADUser.job_title
ActiveDirectoryUser.distinguished_nameemployee_types co "Full Time" and department eq "Engineering"{first_name}.{last_name}@{customprop_domain}.comOktaUser.status eq "ACTIVE" and WorkdayWorker.is_active eq true
department
Cost Center
department
memberOf
Configure reusable authentication for Lifecycle Management Send REST Payload and Send XML Payload actions and for Access Reviews custom REST payload actions
REST Auth Credentials provide centralized, reusable authentication configurations for Send REST Payload and Send XML Payload actions in Lifecycle Management workflows, and for custom REST payload actions in Access Reviews. Instead of configuring authentication directly in each action, you can create named credential sets that multiple actions can reference.
Benefits:
Reuse: Share one authentication configuration across multiple actions
Security: Sensitive fields (passwords, tokens, secrets) are encrypted at rest
Centralized management: Update credentials in one place; all referencing actions use the latest configuration
Audit: Track credential usage and creation history
Credentials are managed on the Administration > Credentials page, which requires the Administrator role on the root team. The page does not require a Lifecycle Management license.
Navigate to Administration > Credentials
In the REST/XML Credentials table, click New REST/XML Credentials to add a new credential
Enter a Name for the credential
Select the Auth Type and complete the required fields (see )
REST Auth Credentials are managed via the Lifecycle Management API:
Create a credential:
List credentials:
Get a single credential:
Update a credential:
Delete a credential:
Provides a custom authorization header value. Use this for API keys or non-standard token formats.
The value is sent as the Authorization header on each request.
HTTP Basic authentication with username and password.
Veza constructs the Authorization: Basic {base64(username:password)} header automatically.
Bearer token authentication.
Veza constructs the Authorization: Bearer {token} header automatically.
Two-step authentication: perform a login request, then extract a bearer token from the response. Use this for APIs that require an initial authentication step before issuing a session token.
How it works:
Veza sends a POST request to login_url with login_payload_json as the body
The JSON response is parsed using bearer_token_attribute to extract the token
The extracted token is used as a Bearer token for the actual REST request
Example:
If the login API returns:
Set bearer_token_attribute to value.token to extract the token.
OAuth 2.0 client credentials flow.
Veza performs the client credentials flow to obtain an access token, then uses it as a Bearer token for the REST request.
Some token endpoints reject a client credentials request that has no scope. Microsoft Entra ID, for example, expects the target resource's .default scope, such as https://<environment>.operations.dynamics.com/.default for Dynamics 365 finance and operations apps. Check the token endpoint's documentation for the scope value to use.
Choosing an authentication method:
FORM (default): Sends client_id and client_secret as form-encoded parameters in the POST body alongside grant_type=client_credentials, plus scope when set. Use this when the token endpoint expects credentials in the request body.
BASIC: Sends credentials in the Authorization: Basic base64(client_id:client_secret)
Check your target API's OAuth2 documentation to determine which method it supports. Both conform to . When in doubt, try FORM first as it is the default and more widely supported.
OAuth 2.0 resource owner password credentials grant (). Veza posts a resource owner's username and password to the token endpoint and uses the returned access token as a Bearer token for the REST request.
A public client sends neither client_id nor client_secret. The resource owner's username and password are what authenticate the request. When client_id is set, authentication_method decides whether the client credentials travel in the Authorization header (BASIC) or in the request body (FORM), as described under .
No authentication header is added to the request. Use this when the target API is public or when authentication is handled through other means (e.g., network-level security, pre-shared keys in URL parameters).
None is also the only way to save a Send REST Payload or Send XML Payload action whose Authorization Header (Legacy) field is empty. Both actions skip the non-empty check on that field only when the selected credential is this type; without it, validation requires a header value.
A Provisioning Policy runs one job per identity, and by default every job fetches its own token. A policy that touches 500 identities makes 500 requests to the target's token endpoint. Set Token Reuse Window (Seconds) on a credential to reuse one fetched token across the jobs in a policy run instead of fetching a new one for each job.
The field applies only to the auth types that fetch a token per job: Login to Bearer, OAuth2, and OAuth2 (Password Grant). The other types carry a static credential and have no token to fetch, so Veza does not display the field for them and rejects a nonzero value set through the API. Changing a credential to a static auth type resets the window to 0 when you save.
In the private Lifecycle Management API described above, this setting is the token_cache_ttl_seconds field. The credential list does not show the window; use the credential's edit panel to read or change it.
The window applies to both the and actions, in Provisioning Policies and in Access Requests, whether the action runs in the control plane or through an Insight Point. An action's check uses it too, so a test can succeed on a token cached earlier rather than proving the credential still works.
Start from the target's own token lifetime and stay well inside it. A window needs only to outlast a single policy run: after it does, a longer window saves no further token requests while leaving a revoked token in play for longer. Veza reuses a token for exactly the number of seconds you set, with no safety margin subtracted.
Reuse is not tenant-wide: Veza can fetch more than one token per window, and an Insight Point deployment can account for several. Size any rate-limit headroom for a small number of token requests per window rather than exactly one.
If the target rate-limits token issuance, a policy run without a window fails at the authentication step rather than at the API call: nothing is provisioned, and the error points at authentication instead of at request volume.
A new value takes effect on the next job, but it does not discard the token cached under the old value. Veza caches a token against the window it was fetched under, so writing any different number, including 0, moves to an entry with nothing cached and the next job fetches a fresh token.
This matters when you are recovering from a revoked credential. To force a fresh token:
Set Token Reuse Window (Seconds) to 0 and save.
Re-run the policy. Each job now fetches its own token.
To turn reuse back on, either wait for the old window to elapse or set a different number of seconds. Restoring the number you were running with moments ago can hand out the same dead token again.
Rotating a secret on the credential in Veza needs no such step: Veza keys a cached token to the authentication material it was fetched with, so a rotated secret is not served a token minted from the old one.
When configuring a action in a Provisioning Policy:
In the action configuration, select a credential from the Auth Credentials dropdown
The credential provides the authentication header and optional default URL/method
The action's URL and HTTP Method settings override the credential defaults when specified
: Action configuration and payload options
: Route requests through Insight Points for on-premises targets
: Attribute transformation syntax for dynamic URLs and payloads
Configure the conditions and actions that execute when workflows run.
When creating Provisioning Policies, you can configure workflows that define actions to execute during different employment lifecycle scenarios, such as when an employee is onboarded, changes function or role, or is withdrawn from the organization. Actions can be executed in sequence based on specific conditions, enabling you to automate onboarding and offboarding actions within Lifecycle Management, across systems in your environment.
Policies and workflows define how Veza automates identity management tasks across your environment by describing conditional actions to execute for different employee populations.
Define the overall automation framework for managing identities throughout their lifecycle
Specify which source of identity triggers the automation
Run SQL statements against external databases as part of a provisioning workflow.
Executes a single SQL statement against MySQL, Microsoft SQL Server, Oracle, PostgreSQL, or as a workflow step. Use it to provision, update, or deprovision users directly in a database-backed application, without standing up a REST adapter.
Example use cases:
Insert a row into an application's user table on provisioning
Update a status column when upstream employment state changes
Delete or disable rows on deprovisioning
Two-step: login request, then extract token from response
APIs requiring session-based auth
OAuth2
OAuth 2.0 client credentials flow
Modern APIs with OAuth2 support
OAuth2 (Password Grant)
OAuth 2.0 resource owner password credentials grant
Targets that expose no other machine-to-machine grant
None
No authentication header added
Public APIs, pre-authenticated endpoints
For the OAuth2 and OAuth2 (Password Grant) auth types, enter any scopes the token endpoint requires in Scope (Optional), separated by spaces (see OAuth2)
Optionally set a default URL and method in URL (Optional) and Method (Optional) (actions can override these values)
For the Login to Bearer, OAuth2, and OAuth2 (Password Grant) auth types, optionally set a Token Reuse Window (Seconds) (see Token Reuse Window)
Click Save
No
Token endpoint URL. Defaults to {credential_url}/oauth2/token if not specified
scope
No
Space-delimited list of scopes to request. Sent as the scope parameter on the token request only when set
ca_certificate_base64
No
Base64-encoded CA certificate for the OAuth2 token endpoint, if it uses a self-signed or internal CA
grant_type=client_credentialsscopeNo
Token endpoint URL. Defaults to {credential_url}/oauth2/token if not specified
client_id
No
OAuth2 client ID. Omit for a public client
client_secret
No
OAuth2 client secret (encrypted at rest)
scope
No
Space-delimited list of scopes to request
ca_certificate_base64
No
Base64-encoded CA certificate for the token endpoint, if it uses a self-signed or internal CA. Applies to the auth_url connection only, as described under
Header
Custom authorization header value
API keys, custom token formats
Basic
HTTP Basic authentication (username/password)
Legacy APIs, Basic authentication endpoints
Bearer
Bearer token authentication
JWT tokens, API tokens
curl -X POST "https://{VEZA_URL}/api/private/lifecycle_management/rest_auth_credentials" \
-H "Authorization: Bearer {API_KEY}" \
-H "Content-Type: application/json" \
--data '{
"value": {
"name": "My API Credential",
"auth_type": "BEARER",
"bearer_settings": {
"token": "eyJhbGciOiJIUzI1NiIs..."
},
"url": "https://api.example.com/v1",
"method": "POST"
}
}'curl "https://{VEZA_URL}/api/private/lifecycle_management/rest_auth_credentials" \
-H "Authorization: Bearer {API_KEY}"curl "https://{VEZA_URL}/api/private/lifecycle_management/rest_auth_credentials/{CREDENTIAL_ID}" \
-H "Authorization: Bearer {API_KEY}"curl -X PATCH "https://{VEZA_URL}/api/private/lifecycle_management/rest_auth_credentials/{CREDENTIAL_ID}" \
-H "Authorization: Bearer {API_KEY}" \
-H "Content-Type: application/json" \
--data '{
"value": {
"id": "{CREDENTIAL_ID}",
"name": "Updated Credential Name",
"bearer_settings": {
"token": "new-token-value"
}
}
}'curl -X DELETE "https://{VEZA_URL}/api/private/lifecycle_management/rest_auth_credentials/{CREDENTIAL_ID}" \
-H "Authorization: Bearer {API_KEY}"full_value
Yes
Complete header value (e.g., ApiKey sk-prod-xyz)
user_name
Yes
Authentication username
password
Yes
Authentication password (encrypted at rest)
token
Yes
Bearer token value (encrypted at rest)
login_url
Yes
URL to send the login POST request
login_payload_json
Yes
JSON body for the login request (encrypted at rest)
bearer_token_attribute
Yes
Dot-notation path to the token in the login response (e.g., value.token)
{
"value": {
"token": "eyJhbGciOiJIUzI1NiIs...",
"expires_in": 3600
}
}client_id
Yes
OAuth2 client ID
client_secret
Yes
OAuth2 client secret (encrypted at rest)
authentication_method
Yes
How to send credentials: FORM or BASIC (see below)
user_name
Yes
Resource owner username
password
Yes
Resource owner password (encrypted at rest)
authentication_method
Yes
How to send the client credentials: FORM or BASIC. Applies only when client_id is set
Token Reuse Window (Seconds)
How long Veza reuses a fetched token before fetching another. Range: 0–172800 (48 hours). 0 (the default) fetches a token for every job.
Open the Administration > Credentials page
Administrator on the root team
Create, Update, Delete
Administrator on the root team
Login to Bearer
auth_url
auth_url
Can contain multiple workflows to handle different scenarios (joiner, mover, leaver)
Support continuous synchronization to keep identities up-to-date
Enable email notifications and webhooks for action-related events
Define specific sequences of actions that execute based on trigger conditions
Handle different lifecycle scenarios (e.g., new hire onboarding, role changes, terminations)
Support conditional execution based on user attributes (department, location, role, etc.)
Allow for complex decision trees through nested conditions
Execute actions in a defined order when conditions are met
Define when specific actions should occur within a workflow
Can be based on any attribute from the source of identity
Support SCIM filter expressions for precise targeting
Can be nested to create sophisticated logic trees
Can trigger multiple actions when met
Can spawn additional conditions after successful action completion
Use one of two condition types: Always runs the actions unconditionally, and When this condition matches runs them only when the SCIM filter expression matches
Example Conditions for Lifecycle Management Actions:
Add to engineering groups based on department:
department eq "Engineering"Grant manager access based on role:
is_manager eq trueAssign cost center groups:
cost_center eq "IT-1234"Add to contractor AD groups:
employment_type eq "CONTRACTOR"
Represent specific tasks such as creating users, syncing attributes, or managing access
Types of actions include:
SYNC_IDENTITIES: Create/update user accounts
MANAGE_RELATIONSHIPS: Grant/revoke access
CREATE_EMAIL: Generate email addresses
DEPROVISION_IDENTITY: Disable/remove access
DELETE_IDENTITY: Permanently delete accounts
CUSTOM_ACTION: Write attributes to a ServiceNow table (shown as Update ServiceNow Table in the action picker)
WRITE_BACK_EMAIL: Update source system
PAUSE: Add workflow delays
SEND_REST_PAYLOAD: Make HTTP requests to external APIs
SEND_XML_PAYLOAD: Send an XML or SOAP body over HTTP
SEND_SQL_COMMAND: Run a SQL statement against an external database
SEND_NOTIFICATION: Trigger alerts
RESET_PASSWORD: Reset existing user password
CREATE_ACCESS_REVIEW: Trigger access review campaigns
ROTATE_KEY: Rotate cryptographic keys in Azure Key Vault (Non-Human Identity (NHI) action; not offered in the policy editor)
GET_NODE_FROM_GRAPH: Query the Access Graph for entities by type and filter
CREATE_ENTITLEMENT: Create roles, groups, or distribution lists in target systems (not offered in the workflow editor)
By default, when an action fails during workflow execution, the workflow stops and no further actions in that condition are executed. Two options allow workflows to continue past action failures instead of stopping:
Enable Continue if any action fails on a condition to keep the workflow running even if any action under that condition fails. This is a blanket setting — if any action fails, the workflow continues to the next action instead of stopping. It applies equally to every action in the condition.
When to use: When all actions in a condition are independent and none are prerequisites for others. For example, a condition with three Send Notification actions (an email, a webhook, and a ServiceNow ticket) where each should fire regardless of the others.
Enable Continue if this action fails on an individual action to keep the workflow running if that specific action fails. The workflow continues to the next step instead of stopping, while other actions in the condition remain critical.
When to use: When most actions in a condition are critical but one specific step is optional. For example, a condition with three actions (Revoke Access, Send Notification, Update CMDB) where the notification is nice-to-have but the other two must succeed.
Continue if any action fails (Condition)
All actions in a condition
If any action fails, the workflow continues instead of stopping
Continue if this action fails (Action)
One specific action
If this action fails, the workflow continues to the next step instead of stopping
The following workflow configuration for a Provisioning Policy enables provisioning actions for Active Directory users when workers are added in Workday:
Create an Active Directory user, synchronizing attributes with the source Workday Worker
Create email addresses for new employees in Exchange Server
Update the Workday Worker and AD User records to include the new email
Grant entitlements by assigning Access Profiles according to the Worker's department
When provisioning users, Veza synchronizes attributes for active employees and creates them during AD User provisioning. These attributes can be transformed from attributes in the source of identity (Workday):
account_name
display_full_name
{display_full_name}
distinguished_name
first_name, last_name
CN={first_name} {last_name},OU=Minnetonka,OU=US,OU=Evergreen Staff,DC=evergreentrucks,DC=local
user_principal_name
username
{username}@evergreentrucks.com
To de-provision users, Veza moves accounts to a terminated users group and adds them to an OU for terminated employees:
account_name
display_full_name
{display_full_name}
distinguished_name
first_name, last_name
CN={first_name} {last_name},OU=Evergreen Termination,OU=Evergreen Staff,DC=evergreentrucks,DC=local
primary_group_dn
-
CN=Terminated Users,OU=Evergreen Groups,DC=evergreentrucks,DC=local
Moving leavers into a "Terminated Users" group (via the primary_group_dn attribute) effectively restricts access to systems that rely on Active Directory for authentication and authorization
Updating the distinguished_name to place leavers in a specific organizational unit (OU) like "Evergreen Termination" separates active users from inactive ones and enables the application of policies, scripts, and queries that target inactive users without affecting active employees
Create or update user accounts in target systems
Assign or remove group memberships, roles
Generate email addresses via email providers
Disable accounts while preserving audit trails
Set role or group membership in a database-backed application
MySQL
Native MySQL protocol
Microsoft SQL Server
Native TDS protocol
Oracle
Native Oracle protocol
PostgreSQL
Native PostgreSQL protocol
Sybase TDS protocol (SQL Anywhere)
The target host must be reachable from the Veza control plane, or from an Insight Point when one is configured for the action (see Insight Point execution).
SQL Auth Credentials
Stored connection credential. Database type, host, port, database, username, and password (or certificate) are configured once in the SQL Credentials table at Administration > Credentials and reused across actions.
Database Type
MySQL, MS SQL Server, Oracle, PostgreSQL, or SAP IQ. Inherited from the credential; can be overridden inline.
Host
Database host or DNS name. Inherited from the credential; inline value overrides.
Port
Database port. Inherited from the credential; inline value overrides.
Database
A non-empty inline value overrides the corresponding credential field. One credential can drive many actions while individual actions retarget host or database without a new credential entry.
Credentials live in the SQL Credentials table under Administration > Credentials. Passwords are encrypted at rest and write-only on read, matching the REST authentication credential model.
To create a credential, you need the Administrator role on the root team:
Go to Administration > Credentials.
In the SQL Credentials table, click New SQL Credentials and select the database type.
Enter host, port, database, username, and password (or, where supported, a certificate).
Save. The credential appears in the SQL Auth Credentials picker for any Send SQL Command action.
Unlike most LCM actions, the SQL Statement field does not accept {attribute_name} placeholders: any {...} in the body is rejected at save time. All identity substitution flows through the Parameters list, bound by the driver using its native placeholder syntax:
MySQL
?
Microsoft SQL Server
?
PostgreSQL
$1, $2, …
Oracle
:1, :2, …
SAP IQ (Sybase IQ)
?
Each Parameters entry accepts {attribute_name} substitution and transformer expressions. Available attribute sources:
Source of Identity attributes: fields on the identity record that triggered the workflow.
Provision Account output entity attributes: when a preceding Provision Account action provisioned or updated a target user in the same workflow.
Example, PostgreSQL insert with bound parameters:
Parameters list:
$1
{email}
$2
{employee_id}
$3
{department}
Driver-side binding means quotes, comments, and statement terminators in attribute values pass through without breaking the statement. Identifiers (table or column names) cannot be parameterized: they are part of the validated statement body.
Parameter values support transformer expressions (UPPER, LOWER, TRIM, dot notation for nested attributes). See Transformers.
When a Send SQL Command action is configured as part of an Access Request catalog definition, Parameters entries can reference values submitted on the request form. The requester provides values (such as a username or role identifier) at request time, and those values are bound to the SQL statement at execution.
Use the {$form_field.field_name} syntax inside a Parameters value, where field_name matches a field defined on the catalog definition.
To configure form field substitution:
Build the SQL statement with driver-native placeholders for every requester-supplied value, and add a Parameters entry for each:
INSERT INTO app_users (email, role_name)
VALUES ($1, $2)$1
{$form_field.email}
$2
{$form_field.role_name}
On the matching catalog definition, add form fields whose names match the placeholders (email and role_name in the example above).
When a user submits an access request, the value entered for each form field replaces the corresponding {$form_field.*} placeholder in the Parameters list. The substituted value is then bound by the driver. The {$form_field.*} syntax is not substituted inside the SQL Statement body; use it only inside Parameters.
Field names must contain only letters, numbers, and underscores (role_name is valid, role-name is not). A field whose name contains an unsupported character might be accepted at catalog-definition save time but is not substituted at execution time, and the literal {$form_field.*} placeholder is bound as the parameter value. If a placeholder references a field that was not provided on the access request, the placeholder is likewise left unchanged.
Because substituted values populate Parameters rather than the SQL Statement, they are bound by the driver and cannot alter statement structure.
At save time, the statement is rejected if it contains:
Statement terminators inside the body (;)
SQL line comments (--)
SQL block comments (/* ... */)
MySQL line comments (#, MySQL only)
These rules enforce single-statement execution and block the common patterns that smuggle multi-statement payloads past parameter binding. To run multiple statements, split them into separate actions or wrap them in a stored procedure call.
The SSL Mode setting controls TLS behavior:
disable
Plain TCP, no TLS.
require
TLS without server-certificate validation.
verify-ca
TLS with CA validation. Requires a CA certificate.
verify-full
TLS with CA validation plus hostname verification. Requires a CA certificate.
Caveats:
SAP IQ requires a non-empty CA Certificate for both verify-ca and verify-full. MySQL also requires a CA certificate for these modes but does not accept a custom CA, so verify-ca and verify-full are not available for MySQL.
Custom CA certificates are not supported for MySQL, Oracle, or PostgreSQL. Validation rejects a custom CA for these databases. Microsoft SQL Server and SAP IQ accept a custom CA.
Set Data Source to route execution through an Insight Point instead of the control plane. Use this when the target database is unreachable from the Veza control plane (for example, a Postgres instance behind a firewall).
Data Source
(Optional) Custom Provider data source to route through. Must be configured as an Insight Point Custom Application. When empty, the action runs on the control plane.
rows_affected
Rows affected by the statement, as reported by the driver. Use it to assert that an UPDATE or DELETE matched the intended rows.
rows_affected is exposed to downstream conditions and actions in the workflow context.
Add the action through the Policy Editor or the policy update API:
Policy Editor: open the policy, choose Add New Action, then select Send SQL Command.
API: include the action in the policy's actions array. The action type identifier is SEND_SQL_COMMAND. See Update Policy Configuration.
Only MySQL, MS SQL Server, Oracle, PostgreSQL, and SAP IQ are supported.
Statements must be valid SQL for the selected dialect. Veza does not translate SQL between dialects.
One statement per invocation. Split multi-statement scripts into multiple actions or wrap them in a stored procedure.
Result-set rows are not exposed: only rows_affected. To branch on query results, use Get Node From Graph when the data is already in the Access Graph, or Send REST Payload when a JSON return value is required.
Custom CA certificates are not supported for MySQL, Oracle, or PostgreSQL.
INSERT INTO app_users (email, employee_id, department, status)
VALUES ($1, $2, $3, 'active')Send XML or SOAP payloads to external endpoints as part of a provisioning workflow.
Sends an XML or SOAP-over-HTTP payload to an external endpoint as a workflow step. Use it to integrate with legacy applications that expose XML or SOAP APIs instead of REST or SCIM.
The action reuses the credential model and captures values from the response via XPath for use by downstream actions.
Example use cases:
Provision users in an on-premises application with a SOAP web service
Submit payloads to legacy HR or payroll systems
Database (catalog) name. Inherited from the credential; inline value overrides.
Username
Database user. Inherited from the credential; inline value overrides.
Password
Leave blank to use the credential's password. Keep passwords in the stored credential rather than on the action. See Centrally-managed credentials.
SSL Mode
One of disable, require, verify-ca, verify-full. See TLS.
CA Certificate
(Optional) PEM-encoded CA certificate, used with verify-ca and verify-full. See TLS.
SQL Statement
SQL to execute. Body placeholders are not supported: use bound parameters. See Parameter binding.
Parameters
Ordered values bound to driver placeholders (? for MySQL/MSSQL/SAP IQ, $1, $2, … for PostgreSQL, :1, :2, … for Oracle). Each value accepts {attribute_name} substitution and transformer expressions.
Timeout
Statement timeout in seconds. Range: 0–3600. 0 uses the driver default.
Only send if prior actions resulted in a change
When enabled, the statement runs only if a prior action in the workflow modified or created resources. Cannot be combined with Insight Point execution.
username
{username}@evergreentrucks.com
display_name
display_full_name
{display_full_name}
given_name
first_name
{first_name}
sur_name
last_name
{last_name}
country_code
work_location
{work_location}
job_title
job_title
{job_title}
primary_group_dn
-
CN=Domain Users,CN=Users,DC=evergreentrucks,DC=local
Permanently remove accounts (databases, cleanup)
Write attributes to a ServiceNow table
Update HRIS with newly created email addresses
Add delays between workflow actions
Make HTTP requests to external APIs
Send XML or SOAP payloads to legacy endpoints
Run SQL statements against external databases
Send an email, call a webhook, or open a ServiceNow ticket as a workflow step
Reset user passwords in target systems
Automatically create certification campaigns
Rotate Azure Key Vault keys from NHI Security (not offered in the policy editor)
Look up entities in the Access Graph during workflow execution
Create groups, roles, or distribution lists in target systems (not offered in the workflow editor)
Capture an identifier from a SOAP response and pass it to a downstream action
URL
Target endpoint URL. Supports {attribute_name} substitution in the path and query string.
HTTP Method
Request method. POST is typical for SOAP; GET, PUT, PATCH, DELETE, HEAD, and OPTIONS are also supported.
Auth Credentials
(Required) Stored REST authentication credential. For endpoints that need no authentication, select a credential of type NONE. Same model as : HEADER, BASIC, BEARER, LOGIN_TO_BEARER, OAUTH2, NONE, OAUTH2_PASSWORD.
Request Headers
(Optional) Additional request headers. Applied last, so entries here override defaults: including Content-Type (see ).
SOAPAction (Optional)
Content-Type is hard-coded to text/xml. There is no Content-Type field in the action settings.
To send a different media type, override the header through Request Headers. Entries in that map are applied last, so they win over the default. For example, to send SOAP 1.2:
Content-Type
application/soap+xml; action="urn:example:hr:CreateUser"
The URL and XML Payload fields accept {attribute_name} placeholders. Sources include the source of identity and any prior action in the workflow (including a preceding Provision Account action).
Transformer expressions (UPPER, LOWER, TRIM, dot notation for nested attributes) work the same way as in Send REST Payload. See Transformers.
When a Send XML Payload action is configured as part of an Access Request catalog definition, the XML Payload can reference values submitted on the request form. The requester provides values (such as a username or role identifier) at request time, and those values are inserted into the payload at execution.
Use the {$form_field.field_name} syntax inside element or attribute content, where field_name matches a field defined on the catalog definition.
To configure form field substitution:
Author the XML Payload with {$form_field.*} placeholders in each element or attribute that takes a requester-supplied value:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<CreateUser xmlns="urn:example:hr">
<Email>{$form_field.email}</Email>
<RoleName>{$form_field.role_name}</RoleName>
</CreateUser>
</soap:Body>
</soap:Envelope>On the matching catalog definition, add form fields whose names match the placeholders (email and role_name in the example above).
When a user submits an access request, the value entered for each form field replaces the corresponding {$form_field.*} placeholder in the XML Payload before the request is sent.
Form field substitution applies to the XML Payload only. It does not apply to the URL or Request Headers.
Substituted form-field values are XML-escaped automatically, and the substituted document is re-checked for well-formedness before send. Placeholders inside XML comments or CDATA sections cannot be safely escaped: a value containing -- or ]] can fail the well-formedness recheck, and the action will error.
Field names must contain only letters, numbers, and underscores (role_name is valid, role-name is not). A field whose name contains an unsupported character might be accepted at catalog-definition save time but is not substituted at execution time, and the literal {$form_field.*} placeholder is emitted in the payload. If a placeholder references a field that was not provided on the access request, the placeholder is likewise left unchanged.
When Add response to output entities is enabled, the action parses the XML response and runs the configured XPath expressions:
Output Entity Type
LegacyAppUser
Response Entity XPath
//CreateUserResponse
Response ID XPath
UserId/text()
Response Name XPath
DisplayName/text()
The extracted entity is added to the workflow context. Downstream actions reference it as {LegacyAppUser.id} and similar {EntityType.attribute} expressions.
For SOAP responses wrapped in a standard envelope, traverse the envelope inline and declare namespace prefixes directly in each XPath expression. There is no separate namespace-registration step: prefixes in your XPath must match the prefixes in the response document as-is.
The action uses the Send REST Payload credential model. Select a stored credential in Auth Credentials. The field is required:
None (NONE): no authentication header is added; for internal services or pre-authenticated URLs.
Header (HEADER): arbitrary inline header value.
Basic (BASIC): username and password, base64-encoded.
Bearer (BEARER): Bearer <token>.
Login-to-Bearer (LOGIN_TO_BEARER): exchange credentials at a login endpoint for a Bearer token.
OAuth2 (OAUTH2): client credentials or other OAuth2 flow.
OAuth2 (Password Grant) (OAUTH2_PASSWORD): resource owner password credentials grant, for targets that offer no other machine-to-machine grant.
The Login-to-Bearer, OAuth2, and OAuth2 (Password Grant) types fetch a token for each job, so a policy that touches many identities makes that many requests to the token endpoint. To reuse one token across the jobs in a policy run, set a token reuse window on the credential. Veza does not reuse tokens unless you set one.
Set Data Source to route execution through an Insight Point instead of the control plane. Use this when the target endpoint is unreachable from the Veza control plane.
Data Source
(Optional) Custom Provider data source to route through. Must be configured as an Insight Point Custom Application. When empty, the action runs on the control plane.
Test Connection checks whether Veza can reach the action's endpoint before the policy is saved. The button is the last item in the action's Credentials section, below Auth Credentials. It is enabled when the action has a URL or the selected credential has a default URL. Without a URL, the button is disabled.
When Test Connection is selected, Veza sends an HTTP HEAD request to the URL with a 10-second timeout:
If Data Source is empty, Veza sends the request from the Veza control plane.
If Data Source is set, Veza sends the request from that data source's Insight Point, as a job.
The test always uses HEAD, regardless of the action's HTTP Method. It does not send the action's request headers or payload, and it does not use the action's Timeout in seconds setting. Redirects are not followed, and {attribute_name} placeholders in the URL are not substituted during the test.
The result appears below the button.
How the test uses the selected credential:
Header, Basic, and Bearer credentials are sent as-is and are not verified. For these types, the success message states that the credentials were not verified.
If the credential has a URL, the tested URL must use the same host and port, and must not change the scheme from HTTPS to HTTP. Otherwise, Veza rejects the test and shows an error.
If the credential has no URL, the test runs without the credential.
If the endpoint is reachable only from a private network and Data Source is empty, the test fails with a message that begins Connection failed: unable to reach the endpoint from Veza's cloud. Set Data Source to a data source whose Insight Point can reach the endpoint, then test again.
For Send XML Payload, the test does not send the SOAPAction header or the XML payload.
The XML payload is checked for well-formedness at save time. Common rejections:
Multiple root elements
Non-whitespace text outside the root
Unbalanced or improperly nested tags
Validation runs again on the substituted payload at execution time, so a body that becomes ill-formed because of a substituted value fails safely instead of being sent.
Add the action through the Policy Editor or the policy update API:
Policy Editor: open the policy, choose Add New Action, then select Send XML Payload.
API: include the action in the policy's actions array. The action type identifier is SEND_XML_PAYLOAD. See Update Policy Configuration.
XML only. Use Send REST Payload for JSON payloads.
Content-Type is fixed to text/xml; override via Request Headers for a different media type.
No separate XML namespace registration: declare prefixes inline in each XPath expression.
Response parsing requires well-formed XML when Add response to output entities is enabled.
Streaming, multipart, and MTOM responses are not supported.
Timeout applies to the entire request; failed requests are not retried automatically.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<CreateUser xmlns="urn:example:hr">
<EmployeeId>{employee_id}</EmployeeId>
<Email>{email}</Email>
<Department>{department}</Department>
</CreateUser>
</soap:Body>
</soap:Envelope>Make HTTP requests to external APIs and services as part of provisioning workflows.
The Send REST Payload action sends an HTTP request to an external API when a workflow runs. Use it to connect provisioning workflows to custom applications, webhooks, and REST services that Veza has no native action for.
Common uses:
Notify external systems when users are created or updated in target systems
Trigger custom provisioning workflows in third-party applications
Send identity data to SCIM endpoints for user synchronization
Create service desk tickets for manual provisioning steps
Call webhooks to coordinate multi-system workflows
Extract response data, such as user IDs, from external systems for use in later actions
The URL and JSON payload can reference identity attributes with curly brace syntax. These attributes are available:
Source of Identity attributes: attributes from the identity source that triggered the workflow, such as Workday worker fields or Okta user attributes.
Output entity attributes from earlier actions: when an earlier action in the same workflow produces an output entity, its attributes are also available. For example, after a Provision Account action, the provisioned Active Directory user's attributes are available. See .
Generated password (Early Access): when a or action runs earlier in the workflow, the password it generated is available as {EntityType.password}. See .
Available transformations include UPPER, LOWER, and TRIM. To read an attribute from a specific entity type, prefix it with the entity type, such as {ActiveDirectoryUser.email}. See for the complete syntax.
When an Access Requests runs a Send REST Payload action, the action's JSON payload can include values that the requester enters in the catalog definition's form fields, such as a role name or resource ID.
Reference a form field as {$form_field.<name>}, where <name> is the form field's name. Veza adds nothing to the payload on its own: a form field reaches the target only through a placeholder in the payload. Other forms, such as $role_name or {role_name}, are not form field placeholders.
To set up form field substitution:
In a Provisioning Policy, create a Send REST Payload action whose JSON payload contains the placeholders:
Create a Send REST Payload that uses the action, and add form fields with matching names, such as role_name and role_id.
When a user submits an access request with this catalog definition, they complete the form fields. After the request is approved, Veza replaces each placeholder with the submitted value and sends the request.
Substitution follows these rules:
JSON payload only. Form field placeholders are not substituted in the URL or headers.
Inside a JSON string. Each placeholder must sit between two " characters, as in "roleName": "{$form_field.role_name}". A placeholder outside a string is left as is, so the payload fails to parse when the action runs.
Values are strings. Veza escapes quotes, backslashes, and control characters in the submitted value, so alice"bob is sent as alice\"bob
Form field and identity attribute substitution can be combined in one payload. For example, {"user": "{email}", "role": "{$form_field.role_name}"} takes the email from the source of identity and the role name from the access request form.
The JSON payload can also include details of the access request, with {$access_requestinfo.<token>} placeholders. They follow the same rules as form field placeholders: JSON payload only, inside a JSON string, and escaped. Tokens are case-sensitive:
requestedFor: who the access is for, by display name when one is available. When Veza can't determine a beneficiary, it uses the requester.
requestedBy: the user who submitted the request, by display name, then email.
comments: the business justification entered with the request.
A Provision Account action for Active Directory populates these attributes on its output entity. A later Send REST Payload action can use them in variable substitutions:
Custom properties defined in the integration configuration are also available, with the key customprop_<property_name>, where <property_name> is the property's format name as configured. A custom property is available only when the user has a value for it.
Password output is an Early Access feature that Veza Support enables for your tenant on request. When it is enabled and a or action runs earlier in the workflow, the password that action generated is available to the URL and JSON payload as {EntityType.password}, such as {ActiveDirectoryUser.password}. Joiner workflows use this to forward a new account's credentials to a downstream system, such as an HR portal or ticketing API.
When Add response to output entities is enabled, the action parses the JSON response and extracts the specified entity data. One API call can create a resource and return an identifier that later actions reference.
For example, if a user creation API returns:
Configure the action with:
Response Entity Attribute: result
Response ID Attribute: user_id
Response Name Attribute: display_name
The extracted entity becomes available to later actions in the workflow.
GET: query or check resource state. Doesn't count as a change.
POST: create a resource. The editor requires a payload.
PUT: replace a resource. The editor requires a payload.
PATCH: partially update a resource. The editor requires a payload.
The editor shows the JSON Payload field only for POST, PUT, and PATCH. When the request runs through an Insight Point, every method except GET, DELETE, and HEAD needs a payload.
Only send if prior actions resulted in a change runs the request only when an earlier action in the workflow made a change, including a Send REST Payload action whose method counts as a change. The setting can't tell a creation from an update: any change by an earlier action triggers the request. It applies only to requests sent from the Veza control plane. When Data Source is set, the setting is ignored and the request is sent.
A stored REST credential supplies the authentication header for the request. Credentials live in the REST/XML Credentials table under Administration > Credentials, where one entry serves many actions. To add one, select New REST/XML Credentials. Sensitive fields are encrypted at rest, and an entry can carry a default URL and HTTP method for actions that set neither.
To use one, select it from the Auth Credentials dropdown in the action configuration. For endpoints that don't require authentication, such as internal services, pre-authenticated webhook URLs, or endpoints behind a VPN, select a credential of type None. See for the supported authentication types and their fields, including the OAuth2 grants Veza performs on your behalf. That page also covers the , which governs how often Veza fetches a token.
A credential builds the authentication header and overrides the Authorization Header (Legacy) field. In the action editor, selecting any credential, including one of type None, clears the legacy header. For actions configured through the API, a None credential adds no header of its own and leaves an existing inline value in place.
Every credential type that adds a header sends it as Authorization. For an API that expects its key in a different header, such as X-API-Key, select a None credential and add the header under Request Headers.
Veza sends the field's whole value as the Authorization header, for example Bearer <token> or ApiKey <key>. Enter only the header value, not a header name: X-API-Key: <key> is sent as Authorization: X-API-Key: <key>.
Set Data Source to route the request through an Insight Point instead of the Veza control plane. Use this to reach endpoints that aren't publicly accessible, such as internal APIs behind a firewall. Leave it empty to send from the control plane. Requests sent from the control plane can't reach private, loopback, link-local, or other reserved addresses, so an endpoint on a private network needs an Insight Point.
The Data Source list shows the data sources enabled for Lifecycle Management. Select a Custom Application set up for Send REST Payload. See for its configuration.
Test Connection checks whether Veza can reach the action's endpoint before the policy is saved. The button is the last item in the action's Credentials section, below Auth Credentials. It is enabled when the action has a URL or the selected credential has a default URL. Without a URL, the button is disabled.
When Test Connection is selected, Veza sends an HTTP HEAD request to the URL with a 10-second timeout:
If Data Source is empty, Veza sends the request from the Veza control plane.
If Data Source is set, Veza sends the request from that data source's Insight Point, as a job.
The test always uses HEAD, regardless of the action's HTTP Method. It does not send the action's request headers or payload, and it does not use the action's Timeout in seconds setting. Redirects are not followed, and {attribute_name} placeholders in the URL are not substituted during the test.
The result appears below the button.
How the test uses the selected credential:
Header, Basic, and Bearer credentials are sent as-is and are not verified. For these types, the success message states that the credentials were not verified.
If the credential has a URL, the tested URL must use the same host and port, and must not change the scheme from HTTPS to HTTP. Otherwise, Veza rejects the test and shows an error.
If the credential has no URL, the test runs without the credential.
If the endpoint is reachable only from a private network and Data Source is empty, the test fails with a message that begins Connection failed: unable to reach the endpoint from Veza's cloud. Set Data Source to a data source whose Insight Point can reach the endpoint, then test again.
Only JSON payloads are supported. Requests are sent with Content-Type: application/json
Authentication is header-based. Through a stored credential, Veza can run the OAuth2 client credentials and password grants itself, but flows that require interactive user consent are not supported
Response parsing requires a JSON object when Add response to output entities is enabled
The timeout applies to each attempt. Veza retries a request up to five times, with backoff, after a 5xx or 429 response or a refused or reset connection. A retry can repeat a POST, so design the endpoint to tolerate a duplicate request
Value for the SOAPAction HTTP header, required by some SOAP 1.1 services.
XML Payload
Request body. Supports {attribute_name} substitution; substituted values are XML-escaped automatically.
Timeout in seconds
Request timeout in seconds. Range: 0–3600. 0 uses the driver default.
Only send if prior actions resulted in a change
When enabled, the request runs only if a prior action in the workflow modified or created resources. Cannot be combined with Insight Point execution.
Add response to output entities
Extract XPath-selected values from the response and expose them as entity attributes for downstream actions.
Output Entity Type
Entity type created from the response. Required when Add response to output entities is enabled.
Response Entity XPath
XPath selecting the parent node that contains the result data.
Response ID XPath
XPath selecting the entity identifier within the response.
Response Name XPath
XPath selecting the entity display name within the response.
Capture all child elements as attributes
(Advanced) Flatten every direct child element and XML attribute under the response entity node into the output entity's attribute map.
JSON Payload
Request body in JSON format. Shown for POST, PUT, and PATCH, and required for those methods in the editor. Supports for attribute substitution: {"user": "{name}", "email": "{email}"}
Timeout in seconds
Maximum wait for each attempt. 0 uses the default of 60 seconds. The maximum is 3600 seconds
Only send if prior actions resulted in a change
When enabled, the request runs only if an earlier action in the workflow made a change. See
Add response to output entities
Extract entity data from the API response to make available for downstream actions
Output Entity Type
Type of entity to create from the response. Required in the editor when Add response to output entities is enabled
Response Entity Attribute
(Optional) JSON path to extract from the response, using dot notation. For example, result extracts response.result, and data.user extracts response.data.user
Response ID Attribute
(Optional) Attribute in the response that holds the entity identifier. Defaults to id
Response Name Attribute
(Optional) Attribute in the response that holds the entity display name. Defaults to name
"5"5Field names. Names can contain only letters, numbers, and underscores: role_name is valid, role-name is not. A name with other characters can be saved on the catalog definition, but it is not substituted, and the literal placeholder is sent.
Missing values. If a placeholder names a field that the access request doesn't include, the placeholder is sent unchanged.
id: the access request ID.target: what was requested. For a catalog definition with no target entity, this is the catalog definition name.
Primary email address (mail)
given_name
Given name (givenName)
sur_name
Surname (sn)
display_name
Display name (displayName)
description
Description
title
Job title
department
Department
department_number
Department number (departmentNumber)
company
Company
office
Office
physical_delivery_office_name
Office location (physicalDeliveryOfficeName)
employee_id
Employee ID (employeeID)
employee_number
Employee number (employeeNumber)
employee_type
Employee type (employeeType)
manager_id
Manager (manager)
street_address
Street address (streetAddress)
city
City (l)
state_or_province_name
State or province (st)
postal_code
Postal code (postalCode)
country_code
Country code (countryCode)
password
Generated password (Early Access; see )
DELETE: remove a resource. A payload is optional and can be set only through the API.
HEAD (API only): metadata query without a response body. A payload is optional.
OPTIONS (API only): describe the communication options for a resource.
Redirects are not followed
URL
Target REST endpoint URL. Supports variable substitution with {attribute_name} syntax in the path and query parameters. A URL without a scheme is sent as https://. Required unless the selected credential supplies a URL
HTTP Method
The editor offers GET, POST, PUT, PATCH, and DELETE. HEAD and OPTIONS are accepted through the API. Methods are case-insensitive and sent in uppercase. Required unless the selected credential supplies a method
Authorization Header (Legacy)
Deprecated. The whole value is sent as the Authorization header, such as Bearer <token>. Appears only on actions that already have one. Use Auth Credentials instead. See Inline authorization header
Auth Credentials
Stored REST authentication credential. Required unless the action already has a legacy authorization header. Supplies the authentication header, and a default URL and HTTP method when this action sets neither. For endpoints that don't require authentication, select a credential of type None. See REST Auth Credentials
Request Headers
URL: https://api.example.com/users/{email}/provision?dept={department}
Payload: {"name": "{first_name} {last_name}", "role": "{job_title | UPPER}"}{"roleName": "{$form_field.role_name}", "roleId": "{$form_field.role_id}"}{"ticketTitle": "Access for {$access_requestinfo.requestedFor}", "reason": "{$access_requestinfo.comments}", "requestId": "{$access_requestinfo.id}"}name
Account name (sAMAccountName)
account_name
Account name (sAMAccountName)
distinguished_name
Distinguished name
user_principal_name
UPN (login name) (userPrincipalName)
Payload: {"username": "{user_principal_name}", "password": "{ActiveDirectoryUser.password}"}{
"result": {
"user_id": "12345",
"display_name": "Example User"
}
}(Optional) Custom headers sent with every request, each entered as a Header Name and Header Value. Header values are sent as entered, without variable substitution
email
{} as the payload.HTTP Method
POST
Auth Credentials
A Header credential with the value SSWS {your-okta-api-token}
JSON Payload
{}
lifecycle_status eq "Leave" or lifecycle_status eq "Parental Leave" or lifecycle_status eq "Garden Leave"https://{your-okta-domain}/api/v1/users/{employee_id | FROM_ENTITY_ATTRIBUTE,"OktaUser","employee_id","login"}/lifecycle/unsuspendWithout automated lifecycle management, organizations face a fragmented identity and access management landscape. Multiple systems require manual coordination, leading to delays in provisioning, security gaps from orphaned accounts, and compliance risks.
Veza Lifecycle Management provides a unified platform that automates identity provisioning and de-provisioning across your entire technology stack. Changes in your HR system automatically trigger coordinated workflows across all connected applications, ensuring consistent access management throughout the employee lifecycle.
Before you begin creating draft Policies for automating Lifecycle Management workflows, you should establish and document how employees in your organization are mapped to business roles, and corresponding birthright entitlements (default access permissions granted based on an employee's role) such as groups and roles in target applications.
Implementing Veza Lifecycle Management will require:
Defining segmentation criteria in terms of Business Roles for identities in your organization.
Defining Role Conditions used in Provisioning Policies that Veza will use to match roles to identities, based on attributes from the source of identity.
Defining Profiles for each target application that will map Business Roles to application-specific entitlements.
Assigning Profiles to Business Roles to enable business rules.
The topics in this document will help you structure your Lifecycle Management implementation, and establish foundations that you can use to simplify access management throughout the employee lifecycle.
Is a lifecycle management process defined for your organization?
If yes: Begin assessing your current policies for implementation with Veza Lifecycle Management.
If no: Work with application owners, HR administrators, and other stakeholders to establish protocols for granting and revoking access as employees join, depart, or change roles.
Do you have one, or even multiple sources of truth for employee identity metadata?
Implementing Lifecycle Management requires careful attention to access control, API key management, and credential handling to maintain security throughout your deployment.
Access control
Limit administrative access: Reduce standing administrator roles to those who need them. Best practice is no more than 5 administrators with standing access.
Use operator role for monitoring: Users with Operator roles can view Provisioning Policies without editing them. Use this role for monitoring and troubleshooting.
Temporary support access: When working with Veza support on LCM issues, grant temporary administrator privileges using Administration > Support User Access rather than creating permanent accounts.
API key management
Monitor Veza API keys and disable unauthorized keys. API calls made with keys that have administrator privileges can modify Provisioning Policies and Access Request Policies.
Key rotation best practices:
Review API keys quarterly
Revoke keys that are no longer in use
Document the purpose of each active key
Use separate keys for different automation purposes
Integration credentials
Credential lifecycle:
Track credential expiration dates and renew before expiry
Avoid editing integration credentials except when renewing them
Test credential changes in a sandbox environment before applying to production
Critical system protection: Identity source extractions are the most critical step in the LCM process. Handle integration configuration changes with care:
Schedule credential updates during maintenance windows
Verify extraction success immediately after credential changes
Have rollback procedures ready if extraction fails
Begin by identifying and cataloging the different roles that can be assigned to employees and their digital identities within your organization. Users will be granted entitlements within target applications based on these business roles based on your Lifecycle Management .
This list of business roles might be sourced from an organization chart, or a human resources information system (HRIS). These roles can be defined in terms of any discriminating attributes from a source of identity, such as:
Employee or contractor status
Roles and job positions
Business Units (BUs)
Locations
Define and list the different populations of employees with different levels of access in your organization (such as by roles, regions, and teams).
Example Business Roles:
Sales
Developers
Executive Employees
US Employees
China Employees
Identify the attributes and conditions that will identify the segment each user belongs to. The possible attributes will depend on the employee metadata provided by your HRIS or other source of truth for identity.
For example, you might assign certain Active Directory groups only to US employees, identified by a source Workday Worker's work_location. To define these conditions, you will need to understand what attributes are available within the source of truth, and how the values map to each employee segment.
Consider how employee records are structured in your source of identity, including all the built-in attributes belonging to an identity, and the possible values.
Check if any custom attributes can be used to define role conditions, and ensure these are enabled in the Veza Access Graph.
Document how employee populations correspond to the attribute values contained in the source of identity.
Examples: Source attributes for role conditions
The following standard attributes are available by all HRIS integrations that use an Open Authorization API template, along with any enabled for the integration. You can typically import data from any HRIS system to Veza using this template, sourced from a generated report, API calls, or CSV data.
Using this standard identity metadata, a Lifecycle Management workflow runs specific actions for identities where some or all of the conditions are true:
Employment Status equals "Pending"
Employment Types equals "Full Time"
Department equals "Engineering"
Work Location equals "US"
A Profile defines a set of entitlements for a specific application that can be assigned to users. For each target application, application owners will need to establish levels of birthright entitlements by defining Profiles mapped to groups, roles, or other entitlements that can be assigned to a user.
Review target applications to validate that the expected entitlements are configured, with the correct scopes and permissions for the Profiles they will be associated with.
Create Lifecycle Management mapped to those entitlements.
Examples: Access Profiles
When configuring the action, administrators can grant or revoke access by choosing a Business Role that inherits the desired Profile.
Configure to inherit the corresponding access profiles, mapping entitlements to employee segments.
Create Business Roles for each segment.
For each Business Role, inherit a corresponding access profile.
Assign one or more Profiles to each Business Role as needed to fully define the birthright entitlements for each position.
Examples: Map Business Roles to Profiles
Asia Employees
US Employees
Developers
Attributes from the source of identity can determine the attributes of users in target systems when creating or updating a target entity.
For example, a provisioned Okta User's country_code might be set to a source Workday Worker's work_location. Additionally, the Okta User manager attribute could be continually synchronized to match the Worker’s manager.
Target synced attributes can have fixed values (e.g., always true), can match a source attribute, or contain a combination of source values, transformed as needed to match the required format. Rules for synchronizing attributes are managed with .
For each application, understand the supported attributes for provisioned users.
Assess the identity metadata from your source of truth to decide how source entity attributes will be used to set the values of target entity attributes.
Veza can synchronize attributes during provisioning and de-provisioning workflows, and whenever a change is detected in the source of identity. Decide which attributes should have Apply On set to Create and update, and which should be set to Create only (and never modified after creating an entity).
Examples: Attribute Mappings
Sync Active Directory Accounts for Active Employees (Joiners/Movers)
When provisioning AD Users, create user attributes based on values in the source of identity. These attributes can also be kept up-to-date with the source of identity when there are changes, by setting Apply On to Create and update.
Sync Active Directory Attributes for Withdrawn Employees (Leavers)
When disabling AD Users, update the DN and Primary Group DN to a group and OU reserved for terminated employees:
Moving leavers into a "Terminated Users" group (via the primary_group_dn attribute) effectively restricts access to systems that rely on Active Directory for authentication and authorization.
Updating the distinguished_name to place leavers in a specific organizational unit (OU), like "Evergreen Termination," separates active users from inactive ones, and enables the application of policies, scripts, and queries that target inactive users without affecting active employees.
Use attribute formatters to dynamically select Access Profiles at runtime based on user attributes
Dynamic Access Profiles enable context-aware provisioning by enabling the Manage Entitlements action to resolve Access Profile names at runtime using user attributes.
Instead of explicitly selecting static Access Profiles when configuring a workflow, you can use attribute formatter expressions that evaluate to Access Profile names dynamically when the workflow executes. This is particularly valuable for organizations with complex access patterns based on attributes like department, location, role, or business unit.
This feature eliminates the need for separate workflow conditions for each profile combination, supporting configurations where a single workflow provisions users to different Access Profiles based on their identity attributes.
When a Lifecycle Management workflow runs with dynamic Access Profiles configured:
Attribute Evaluation: The system evaluates each dynamic Access Profile formatter expression using the identity's attributes. For example, if the expression is dept-{department | LOWER} and the user's department attribute is
At least one source of identity is required to trigger Lifecycle Management actions when there are changes in the data source. This data source could be an HRIS system, identity provider, directory service, or an exported report.
Veza supports importing employee records from built-in integrations, OAA integrations using the Custom HRIS template, and CSV upload.
For example, you may have different sources of identity for full-time and employees and contractors.
What scenarios will be automated?
A range of applications can be sources of identity and targets for Lifecycle Management, with different actions supported for each integration. See Actions and Integrations for the current capabilities.
Organize the populations hierarchically, each inheriting the access granted to its parent population. For example, you might have a structure "All Employees" > "Sales Team" > "Sales Managers," with each inheriting the access granted to the parent.
Create a Business Role in Veza to model each segment.
Employee's preferred first name.
Display Full Name
Full name for display; includes preferred first name if available.
Canonical Name
Employee's canonical name.
Username
Username as shown in the integration UI.
Employee's work email (unique).
IDP ID
ID for connecting to the destination IDP provider.
Personal Email
Employee's personal email.
Home Location
Employee's home location.
Work Location
Employee's work location.
Cost Center
Cost center ID associated with the employee.
Department
Department ID (Group ID) of the employee.
Managers
List of employee IDs of the employee's managers.
Groups
List of group IDs the employee is associated with.
Employment Status
Employment status, e.g., ACTIVE, PENDING, or INACTIVE.
Is Active
Indicates if the employee is active.
Start Date
The date the employee started working.
Termination Date
Employee's termination date, if applicable.
Job Title
Employee's job title.
Employment Types
Type of employment, e.g., FULL_TIME, PART_TIME, INTERN, CONTRACTOR, or FREELANCE.
Primary Time Zone
Employee's primary time zone.
Start Date on or after "2025-01-01"
Google Cloud
Google China Employees (Google Group)
username
{username}@evergreentrucks.com
display_name
display_full_name
{display_full_name}
given_name
first_name
{first_name}
sur_name
last_name
{last_name}
country_code
work_location
{work_location}
job_title
job_title
{job_title}
primary_group_dn
-
CN=Domain Users,CN=Users,DC=evergreentrucks,DC=local
Employee Number
Unique identifier for the employee.
Company
The company or subsidiary the employee works for.
First Name
Employee's first name.
Last Name
Employee's last name.
AD Executive Employees
Active Directory
Executive Employee - Manager US (Active Directory Group)
AD Engineering Managers
Active Directory
Engineering - Manager US (Active Directory Group)
Azure Helpdesk Role
Azure
Helpdesk Administrator (Azure AD Role)
account_name
display_full_name
{display_full_name}
distinguished_name
first_name, last_name
CN={first_name} {last_name},OU=Minnetonka,OU=US,OU=Evergreen Staff,DC=evergreentrucks,DC=local
user_principal_name
username
{username}@evergreentrucks.com
account_name
display_full_name
{display_full_name}
distinguished_name
first_name, last_name
CN={first_name} {last_name},OU=Evergreen Termination,OU=Evergreen Staff,DC=evergreentrucks,DC=local
primary_group_dn
-
CN=Terminated Users,OU=Evergreen Groups,DC=evergreentrucks,DC=local


Preferred Name
Google China Employees
Engineeringdept-engineeringName Resolution: The evaluated expression produces an Access Profile name.
Access Profiles must be named using a predictable, consistent pattern to facilitate resolution. Without consistent naming conventions, dynamic profile resolution will fail to match existing profiles.
Profile Lookup: Veza looks up an Access Profile with that exact name
Profile Application: If the profile exists in the RUNNING state, its entitlements are applied. Resolved profiles can contain entitlements across multiple target integrations, and dynamically resolved profiles can inherit entitlements from other profiles.
Graceful Continuation: If the profile name doesn't resolve or doesn't exist, Veza logs the issue to the Activity page and continues processing any other Access Profiles. This is the default behavior and ensures missing or non-existent profiles don't cause the entire workflow to fail.
Name-based Lookup: Dynamic Access Profiles resolve to profile NAMES, not IDs
Naming Convention Critical: Access Profiles must be named using a predictable, consistent pattern
Profile Inheritance Support: Dynamically resolved profiles can inherit entitlements from other profiles
Multi-Integration Support: Resolved profiles can contain entitlements across multiple target integrations
Graceful Failure: By default, missing or non-existent profiles don't cause the entire workflow to fail
Dynamic and static Access Profiles can be used together in the same action.
Selection Time
Policy configuration time
Workflow execution time
Identifier Type
Access Profile ID
Access Profile name (resolved from expression)
Validation
Profile existence validated when saving policy
Expression syntax validated when saving policy; profile existence checked at runtime
Before configuring Dynamic Access Profiles:
Create Access Profiles following a consistent naming convention that includes attribute values
Identify User Attributes that will drive profile selection (e.g., department, location, role)
Plan Naming Pattern that incorporates these attributes predictably
Navigate to Lifecycle Management > Provisioning > Policies
Create or edit a policy
Add or edit a Manage Entitlements action
In the Dynamic Access Profiles to Add section (or Dynamic Access Profiles to Remove, to remove profiles resolved at runtime):
Click Add Profile Name to add a new dynamic profile expression
Enter an attribute formatter expression that evaluates to an Access Profile name
Use the autocomplete to reference available attributes
Add multiple dynamic profile expressions as needed
Dynamic Access Profile expressions use the attribute formatter syntax:
Common Patterns include:
{department} - Direct attribute value
{department | LOWER} - Convert attribute value to lowercase
{OAA.Secondary.Employee.department} - Attribute from a secondary source of identity
TEAM-{department}-{businessUnitCode} - Multiple attributes combined with static text
{location | UPPER}-{role | LOWER} - Multiple attributes with different formatters
You can configure multiple dynamic Access Profile expressions in a single action by clicking Add Profile Name for each additional expression. Each expression is evaluated independently.
You can use IF/ELSE conditional logic within a Dynamic Access Profile expression to select different profile names based on user attributes. This allows a single expression to evaluate to different Access Profile names depending on the identity's properties.
Syntax:
You can use multiple ELSE IF branches to check several conditions in sequence:
Supported Comparison Operators:
eq
Equals
department eq "Engineering"
ne
Not equals
status ne "Terminated"
co
Contains
groups co "Admins"
Combine conditions with and, or, or negate with not. Use parentheses to group complex conditions.
Example: Complex Conditions with Logical Operators
This expression assigns the SalesforceAdmins profile to users who meet the complex department/role criteria, and No_Profile_Selected (a placeholder that resolves to no profile) for everyone else.
Using No_Profile_Selected as a Fallback
When using IF/ELSE logic, the ELSE branch must provide a value. If you don't want to assign a profile when conditions aren't met, use a placeholder name like No_Profile_Selected that doesn't match any actual Access Profile. The system will log that the profile wasn't found and continue processing other profiles gracefully.
Example: Configuring three dynamic profiles for department, location, and role-based access:
`dept-{department
`location-{location
`role-{role
In this configuration, the user receives entitlements from up to three Access Profiles based on their attributes. Each expression is added as a separate profile in the UI.
Success with Dynamic Access Profiles depends on establishing consistent naming patterns for your Access Profiles:
Use clear delimiters: Choose hyphens or underscores consistently (e.g., dept-engineering for department-based profiles or TEAM-dept-bu for multi-attribute combinations)
Add prefixes to organize: Group profiles by category (e.g., dept-{department}, loc-{location}, TEAM-{dept}-{bu})
Handle case sensitivity: Profile names are case-sensitive. Use transformers like LOWER or UPPER in your expressions to normalize values, and document your chosen convention
Document your convention: Ensure all teams follow the same naming pattern
Use ELSE IF for related conditions: When selecting one profile from multiple options based on the same attribute (e.g., department), use a single IF/ELSE IF/ELSE expression with multiple branches—this keeps your configuration simple and readable
Use multiple fields for independent criteria: Only add separate Access Profile Name fields when you need to evaluate completely independent conditions (e.g., one profile based on department AND another based on location)
Use fallback placeholders: When a condition shouldn't assign a profile, use a non-existent name like No_Profile_Selected as the ELSE value—the system will gracefully skip it
Test complex conditions: Use the Test Formatter feature to validate your IF/ELSE logic before deploying to production
Create profiles before processing: Always create Access Profiles before running workflows that reference them
The system performs name lookups at runtime: If a profile doesn't exist, it will be skipped
Plan for new attribute values: When adding new departments, locations, or roles to your organization, remember to create their corresponding Access Profiles first to avoid provisioning gaps
Before deploying to production, validate your configuration using dry-run mode to confirm profiles resolve correctly and attribute values match profile names exactly. Monitor your Lifecycle Management logs for "Dynamic access profile not found" messages, which indicate naming mismatches or missing profiles.
Profile not found on the Activity page
Name mismatch or profile is PAUSED
Check the Activity page for the exact resolved name; verify profile exists and is in RUNNING state
Formatter fails to resolve
Missing attribute or incorrect path
Verify attribute exists on identity node; check secondary node paths exist
Wrong profile applied
Similar profile names
Use distinctive naming patterns; avoid profile names that are substrings of others
Understanding Conditions and Transformers - Conceptual overview of the different evaluation systems
Access Profiles - Creating and managing Access Profiles
Manage Entitlements Action - Configuring the Manage Entitlements action
Attribute formatters - Available formatters and syntax
- Policy configuration and workflows
{attribute_path | formatter | formatter_2}IF <condition>
<profile_name_if_true>
ELSE
<profile_name_if_false>IF <condition1>
<profile_name_1>
ELSE IF <condition2>
<profile_name_2>
ELSE IF <condition3>
<profile_name_3>
ELSE
<default_profile_name>IF ((department eq "Finance") or (department eq "DigitalSales") or (department eq "FP&A") or (department eq "Fiscal Operations")) and (job_title eq "Account Manager")
SalesforceAdmins
ELSE
No_Profile_SelectedDepartment-based profile
Location-based profile
Each profile contains entitlements appropriate for that department
Dynamic Access Profile Configuration:
With this formatter prefix:
Runtime Behavior:
User with department=Engineering → Access Profile access-profile-engineering
User with department=Sales → Access Profile access-profile-sales
User with department=QA → Access Profile access-profile-qa
TEAM-Sales-12345
TEAM-QA-12345
Dynamic Access Profile Configuration:
Runtime Behavior:
User with department=Engineering and businessUnitCode=12345 → Access Profile TEAM-Engineering-12345
User with department=Sales and businessUnitCode=12345 → Access Profile TEAM-Sales-12345
User with department=QA and businessUnitCode=12345 → Access Profile TEAM-QA-12345
EMEA-manager
EMEA-engineer
Dynamic Access Profile Configuration:
Runtime Behavior:
User with location=us and role=Manager → Access Profile US-manager
User with location=emea and role=Engineer → Access Profile EMEA-engineer
dept-{department | LOWER}Runtime Behavior: Every user receives:
Entitlements from all-employees-base-access (static)
Entitlements from their department-specific profile (dynamic)
Runtime Behavior: The system evaluates the department attribute from the secondary HRIS Employee node, not the primary Okta User node.
M&A DepartmentInformation Technology Department - For IT users
(No actual profile named No_Profile_Selected exists)
Dynamic Access Profile Configuration:
This uses a single Access Profile Name field with multiple ELSE IF branches:
Runtime Behavior:
User in Legal department → Receives Legal Department profile
User in M&A department → Receives M&A Department profile
User in IT department → Receives Information Technology Department profile
User in any other department → No profile assigned (resolves to non-existent No_Profile_Selected)
Salesforce User - For specific test users(No actual profile named No_Profile_Selected exists)
Dynamic Access Profile Configuration:
This requires two separate Access Profile Name fields because you want to potentially assign both profiles to the same user. Click Add Profile Name to add the second field.
Access Profile Name (Field 1) - Department/Role based:
Access Profile Name (Field 2) - Test user override:
Runtime Behavior:
User in Finance department with "Account Manager" title → Receives SalesforceAdmins profile
User with first_name "user04" → Receives Salesforce User profile
User meeting both conditions → Receives both profiles
User meeting neither condition → No profiles assigned (both resolve to non-existent No_Profile_Selected)
Flexibility
Fixed set of profiles
Adapts based on user attributes
Use Case
Universal access for all users in a workflow
Conditional access based on attributes
Scalability
Requires separate conditions for variations
Single workflow handles all variations
Failure Behavior
Policy creation fails if profile doesn't exist
Graceful continuation if profile doesn't exist
sw
Starts with
location sw "US-"
ew
Ends with
email ew "@company.com"
gt
Greater than
employee_count gt 100
ge
Greater than or equal
start_date ge "2024-01-01"
lt
Less than
risk_score lt 50
le
Less than or equal
level le 5
ELSE statement has to be last
Two separate IF blocks in one field
IF department eq "Sales"
SalesProfile
ELSE IF department eq "Engineering"
EngineeringProfile
ELSE
No_Profile_SelectedIF customprop_custom_department eq "Legal"
Legal Department
ELSE IF customprop_custom_department eq "Mergers and Acquisitions"
M&A Department
ELSE IF customprop_custom_department eq "Information Technology"
Information Technology Department
ELSE
No_Profile_SelectedIF department eq "Sales"
SalesProfile
ELSE
No_Profile_Selected
IF location eq "US"
USProfile
ELSE
No_Profile_SelectedIF department eq "Sales"
SalesProfile
ELSE IF department eq "Engineering"
EngineeringProfile
ELSE
DefaultProfile{department | LOWER}access-profile-{department | LOWER}TEAM-{department}-{businessUnitCode}{location | UPPER}-{role | LOWER}access-profile-{OAA.Secondary.Employee.department | LOWER}IF customprop_custom_department eq "Legal"
Legal Department
ELSE IF customprop_custom_department eq "Mergers and Acquisitions"
M&A Department
ELSE IF customprop_custom_department eq "Information Technology"
Information Technology Department
ELSE
No_Profile_SelectedIF ((department eq "Finance") or (department eq "DigitalSales") or (department eq "FP&A") or (department eq "Fiscal Operations")) and (job_title eq "Account Manager")
SalesforceAdmins
ELSE
No_Profile_SelectedIF first_name eq "user04"
Salesforce User
ELSE
No_Profile_SelectedComplete reference for SCIM filter syntax used in Lifecycle Management workflow trigger conditions
This page provides a comprehensive reference for the SCIM filter syntax used in Lifecycle Management workflow trigger conditions. Trigger conditions determine when a workflow action should execute based on identity attributes.
SCIM (System for Cross-domain Identity Management) filter syntax provides a standardized way to express conditions. The basic structure is:
<attribute> <operator> <value>For example:
department eq "Engineering"This condition evaluates to true when the identity's department attribute equals "Engineering".
The pr (present) operator does not evaluate as expected in LCM conditions. To test that an attribute has a value, use attribute ne "".
Timestamp comparisons use ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ).
For attributes that contain multiple values (arrays), the following operators are supported:
String operators compare attribute values case-sensitively. For example, department eq "Sales" matches Sales but not sales or SALES. This applies to every string operator, including ne, co, sw, and ew.
To compare values regardless of case, normalize both sides with a transformer such as LOWER or UPPER. See .
Write attribute names in lowercase (for example, department, not Department). Source attribute names are stored in lowercase, and such as sys_attr__is_mover must be written in their exact lowercase form.
Combine multiple conditions using logical operators.
not has the highest precedence
and has higher precedence than or
Use parentheses () to control evaluation order
Example combining operators:
Two system attributes support mover detection:
sys_attr__is_mover: Set to true when any property in the policy's Mover Properties list changes. Indicates that the identity changed, but does not identify which property changed.
sys_attr_changed__<property>: Set to true for each specific property that changed in the most recent extraction. These attributes are transient and are cleared at the start of each extraction cycle.
Use sys_attr__is_mover when you want to trigger on any mover event. Use sys_attr_changed__<property> when you need to trigger only on specific property changes or combinations.
Broad mover detection with sys_attr__is_mover:
Targeted mover detection with sys_attr_changed__:
See for the full sys_attr_changed__ reference.
Lifecycle Management provides two families of computed system attributes for use in trigger conditions:
sys_attr__ prefix: Persistent boolean flags such as sys_attr__is_mover (any monitored property changed) and sys_attr__is_new_identity (first appearance of an identity).
sys_attr_changed__ prefix: Per-property change detection attributes, transient per extraction cycle. sys_attr_changed__department eq true means department changed in the most recent extraction.
See for the complete reference.
For time-sensitive workflows, you can embed transformer functions directly in condition values. This enables comparisons against dynamically-computed dates and times rather than static values.
Embedded transformers use the {| FUNCTION | ...} syntax. The pipe (|) immediately after the opening brace indicates there is no source attribute—the expression starts directly with a function:
This differs from attribute transformers where you reference an attribute first:
Attribute transformer: {hire_date | DATE_FORMAT, "DateOnly"} (starts with attribute)
Embedded in condition: {| NOW | DATE_FORMAT, "DateOnly"} (starts with function)
See for all available functions.
Trigger a leaver workflow when an employee's last day of work falls within a 2-day window around today (Eastern Standard Time):
Breaking down the embedded transformer:
Result: The workflow triggers when:
The employee is active (is_active eq true)
Their last day is today or earlier (le today)
Their last day is after 2 days ago (gt 2 days ago)
This creates a 2-day processing window for departing employees.
Trigger a joiner workflow 7 days before an employee's start date:
This triggers for employees whose hire date is within the next 7 days, enabling pre-provisioning of accounts before their start date. For a Workday source of identity, see for how Veza marks pre-hire Workers and the integration setting they require.
Trigger a cleanup workflow for employees terminated more than 30 days ago:
For a conceptual overview of how conditions and transformers work together, see .
Available in Veza v2026.8.31 and later.
A WHEN() expression compares a date attribute to the current date, a fixed date, or another date attribute. Veza converts each expression into the equivalent embedded-transformer comparison (see ) every time it evaluates the condition, so you don't write the NOW and DATE_ADJUST_DAY pipeline yourself.
The attribute comes first and is required.
WHEN and the pattern keywords are case-insensitive. when(start_date within last 7 days) and WHEN(start_date WITHIN LAST 7 DAYS) are equivalent.
A WHEN() expression is a complete clause. Combine it with other clauses using and
You can use WHEN() in workflow trigger conditions (Identity matches this condition) and in When this condition matches conditions. Transformers and attribute formatters don't accept it.
In the table, N and M are day counts. A day count is a positive whole number or the name of an attribute that holds one. DATE is a date in YYYY-MM-DD format or the name of another date attribute.
WHEN() counts only in days. Write day or days after the count. For a week, use 7 days. For month and year spans, use a embedded transformer instead.
The condition editor rejects an expression that:
Has no closing parenthesis, or has no attribute before the pattern
Uses a day count of zero or less, or a between range where N isn't less than M
Uses a date that isn't in YYYY-MM-DD format
Each attribute that begins a WHEN() expression needs an entry in Properties for ‘When’ Expressions in Conditions. The entry sets the format and time zone Veza uses to build the comparison dates for that attribute.
In Select Format, choose Date Only for attributes that store a calendar date, such as 2026-01-15. Choose Date and Time for attributes that store a timestamp, such as 2026-01-15T08:00:00Z.
The time zone decides when "today" begins and ends. Choose one time zone for every identity, or select Based on Location (Lookup Table) to read each identity's time zone from a policy lookup table. For a lookup, select the Key Attribute on the identity, the Lookup Table, the Match on Column that holds the key values, and the return column that holds an IANA time zone name (such as America/New_York) or a UTC offset (such as -05:00). An identity whose key value has no matching row uses UTC. An identity without the key attribute doesn't match the WHEN() expression.
To add an entry:
Open the policy's draft version and select the Workflow Components tab.
Select the Properties card.
Under Properties for ‘When’ Expressions in Conditions, click Add.
In Select Source Attributes, select one or more attributes. The list shows only date and time attributes, and an attribute can belong to only one entry.
Changes to these entries take effect when you publish the policy version. You can't delete an entry while a WHEN() expression uses one of its attributes.
While you type a condition, the editor flags any WHEN() attribute that has no entry, and the condition isn't valid until you add one. Click Add Properties to create an entry, or Apply Properties to add the attributes to the most recently added entry with its format and time zone.
is today, is DATE, before today, and after today compare dates only, whatever the format. The time zone doesn't apply to before DATE, after DATE, and is DATE. A policy saved through the API without an entry for an attribute uses Date Only and UTC for that attribute.
An identity that has no value for the attribute doesn't match the within, between, after, or is patterns. It does match the before patterns, because Veza treats a missing date as earlier than any date. To exclude those identities, add a non-empty check:
Veza compares attribute values in ISO 8601 form, such as 2026-01-15 or 2026-01-15T08:00:00Z, as dates. It compares values in other formats, such as 01/15/2026, as text, and those comparisons don't return reliable results.
Veza evaluates a WHEN() expression against the current time at each policy run, so an identity can start matching without any change to its attributes. With Only when identity properties change and Specific properties selected, a workflow doesn't run for a match caused only by the passage of time. See the .
When identities work in different time zones, a single fixed time zone can start a workflow a day early or a day late for some of them. To evaluate "today" in each identity's own time zone, read the time zone from a lookup table keyed on an identity attribute, such as the office location.
Create a lookup table that maps each location to an IANA time zone name or a UTC offset, and add it to the policy's draft version. See .
Veza determines "today" separately for each identity, so a New York hire and a Singapore hire with the same start date each match on their own local date. The workflow runs at the first policy run that falls on that local date. If no policy run falls on that date, the identity doesn't match. To allow for a missed run, use within last N days instead. An identity whose location has no row in the table uses UTC, and an identity without a location value doesn't match.
Because the match comes from the date changing, not from a change to the identity's attributes, a workflow with Only when identity properties change and either Specific properties or Used properties selected doesn't run for it. See the .
Before enabling a policy, use the Dry Run feature to preview which identities match your trigger conditions. This helps catch overly broad or restrictive conditions before they affect real accounts.
To evaluate a single condition clause by clause against sample attribute values, select Test under the condition field. See .
Consider what happens when attributes are null or empty:
Check value case: String values are matched case-sensitively — eq "Sales" will not match sales. Normalize with LOWER or UPPER if needed (see ).
Check attribute names: Ensure the attribute name matches the source attribute, using its lowercase form
Verify data types
Add specificity: Combine multiple conditions with and
Check for broad patterns: co "" matches all non-null values
Verify logical grouping: Ensure and/or precedence is correct
Use ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ
Include timezone: Always use Z suffix for UTC
Check attribute type: Ensure the source attribute is a timestamp, not a string
- Conceptual overview of conditions vs. transformers
- Create and configure Provisioning Policies
- Configure workflow actions and their triggers
- Transform attribute values using formatter syntax
sw
Starts With
Prefix match
employee_id sw "EMP"
ew
Ends With
Suffix match
email ew "@company.com"
Less Than
Strictly less than
access_level lt 5
le
Less Than or Equal
Less than or equal to
risk_score le 50
gt
Greater Than
Strictly greater than
tenure_months gt 12
ge
Greater Than or Equal
Greater than or equal to
salary_grade ge 3
At or Before
At or earlier than
start_date le "2024-12-31T23:59:59Z"
gt
After
Later than
hire_date gt "2023-01-01T00:00:00Z"
ge
At or After
At or later than
last_login ge "2024-01-01T00:00:00Z"
List does not match value(s)
tags ne "deprecated"
Format for comparison
`{
EST timestamp
Today (or -2 for 2 days ago)
4
DATE_FORMAT, "DateOnly"
Adjusted timestamp
Date string for comparison
orWHEN(start_date within next 7 days) and department eq "Sales"between N and M days from now
Between N and M days in the future, excluding both boundary days. N must be less than M.
WHEN(contract_end_date between 30 and 90 days from now)
before now, after now
Earlier or later than the current time. With the Date Only format, Veza compares against today's date.
WHEN(termination_date before now)
before today, after today
Earlier or later than today's date
WHEN(start_date after today)
is today
Today's date
WHEN(start_date is today)
before DATE, after DATE
Earlier or later than DATE
WHEN(start_date before 2027-01-01)
is DATE
The same as DATE
WHEN(start_date is hire_date)
N days before <attribute>
Earlier than the date N days before the other attribute
WHEN(start_date 5 days before hire_date)
N days after <attribute>
Later than the date N days after the other attribute
WHEN(start_date 30 days after hire_date)
Uses is now. Use before now or after now instead.
Adds words after the pattern, such as as datetime or in America/New_York. Set the format and time zone in the policy properties instead.
Choose the format and the time zone, then click Save.
Add an entry for start_date under Properties for ‘When’ Expressions in Conditions, as described in Set the date format and time zone. Select Date Only and Based on Location (Lookup Table), then set:
Key Attribute: location
Lookup Table: the table from step 1
Match on Column: location
Return Column for Timezone Value: time_zone
Use the attribute in the workflow's trigger condition:
Review operator choice: co for contains vs. eq for exact match
Use Dry Run: Test the condition against specific identities
Test the condition: Select Test under the condition field to see which clauses match sample values. See Test conditions and formatters.
Transformer Reference - Complete list of transformation functions
System Attributes - Available system attributes for conditions
Dynamic Access Profiles - Formatter-based profile assignment
Attribute Mapping - Map source attributes to target attributes
eq
Equal
Exact match (case-sensitive)
department eq "Sales"
ne
Not Equal
Does not match
status ne "Terminated"
co
Contains
Substring match
email co "@company.com"
eq
Equal
Exact numeric match
department_code eq 100
ne
Not Equal
Does not equal
level ne 0
eq
Equal
Boolean match
is_active eq true
ne
Not Equal
Boolean inverse
is_contractor ne true
eq
Equal
Exact timestamp match
hire_date eq "2024-01-15T00:00:00Z"
lt
Before
Earlier than
termination_date lt "2024-06-01T00:00:00Z"
co
Contains
List contains a specific value
employee_types co "Full Time"
eq
Equal
List exactly matches value(s)
roles eq "Admin"
ne
and
Both conditions must be true
is_active eq true and department eq "IT"
or
Either condition must be true
department eq "IT" or department eq "Engineering"
not
Negates a condition
not(status eq "Terminated")
NOW
Current UTC timestamp
`{
UTC_TO_TIME_ZONE
Convert to specific timezone
`{
DATE_ADJUST_DAY
Add/subtract days
`{
1
NOW
(none)
Current UTC timestamp
2
UTC_TO_TIME_ZONE, "-05:00"
UTC timestamp
Eastern time timestamp
3
within last N days
In the last N days, up to and including today
WHEN(start_date within last 7 days)
within next N days
In the next N days, starting today
WHEN(start_date within next 7 days)
between N and M days ago
Between N and M days in the past, excluding both boundary days. N must be less than M.
WHEN(termination_date between 30 and 90 days ago)
New York
America/New_York
London
Europe/London
Singapore
lt
le
Not Equal
DATE_FORMAT
DATE_ADJUST_DAY, 0
Asia/Singapore
WHEN(start_date is today)# Full-time employees in Engineering or IT departments
employee_types co "Full Time" and (department eq "Engineering" or department eq "IT")# New full-time employees in specific departments
employee_types co "Full Time" and (department eq "Engineering" or department eq "Sales")
# New hires with specific job levels
is_active eq true and job_level ge 3 and hire_date gt "2024-01-01T00:00:00Z"
# Contractors starting in a specific region
is_contractor eq true and location sw "US-"# Any change in monitored properties for active employees
sys_attr__is_mover eq true and is_active eq true
# Department-specific mover handling (identity moved AND is now in Engineering)
sys_attr__is_mover eq true and department eq "Engineering"
# Mover detection combined with employment type
sys_attr__is_mover eq true and is_active eq true and employee_types co "Full Time"# Triggers only when department changes TO Sales (not when Sales employees change other attributes)
department_name eq "Sales" and sys_attr_changed__department_name eq true
# Triggers when manager changes for active employees in specific departments
sys_attr_changed__managers eq true and employment_status eq "ACTIVE" and (department_name eq "Engineering" or department_name eq "Marketing" or department_name eq "Sales")
# Triggers when any of several properties change
(sys_attr_changed__department_name eq true or sys_attr_changed__job_title eq true or sys_attr_changed__managers eq true) and employment_status eq "ACTIVE"
# Triggers only when BOTH a location field AND manager change in the same extraction
(sys_attr_changed__customprop_management_chain_level_03 eq true or sys_attr_changed__customprop_management_chain_level_04 eq true) and sys_attr_changed__managers eq true# Terminated employees
employment_status eq "Terminated"
# Inactive contractors
is_active eq false and is_contractor eq true
# Users with imminent termination date
termination_date le "2024-12-31T23:59:59Z" and termination_date gt "2024-01-01T00:00:00Z"# High-privilege access for senior engineers
department eq "Engineering" and job_level ge 5 and is_active eq true
# Region-specific access
location sw "EMEA-" and employee_types co "Full Time"
# Cost center based provisioning
cost_center eq "CC-1000" and is_active eq true{| NOW | UTC_TO_TIME_ZONE, "-05:00" | DATE_FORMAT, "DateOnly"}is_active eq true
and customprop_lastdayofwork le "{| NOW | UTC_TO_TIME_ZONE, \"-05:00\" | DATE_ADJUST_DAY, 0 | DATE_FORMAT, \"DateOnly\"}"
and customprop_lastdayofwork gt "{| NOW | UTC_TO_TIME_ZONE, \"-05:00\" | DATE_ADJUST_DAY, -2 | DATE_FORMAT, \"DateOnly\"}"is_active eq false
and hire_date le "{| NOW | DATE_ADJUST_DAY, 7 | DATE_FORMAT, \"DateOnly\"}"
and hire_date gt "{| NOW | DATE_FORMAT, \"DateOnly\"}"employment_status eq "Terminated"
and termination_date lt "{| NOW | DATE_ADJUST_DAY, -30 | DATE_FORMAT, \"DateOnly\"}"WHEN(<attribute> <pattern>)WHEN(termination_date before today) and termination_date ne ""# Joiner: start date is today or in the next 7 days
WHEN(start_date within next 7 days) and employee_types co "Full Time"
# Leaver: termination date has passed
WHEN(termination_date before today) and termination_date ne ""
# Cleanup: terminated between 30 and 90 days ago
WHEN(termination_date between 30 and 90 days ago) and employment_status eq "Terminated"# Good: Specific and targeted
department eq "Engineering" and job_level ge 3 and is_active eq true
# Avoid: Too broad, may affect unintended users
department eq "Engineering"# Use parentheses for clarity when mixing and/or
(department eq "IT" or department eq "Engineering") and is_active eq true
# Without parentheses, this evaluates differently due to precedence:
# department eq "IT" or (department eq "Engineering" and is_active eq true)
department eq "IT" or department eq "Engineering" and is_active eq true# Explicit check for non-empty department
department ne "" and department eq "Engineering"
# Check for active status before other conditions
is_active eq true and department eq "Engineering"Guide for implementing automated user lifecycle management across Workday, Okta, and Active Directory
A well-designed identity Lifecycle Management solution automates the provisioning, synchronization of attributes and metadata, and deprovisioning of user accounts across your application and systems ecosystem.
This guide demonstrates how to implement a worker (employees and contractors) Lifecycle Management solution using Workday as the source of identity with downstream user account provisioning and synchronization platforms of Okta and Active Directory (AD). This represents a common enterprise architecture where worker records originate in an HR system and are provisioned to identity and access management systems, while maintaining a seamless, secure, and compliant user lifecycle process.
The following diagram shows the complete identity provisioning and synchronization architecture from Workday, a human capital management platform, to Okta and Active Directory, which are identity management systems:
The "Joiner Mover Leaver" (JML) process is a framework for managing users' employment lifecycle access within an organization. Provisioning access begins with onboarding new employees (Joiners), then managing internal transitions (Movers), and finally offboarding departing employees (Leavers).
Lifecycle Management is based on the JML paradigm, where Workday is the authoritative source of identity, which is monitored for the status of the worker based on attributes in their record to determine whether the user is a joiner, mover, or leaver.
The joiner, mover, leaver (JML) process flows through the systems as follows:
Before starting this implementation, ensure you have:
Completed at least one successful extraction for each integration
Note: An extraction is the metadata ingestion process that pulls identity and permission data from target systems into Veza, enabling it to act across access policies, governance, and provisioning workflows.
First, create Access Profiles that define which application entitlements a group of users will be assigned:
Go to Access Profiles > Access Profiles
Click Create
Configure a profile for each department or role:
Create additional profiles as needed based on your organizational structure.
Next, create a Provisioning Policy using Workday as the source of identity:
Navigate to Lifecycle Management > Provisioning > Policies
Click Create Provisioning Policy
Configure the policy:
Provisioning Policy Name: Workday Employee Lifecycle
Now add a workflow for new employee onboarding:
Edit your Workday Employee Lifecycle policy
Click Create Workflow
Configure the workflow:
Workflow Name: Active Employee
Add a workflow for handling employee role changes:
Edit your Workday Employee Lifecycle policy
In the workflows list, click Create
Configure the workflow:
Workflow Name: Mover Workflow - Regional Sales Manager
Finally, add a workflow for employee termination:
Edit your Workday Employee Lifecycle policy
In the workflows list, click Create
Configure the workflow:
Workflow Name: Employee Termination
After configuring your workflows for joiners, movers, and leavers, you can test your policy using Simulated Dry Runs to check the expected actions when executed.
Another approach to test your policy is to create draft versions. You can make changes to your policy as an iterative draft until you are satisfied with the results. You can then publish the final version and enable it.
As a final verification, make modifications to the Workday application to test your policy's expected performance. Ensure that the downstream applications, Okta and Active Directory, are correct with the modifications.
Select Workday Employee Lifecycle policy.
Click Dry Run at the top of the page.
Select Single Dry Run.
In the Identity field, select an employee name from the dropdown menu.
Select Workday Employee Lifecycle policy.
Click Create Draft. If a draft already exists, click Go to Draft Version instead.
Select Edit Workflow.
Modify any workflow in your policy.
In your Workday application, update the source of identity to test your policy. The following is a list of suggested changes:
Change the employee’s employee type (ie, from regular to contractor)
Verify account creation in Okta and Active Directory
Change the employee's department and verify group membership updates
Terminate the employee and verify account deprovisioning
Identity Synchronization is implemented during Lifecycle Management provisioning workflows. It is used to prevent provisioning errors due to duplication of username and/or email address. It supports robust identity sync across downstream applications (Okta and Active Directory) with different naming constraints or enforces unique identifiers.
Use Identity Synchronization if your target system already has an identity with a given attribute (e.g., a username or email is already in use).
Configure the on each workflow, under Run Workflow → Identity properties. For the Workday to Okta and Active Directory pattern, Only when identity properties change is typical: Workday emits reliable change events, so the extra re-processing of unchanged identities under Every extraction is usually unnecessary.
Synchronizes employee records to Okta user accounts, creating and updating user profiles with mapped worker attributes from Workday.
Configuration:
Description: Synchronizes identities to Okta
Entity Type: OktaUser
Create accounts: On (Veza creates identities that don't already exist)
Update existing accounts: On (Veza keeps attributes in sync after creation)
All Employees
Assigns "All Okta Employee Access" profile
Entitlement Removal: None
US Developers
Condition: wd_location eq "US" and department eq "developer"
Assigns developer-specific access profiles
Entitlement Removal: None
Creates and updates on-premises Active Directory accounts with location-specific group assignments and standardized naming conventions for different employee categories.
Configuration:
Description: Synchronizes identities to Active Directory
Entity Type: ActiveDirectoryUser
Create accounts: On (Veza creates identities that don't already exist)
Update existing accounts: On (Veza keeps attributes in sync after creation)
US Location
Condition: work_location eq "US"
Assigns US Groups
Entitlement Removal: All not listed in this action
Executive Group
Condition: employee_group eq "Executive"
Assigns the Executive Employee group
Entitlement Removal: All not listed in this action
China Location
Condition: work_location eq "China"
Assigns China Groups
Entitlement Removal: All not listed in this action
Defines the procedures for safely removing access when employees leave the organization, including specific handling for each identity provider.
Handles employee offboarding in Okta by disabling accounts while preserving access history and configurations.
Configuration:
Description: Disables identities in Okta
Entity Type: OktaUser
Remove all entitlements: No
Deprovision Type: Disable
Controls the offboarding process for on-premises Active Directory, including moving accounts to a terminated user's organizational unit.
Configuration:
Description: Disables identities in Active Directory
Entity Type: ActiveDirectoryUser
Remove all entitlements: No
Deprovision Type: Not shown. Active Directory supports only Disable, which Veza applies automatically.
Below are more detailed examples of joiner, mover, and leaver scenarios that you can implement using Veza's Lifecycle Management.
To handle edge cases where standard attribute formatting is not effective, use to define special exceptions. For example:
Contractors versus Employees: Use different username formats based on employment type
Username Conflicts: Configure fallback formatters for handling duplicate usernames
Location-Specific Naming: Apply different naming conventions based on location or region
Ensure your email addresses remain consistent by configuring email write-back to Workday:
In your Joiner workflow, after the Provision Account actions, add:
Add New Action > Create Email
Configure for your email system
Then add:
This ensures the email created in your systems is written back to Workday as the source of truth.
When implementing conditional actions, consider these patterns for robust lifecycle management:
Monitor your lifecycle management workflows using the page:
Navigate to Lifecycle Management > Activity
Filter by policy name to see all actions for your Workday policy
Look for failed actions and investigate error messages
Use the activity details to verify that transformations are working correctly
If usernames are already taken in target systems:
Configure to handle conflicts
Use employee ID or other unique identifiers as backup username formats
If required attributes are missing from Workday:
Use to provide fallback values
Configure conditional logic to handle missing data gracefully
If group assignments fail:
Verify that referenced groups exist in target systems
Check that service accounts have sufficient permissions
Use conditional logic to assign groups only when they exist
Overview of supported provisioning integrations in Veza, with capabilities and supported actions for target applications and sources of identity.
This page covers the integrations that power Lifecycle Management workflows and can act as identity sources for Provisioning Policies, and target applications that can be provisioned or deprovisioned.
Enabling provisioning on an integration also makes it available to other Veza products that use write-back capabilities, including Access Intelligence (Disable Accounts) and Access Requests. The integration tables below represent the validated, production-ready set for Lifecycle Management specifically.
Veza supports four implementation pathways:
Native Integrations: Direct, API-based provisioning, with out-of-the-box support for 25+ validated target applications (listed below).
SCIM 2.0 Protocol: Standards-based provisioning for any enterprise application that exposes a SCIM 2.0 interface.
OAA Write Framework: Veza's Open Authorization API (OAA) extends write-back to applications that Veza does not integrate with natively. This pathway is typically used for homegrown and custom applications.
Direct REST, XML, and SQL Actions: For an application that neither integrates natively nor exposes a SCIM interface, a dedicated Send REST Payload, Send XML Payload, or Send SQL Command action calls the target system directly. Use these actions to notify a platform when a joiner, mover, or leaver (JML) workflow completes, or to start work in that platform as a workflow step.
Combined, these approaches cover the enterprise application landscape reachable via Lifecycle Management target applications and actions: natively integrated systems, any SCIM-compliant application, homegrown and custom applications modeled through OAA, and any remaining system that exposes a reachable REST, XML or SOAP, or SQL interface.
The validated integrations listed below represent tested, production-ready configurations. For additional integration support, contact your Customer Success Manager.
Identity sources are authoritative systems that provide information about user identities. While Veza does not require write permissions to the identity source of truth, some of these integrations are also supported as provisioning targets. Integrations can also allow write-back of a user's newly created email address to the user's record in the source of identity as part of the initial provisioning workflow.
Veza supports leading HR systems, IDPs and directory services, ITSM platforms, payroll systems, custom applications, and flat files:
The following integrations are validated as provisioning targets for Lifecycle Management workflows. Enabling provisioning on an integration enables actions (create, sync, deprovision, manage entitlements) that can be triggered from Provisioning Policies and from other Veza products.
Validated Integrations
The following table lists the out-of-the-box, Veza-validated target application integrations.
Other Supported Integrations
For any Veza-supported application not listed above, contact your Customer Success Manager for more details on how to enable the specific Veza integration for use with provisioning as a target application for provisioning and de-provisioning.
Direct REST, XML, and SQL Actions
For an application that does not integrate with Veza natively and does not expose a SCIM interface, a workflow can call the target system directly:
makes an HTTP request to an external API, webhook, or REST-based service.
sends an XML or SOAP-over-HTTP body to a legacy endpoint.
runs a SQL statement against MySQL, Microsoft SQL Server, Oracle, PostgreSQL, or SAP IQ (Sybase IQ).
Use these actions to notify a platform when a joiner, mover, or leaver workflow completes, to start work in that platform, or to coordinate provisioning across multiple downstream applications. Because each action targets an endpoint you supply, the three actions together extend provisioning support to systems that have no native or SCIM connector.
An Insight Point is required to enable provisioning operations and identity discovery for systems that Veza cannot access directly, such as an on-premises application server behind a firewall. The Insight Point is a lightweight connector that runs in your environment, enabling secure gathering and processing of authorization metadata for provisioning tasks.
A Veza Insight Point is typically deployed as a Docker container or VM OVA, running within your network for metadata discovery and provisioning job execution. This ensures secure communication between your environment and Veza.
For deployment instructions, refer to the .
You can configure extraction intervals for your integrations to ensure data is regularly updated for provisioning workflows.
Go to Veza Administration > System Settings
In the Integrations section, set the global Extraction Interval
To override the global setting for specific integrations, use the Active Overrides section
Available extraction intervals are:
Auto (each integration's default, which is 1 hour for most of them)
1 Hour
6 Hours
12 Hours
1 Day
One hour is the shortest extraction interval for most integrations. A 15-minute option appears in the Discovery Interval control, which is a separate setting and does not apply to extraction. See .
To manually trigger an extraction:
Go to Integrations > All Data Sources
Search for the desired data source
Select Actions > Start Extraction
Note: Custom application payloads are extracted after the payload is pushed to Veza using the Open Authorization API.
To enable provisioning for a specific integration:
Open the Integrations page (in the Featured section of the navigation sidebar), or Lifecycle Management > Integrations (in the Products section).
Search for the integration you want to enable and open its settings.
Check the Enable usage for Provisioning checkbox, then click Save Configuration.
After saving, the integration shows Enabled in the Provisioning Support column on the Integrations overview. The column shows one of four states for each integration:
To verify the health of the provisioning data source:
Open Lifecycle Management > Integrations (in the Products section of the navigation sidebar), or the main Integrations page (in the Featured section)
Search for the integration and click the name to view details
In the Properties sidebar on the right (not the Properties tab), click the magnifying glass icon next to the Provisioning Support value
Many identity source systems have API rate limits that can affect extraction timing. Avoid forcing repeated extractions within short time windows (typically 5 minutes) to prevent API errors that delay workflow execution.
For systems using custom or user-defined fields (UDFs), maintain clear documentation of:
Field purpose and mapping
Expected data formats and validation rules
Which fields are used in workflow trigger conditions
This documentation ensures consistency when fields are added or modified.
Understand the data retention policies of your identity sources, particularly for terminated employees or contractors. Some systems retain terminated records for limited periods (e.g., 90 days), which affects leaver workflow design. Plan workflow timing to ensure LCM can process records before they're purged from the source system.
Changes to core identity fields can break LCM workflows. Coordinate with system administrators before modifying:
Unique identifiers (employee ID, username)
Employment status fields
Date fields (hire date, termination date)
Location or department identifiers
Any fields used in workflow trigger conditions
Communicate planned changes in advance and test in sandbox environments before applying to production identity sources.
For more information:
Refer to individual integration documentation for detailed provisioning capabilities
Consult the Veza documentation for troubleshooting and best practices
Contact Veza support for assistance with enabling or configuring provisioning for your integrations
Administrative access to Veza to create Provisioning Policies
Source of Identity Integration: Your Workday integration (entity type Workday Worker, set by the integration you select)
Click Create to save the basic configuration
is_active eq true AND hire_date eq "2025-08-04T00:00:00" This condition is triggered when, in Workday, the employee is active and a defined hiring date is "2025-08-04T00:00:00". Therefore, any active employee hired on or after the specified date is considered a joiner.Only the first time the identity matches: Cleared With this checkbox cleared, the workflow runs on every extraction where the identity matches the condition, not only the first time it matches. Updates to a user's source attributes (such as email, department, manager, or role) continue to reach the target application after the user is provisioned.
Add actions to the workflow as detailed in the section.
Condition: is_active eq true AND first_name eq “Sarah” AND last_name eq “Johnson” AND position eq “Regional Sales Manager”
Only the first time the identity matches: Cleared
Add actions similar to the Joiner workflow, but ensure Entitlement Removal is set to All not listed in this action in the Manage Entitlements actions to update group memberships when departments change When a user’s role changes (mover), you often need to revoke existing entitlements—like group memberships, role assignments, and permission set grants—not just avoid adding new ones. Setting Entitlement Removal to All not listed in this action ensures that previously granted relationships are actively removed to prevent privilege creep or orphaned access.
Condition: is_active eq false OR termination_date eq "2025-08-08T00:00:00"
This condition is triggered when the employee is no longer active and a defined termination date is "2025-08-08T00:00:00". Therefore, any non-active employee terminated on or after the specified date is considered a leaver.
Add deprovisioning actions, such as Deprovision Okta Identities and Deprovision AD Identities
Ensure that Okta and Active Directory contain the correct identity information for the employee.
Continue to iterate on changes to the workflow until it is ready.
Click Publish when the policy performs satisfactorily.
On the Provisioning Policies list, open the policy row's ⋮ menu.
Select Enable, then confirm.
Add New Action > Write Back Email
Integration: Your Workday integration
Entity Type: Workday Worker
Name: Engineering Department Access
Access Profile Type: Application Entitlements
Description: Standard access for Engineering department employees
Label: Developers
Entitlements:
- Active Directory Group: Engineering
- Okta Group: EngineeringName: Marketing Department Access
Access Profile Type: Application Entitlements
Description: Standard access for Marketing department employees
Entitlements:
- Active Directory Group: Marketing
- Okta Group: Marketing{username}@sigmacorpx.com
Create and update
first_name
{first_name}
Create and update
distinguished_name
CN={first_name} {last_name},OU=Minnetonka,OU=US,OU=Evergreen Staff,DC=evergreentrucks,DC=local
Create and update
See for more information on distinguished_name.
user_principal_name
{username}@evergreentrucks.com
Create and update
distinguished_name
CN={first_name} {last_name},OU=Evergreen Termination,OU=Evergreen Staff,DC=evergreentrucks,DC=local
Create only
primary_group_dn
CN=Terminated Users,OU=Evergreen Groups,DC=evergreentrucks,DC=local
Create only
Trigger: New employee record created in Workday with status="Active" and worker_type="Full_Time"
Actions:
1. Create Okta user with attributes from Workday transformer
2. Assign to department-specific groups in Okta
3. Create AD user with attributes from Workday transformer
4. Add to appropriate security groups in AD based on job role
5. Send welcome email with account informationTrigger: New worker record created in Workday with status="Active" and worker_type="Contractor"
Actions:
1. Create Okta user with limited attribute set and "Contractor-" prefix in username
2. Assign to contractor-specific groups in Okta
3. Create time-limited AD account with expiration date set to contract end date
4. Add to contractor security groups with restricted access
5. Send welcome email with temporary password and access instructionsTrigger: Employee department changed in Workday
Actions:
1. Update department attribute in Okta and AD
2. Remove previous department group memberships in both systems
3. Add new department group memberships in both systems
4. Update OU placement in AD
5. Send notification to new managerTrigger: Employee job level changed to include management flag
Actions:
1. Update job title in all systems
2. Add to manager-specific groups in Okta and AD
3. Add to approval workflows in relevant systems
4. Send manager training notificationTrigger: Employee status changed to "Terminated" in Workday
Actions:
1. Disable user in Okta and AD (do not delete)
2. Remove all group memberships
3. Revoke all application access
4. Move AD account to "Terminated Users" OU
5. Generate access termination report for complianceTrigger: Employee terminated with reason="Security Risk"
Actions:
1. Immediately disable all accounts (high priority)
2. Force logout from all active sessions
3. Reset all passwords
4. Remove all access rights and group memberships
5. Generate security incident report# Okta User Attributes
login: {worker_id}@company.com
email: {work_email | DEFAULT, "{worker_id}@company.com"}
first_name: {first_name}
last_name: {last_name}
display_name: {first_name} {last_name}
department: {department_name}
title: {job_title}
manager_id: {manager_worker_id}@company.com
# Handle different user types
user_type: {worker_type | LOWERCASE | REPLACE, "full_time", "Employee" | REPLACE, "contractor", "Contractor" | DEFAULT, "Employee"}
employee_id: {employee_id}
# Custom attributes
customField1: {location_code}
customField2: {hire_date | DATE_FORMAT, "yyyy-MM-dd"}
customField3: {termination_date | DATE_FORMAT, "yyyy-MM-dd" | DEFAULT, ""}# AD User Attributes
account_name: {worker_id}
# Build distinguished name based on employment type and department
distinguished_name: {worker_type | EQUALS, "contractor" | IF_TRUE, "CN={first_name} {last_name},OU=Contractors,OU={department_name},DC=company,DC=local" | IF_FALSE, "CN={first_name} {last_name},OU=Employees,OU={department_name},DC=company,DC=local"}
user_principal_name: {worker_id}@company.local
email: {work_email | DEFAULT, "{worker_id}@company.com"}
display_name: {first_name} {last_name}
given_name: {first_name}
sur_name: {last_name}
department: {department_name}
job_title: {job_title}
description: {job_title} - {department_name}
company: Company Inc.
# Set account expiration for contractors
account_expires: {worker_type | EQUALS, "contractor" | IF_TRUE, {contract_end_date} | IF_FALSE, ""}
# Custom attributes
extension_attribute_1: {cost_center}
extension_attribute_2: {business_unit}
extension_attribute_3: {hire_date | DATE_FORMAT, "yyyy-MM-dd"}
extension_attribute_4: {employee_id}# US-based employees
work_location eq "US"
# International employees requiring different treatment
work_location eq "China" OR work_location eq "EMEA"
# Remote workers
work_location eq "Remote" OR office_location contains "Remote"# Technical roles requiring elevated access
department eq "Engineering" OR department eq "DevOps" OR job_title contains "Developer"
# Management roles
job_level eq "Manager" OR job_level eq "Director" OR job_level eq "VP"
# Sensitive roles requiring additional security
department eq "Finance" OR department eq "Legal" OR department eq "HR"# Full-time employees
worker_type eq "Full_Time" AND status eq "Active"
# Contractors with time-limited access
worker_type eq "Contractor" AND contract_end_date is not null
# Temporary workers
worker_type eq "Temporary" OR employment_status eq "Temp"
2 Days
3 Days
7 Days
30 Days
ActiveDirectoryUser
CustomHRISEmployee
CustomHRISEmployee
✅
Not Supported
The integration does not support Lifecycle Management.
Not Configured
The integration supports Lifecycle Management, but provisioning is not enabled.
Enabled
Lifecycle Management is enabled and running for the integration.
Disabled
Lifecycle Management is turned off for the integration.
last_name
{last_name}
Create and update
country_code
{work_location}
Create and update
login
{username}@sigmacorpx.com
Create only
Shared attribute mapping
{username}@evergreentrucks.com
Create and update
display_name
{display_full_name}
Create and update
given_name
{first_name}
Create and update
sur_name
{last_name}
Create and update
country_code
{work_location}
Create and update
job_title
{job_title}
Create and update
primary_group_dn
CN=Domain Users,CN=Users,DC=evergreentrucks,DC=local
Create and update
account_name
{display_full_name}
Create only
Shared attribute mapping

CustomHRISEmployee
CustomIDPUser
CustomHRISEmployee
CustomHRISEmployee
CustomHRISEmployee
Supports email write-back
LDAP user
CustomHRISEmployee
AzureADUser
GoogleWorkspaceUser
OktaUser
OAA.Oracle HCM.HRISEmployee
Supports email write-back
ServiceNowUser
CustomHRISEmployee
WorkdayWorker
Supports email write-back
✅
✅
Reset Password, Create Group, Delete Account
ActiveDirectoryGroup
-
✅
✅
✅
Delete Account
AtlassianCloudAdminGroup
-
✅
✅
✅
Create Group
AwsSsoGroup, AwsSsoPermissionSetAccount
-
✅
✅
✅
Reset Password, Create Email, Create Group, Delete Account
AzureADGroup, AzureADRole, ExchangeOnlineDistributionGroup, AzureADLicense
Email management includes mailbox configuration (size limits, quotas, auditing) and client access settings (OWA, ActiveSync, MAPI, POP, IMAP)
✅
✅
✅
Delete Account
ApplicationGroup, ApplicationRole
-
✅
✅
❌
Delete Account
OAA.<application type>.Group, OAA.<application type>.Role
Requires feature enablement. Relationship management depends on configuration: group entitlements require the add and remove group stored procedures, and role entitlements require the add and remove role stored procedures
❌
❌
❌
Create Email
-
-
✅
✅
✅
Delete Account
GithubOrganization, GithubTeam
-
✅
✅
✅
Delete Account
LDAP group
Includes Red Hat Identity Manager and FreeIPA
✅
✅
✅
Delete Account
GoogleWorkspaceGroup
-
✅
✅
✅
Delete Account
MySQLRoleInstance
-
✅
✅
✅
Reset Password, Create Group, Delete Account
OktaGroup
Supports two deprovision types: SUSPENDED (temporary) and DISABLED (permanent deactivation)
✅
✅
✅
Delete Account
OracleDBRole
-
✅
✅
✅
Delete Account
OracleRole
-
❌
✅
❌
Write Back Email
-
-
✅
✅
❌
Delete Account
PagerDutyTeam
Platform does not support user deactivation; use Delete Account instead
✅
✅
✅
Delete Account
PostgreSQLGroup
-
✅
✅
✅
-
SalesforceGroup, SalesforcePermissionSet, SalesforcePermissionSetGroup, SalesforceProfile, SalesforceUserRole
-
SAP ECC
✅
✅
✅
-
SapEccRole
Manage Entitlements supports role assignment only (revocation is not supported)
✅
✅
✅
Delete Account
SCIMGroup
Supports token authentication and OAuth2 client credentials
✅
✅
✅
Update ServiceNow Table
ServiceNowGroup, ServiceNowRole
Manage Entitlements covers directly granted roles only; roles inherited through group membership are not managed
✅
✅
✅
-
SnowflakeRole
-
✅
✅
❌
Delete Account
SplunkEnterpriseRole
Platform does not support user deactivation; use Delete Account instead
✅
✅
❌
Write Back Email
WorkdaySecurityGroup
-
Veza
✅
✅
✅
-
VezaRoleBinding, VezaAccessProfile, VezaGroup
-


Enable SCIM-based provisioning for custom applications with Open Authorization API
Veza can automate user provisioning and de-provisioning for any application that uses the Open Authorization API (OAA) for data gathering and authorization modeling, and exposes SCIM-compliant endpoints for user and group management.
This enables organizations to:
Use your application's existing SCIM endpoints for automated provisioning operations
Model complex authorization structures using OAA's flexible templates (applications, resources, permissions, custom properties) for Access Graph visibility, Access Reviews, and other Veza features.
Gather authorization metadata using a variety of methods (custom connectors, APIs, manual JSON payloads, CSV files)
Administrative access in Veza to configure the integration
An existing integration in Veza with at least one successful extraction
Your custom application must expose SCIM 2.0-compliant endpoints; see below
SCIM connection details for the custom application (URL, authentication credentials)
To enable the integration:
In Veza, go to the Integrations overview
Search for your custom OAA application integration
Check the box to Enable usage for Provisioning
To verify the configuration:
Open Lifecycle Management > Integrations
Search for the integration and click to view details
In the Properties sidebar on the right (not the Properties tab), verify that Provisioning Support shows Enabled
There are several potential ways to integrate a custom application for automated lifecycle management and access requests:
External SCIM for Open Authorization API: You may build your OAA integration using the custom application template and leverage dedicated SCIM endpoints for user and group management. This is useful when you need full control over how authorization metadata is represented in the Veza Access Graph:
Your application supports SCIM, and you want to model a wider range of authorization entities and metadata (e.g., credentials, resources) than the Veza SCIM integration supports.
You already have a custom OAA integration and want to add provisioning capabilities using SCIM.
Full SCIM Connector
This document describes how to enable External SCIM for an Open Authorization API integration, and supported actions.
Data Gathering (OAA):
You will need to design and build a custom integration to publish information about the application to the Veza Access Graph:
The payload can include local users, groups, permissions, resources, and complex authorization relationships
Data can be gathered from any source: APIs, databases, configuration files, etc.
See the rest of the Open Authorization API documentation for examples and best practices when designing and deploying custom integrations.
Lifecycle Management (SCIM):
You can enable the SCIM connection at the custom provider level:
Setting provisioning: true and external_lifecycle_management_type: SCIM for the custom provider enables Veza to use your application's SCIM endpoints for provisioning
Provide SCIM connection information and credentials (configuration_json)
Veza maps lifecycle actions to SCIM operations (POST /Users, PATCH /Users/{id}
Important: When configuring a custom application for SCIM integration, the OAA payload structure (Application template) and SCIM configuration serve different purposes:
The OAA Payload (push_application() or API push) defines local users, groups, permissions, and resources used for visibility and authorization modeling in Veza, and can be updated independently.
The SCIM Configuration (configuration_json) for the custom provider defines how to connect to SCIM endpoints (including authentication, URL, and endpoint paths), and is used only for lifecycle management and access request operations.
Both must be consistent (describe and contain the same users and groups), but are configured separately.
Your application must expose SCIM 2.0 compliant endpoints with the following operations:
User Management:
GET /Users - List and filter users
GET /Users?filter=userName eq "{username}" - Query users by userName
POST /Users - Create new users
Group Management:
GET /Groups - List groups
GET /Groups/{id} - Retrieve specific group by ID
GET /Groups?filter=members.value eq "{userId}" - Query groups by member (used when a user response does not include groups)
Note: If the Users and Groups APIs are not at the standard
/Usersand/Groupspaths, you can specify alternate endpoint paths in the configuration.
Your SCIM API must support one of the following authentication methods:
Bearer Token: API token passed in Authorization: Bearer {token} header
Basic HTTP Authentication: Username and password passed in Authorization: Basic {credentials} header
The authentication credentials must have both read and write permissions to the SCIM endpoints.
To synchronize custom attributes beyond the standard SCIM user schema:
Expose a GET /Schemas endpoint that returns SCIM schema definitions
Enable schema fetching in your configuration (see Configuration section)
External SCIM for Lifecycle Management is configured via the Veza REST API.
Create a Custom Provider that uses external SCIM endpoints specifically for lifecycle management:
Required Fields
Configuration JSON Parameters
The configuration_json field contains SCIM endpoint connection details used only for provisioning operations. It does not affect your OAA payload structure.
* One of scim_token or the username/password pair is required for authentication.
use_atomic_group_add_op and use_atomic_group_remove_op are API-only settings and are not shown in the integration form in Veza. Set them in configuration_json when you create the custom provider, or update the provider with PATCH /api/v1/providers/custom/{id}.
Example Configuration with Bearer Token:
Example Configuration with Basic Authentication:
Push the OAA Application Payload as normal. See the for details.
Veza creates entities in Access Graph based on the OAA payload, which can be targeted in lifecycle management operations:
local_users in your Application template → Users to provision via SCIM
local_groups in your Application template → Groups to manage via SCIM
Entity types are named according to the following pattern:
User Entity Type: OAA.{application_type}.User
Group Entity Type: OAA.{application_type}.Group
Where {application_type} is the value you specify in your OAA Application template when building the payload. For example, if the application is defined:
The resulting entity types are:
OAA.CustomerPortal.User
OAA.CustomerPortal.Group
When Veza provisions users via SCIM, transformers can map attributes from your policy source of identity to SCIM properties:
If the SCIM service exposes a /Schemas endpoint and you enable scim_extension_schemas: true, Veza can synchronize custom extension attributes beyond the standard SCIM user schema. Extension attributes are mapped using the schema URN as defined by your SCIM implementation.
The following SCIM operations are performed when Lifecycle Management actions execute:
Create a new user in the target application.
SCIM Operation:
The SCIM endpoint creates the user and returns the user object with an assigned id.
Updates an existing user's attributes (one-time or continuously).
SCIM Operations:
Query for existing user:
Update the user:
Remove access when a user leaves the organization or changes roles. The user account is deactivated, but data is preserved.
SCIM Operation:
Deprovision sets active=false, which disables login but preserves the user record.
Permanently remove a user account.
SCIM Operation:
Grant a user access via group membership.
Veza reads the group's current members, then replaces the members attribute with the full list of existing members plus the user. Your SCIM server must support the replace operation on the members attribute and treat it as a replacement of the full member list. Veza confirms each membership change after the update, and the action fails if the change does not appear.
If your SCIM server accepts replace on members but does not apply it, set use_atomic_group_add_op to true in configuration_json (see ). Veza then sends a single add operation for the user, without reading the group first.
SCIM Operations:
Retrieve the group and its current members:
Replace the group members with the existing members and the user:
Revoke a user's access by removing group membership.
Veza reads the group's current members, then replaces the members attribute with every member except the user. Your SCIM server must support the replace operation on the members attribute and treat it as a replacement of the full member list. If no members remain, for example when the user is the group's only member, Veza instead sends a remove operation on members with no value. That request removes all members, so your SCIM server must also accept it. Veza confirms the removal after the update, and the action fails if the user is still a member. The warning in also applies to removal.
If your SCIM server accepts replace on members but does not apply it, set use_atomic_group_remove_op to true in configuration_json (see ). Veza then sends a single remove operation for the user, without reading the group first.
SCIM Operations:
Retrieve the group and its current members:
Replace the group members with the remaining members:
If no members remain, Veza sends this request instead:
Custom REST API Actions: Actions in Veza may directly call any external API and capture the response in audit trails. This can enable Lifecycle Management and Access Requests for any target system, provided it has appropriate endpoints for managing users and access controls.
GET /Users/{id}groupsPATCH /Users/{id} - Update user attributes
DELETE /Users/{id} - Delete user (required if using Delete Account action)
PATCH /Groups/{id} - Update group membership
DELETE /Groups/{id} - Delete group (optional)
Provision Account
✅
Create new users or update existing user attributes in the target application
Manage Entitlements
✅
Add or remove users from groups
Deprovision Account
✅
Deactivate user accounts (sets active=false in SCIM)
Extraction Method
You build the OAA push payload directly
Auto-discovery via SCIM endpoints
Authorization Modeling
Full OAA Application support (roles, permissions, resources)
Users and groups only
Lifecycle Management
Via SCIM endpoints
Via SCIM endpoints
curl -X POST "https://{VEZA_URL}/api/v1/providers/custom" \
-H "authorization: Bearer {API_KEY}" \
-H "Content-Type: application/json" \
--data '{
"name": "MyCustomApp",
"custom_template": "application",
"provisioning": true,
"external_lifecycle_management_type": "SCIM",
"configuration_json": "{\"app_name\":\"MyCustomApp\",\"app_type\":\"MyCustomApp\",\"scim_url\":\"https://api.myapp.com/scim/v2\",\"scim_token\":\"your-bearer-token\",\"scim_extension_schemas\":false}"
}'name
Yes
Display name for the Custom Provider in Veza
custom_template
Yes
OAA template type ("application")
provisioning
Yes
Must be set to true to enable Lifecycle Management
app_name
Yes
Name for the application. Required by configuration validation. Lifecycle Management takes entity types from the application_type in your OAA payload, not from this value.
"CustomerPortal"
app_type
Yes
Application type. Required by configuration validation. Lifecycle Management does not use this value.
"CustomerPortal"
{
"app_name": "CustomerPortal",
"app_type": "CustomerPortal",
"scim_url": "https://api.customerportal.internal.com/scim/v2",
"scim_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"scim_extension_schemas": true
}{
"app_name": "LegacyApp",
"app_type": "LegacyApp",
"scim_url": "https://legacy.mycompany.com/api/scim",
"username": "scim-service-account",
"password": "secure-password-here",
"scim_extension_schemas": false
}custom_app = CustomApplication(
name="CustomerPortal", # Display name
application_type="CustomerPortal" # This determines entity types!
)user_name
userName
String
Yes
Unique username
emails
POST /Users
Content-Type: application/json{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "jane.doe",
"name": {
"givenName": "Jane",
"familyName": "Doe",
"formatted": "Jane Doe"
},
"emails": [
{"value": "jane.doe@company.com", "primary": true}
],
"active": true
}GET /Users?filter=userName eq "jane.doe"PATCH /Users/{id}
Content-Type: application/json{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{"op": "replace", "path": "displayName", "value": "Jane Smith"}
]
}PATCH /Users/{id}
Content-Type: application/json{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{"op": "replace", "path": "active", "value": false}
]
}DELETE /Users/{id}GET /Groups/{groupId}PATCH /Groups/{groupId}
Content-Type: application/json{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "members",
"value": [
{"value": "{existingMemberId1}"},
{"value": "{existingMemberId2}"},
{"value": "{userId}"}
]
}
]
}GET /Groups/{groupId}PATCH /Groups/{groupId}
Content-Type: application/json{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "members",
"value": [
{"value": "{remainingMemberId1}"},
{"value": "{remainingMemberId2}"}
]
}
]
}{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{"op": "remove", "path": "members"}
]
}Delete Account
✅
Permanently delete user accounts from the target application
Use Case
Complex custom applications where visibility or access reviews are needed.
Standard SaaS with SCIM support
external_lifecycle_management_type
Yes
Lifecycle management mode (use "SCIM" to enable SCIM-based provisioning)
configuration_json
Yes
JSON-encoded string containing SCIM connection details (see structure below)
scim_url
Yes
Base URL for SCIM API (without /Users or /Groups path)
""
scim_token
No*
Bearer token for authentication
"eyJhbGci..."
username
No*
Username for basic authentication
"scim-admin"
password
No*
Password for basic authentication
"secure-password"
users_endpoint
No
Users endpoint path (defaults to Users if not specified)
"Users"
groups_endpoint
No
Groups endpoint path (defaults to Groups if not specified)
"Groups"
scim_extension_schemas
Yes
Fetch SCIM schemas for extension attribute support. Set to false if your SCIM server does not expose /Schemas.
true
ca_certificate
No
Custom CA certificate for SSL verification (PEM format)
"-----BEGIN CERTIFICATE-----..."
use_atomic_group_add_op
No
Defaults to false. When true, Veza adds a user to a group with a single add operation on members, with only the user as its value, instead of reading the group and replacing the member list.
true
use_atomic_group_remove_op
No
Defaults to false. When true, Veza removes a user from a group with a single remove operation on members, with only the user as its value, instead of reading the group and replacing the member list.
true
emails
Array
No
Email addresses
display_name
displayName
String
No
User's display name
title
title
String
No
Job title
nick_name
nickName
String
No
Casual name
external_id
externalId
String
No
External system identifier
phone_numbers
phoneNumbers
Array
No
Telephone numbers (JSON array)
addresses
addresses
Array
No
Physical addresses (JSON array)
ims
ims
Array
No
Instant messaging addresses (JSON array)
photos
photos
Array
No
Photo URLs (JSON array)
locale
locale
String
No
User's locale
preferred_language
preferredLanguage
String
No
Preferred language
profile_url
profileUrl
String
No
Profile page URL
timezone
timezone
String
No
User's time zone
user_type
userType
String
No
User classification
formatted_name
name.formatted
String
No
Full formatted name
family_name
name.familyName
String
No
Surname
given_name
name.givenName
String
No
Given name
middle_name
name.middleName
String
No
Middle name
Configure how user attributes from a source of identity are transformed for target user accounts
When creating workflows in Provisioning Policies to create, sync, or deprovision identities, you will use attribute transformers to specify how user attributes for target accounts should be structured.
An attribute transformer is the complete configuration for mapping a source attribute to a destination attribute. It consists of:
Destination attribute
The target attribute to set
The target attributes to create or update are typically mapped and, optionally, transformed from user metadata in the source of identity, such as an identity provider, HR system, or CSV upload. Attributes can be synchronized once or kept continuously in sync as changes occur throughout the user's employment lifecycle.
For example, attribute mapping and transformation can be used across Joiner, Mover, and Leaver scenarios:
Joiner: Set new Azure AD User Principal Name to {source username}@your-email-domain.com. This is an example of mapping multiple attributes and performing a transformation. More specifically, you use the attribute transformer to generate an email address for new joiners. Use the source username (user_principal_name) from the source of identity (Azure AD UPN) for the first part (user attribute), while your-email-domain.com is used for the last part (target attribute).
Mover: Always update a user’s “Manager” and “Department” attributes in Okta to match the user’s manager and department in Workday, a source of identity, whenever a department change or other employee mobility event occurs. This is an example of attribute mapping with continuous synchronization.
Leaver
When synchronizing a user’s attributes, Veza may apply many transformations to convert the source attribute values into a more suitable format intended for the target application as a user account attribute.
For example, a transformer might remove the domain from an email address, replace special characters, or convert a string with uppercase letters to lowercase letters.
See for detailed information.
Shared attribute mappings define one or more rules to apply when synchronizing the attributes of a target identity. Use them at the Policy level where you want to create or update attributes using the same conventions across multiple sync or deprovision actions. When you need to configure a one-time individual action in a workflow, such as a specific attribute, then you use the transformer at the Action level.
At the Policy level, you configure a transformer with basic details, including how to source the value of each attribute:
Assign a name and description to the transformer, and specify the data source to which it applies.
Entity Type: Choose the target entity type in the destination system.
Click Add Attribute. The Destination Attribute dropdown will list available attributes for the chosen entity type.
Destination Attribute: Choose the attribute that Veza will create or update for the target entity.
After creating a shared attribute mapping, you can select it when editing a workflow action. To edit or delete shared attribute mappings, open the policy's draft version, select the Workflow Components tab, and select the Shared Attribute Mappings card. Remember that Provision Account and Deprovision Account actions can have action-level transformers override shared attribute mappings. If the same destination attribute is defined in both, the action-level transformer will take precedence.
Create shared attribute mappings when the same transformation logic appears in two or more places within the policy. Shared attribute mappings reduce duplication and ensure consistent formatting across actions.
Create transformer functions when the same transformation applies to multiple properties. Functions let you reuse logic without duplicating configuration.
The Formatter field in a transformer specifies how to construct the attribute value. It can be set to a specific value, synchronized with a source attribute, transformed using a function, or a combination of these.
To create a destination attribute with a fixed value, enter the desired value when configuring the formatter. For setting the creator attribute:
For activating a re-hired employee:
To clear an attribute value, leave the formatter field empty. The behavior at the destination depends on system type:
SQL-based destinations (Oracle, MySQL, MSSQL): an empty formatter sends NULL to the database column.
SCIM destinations: an empty formatter sends an empty string to the provider.
Active Directory: an empty formatter clears the attribute on the user account.
For deactivating a user or clearing a manager reference:
Target attributes can be updated based on attributes belonging to the source of identity. To reference the value of a source entity attribute in your formatter, use the format {<source_attribute_name>}.
Examples:
By default, when you reference an attribute such as {department} in a formatter, the system searches through your configured identity sources in order (primary first, then secondary sources). This works well for simple policies with a single source of identity.
Aliases become useful when:
Multiple integrations share the same entity type (e.g., two Active Directory instances, or when your source of identity and sync target use the same entity type)
A policy involves multiple integrations that have attributes with the same name
You need to explicitly control which system's attribute value is used
You want to compare values between source and target systems while defining LCM Workflow Conditions
Example: HR System to Directory Sync
A policy syncs identities from an HR system (Workday) to a directory (Active Directory). Both have a department attribute. Without aliases, {department} resolves from whichever system appears first in the search order. With configured aliases hr and directory (which become $hr and $directory), you can explicitly reference {$hr.department} to ensure you're using the authoritative HR value.
Aliases can be used in:
Attribute formatters
Workflow trigger conditions
Action conditions
Mover property definitions
Test formatters (for validation before deployment)
Aliases provide shorthand references to specific integrations and entity types, making transformers and conditions more readable in complex policies.
To configure aliases, open the draft version of a Provisioning Policy, select the Workflow Components tab, and select the Entity Aliases card. Select + on the card to add an alias. Each alias requires:
Alias Name: Must start with $ followed by at least one lowercase letter, number, or underscore. Additional $ characters can appear after the first character. The $ prefix is added automatically if omitted. Valid examples: $workday, $hr_system, $ad$corp. Invalid examples: $, $AD (uppercase), $$double (multiple leading $
Aliases can resolve attributes from two contexts:
Input: Values from the source system before any sync action runs (the authoritative data)
Output: Values currently in the target system (what's already provisioned)
By default, the system checks output first, then falls back to input. Use suffixes to explicitly control resolution:
Use these operators in IF conditions to compare attribute values:
Combine conditions with and, or, or negate with not.
In attribute formatters:
In LCM Workflow Conditions (comparing source and target values):
Multiple integrations with the same entity type:
For organizations with multiple Active Directory domains (e.g., corporate employees and contractors), you can create distinct aliases to control which AD integration is used:
Configure alias corp_ad → Integration: AD_Corporate, Entity Type: ActiveDirectoryUser
Configure alias contractor_ad → Integration: AD_Contractors, Entity Type: ActiveDirectoryUser
Then explicitly reference the correct domain in your formatters:
This ensures you're using the department attribute from the corporate AD integration rather than the contractor AD integration, even though both use the same ActiveDirectoryUser entity type.
Based on the user metadata available from your source of identity, you may need to convert a full email address to a valid username, standardize a date, or generate a unique identifier for users provisioned by Veza. Suppose an attribute value needs to be altered to be compatible with the target system. In that case, you can transform the value of a source attribute or apply a range of other functions to generate the target value.
Formatter expressions use the following syntax: {<source_attribute_name> | <FUNCTION_NAME>,<param1>,<param2>}
For example:
Refer to the page for complete documentation of all supported functions, parameters, and usage examples. The reference includes:
You can pipeline multiple transformation functions together, separated by a vertical bar (|). Each will apply in sequence, allowing for complex attribute formatters that use the output of one function as the input of another.
{name | UPPER}
If name = Smith, the result is SMITH.
{first_name | SUB_STRING,0,1 | LOWER}.{last_name | LOWER}
Before deploying transformers in production policies, you can validate formatter expressions directly in the Veza UI. This allows you to verify that your transformation logic produces the expected output without affecting live data.
When adding or editing a transformer in a policy, look for the Test button next to the Formatter field. Clicking it opens the Test Formatter dialog:
Enter your transformer expression in the Formatter field
Click the Test button to open the test dialog
The dialog shows input fields for each attribute referenced in your expression (e.g., {first_name}, {email})
The test dialog is available wherever transformers are configured, including:
Action attribute mappings
Unique identifiers
Shared attribute mappings
Date formatters
In the read-only view of a policy version, Test is available on action attribute mappings, the unique identifier, and shared attribute mapping details, but not on date, access review name, or email formatters. See .
For complex pipelines, test incrementally:
Test the first function alone to verify it handles the input correctly
Add each subsequent pipe and verify intermediate results
Validate the complete pipeline produces the final expected value
This step-by-step approach helps isolate issues when a transformation doesn't produce the expected output.
Use inline testing during transformer development, then validate the complete policy with a dry run before deploying to production.
As part of implementing Lifecycle Management (LCM) processes with Veza, you should create sets of shared attribute mappings to define how values such as username, login, or ID are sourced for each Provisioning Policy. These transformers can then be reused across all identity sync and deprovision policy workflows.
For example, defining a shared attribute mapping to describe how to format Azure AD account names {username}@evergreentrucks.com enables reuse across multiple workflow actions. You can also define action attribute mappings at the action level when they are used only once within a policy, such as setting the primary group DN and OU of de-provisioned identities to a group reserved for terminated accounts.
Shared Attribute Mapping Examples:
The $target attribute transformer function is used when a value consists of one or more attributes that require an operation(s), making it too complex to transform, but it needs to be reused.
For example, an email address consists of firstname_lastname@sample.com. However, you must use the format . By using the $target function, you reuse only one attribute, username, while not changing the other two attributes (firstname_lastname).
Example:
Destination Attribute
Formatter
Formatter
You can reference an attribute set by an earlier transformer as the lookup key in a subsequent transformer. This enables multi-stage transformation pipelines where one transformer computes a normalized value, and a later transformer uses that value for table lookups or other operations.
Example: Compute a padded employee ID in one transformer, then use it to look up a cost center in a later transformer:
Transformer 1 — set padded_id:
Transformer 2 — use padded_id as the lookup key:
The $target.padded_id reference resolves to the value set by Transformer 1, and passes it as the key into the LOOKUP function.
The Custom Attribute Transformer function allows you to define a custom transformer that acts as an alias for applying one or more transformer functions.
For example, you can define a custom function named $CLEAN, which is used as {first_name | $CLEAN}. This function can consist of a series of transformer functions such as | ASCII | LOWER | REMOVE_CHAR |.
To define a custom attribute transformer, use the following guidelines:
Policy Version Definitions
Custom functions must be defined as part of the policy version.
These definitions are structured similarly to hard-coded definitions and are returned in the same format, allowing the Veza UI to handle them without modification.
The API for updating and retrieving a policy version must also support these custom function definitions.
Custom Attribute Transformer Limitations
The following custom definitions are not supported:
Transformer functions with included transformer parameters
Nested transformer functions
Transformer functions with parameters
As part of the Provision Account action, you can append values to multi-value Active Directory attributes without replacing existing values. This ensures that existing attribute values are preserved when adding new ones.
Supported Multi-Value Attributes:
Active Directory supports appending for the following multi-value attributes:
organizationalStatus, departmentNumber, employeeType
servicePrincipalName, proxyAddresses
member
Syntax:
Use the >> prefix before the array to append values:
Appending syntax supports two array formats:
With quotes (JSON format): >>[``"Active", "Permanent"]
Without quotes (simple format): >>[Active, Permanent]
When you use this syntax:
New values are added to the end of the existing attribute values
Duplicate values are automatically removed
The order of existing values is preserved
New values appear after existing values in the order specified
For example, ff an Active Directory user has:
And you apply the transformer:
The resulting value is:
Note that "Employee" was already present and not duplicated.
Setting versus Appending:
To Replace existing values: Use [value1, value2] (without >>)
To Append to existing values: Use >>[value1, value2] (with >>)
Additional Notes:
The append prefix (>>) only works for multi-value attributes. It is ignored for single-value attributes
If the attribute has no existing values, the values are simply set (no difference from non-append behavior)
Both the appending syntax and the standard array syntax support arrays with or without quotes around values
Formatter: Choose how the destination attribute should be formatted. Specify the value, a {source_attribute}, or apply Transformation Functions.
Then Apply: Chains transformation functions together using the pipe (|) character. Each function runs in sequence, with the output of one becoming the input of the next.
See Then Apply for more examples.
Apply On: Select Create and update to keep the attribute synced on existing target identities, while applying any defined transformations. By default (Create only), attributes will not be synced if the target identity already exists.
You need to detect movers based on changes in a specific system
Integration: The data source containing the entity type.
Entity Type: The entity type to reference (e.g., WorkdayWorker, OktaUser).
Target only
{$workday$out.department}
Get the current target value
Starts with
String
ew
Ends with
String
lt
Less than
Number, timestamp
le
Less than or equals
Number, timestamp
gt
Greater than
Number, timestamp
ge
Greater than or equals
Number, timestamp
Padding
LEFT_PAD, RIGHT_PAD, ZERO_PAD
Create fixed-width identifiers
Date/time
DATE_FORMAT, DATE_ADJUST, DATE_ADJUST_DAY, ASSUME_TIME_ZONE, UTC_TO_TIME_ZONE, NOW
Convert and manipulate dates
Character encoding
ASCII, REMOVE_DIACRITICS
Handle international characters
Lookup
LOOKUP, FROM_ENTITY_ATTRIBUTE, FROM_MANY_ENTITIES_ATTRIBUTE, FOR_EACH
Cross-reference data from tables or entities
Generation
NEXT_NUMBER, UUID_GENERATOR, RANDOM_INTEGER, RANDOM_STRING_GENERATOR, RANDOM_ALPHANUMERIC_GENERATOR, RANDOM_NUMBER_GENERATOR
Create unique values
Domain
REMOVE_DOMAIN
Extract usernames from email addresses
Formatting
COUNTRY_CODE_ISO3166, LANGUAGE_RFC5646, PHONE_NUMBER_E164
Standardize to international formats
Default values
IF_EMPTY, IF_EMPTY_OR_MISSING
Replace empty or missing values
JSON
JSON_EXTRACT, JSON_FORMAT
Extract or format values in JSON strings
{email | REMOVE_DOMAIN}
If email = john.smith@domain.com, the result is john.smith.
{email | REPLACE_ALL, " ", "."}
If email = john smith@domain.com, the result is john.smith@domain.com.
{location | LOOKUP, "locationTable", "location_code", "city"}
If location = CA001, the result is Los Angeles (using a lookup table named locationTable).
{start_date | DATE_FORMAT, "01/02/2006" | UPPER}
If start_date = 2023-03-15, the result is 03/15/2023 (DATE_FORMAT doesn't typically need UPPER, but shows pipeline capability).
{hire_date | DATE_FORMAT, "Jan 2, 2006" | REPLACE_ALL, " ", "_"}
If hire_date = 2023-03-15, the result is Mar_15,_2023.
{office_code | TRIM_CHARS_LEFT, ".0" | TRIM_CHARS_RIGHT, ".USCA"}
If office_code = 000.8675309.USCA, the result is 8675309.
{username | REMOVE_CHARS, ".-_" | TRIM | UPPER}
If username = "–john.doe_–", the result is JOHNDOE.
{employee_id | REMOVE_CHARS, "#" | TRIM_CHARS, "0" | LEFT_PAD, 6, "0"}
If employee_id = "##001234##", the result is 001234.
{department | REMOVE_WHITESPACE | LOWER | REPLACE_ALL, "&", "and"}
If department = "Sales & Marketing", the result is salesandmarketing.
TEST{| RANDOM_INTEGER, 1000, 9999}
Generates test IDs like TEST4827, TEST8391 (see RANDOM_INTEGER for details).
Click Test Formatter in the dialog to evaluate the expression
View the result to verify the transformation produces expected output
Click Save to close the dialog, or Cancel to discard changes
John Smith
john.smith
CN={first_name} {last_name},OU={department},OU={location},DC=company,DC=local
Create and update
Full AD path
user_principal_name
`{first_name
SUB_STRING,0,1
LOWER}.{last_name
{first_name}{last_name}@company.com
Create and update
Email address
OktaAccountTransformer OktaUser
login
`{first_name
SUB_STRING,0,1
LOWER}.{last_name
{first_name}{last_name}@company.com
Create and update
Email address
username_prefix
`{first_name
SUB_STRING,0,1
LOWER}.{last_name
AzureADTransformer AzureADUser
principal_name
{first_name}{last_name}
Create only
Primary identifier
mail_nickname
`{first_name
SUB_STRING,0,1
LOWER}{last_name
display_name
{first_name} {last_name}
Create and update
Display name
GoogleAccountTransformer GoogleWorkspaceUser
{first_name}{last_name}@company.com
Create only
Primary email
email_addresses
{username}@company.com
Create only
Email list
recovery_email
{personal_email}
Create and update
Backup email
ContractorTransformer ActiveDirectoryUser
account_name
c-{username}
Create only
Contractor prefix
distinguished_name
CN={first_name} {last_name},OU=Contractors,OU={department},DC=company,DC=local
Create and update
Contractor OU
description
Contractor - {vendor_company} - Start Date: {start_date}
Create and update
Metadata
RegionalEmailTransformer ExchangeUser
email_address
{username}@{region}.company.com
Create only
Regional email
alias
{first_name}.{last_name}@{region}.company.com
Create and update
Regional alias
memberOfroleOccupanturl, wWWHomePage
otherTelephone, otherMobile, otherIpPhone, otherFacsimileTelephoneNumber, otherHomePhone, otherPager, otherMailbox
And additional multi-value attributes including: objectClass, postalAddress, postOfficeBox, seeAlso, userCertificate, userSMIMECertificate, userPKCS12, securityIdentifierHistory, altSecurityIdentities, businessCategory, carLicense, homePostalAddress
email, username, distinguished_name
Formatter
The template that constructs the value
See Terminology
Apply On
Whether to update the attribute on existing users. The attribute mapping editor shows this choice as Create only or Create and update.
Create only/Create and update
Fallback formatters
Alternative templates if the primary causes conflicts
{first_name}.{last_name}1@company.com
Source of Identity
The system holding authoritative user data—the "source of truth"
HR systems (Workday, BambooHR), identity providers (Azure AD, Okta), CSV uploads
Target Application
The system where user accounts are created or updated using source data
Active Directory, Okta, Google Workspace, SaaS applications
created_by
“Veza”
Create only
isActive
true
Create and update
manager_id
(empty)
Create and update
isActive
false
Create and update
first_name
{first_name}
Create and update
last_name
{last_name}
Create and update
{first_name}.{last_name}@domain.com {first_name}_{last_name}@domain.com {last_name}@domain.com {firstname_initial}{last_name}@domain.com {firstname_initial}-{last_name}@domain.com {firstname_initial}{middlename_initial}{last_name}@domain.com {last_name}-{firstname_initial}@domain.com
-
(none)
Output, then input
{$workday.department}
General attribute access
$in
Source only
{$workday$in.department}
Get the authoritative source value
eq
Equals
Boolean, string, number, timestamp
ne
Not equals
Boolean, string, number, timestamp
co
Contains
String, string list
{$workday.first_name | LOWER}.{$workday.last_name | LOWER}@company.comIF $workday$in.department ne $ad$out.department
{$workday$in.department}
ELSE
{$ad$out.department}{$corp_ad.department}username
`{email | REMOVE_DOMAIN}`
Removes the domain from the email to create username
"jsmith" is the output derived from jsmith@company.com
user_id
`f{id | UPPER}`
Converts ID to uppercase
JSMITH" is the output derived from the userid, "jsmith"
String case
UPPER, LOWER, TITLE_CASE, SENTENCE_CASE, LOWER_CAMEL_CASE, UPPER_CAMEL_CASE, LOWER_SNAKE_CASE, UPPER_SNAKE_CASE
Standardize naming conventions
String manipulation
TRIM, TRIM_CHARS, REMOVE_CHARS, REMOVE_WHITESPACE, REPLACE_ALL, APPEND, PREPEND
Clean and format string data
Substring
FIRST_N, LAST_N, SUB_STRING, SPLIT
Extract portions of values
UPPER
john.doe
JOHN.DOE
{email | SPLIT, "@", 0}
john.doe@example.com
john.doe
{start_date | DATE_FORMAT, "2006-01-02"}
2025-01-15T10:30:00Z
2025-01-15
Validating a single transformer expression
Inline Testing
Testing how transformers work with real entity data
Verifying complete policy workflow execution
ADAccountTransformer ActiveDirectoryUser
account_name
{display_full_name}
Create only
Basic account name
username`{firstname}{lastname}``{$target.username}@sample.com`{employee_id | LEFT_PAD, 8, "0"}{$target.padded_id | LOOKUP, "costCenterTable", "padded_id", "cost_center"}>>[value1, value2, value3]organizationalStatus: ["Active", "Employee"]>>[Employee, Contractor, Temporary]organizationalStatus: ["Active", "Employee", "Contractor", "Temporary"]$out
sw
{name | LOWER | REPLACE_ALL, " ", "."}
distinguished_name
Configure Provisioning Policies, the workflows, shared attribute mappings, and notification settings that automate Lifecycle Management actions
Provisioning Policies define the workflows that are triggered when a user is added or other events are detected at a specific source of identity. Workflows contained in a policy describe conditional sequences of actions that can be structured based on the specific joiner, mover, leaver (JML) scenarios that you want to automate. This might include hiring a new employee, terminating an existing employee, transferring an existing employee to another department, or other actions triggered by changes in status.
A policy can contain one or more workflows that run under different conditions. For example, one workflow might be applied when employees enter an "Active" state (for Joiner/Rehire scenarios), and another when an employee becomes "Inactive" (for Leaver scenarios). A workflow could also be triggered when an employee's hire date falls within a certain threshold, such as being less than 4 days away, or when it is related to any other employee property within the source of identity.
For most enterprise deployments, Veza recommends:
One policy for each source of identity integrated with Lifecycle Management
Two workflows within each policy:
One for active users to cover Joiner and/or Mover scenarios (including Re-hire)
Another for inactive users to cover Leaver scenarios
To create a policy for a source of identity:
Go to Lifecycle Management > Provisioning > Policies (the Provisioning Policies menu item before Veza v2026.11.2).
Click Create Provisioning Policy.
Enter a policy name and description.
The policy name is used to identify it on the Policies list and event logs
The Dry Run allows you to simulate and preview how a Policy would process an identity, without making actual changes to target systems. This testing tool helps you validate workflow conditions, preview potential changes, and understand what actions would be triggered for specific identities.
The Dry Run evaluates workflow logic but does not interact with target integrations. Verify integration health to ensure target systems are accessible before running actual policies. Dry Run takes a policy and an identity to simulate:
The workflows triggered
All actions that would run
What Access Profiles would be assigned
Any potential changes to entities and attributes
You can test how policies would respond to identity attribute changes for different scenarios during a Dry Run simulation without impacting the actual identity attribute values.
You can initiate a Dry Run in two ways:
From a Provisioning Policy
When editing a policy, open the Dry Run tool to preview changes for any identity:
Go to Lifecycle Management > Provisioning > Policies.
Click a policy to view its details, then open a version from the Policy Versions panel.
Click Dry Run and select Single Dry Run. You can also start this dry run from the Provisioning Policies list: click ⋮ on the policy's row and select Single Dry Run.
From Identity Details
You can start a Dry Run when viewing details for any account on the Identities page:
Go to Identities.
Search for an identity and click to view its details.
Open the ⋮ menu and select Policy Dry Run.
Select a policy, customize entity attributes, and click Show Results.
You can also select Policy Dry Run from an identity's ⋮ menu in the Identities table.
Dry Run Notes:
Result: 0 Changes
When a dry run returns "0 changes", it means:
The selected identity does not meet any of the trigger conditions defined in your policy's workflows
No actions would be executed for this identity when the policy runs
This is not an error - it simply means the identity doesn't qualify for any of the configured workflows
Limitations
Dry Run has several important limitations:
Dry Run evaluates whether workflow conditions are met, not whether actions would succeed
It does not check whether integrations are functioning properly and whether target systems are accessible
It does not validate that changes could be successfully applied
A broken integration might cause workflow-defined changes not to be applied to an identity
Best Practices
Use Dry Run to validate that policies and their workflows are working as intended before enabling them in a live environment.
Test with Representative Identities: Select identities that represent different scenarios (new hires, role changes, terminations) to validate all workflows in your policy.
Simulate Different Scenarios: Modify identity attributes during Dry Run to test trigger conditions such as:
Department changes
Employment status updates
Handling long names or names with special characters
Department and location change at once
Same-day rehire after termination
Understanding how workflows execute helps with troubleshooting and policy design.
When identity source data changes, Veza processes it in this order:
Extraction completes: Data is pulled from the identity source.
Duplicate resolution (optional): If the policy has a Duplicate Resolution Rule configured, Veza consolidates duplicate records for the same person into a single authoritative identity before triggers evaluate. See .
Workflow triggers evaluate: Veza begins evaluating trigger conditions within approximately 1 second of extraction completing. Actual evaluation time scales with the number of managed identities. Policies with thousands of identities can take several minutes to process. For policies with multiple identity sources, evaluation waits until all configured sources have completed extraction.
"First time only" triggers
Most workflows (except sync workflows) have Only the first time the identity matches selected, so they trigger only when the condition is first met. This means:
The workflow triggers the first time an identity matches the condition.
If the condition clears (identity no longer matches) and then matches again, the workflow triggers again as if it were the first time.
This behavior handles rehire scenarios where a previously terminated employee returns.
Sync workflows
Sync workflows track specific properties for changes. When adding new properties that require syncing:
Update the tracked property list in the workflow configuration.
Update sync-related shared attribute mappings to include the new attributes.
For more information on workflow triggers, see .
Trigger conditions use SCIM filter syntax. When comparing values, only the variable on the right side of the comparison can be transformed. The left side must be an attribute reference without transformation. See for syntax details.
Policies can be version-controlled, allowing for a method to refine and test changes in your automation workflows. You can create draft versions to test changes and validate updates before deployment while maintaining a history of previous configurations. Each policy can have only one active version and one draft version at a time, with automatic archival of retired versions.
Policies have a current state that is based on their workflow operations.
The Policy state includes:
Initial - Initially created before the first workflow version is published
Running - Actively processing with one or more workflows
Paused - Temporarily disabled
Pending - Waiting for activation
Note: On the Provisioning Policies page, click the overflow icon (three dots) on a policy's row and select Enable to start a policy in the Initial state or resume a Paused policy, or Disable to pause a Running policy.
The Workflow Version state includes:
Draft - In draft mode for editing and modification
Published - Functional and active
Retired - No longer active or usable
Draft mode is a state where a policy is saved but not yet active. In draft mode, you can create, edit, and test policy configurations (such as workflows, actions, or mappings) without affecting real users, identities, or access profiles. Once you are satisfied, you can publish the policy, which moves it from the work-in-progress state to an operational state.
Draft-and-publish is the standard flow for every Provisioning Policy. There is no setting to turn it on.
Test Policy Workflows using Draft Versioning
You can test and refine your policy workflows to ensure that it is working as expected through a series of draft versions with Dry Run simulations. Once the workflow’s result is satisfactory, publishing the version will change the policy status to ‘active’.
Perform the following steps to test your policy workflow:
Create and save a new policy.
Create a new workflow and Save.
After creating a new workflow, click Publish.
By publishing your workflow, it is ready for activation: on the Provisioning Policies page, click ⋮ on the policy's row and select Enable. The Create Draft button is enabled.
Published Policy
A published policy is activated and deployed with the following characteristics:
Enforces the defined rules in your environments, including:
Creating, modifying, or removing user access.
Synchronizing identity attributes.
Triggering workflows or notifications.
For organizations using multiple Veza tenants (such as sandbox and production), policies can be migrated between environments using migration scripts provided by Veza support.
Use the migration script approach for:
Large policies with many workflows and complex transformers
Repeated migrations between the same environments (sandbox → production)
Policies where manual reconstruction would be time-consuming
For simple policies or one-time migrations, manual reconstruction may be faster than setting up the migration toolkit.
In both sandbox and production tenants, log in as an Integration Manager or Administrator and create API keys (Administration > API Keys).
Store each key in a password manager or secrets vault.
Set environment variables for the migration script:
VEZA_TOKEN for production
In the target tenant, create a new draft version of the policy and note the version number.
If any of the following changed since the last migration, update the lookup table CSV (provided by support) with new IDs:
Access Profiles
Email Templates
Extraction frequency for an identity source is set by its extraction interval, which an administrator can change in System Settings. See .
To extract at a specific time of day instead, so that identity data is current before a workflow runs, configure a per-data source schedule through the Veza API. There is no UI for this setting, and a schedule replaces the extraction interval for that data source. See .
Concurrency limits apply at the tenant level, across all policies. Set them on the Performance tab of the Lifecycle Management Settings page:
Workflow tasks: how many triggered workflows run in parallel. Each task runs one identity through its policy workflow.
Access request fulfillments: how many approved requests apply their access changes in parallel.
Per-integration limits: how many provisioning jobs run in parallel against one integration. A default limit applies to every integration without its own limit. See How do I configure parallel execution settings? under in the Lifecycle Management FAQ.
Raise these values gradually. Higher concurrency adds load to target systems and downstream integrations.
Disabling a policy pauses any running workflows. Re-enabling the policy does not resume paused workflows—they restart on the next extraction cycle.
Use the Policies page for an overview of initial, running, and paused policies. New policies are created in the "Initial" state, enabling a review period before activating the policy. Active ("Running") policies will apply the next time the data source is extracted.
To manage policies on the main Provisioning Policies overview:
Go to Lifecycle Management > Provisioning > Policies
Find the policy you want to manage
Search for a specific policy by name
Filter to show all providers by their current state
On the policy page, click View Details on the Last Policy Run panel to open the policy's run details. When a policy draws identities from more than one source, this view covers each source separately. You can also open this view by selecting the status in the Run Status column on the Provisioning Policies page.
Identity Source
Each source of identity appears as a card under Identity Source, showing the data source, the entity type that source contributes, and Started at for that source's most recent run. A source with no run history reads No extractions yet, and a source with a run in progress shows a running indicator. Select a card to scope the rest of the view to that source.
Veza orders cards by the start time of each source's most recent run, most recent first. Sources with no run history appear last. When the view opens, Veza selects a source that is currently running. If no source is running, Veza selects the source whose most recent run started last.
Started at is when Veza began processing that source's most recent run. It is not the time the source last extracted data.
Run summary
The summary above the execution steps reads Current Policy Run while the selected source is running, and Last Policy Run otherwise. It reports the processing time and the policy version. The view shows Status only when the run is Running or Stopped. The Run Status column on the Provisioning Policies page also shows Awaiting Extraction (the policy is waiting for the next extraction) and, for a policy that will not run, Not Published (no published version), Not Enabled (published but not enabled), or Disabled.
If a safety limit stopped the run, the view shows the alert Policy run stopped to avoid exceeding safety limit. Select View Details to open the Blocked Tasks page.
Execution steps
Three steps describe what the run did for the selected source:
Analyze Identities determines which identities changed, validates them against the policy's identity settings, and saves them to Veza. It reports counts of new, deleted, property-changed, and unchanged identities. When valid identity settings are enabled on the policy, it also reports valid and invalid identity counts, and the invalid count links to the matching entries on the Activity page.
Evaluate Workflows matches identities against workflow trigger conditions and reports how many identities each workflow runs for.
Execute Workflows runs the workflow tasks and reports task counts, completions, errors, and the number of tasks a safety limit held back. Blocked task counts are reported per workflow as well as for the run, so a workflow that reached its own limit is visible individually. The blocked count is a live figure that decreases as tasks are run or abandoned from the Blocked Tasks page, and it is included in the total task count. When the run creates no tasks, the step reads Completed - No tasks to execute
For the sequence Veza follows for an individual identity, see .
Policies with multiple sources of identity
Each policy run covers one extraction from one source, so sources succeed or fail independently. A failure on one source does not change the status of another, and no combined status is reported across sources.
A policy with more than one source of identity does not process an extraction until every configured source has extracted at least once. Extractions that arrive before then wait. After that, extractions are processed and identities are saved, but workflows do not run until the most recent extraction of every source, primary and secondary, has finished successfully. Workflows start on the extraction after that point. This gate applies once, when the policy first starts: afterward, a failed extraction from one source does not stop workflows for the others.
Policies contain one or more workflows. Typically, workflows correspond to Active and Inactive user states, but not always. More specifically, workflows define a sequence of actions to run when a condition is met, based on events and identity changes captured at the source of identity. These workflows apply to scenarios such as new employee hiring, internal employee mobility changes (e.g., promotions, transfers, new managers), or employee departures.
Workflows comprise a tree-like sequence of conditions designed to meet the specific requirements of your joiner, mover, and leaver processes. For example, you may want to grant specific entitlements to users with specific roles, locations, or groups.
The following diagrams illustrate typical joiner and leaver workflow implementations, showing how identity changes in your HR system trigger coordinated provisioning and de-provisioning actions across multiple target applications.
Joiner Workflow
When a new employee is created in Workday, Veza automatically provisions accounts and assigns appropriate access across connected systems based on the employee's role and attributes.
Leaver Workflow
When an employee's status changes to inactive or terminated in Workday, Veza automatically de-provisions accounts and removes access to protect your organization's security posture.
Workflows and Trigger Conditions
Trigger Conditions refer to rules or filters that initiate (or delay) provisioning and deprovisioning workflows based on certain events, criteria within identity data sources, or lifecycle workflows. Trigger conditions use SCIM filter syntax to evaluate whether an identity matches specific criteria.
See for SCIM filter syntax and available operators, or for a comparison with transformer syntax.
Trigger conditions are often tied to HR events, such as employee hiring (joiner), role changes (mover), or termination (leaver). For example, provisioning flows can be triggered when an employee is hired or deprovisioned when terminated.
Trigger Conditions can be time-based, such as "create the Active Directory account 15 days before a new employee's start date". To compare a date attribute to the current date, use a WHEN() expression. See .
Advanced implementations also support relationship-based triggers (e.g., launching workflows when a worker is added to a specific department). Note: Trigger conditions can also encompass transformer functions embedded in SCIM filter conditions
To add a workflow, perform the following:
Open the policy, open the draft version from the Policy Versions panel, and select the Workflows tab.
Click Create (Create Workflow when the policy has no workflows yet).
In Name & Description, enter the workflow name and description.
Use the Enable workflow toggle to set whether the workflow starts enabled.
Note: All workflow errors must be resolved before it can be saved.
Save Conflicts
When you click Save in the workflow editor, Veza checks whether the draft version changed after you opened the editor, for example because another user saved changes to it. If it did, Veza doesn't save. The Draft Changed Since You Started Editing dialog opens instead and shows who last edited the draft, when they saved, and when your edit started.
Under Choose how to resolve, select an option and click Confirm:
To return to the editor with your edits intact, click Cancel. Nothing is saved.
Clone or Delete a Workflow
Each workflow card on the version's Workflows tab has a menu with these options, alongside Edit Workflow and Workflow Settings:
Clone Workflow copies the workflow.
Delete Workflow deletes it.
Run Workflow Manually runs the workflow for selected identities in the published version. See .
See Notes displays the workflow notes, when notes exist.
Webhook notifications after Provision Account
For ITSM integrations that need to receive all attributes after a Provision Account action completes:
Place the webhook action under a condition that follows the Provision Account action in the workflow tree.
Add a pause action before the webhook if needed to allow time for attribute propagation.
Use clear naming conventions for conditions (for example, "FTE New Hire AD Notification") to indicate their purpose.
A shared attribute mapping (a Transformer in earlier releases) is a reusable rule that takes incoming identity or attribute data and modifies it into the format or value that the target system requires.
They’re used when the data source system and target system represent or store information differently. For example, transformers can:
Converting a username from “First.Last” format into all lowercase.
Mapping a department value like “HR” in the source to “Human_Resources” in the target.
Adding a prefix or suffix to attributes (e.g., appending a domain name to create an email).
Transformers act as data processors inside a policy, ensuring that the right values are sent when provisioning, updating, or deprovisioning identities and entitlements.
To add a shared attribute mapping, perform the following:
Open the policy and open its draft version from the Policy Versions panel. If the policy has no draft, click Create Draft.
Select the Workflow Components tab.
On the Shared Attribute Mappings card, click +. When the policy has none yet, you can also click Create Shared Attribute Mapping.
In the New Shared Attribute Mapping
See for available transformation functions.
Lookup tables are CSV files with columns that map values from a source of identity to destination values. Each row represents a mapping entry. The first row must contain the column headers.
This example is a location mapping table, which is a typical format for a Lookup Table:
Once a Lookup Table has been uploaded, it can be processed with the Lookup Transformers. The Lookup transformers convert identity attributes from a source system into appropriate values for target systems based on CSV reference tables. This is particularly useful when mapping values between systems that use different naming conventions, codes, or formats for the same conceptual data.
Use Lookup Table Transformers to:
Map source attribute values to different values in target systems
Standardized reference data that must be consistent across applications
Extract different pieces of information from a single attribute value
Have complex mapping requirements that built-in transformers cannot support
See for detailed information.
To add a Lookup Table, perform the following:
Open the policy's draft version and select the Workflow Components tab.
Select the Lookup Tables card.
Click + on the card. When the policy has no lookup tables yet, you can also click Create Lookup Table.
In the New Lookup Table window, enter a name and description for the Lookup table.
Properties are the attributes that describe identities, accounts, and entitlements. They serve as the data points a policy can use to determine when and how to take action. Properties can come from:
Built-in properties – default attributes that LCM provides out-of-the-box (for example: username, email, status, created_at).
Custom properties – attributes defined by your organization to capture unique metadata (for example: cost_center, employee_type, manager_id).
Use Properties to:
Properties are referenced in policy conditions (e.g., disable account if status = inactive).
Help with transformers and lookup tables, allowing you to map or reformat values.
Used in identity overrides when syncing accounts from different providers.
To add Properties, perform the following:
Open the policy's draft version and select the Workflow Components tab.
Select the Properties card.
The Mover Properties appear. Click Edit.
In the Edit Properties panel, click the Select options field to display a dropdown menu of attributes.
The Properties card also holds Properties for ‘When’ Expressions in Conditions, which set the date format and time zone for attributes used in WHEN() expressions. See .
Password Rules in a policy ensure that generated passwords adhere to standardized criteria according to defined password policies across automated provisioning workflows. You can define reusable password rules to enforce requirements for password length, mandatory character types (uppercase letters, lowercase letters, numbers, and special characters), and restricted characters when generating random passwords. These rules are available for selection in Provision Account, Deprovision Account, and Reset Password actions when working with integrations that support complex password requirements.
To add Password Rules, perform the following:
Open the policy's draft version and select the Workflow Components tab.
Select the Password Rules card.
Click + on the card. When the policy has no rules yet, you can also click Create Password Rule.
In the New Password Rule window, enter a name and the length of the password (default is 6).
Custom Transformer Functions allow you to programmatically modify or enrich identity attributes as they are synced from identity sources to target systems. These transformations ensure that data formats align across systems and support more dynamic provisioning logic. Such transformers can:
Convert dates into required formats or perform date-based calculations (e.g., adding days to a hire date).
Normalize or transform string values (e.g., case conversion, trimming, substrings).
Apply conditional logic via functions directly within provisioning rules.
Chain multiple transformations into pipelines for complex workflows.
To add Transformer Functions, perform the following:
Open the policy's draft version and select the Workflow Components tab.
Select the Transformer Functions card.
Click + on the card. When the policy has no transformer functions yet, you can also click Create Custom Transformer Function.
In the New Custom Transformer Function window, enter a name and description of the transformer. Note: The name
To open the Policy Settings page, open the policy and click Policy Settings at the top of the policy page. The button is available to users with permission to update policies. The page is organized into Details, Primary Identity Source, Additional Identity Sources, Notifications, and Execution Guardrails sections.
The Policy Settings page provides information about a specific policy and allows for additional configuration, including:
Modify the primary identity source
Define an additional data source to the primary identity source
Configure email notifications or a webhook for action-related events
Set execution guardrails that limit how many identities or workflow runs an extraction can affect, to prevent unexpected issues
The Details view shows the Provisioning Policy Name and Description fields. These fields are editable for name change or description refinement, if required.
The Primary Identity Source pane displays the integration name of the data source. The Integration field displays all available data sources, where you can add or remove, if required.
A Primary Identity Source is the authoritative system that serves as the source of truth for user identities (e.g., HR system, Active Directory, identity provider like Okta/Entra ID). Typically, one type of source of identity is associated with one integration.
The role of the Primary Identity Source includes:
Acts as the authoritative record for user information (emails, roles, statuses).
Lifecycle rules such as provisioning, updates, or deprovisioning are typically triggered based on changes detected in this data source.
Ensures consistency and accuracy across target systems where access is granted or revoked.
The Duplicate identity resolution section of this pane consolidates multiple records for the same person within this source into a single record. See .
As an option, the Additional Identity Sources pane is typically used to add a different type of integration from the Primary Identity Source, which requires that the additional data source be already configured into Lifecycle Management. You can also correlate primary attributes and additional attributes to be associated with the data source. The added data source will sync for authentication, user updates, or provisioning.
To add an Additional Identity Source, perform the following:
Click Add Source.
Select a data source in the Search Identity Sources picker. Note: Leave 'These types are not related' unchecked (the default) when you want Veza to match identities across both sources using the correlating attributes defined below. Enable the option when the additional source has no correlation to the primary — for example, when adding it purely for enrichment and identity matching is not needed. With the option enabled, Veza hides the Correlating Attributes section and skips identity matching between the two sources.
In the Correlating Attributes section, select an attribute in the Attribute in primary source column.
To update identity attributes from this source without running workflows (for example, when it only supplies manager information from a departmental system), clear the source under Extraction is processed from in each workflow. See .
When events occur during the execution of a policy's workflow, notifications can be triggered upon execution of actions in workflows as a means to inform stakeholders or integrate with external systems. This section covers policy notifications, which send when an event of the selected type occurs in any workflow in the policy. Notifications can also be a step in a workflow, or an option on another action (Action Notification Settings). To compare the three, see . Policy notifications support email and webhooks.
For example, an organization might configure its Active Employee policy to send an email to the manager of each new hire after the employee's email address is provisioned (see ). Additionally, a webhook will be sent to the company's learning management system to initiate online onboarding training once each new hire's Okta account is provisioned, following a successful Provision Account action.
Use the Notifications to add and manage notifications:
Open the policy, click Policy Settings, select Notifications, and click Add Notification. The same Notifications section is also available when you create a policy.
Choose the notification type (Email or Webhook).
Choose the event to trigger notifications:
See for customizing email notifications.
This setting controls whether a workflow re-runs for an identity that still matches its trigger condition but whose properties have not changed in the source since the last extraction. It takes effect only when the workflow's Only the first time the identity matches checkbox is cleared. While that checkbox is selected, the setting has no effect, and the workflow follows first-match trigger behavior instead (see ).
It is a per-workflow trigger setting, chosen in the workflow editor under Run Workflow → Identity properties. Each policy also has a default mode. When you publish the policy, Veza saves that default on every workflow that doesn't set its own mode. After that, each workflow keeps its own value, so changing the policy default later affects only workflows added afterward. Policies created in the Veza UI default to Only when identity properties change. When you create a policy through the API, set sync_only_when_source_changes to true for the same default. If you omit it, workflows that don't set their own mode publish as Every extraction with a 24-hour throttle. As with the other , the policy default is not editable in Policy Settings.
When you choose Every extraction, a throttle appears: Minimum Re-run Interval (hours) (default 24 hours). This is a per-identity minimum interval — on each extraction, an unchanged-but-matching identity re-runs only if at least this interval has elapsed since that identity was last processed.
To configure:
Open the workflow in the policy's workflow editor.
Under Run Workflow → Identity properties, select Only when identity properties change or Every extraction.
If you selected Every extraction, set the throttle interval in Minimum Re-run Interval (hours) (default: 24 hours).
Save the workflow.
Safety Limits guard against unintended mass changes to identities. They stop a policy when an extraction would change, or is changing, more identities than you expect. There are two kinds of limit:
Each kind can be set for the policy as a whole, for individual workflows, or both. A policy-level limit counts across every workflow in the policy. A workflow-level limit counts only that workflow.
Policy-level limits apply to every workflow in the policy. Click Policy Settings on the policy page and go to Execution Guardrails → Safety Limits:
Stop processing at the safety limit sets the policy-level Safety Limit. Turn on the toggle, then enter the threshold in Max Identities Affected per Extraction.
Stop processing at the predictive safety limit sets the policy-level Predictive Safety Limit. Turn on the toggle, then enter the threshold in Max Workflow Runs per Extraction. The minimum is 1. Available in Veza v2026.9.7 and later.
Workflow-level limits are part of each workflow's guardrails, described below.
Each workflow has its own Execution Guardrails section on its Workflow Settings page. To open it, select Workflow Settings from the workflow card's menu on the policy's Workflows tab. Workflow-level guardrails apply only to that workflow, allowing different settings for Joiner, Mover, and Leaver workflows within the same policy. The available controls are:
Retry failed workflows: when on, a failed workflow re-attempts on later extractions up to the configured Max Retries value. The Max Retries field in the UI accepts values from 1 to 50; API callers can configure values up to 1000. When the toggle is off, a workflow that fails on an identity does not re-run for that identity on later extractions, and operators must intervene manually. The corresponding API fields are no_retry_for_failed_workflow and max_retries_for_failed_workflow; see the for the full property table.
Stop processing at the safety limit
For each extraction, Veza checks the limits in this order:
Policy-level Predictive Safety Limit. If the predicted workflow runs across all workflows exceed it, every workflow's tasks for the extraction are blocked, and the workflow-level predictive checks are skipped.
Workflow-level Predictive Safety Limits. Each workflow is checked on its own. A workflow over its limit has all of its tasks blocked. The other workflows' tasks run normally.
Safety Limits, as tasks run. Before each task starts, and again while it runs, Veza checks the policy-level Safety Limit and then that workflow's own Safety Limit. When the policy-level count is reached, every remaining task in the policy is blocked, whichever workflow it belongs to. When a workflow-level count is reached, only that workflow's remaining tasks are blocked. A task blocked partway through keeps its progress, and continues from that point if you run it.
Whichever limit is reached:
The blocked tasks wait on the page until an administrator runs or abandons them.
The whole policy stops processing extractions. This applies to a workflow-level limit too. Later extractions are skipped for every workflow in the policy, not queued, until an administrator resumes processing. Skipped extractions are not replayed, but their changes are not lost. When processing resumes, the next extraction compares the current source data with the identities Veza stored before the limit was reached, so identities that changed, appeared, or were removed in the meantime are detected. Veza sees only the net result: an attribute that changed and then changed back counts as unchanged. If the source has not changed since the most recent skipped extraction, the changes are detected on the next extraction in which the source data changes.
Veza records a SAFETY_LIMIT_REACHED event. Its message says which limit was reached, and names the workflow for a workflow-level limit.
The Blocked Tasks page lists the tasks a safety limit held back. For a task, or a selection of tasks, you can:
Run the blocked tasks (manually approve execution)
Abandon the blocked tasks (discard without executing)
To restart the policy, click Resume Processing Extractions, then Confirm and Resume. Any tasks still blocked are run, and the policy processes extractions again. To discard the remaining tasks instead, abandon them before you resume.
Identity Validation evaluates every identity in an extraction, not only the identities that changed, against before workflows run, and halts the extraction when too many identities fail. It is a threshold control for the run as a whole, not a per-identity filter:
While the invalid count stays within the configured tolerance, identities marked invalid are still saved and still processed. Validation records them; it does not exclude them. The default tolerance is 0, so a single invalid identity stops the extraction.
Once the invalid count exceeds the tolerance, the entire extraction stops before any identities are saved or any workflow is evaluated. The extraction is recorded as failed, and an EXTRACTION_EVENT_FAILED event is recorded.
The policy is not held after a stop, unlike a . The next extraction is processed and validated again on its own. If its data passes, it proceeds, and because the stopped extraction saved nothing, it detects the changes made since the last saved run. If its data still fails, it stops again. At the default tolerance, one identity that keeps failing, or a filter that references an attribute the source does not send, stops every extraction until the source data, the filter, or the tolerance changes.
Use Identity Validation when an upstream source is occasionally noisy — for example, when staging records or partially provisioned identities appear in the authoritative feed and should not trigger Joiner or Leaver actions.
To configure:
Open the policy, click Policy Settings, and go to Execution Guardrails.
Under Identity Validation, turn on Validate identities before processing.
In Valid Identity Filter, enter a SCIM filter expression that all valid identities must match. Identities that do not match are marked invalid.
In Invalid Identity Filter, enter a SCIM filter expression that explicitly identifies invalid identities. Identities matching this filter are marked invalid even if they also match the valid filter.
Filter semantics: An identity is marked invalid if it matches Invalid Identity Filter OR fails to match Valid Identity Filter. If only one filter is configured, only that filter is evaluated.
A filter that cannot be evaluated for an identity counts as not matching, so for Valid Identity Filter the identity is marked invalid. A filter that cannot be parsed at all causes the extraction to fail. Veza does not check filter syntax when the policy is saved, so test filter expressions first.
Example filters:
| Require an email and a first name | email ne null and (first_name ne null or beeline.first_name ne null) | | Exclude identities tagged as test accounts | Set Invalid Identity Filter to tags co "test_account" |
Filters use the standard Veza SCIM filter syntax — see for the operator reference.
The name should indicate the source of identity that the policy applies to
Select a Primary Identity Source using the arrows to display a list of available data source integrations.
The selected identity source will trigger workflows in the policy
For the identity source to appear in the menu list, the integration must have Lifecycle Management enabled and be available as a source of identity.
See Integrations for a list of supported providers and the steps to enable a Lifecycle Management data source.
Note: A Lifecycle Management data source can only be used to trigger workflows in one policy at a time. However, you can assign multiple Lifecycle Management data sources to a single policy as Primary Identity Sources. For example, Company A merges with Company B using Active Directory as its Primary Identity Source. The Primary Identity Source can consist of two integrations: Company A AD (from a CSV Upload integration) and Company B Employee Directory (from an OAA integration).
(Optional) Use Additional Identity Sources to add more data sources and correlating attributes.
Click Add Source.
Select a source in the Search Identity Sources picker.
Under Correlating Attributes, select an attribute in the Attribute in primary source column.
Select the matching attribute in the Attribute in additional source column.
Click Add to add more pairs of correlating attributes.
The Only enrich existing identities option controls identity creation:
Enabled: Only adds data to existing identities from the Primary Identity Source. Does not create new LCM identities.
Disabled: Creates new LCM identities when users exist in the Additional Identity Source but not in the Primary Identity Source.
Whether an extraction from this source runs workflows is set per workflow, not on the source. See the Extraction is processed from clause in .
Click Create. The policy is automatically set to the Initial state.
Select one or more attributes to sync. You can modify attributes to simulate potential changes.
Click Show Results.
Review the results:
Check the Workflows Run section to see which workflows were triggered.
Check the Actions Run section to see all job requests that would be generated (e.g., edits to user attributes, adding/removing access profiles).
Check the Messages section for evaluation messages.
Location transfers
Role modifications
Test Edge Cases: Use Dry Run to test unusual scenarios or edge cases that might not occur frequently in your environment.
A Dry Run executes the workflow logic end-to-end, making no external changes. It evaluates conditions, decides which actions would run, and logs the decisions and payloads. That makes it ideal for probing unusual or risky situations without touching real accounts or entitlements. Here are some edge case examples:
Actions execute: Actions within a condition execute in order. If an action fails, the remaining conditions in the workflow are skipped and the workflow is marked as errored — unless the failing action has Continue if this action fails enabled, or the parent condition has Continue if any action fails enabled.
Click the overflow menu (three dots) and select Single Dry Run to test your workflow.
If you are not satisfied with the results of the Dry Run simulation, then click Create Draft. Your workflow will be labeled with a new version number.
Click Edit Workflow to make changes to your workflow.
Continue to modify your workflow using the previous steps until your workflow displays the expected results. Click Publish.
You can view the history of your workflow versions and rollback any draft version for use.
It can still be updated by moving it back into Policy Draft Mode first.
VEZA_TOKEN_2 for sandbox
Set up a Python virtual environment for running migration scripts.
Obtain the migration script and lookup table files from Veza support.
Webhook notifications
Update the migration script configuration with source and target version numbers.
Run the migration script.
Review the migrated policy and apply any manual corrections needed.
Run a bulk dry run (allow 8-9 hours for completion).
Review joiner and leaver counts—high counts may indicate configuration issues.
Publish the policy and wait for the next extraction to verify correct execution.
Review the Activity page approximately 30 minutes after extraction completes.
Click the three dots icon ⋮ in the rightmost column to expand the Actions menu
Dry Run - Single Dry Run, Bulk Dry Run, and See Bulk Dry Run History.
Versions - See Version History, Discard Draft (when a draft exists), and Compare Versions.
Provisioning Policy - Enable or Disable the policy, or Delete it.
Click a policy's row to open it. The policy page shows the Last Policy Run and Policy Versions panels. Open the draft version to create a workflow, shared attribute mapping, property, password rule, or transformer function. When a policy has more than one version, the Policy Versions panel also shows Compare Versions. For every control on the policy page and the version page, see Policy page and version page.
In Priority, select one of:
Not set
Low
Normal
Medium
High
Critical
The levels dictate the order in which workflow tasks run. Higher-priority tasks are processed first. A fairness algorithm prevents lower-priority workflow tasks from being starved.
Optionally, configure Execution Guardrails (see Workflow-level guardrails), then click Next.
In the workflow editor, click the Trigger box to open the trigger panel. Until a condition is set, the box reads Set Trigger Condition.
Under Run Workflow, set the clauses that decide when the workflow runs for an identity:
Extraction is processed from: select the identity sources whose extractions run this workflow. At least one source is required. Clear a source to update identity attributes from it without running this workflow, for example when an additional source only supplies manager information.
Identity matches this condition: build the trigger condition string. Once a condition has been set, another conditional string can follow.
To check the condition string against sample attribute values, select Test under the condition field. See Test conditions and formatters.
With readable conditions on, the workflow tree also shows a plain-English description of the trigger and each condition.
Only the first time the identity matches:
Selected: The workflow runs only when the trigger condition is initially met, and on every subsequent transition from "not met" to "met."
Cleared: The workflow runs on every extraction where the condition is true, regardless of its previous status.
Identity properties: select Only when identity properties change or Every extraction. See for the difference. Under Only when identity properties change, choose which changes count:
Any property: a change to any of the identity's properties.
Specific properties: a change to one or more of the properties selected in Trigger Properties. For more precise control (such as triggering only when two specific properties change together), use sys_attr_changed__<property> attributes directly in the trigger condition string instead. See . Because this option gates on a
(Optional) Under Workflow Schedule, click Add Date Formatter.
Click the Formatter field to display a dropdown menu of operator functions, the conditional expression function, and attributes.
Click the Then Apply field to display a dropdown menu of operator functions. The Then Apply field combines a series of attribute formatters with the pipe (|) character to run the value of an attribute in sequence. The output of one formatter becomes the input of the following formatter.
(Optional) In Minimum Delay Before Running, set the delay. This option prevents actions from executing immediately when a trigger condition is met. The purpose of such a delay is usually to allow for propagation or to prevent repeated rapid changes that trigger unintended cycles.
Click Save.
Click the Integration field to display a dropdown menu of integrations of a target system.
Click the Entity Type field to display target entity types based on the integration that was previously selected.
In Attributes, click Add Attribute.
In Unique Identifier, click the Destination Attribute field to display a list of attributes.
Click the Formatter field to display a dropdown menu of operator functions, the Conditional Express function, and attributes.
Click the Then Apply field to display a dropdown menu of operator functions. The Then Apply field combines a series of attribute formatters with the pipe (|) character, which runs the value of an attribute in sequential order. The output of one formatter becomes the input of the following formatter.
Optionally, click Add Attribute to add more attributes and repeat the attribute steps.
For a unique attribute, the Fallback Formatter option appears. Click Add Fallback to provide an alternative formatter when a conflict occurs if the primary formatter generates a value that is already in use.
Optionally, set Apply On to Create and update to keep the target entity up-to-date with values from the source of truth. The default, Create only, sets the value only when the entity is created.
Click Save.
Drag and drop a CSV file or navigate to a CSV file to upload. The CSV file must be 10MB or less.
After uploading the file, you can preview it.
Click Save.
Select one or more attributes for your property.
Click Save.
Turn on the toggles for the character types every generated password must include:
Require at least 1 lowercase character
Require at least 1 uppercase character
Require at least 1 numeric character
Require at least 1 special character
Note: At least one of the lowercase, uppercase, or numeric toggles must be on.
In the Disallow characters field, enter one or more characters that are not allowed in the password.
Click Save.
Click the Function Expression field to display a dropdown menu of operator functions.
Click Save.
Select the matching attribute in the Attribute in additional source column. Note: The Only enrich existing identities option:
Enabled: Only enriches existing identities from the Primary Identity Source. Does not create new identities.
Disabled: Creates new LCM identities for users found in the Additional Identity Source but not in the Primary Identity Source.
(Optional) Use the Duplicate identity resolution section of the source's card to consolidate multiple records for the same person within this source. Each source carries its own independent rule. See Duplicate Resolution Rules.
Update Account
Add Entitlement
Remove Entitlement
Create Email
Change Password
Delete Account
Disable Account
Write Back Email
Access Request Completed
Custom Action
Action Failed
Workflow Task Failed
Extraction Processing Failed
Create Group
Create Guest Account
Rename Group
Create Access Review
Reset Password
Create Access Review Queued
Safety Limit Reached
Invalid Identity Summary
Invalid Identity
Identity Metadata Edit
Rotate Key
Remove Direct Access
Identity No Longer in Sources
The Manage Entitlements action emits Add Entitlement and Remove Entitlement events. Access Request Completed is listed only when Access Requests is enabled.
Under Send a notification if:, choose Changes were made successfully, The action failed, or both.
For an email, in Select Email Template, select a custom email template or Default template. See Custom Email Templates.
Select a Veza Action: Select Veza Action for a webhook, or Select Recipient (Veza Action) for an email. An email Veza Action sends only to its own address and replaces the recipient fields in step 8. A Veza Action is an integration with functionality for sending data to external systems, enabling downstream processes around Veza alerts, and access to reviewer actions. Use a Veza Action to configure generic webhooks or enable email notifications.
See Veza Actions on how to create and deploy a Veza Action.
To customize the Webhook setting, perform the following:
In the Webhook URL field, enter the endpoint configured to receive the webhook payload.
In the Webhook Auth Header field, enter the authorization header if the webhook endpoint requires authentication (e.g., Bearer token123 or API-Key abc456).
To customize the Email setting, perform the following:
In the Recipients field, enter one or more email addresses. Use a comma when adding additional addresses.
In the Recipients From User's Attributes field, use the arrows to display a list of user attributes. Select one or more attributes that contain email addresses for the email notification. The list shows only text attributes whose name contains mail or manager.
Under Email Formatters, optionally build recipient addresses from identity attributes. See .
Click Save.
Stop processing at the predictive safety limit (the per-workflow Predictive Safety Limit): blocks this workflow before execution begins if the number of workflow runs predicted for it exceeds the threshold in Max Workflow Runs per Extraction. Use it to stop unintended mass processing when upstream attribute changes in a Source of Identity would trigger a large batch of Joiner, Mover, or Leaver runs.
Set Max Invalid Identity Events per Extraction to cap the number of INVALID_IDENTITY activity log entries Veza records per extraction. Default: 1000. The total invalid count is always tracked accurately — this field only limits event log volume.
Set Invalid Identities Allowed Before Blocking to the highest invalid count the policy can tolerate before halting. Default: 0 (strict — any invalid identity blocks the run). Set to a non-zero number to allow up to that many invalid identities before the policy stops.
Save the policy.
Force Save My Changes
Saves your copy of the draft's workflows, replacing the current draft.
Discard My Changes
Closes the editor without saving and returns to the policy version, which shows the latest saved draft.
location_code,state_code,state,city
MN001,MN,Minnesota,Minneapolis
CA001,CA,California,Los Angeles
TX001,TX,Texas,Houston
TX002,TX,Texas,AustinOption (under Identity properties)
When the workflow runs for a matching identity
Use when
Only when identity properties change
Only when the identity's properties changed in the source since the last extraction, or when the identity newly matches the trigger condition.
The source emits reliable change events and you want to minimize unnecessary processing.
Every extraction
Also re-runs matching identities whose properties have not changed, subject to a per-identity throttle (below).
You want a safety net against missed change events, or the source occasionally produces silent updates that do not trigger change detection. For large tenants, prefer a longer interval: a shorter one re-processes more unchanged identities on each extraction.
Predictive Safety Limit
Before any workflow runs for an extraction
Workflow runs predicted for the extraction
Safety Limit
Before each workflow task starts, and again while it runs
Identity changes the extraction has made so far
Goal
Filter


hire_date <= TODAYUsed properties: a change to at least one property the workflow actually uses. These are the properties referenced by the trigger condition, enabled conditions, and state-changing actions, plus any you add in Additional Trigger Properties.
Frequently asked questions about Veza's Lifecycle Management for automated identity and access governance
This document addresses common questions about Lifecycle Management (LCM) for automated identity and birthright access governance across systems and applications.
The questions in this document are designed to introduce key concepts and address common questions that often arise during deployments. Please contact your support team with additional questions and feedback. Note that specific functionality may depend on the features and integrations enabled in your environment.
Your Lifecycle Management configuration can be straightforward or complex, depending on your organization's needs. To learn more about general implementation patterns, see Workday, Okta, and Active Directory and Implementation and Core Concepts.
See also:
RunningHybrid mode (only_enrich_existing = false): Can create new Policy Identities if they don't exist in primary sources.
Process with disregard_change_limit=true or disregard_predictive_change_limit=true parameter
Reset limits after processing
If changes are unexpected:
Check source system for data quality issues
Review recent policy configuration changes
Validate workflow trigger conditions
Generate IDs: Create unique identifiers from existing data
Inactive
Inactive
Primary source (default)
Access profile assignments and permissions
Safety limit configurations
Notification templates and settings
Secondary identity source configurations
Access Reviewer
Generally Available
Root only
Read-only access for assigned review purposes only
Read-only access for assigned review purposes only
Limited to assigned review contexts
SCIM Provisioner
Generally Available
Root only
Read-only access to policies and workflows
Read-only access to Access Profiles
SCIM 2.0 user lifecycle management
Integrations Manager
Generally Available
Root, Non-root
Read-only access to policies and workflows
Read-only access to Access Profiles
Integration configuration and management
Integration Owner
Generally Available
Root, Non-root
Read-only access to understand integration impacts
Read-only access to profile assignments
Specific integration ownership and monitoring
Access Reviews Monitor
Generally Available
Root only
Limited read-only access for monitoring review activities
Limited read-only access for monitoring purposes
Access Review progress monitoring without modification
Viewer
Early Access
Root, Non-root
Read-only access for monitoring
Read-only access for monitoring
Requires ROOT_TEAM_VIEWER feature for Root team access
Watcher
Early Access
Root only
Read-only access for monitoring (cannot make changes)
Read-only access for monitoring
View Review Configurations without modification capability
Auditor
Early Access
Root only
Read-only access for audit and compliance purposes
Read-only access for audit purposes
Export audit logs and compliance reporting
Re-assigner
Early Access
Root only
Read-only access with ability to re-assign review results
Read-only access with review result re-assignment
Can reassign Access Review results to different reviewers
OAA Push
Early Access
Root, Non-root
Read-only access for monitoring
Read-only access for monitoring
Upload Open Authorization API (OAA) payloads
Programmatic Key Manager
Early Access
Root, Non-root
Read-only access for monitoring
Read-only access for monitoring
Programmatic API key lifecycle management
OAA CSV Manager
Early Access
Root, Non-root
Limited access for CSV integration management
Limited access related to CSV integrations
Required for CSV Upload integration management
NHI Security Admin
Early Access
Root only
Read-only access with focus on non-human identity security features
Read-only access with NHI focus
Non-Human Identity security dashboards and risk assessments
Safety Limits: Changes blocked by the Safety Limit (during processing) or the Predictive Safety Limit (before processing begins). Tasks blocked by either limit wait on the Blocked Tasks page
PENDING - Awaiting configuration or approval
no_retry_for_failed_workflow
Disables automatic retry when set to true
false
max_retries_for_failed_workflow
Maximum number of retry attempts
10
Abandon on the Blocked Tasks page, or the Unblock Workflow Tasks API call with the ABANDON action
The selected tasks
Audit log action Update Blocked Workflow Tasks
Acknowledging the safety limit through the API (POST /api/private/lifecycle_management/policies/{policy_id}:resume_processing_extractions) with remaining_blocked_workflow_tasks_action set to ABANDON
Every task still blocked for the policy
Audit log action Acknowledge Safety Limit Exceeded. The policy's event log also records who acknowledged the limit and how many tasks were abandoned.
Configuration
Open the policy > Policy Settings > Notifications
Select the action in the workflow editor > Action Notification Settings
A workflow step
Sends when
An event of the selected type occurs in any workflow in the policy
The action fails, or succeeds and made changes
The workflow reaches the step
Notification types
Email, Webhook
Email, Webhook
Email, Webhook, Service Now
Available data
That event's placeholders, plus identity attributes for most action events
Action, workflow, and identity names, plus identity attributes and the action's output entities. No {{ENTITY_NAME}} or error message
Action, workflow, and identity names, plus identity attributes and the output entities of earlier actions
Best for
Watching for a kind of event across the policy, and events outside a workflow run
Reporting one action's outcome, typically a failure
A message at a set point in the workflow, under a condition, or to ServiceNow
{{FirstName}} {{LastName}}SPLIT(Email, "@")[1]LEFT_PAD({{employee_id}}, "0", 6)Available by default
Automated Access Reviews
Trigger compliance access reviews automatically based on user changes
Available by default
Multiple Identity Sources
Use multiple HR systems or identity providers with priority handling
Available by default
Send REST Payload Action
Custom REST API action for provisioning workflows to integrate with external systems and custom applications
Available by default
Enhanced Dashboard View
Consolidated overview dashboard showing policies, activity, and integration status at a glance
Available by default
Access Request & Approvals
Enables users to request access with automated approval workflows and provisioning
Requires configuration - contact your Customer Success Manager
Policy JSON Viewer
View and export full policy configurations in JSON format for debugging and technical support
Available upon request
Active Identity Source Prioritization
When an identity has both primary and secondary sources, prioritizes displaying attributes from whichever source has an active user status, rather than always defaulting to the primary source
Early Access - contact Veza support to enable
Alias-Based Attribute Lookup
Reference entity attributes in policies using custom aliases (e.g., $employee.email) to disambiguate when the same entity type appears as both a source of identity and a sync target
Early Access - contact Veza support to enable
Active
Any
Primary source
Inactive
Active
Secondary source
Active
Active
Primary source (default)
Role
Availability
Team Support
Provisioning Policies & Workflows
Access Profiles
Special Capabilities
Administrator
Generally Available
Root only
Full access: Create, edit, delete policies and workflows
Full access: Create, edit, delete Access Profiles and types
System configuration, user management
Operator
Generally Available
Root, Non-root
Read-only access to policies and workflows
Read-only access to Access Profiles. With the Creator permission set, can create Access Profiles and edit the profiles they own
Can create Access Reviews (Root team only)
Customizing email notifications and Webhook configuration for Lifecycle Management events and Access Requests.
Administrators can customize email notifications sent during Lifecycle Management and Access Request workflows. These emails can include instructions, unique branding, and placeholders for metadata specific to the event (such as entity names, action types, or request details). Each notification type (usage) can have its own customized template.
Notification templates support HTML and CSS. They can include links to external images or you can upload small files to Veza. This document includes steps to configure templates in the Veza UI or the Notification Templates API, and a reference for event types, default templates, and supported placeholders.
In addition to event-specific templates, you can create custom email templates that are not tied to specific lifecycle events. These reusable templates allow you to define notification content once and use it across Send Notification actions, action notification settings, and policy notifications. Custom email templates are:
Reusable: Single template for multiple workflows and actions
Event-independent: Not associated with a specific lifecycle event type
Flexible: Can be used in Send Notification actions, action notification settings, and policy notifications
Standard placeholder support: Supports the standard placeholders. Which ones are filled depends on where the template is used
To create a custom email template:
Navigate to Lifecycle Management > Settings > Notifications
Click Create Template
Select For custom mail (as opposed to "For event")
Define your template name, subject, and body using HTML and placeholders
To use a custom template, select it in Select Email Template when you configure an email notification:
Send Notification action: in the action's settings
Action Notification Settings: in the notification on an action. One selection applies to every outcome you check under Send a notification if:
Policy notification: in the notification under Policy Settings > Notifications
When you select Default template, the template depends on where the notification is configured. A policy notification uses the template for its event. The Send Notification action and Action Notification Settings use your organization's default Action Succeeded or Action Failed template, if one is set, and otherwise the action's built-in template. See . When you select a custom template, that template is used regardless of the specific event being processed.
The system provides built-in templates for all Lifecycle Management and Access Request events. These templates use placeholders that are automatically replaced with actual values when notifications are sent.
Generic Failure Template
When specific event templates aren't available or when events fail, the system uses a generic failure template:
Subject: Lifecycle job {{EVENT_TYPE}} has failed
Body:
See for all default messages.
Lifecycle Management Events
Each template you create is associated with a specific notification event (referred to as usage in the API). The following event types are available for Lifecycle Management workflows, organized by functional area:
Veza provides built-in email templates for all event types, organized by functional area below. These templates include standard placeholders and can be customized or replaced with your own templates.
From the Veza UI, you can add images directly through the "Add images" option. These will be automatically encoded and included in your template.
To use an attachment you have uploaded in a template, specify it by attachment.name, for example:
To embed high-resolution images in your templates, you should serve the content from a public URL, and use HTML to link and style it.
Use placeholders to include dynamic information in templates, such as entity names, action types, timestamps, and other event metadata. Placeholders are automatically replaced with actual values when notifications are sent.
Veza notification templates support two types of placeholders:
1. Static Placeholders (Predefined)
These are uppercase constants documented in the tables below (e.g., {{ENTITY_TYPE}}, {{ENTITY_NAME}}). They are replaced first during template processing. Which ones are filled depends on the notification type; see .
Example:
2. Dynamic Attribute Placeholders
You can also reference any attribute from the entities being processed using two formats:
Untyped format: {{attribute_name}} - References an attribute by name alone
Typed format: {{EntityType.attribute_name}} - References an attribute from a specific entity type
The attribute name must exactly match the casing used by your integration. For example:
If your integration provides an attribute named email, use {{email}}
If it provides Email, use {{Email}}
If it provides employee_id, use {{employee_id}}
Examples:
Veza populates the following static placeholders. Not every placeholder is available in every notification. Availability depends on whether the template is attached to a policy event or to an action, and on whether the action succeeded. See .
A custom template works with both policy event notifications (Policy Settings > Notifications) and action notifications (Edit Action > Action Notification Settings). Each type fills a different set of built-in placeholders, and a placeholder the type does not fill stays in the message as literal text. {{EVENT_IDENTITY_NAME}} is the identity the workflow runs for. {{ENTITY_NAME}} is the account the action created or changed.
Action notifications: {{ACTION_NAME}}, {{ACTION_TYPE}}, {{SUCCEED_OR_FAILED}}, {{ACTION_JOB_ID}}, {{JOB_ID}}, {{WORKFLOW_NAME}}, {{POLICY_NAME}}, {{EVENT_IDENTITY_NAME}}, and {{EVENT_IDENTITY_ID}}.
Attribute placeholders such as {{email}} and {{OktaUser.email}} follow separate rules. See .
Placeholder Not Being Replaced?
If a placeholder appears in your notification email instead of being replaced with a value, check the following:
Verify exact casing: Placeholders are case-sensitive
✅ Correct: {{ENTITY_TYPE}}
❌ Wrong: {{entity_type}}, {{EntityType}}, {{Entity_Type}}
Best Practices:
Start with predefined placeholders: Use the documented static placeholders (uppercase) whenever possible
Test templates: Send test notifications to verify placeholder replacement before deploying to production
Document custom attributes: Keep a reference of the attribute names and casing used by your integrations
Use typed format for clarity: When working with multiple entity types, use {{EntityType.attribute}}
Whether a placeholder resolves to a value, and which record that value comes from, depends on two things: the form of the placeholder and the configuration surface the template is attached to. A placeholder that resolves correctly on one surface can fall through unresolved on another. This section describes how resolution works so you can author templates that reference the intended record.
Veza resolves three placeholder forms differently:
For the qualified form, when an entity type is in both the output entities and the source of identity, the output (target) value is used.
A notification template can be attached to three surfaces, and each receives a different set of attributes:
Target (output entity) attributes are only available downstream when the action that ran produces output entities:
When in doubt, confirm the source of an attribute against the producing action rather than assuming it is available everywhere in the workflow.
The qualified form requires the exact entity type string that the integration registered, not a friendly label from the UI. For OAA integrations, that string has the form OAA.<Provider Display Name>.<Entity Type>, and it includes any spaces in the provider's display name.
For example, a Jira Cloud user's email attribute is referenced as:
The space inside Jira Cloud is required. Veza splits the entity type from the attribute on the final period, so spaces inside the provider name are preserved. If the provider display name contains a period, the qualified form cannot address it.
To find the canonical entity type for an integration, inspect an entity of that type in the Veza catalog or query the entity type through the API. Use the registered type string exactly as shown, including capitalization and spaces.
For a given notification, Veza selects the template to render in this order:
The custom template selected in Select Email Template for that notification, if one is selected.
The template your organization set as the default for the notification's usage, if there is one. For a policy notification, the usage is the event, such as Create Account. For the Send Notification action and Action Notification Settings, it is Action Succeeded or Action Failed. The Send Notification action uses Action Succeeded.
The built-in template for that event, or for that action type.
A default template for Action Succeeded applies to every Send Notification email and every action success email that uses Default template, in every policy.
The template is stored per outcome (success or failure). In the UI, one selection applies to every outcome you check. To use different templates for success and failure, set them through the API.
Veza replaces each {{key}} token with its value. Templates can also use Handlebars conditional blocks such as {{#if}} and {{else}}, which Veza evaluates against the only. For example, the built-in Send Notification template uses {{#if ACTION_URL}} to show a link only when there is one.
Attribute placeholders such as {{email}} and {{OktaUser.email}} can't be used in a block condition. Keep attribute placeholders out of templates that contain a Handlebars block: Veza evaluates the blocks before it fills attribute placeholders, so those placeholders might not be filled.
If a notification arrives with literal {{...}} text in it, check the activity log for the unresolved-placeholder warning. It lists the exact tokens that did not resolve, which distinguishes a wrong entity type prefix from an attribute that was simply empty.
Beyond the listed above, individual actions populate result-specific placeholders. Availability is context-dependent: each token is only set by the action or event that produces it, so a placeholder valid in one notification may be empty in another.
Webhook notifications are triggered upon execution of actions during the Provisioning Policy workflow process. Webhooks inform stakeholders or integrate with external systems of events that are processed within the workflow. Webhook notifications can be optionally configured as their own discrete action in a workflow or as an option when another action is executed.
For example, a webhook is sent to the company's learning management system to initiate online onboarding training once each new hire's Active Directory account is provisioned, following a successful Provision Account action.
To create and manage a webhook, perform the following:
Go to Lifecycle Management > Provisioning > Policies and select a policy.
Click Policy Settings in the policy header.
Select Notifications and click Add Notification.
Choose the Webhook notification type.
Save the template
{{ACTION_URL}} is filled only when the action fails with a system error. Otherwise, it stays as literal text.
{{ENTITY_NAME}} and {{ENTITY_TYPE}} are not available.
{{EVENT_ERROR_MESSAGE}} is empty. To include the failure reason, use a policy event notification.
The action's result placeholders, such as {{LOGIN}} and {{SOURCE_ENTITY_NAME}}, stay as literal text. {{ANY_CHANGES}} and {{ANY_CREATED}} read false.
Event notifications when the action failed: {{EVENT_TYPE}}, {{ENTITY_NAME}}, {{ENTITY_TYPE}}, {{RELATIONSHIP_ENTITY_NAME}}, {{RELATIONSHIP_ENTITY_TYPE}}, {{JOB_ID}}, {{EVENT_ERROR_MESSAGE}}, {{EVENT_IDENTITY_NAME}}, {{EVENT_IDENTITY_ID}}, {{WORKFLOW_NAME}}, {{POLICY_NAME}}, {{ACTION_NAME}}, and {{ACTION_TYPE}}. {{ENTITY_NAME}} and {{ENTITY_TYPE}} are empty if the action failed before it identified the account.
Event notifications when changes were made successfully: only the placeholders specific to that event. For example, a successful Reset Password event fills {{ENTITY_NAME}}, {{ENTITY_TYPE}}, {{LOGIN_NAME}}, and {{LOGIN_PASSWORD}}.
Check placeholder format: Ensure proper syntax with double curly braces
✅ Correct: {{ENTITY_NAME}}
❌ Wrong: {ENTITY_NAME}, {{ENTITY_NAME}, ENTITY_NAME
Verify attribute exists: For dynamic attributes, confirm the attribute is provided by your integration
Use the typed format to specify the entity type: {{OktaUser.email}}
Check your integration documentation for available attribute names and their casing
Check event context: Some placeholders are only available for specific events
For example, {{LOGIN_PASSWORD}} is only available in policy notifications for identity creation, sync, and password events
{{ACCESS_REQUEST_URL}} is only available for Access Request events
{{ENTITY_NAME}} and {{ENTITY_TYPE}} are not available in action notifications, and {{EVENT_ERROR_MESSAGE}} is empty there. Use {{EVENT_IDENTITY_NAME}}, or attach the template to a policy event notification; see .
Choose an event to trigger notifications. See Notifications for the event list.
Under Send a notification if:, choose Changes were made successfully, The action failed, or both.
Select the Veza Action in Select Veza Action.
A Veza Action is an integration with functionality for sending data to external systems, enabling downstream processes around Veza alerts, and access to reviewer actions. Use a Veza Action to configure generic webhooks or enable email notifications.
See Veza Actions Webhooks on how to create and deploy a webhook.
To customize the Webhook setting, perform the following:
In the Webhook URL field, enter the endpoint configured to receive the webhook payload.
In the Webhook Auth Header field, enter the Auth Header if the webhook listener requires authentication.
When configured, webhook requests include an Authorization header containing the credentials specified in the Webhook Auth Header field. This allows the receiving endpoint to authenticate the request using Bearer tokens, API keys, or other authentication schemes.
Click Save.
<html><body>
<br>
<br> Here is the notification that lifecycle job has failed. <br>
Error message: {{EVENT_ERROR_MESSAGE}}<br>
<br>
For reference:
<br> job_id: {{JOB_ID}}<br>
<br> identity_id: {{EVENT_IDENTITY_ID}}
<br> identity_name: {{EVENT_IDENTITY_NAME}}
<br> entity_type: {{ENTITY_TYPE}}
<br> entity_name: {{ENTITY_NAME}}
</body></html><img src="cid:<name_of_attachment>"Hello,
New account created for {{ENTITY_NAME}} with type {{ENTITY_TYPE}}.<!-- Untyped - uses attribute from any entity -->
User email: {{email}}
Department: {{department}}
<!-- Typed - uses attribute from specific entity type -->
Okta email: {{OktaUser.email}}
AD username: {{ActiveDirectoryUser.sAMAccountName}}Built-in (uppercase)
{{ACTION_NAME}}
Populated directly by the workflow runner. No entity lookup. See Predefined placeholders.
Bare attribute
{{email}}
Input entities: the source-of-identity records first, then the output entities of earlier actions in the same workflow run.
Qualified attribute
{{OktaUser.email}}
Output (target) entities first, then source-of-identity entities.
Event-based notification (per policy event)
Available
Available when the event carries an action result that produced output entities
Action notification settings (on_success / on_failure on an action)
Available
Available from that action's output entities
Send Notification action (standalone workflow node)
Available
Available from earlier actions in the same workflow run
Provision Account
Yes. Target user attributes are available to subsequent actions and to its own notifications.
Send REST Payload
Only when Add response to output entities is enabled on the action.
Send Notification
Only a Webhook notification that waits for a response, from the entities the response returns. Email and ServiceNow notifications don't.
Pause, Deprovision, and similar terminal actions
Generally none of their own. Output entities from an earlier action in the same workflow can still be in scope.
{{OAA.Jira Cloud.User.email}}Create Account Failed
LIFECYCLE_MANAGEMENT_CREATE_IDENTITY_FAILED
Sent when identity creation fails
Update Account
LIFECYCLE_MANAGEMENT_SYNC_IDENTITY
Sent when an account is updated
Update Account Failed
LIFECYCLE_MANAGEMENT_SYNC_IDENTITY_FAILED
Sent when an account update fails
Delete Account
LIFECYCLE_MANAGEMENT_DELETE_IDENTITY
Sent when an identity is deleted
Delete Account Failed
LIFECYCLE_MANAGEMENT_DELETE_IDENTITY_FAILED
Sent when identity deletion fails
Disable Account
LIFECYCLE_MANAGEMENT_DISABLE_IDENTITY
Sent when an identity is disabled
Disable Account Failed
LIFECYCLE_MANAGEMENT_DISABLE_IDENTITY_FAILED
Sent when identity disabling fails
Create Guest Account
LIFECYCLE_MANAGEMENT_CREATE_GUEST_ACCOUNT
Sent when a guest account is created
Create Guest Account Failed
LIFECYCLE_MANAGEMENT_CREATE_GUEST_ACCOUNT_FAILED
Sent when guest account creation fails
Identity No Longer in Sources
LIFECYCLE_MANAGEMENT_IDENTITY_DELETED_FROM_SOURCES
Sent when an identity is deleted from its connected source(s)
Add Entitlement Failed
LIFECYCLE_MANAGEMENT_ADD_RELATIONSHIP_FAILED
Sent when adding relationship fails
Remove Entitlement
LIFECYCLE_MANAGEMENT_REMOVE_RELATIONSHIP
Sent when a relationship is removed
Remove Entitlement Failed
LIFECYCLE_MANAGEMENT_REMOVE_RELATIONSHIP_FAILED
Sent when removing relationship fails
Remove Direct Access
LIFECYCLE_MANAGEMENT_REMOVE_DIRECT_ACCESS
Sent when direct access to a resource is removed
Create Email Failed
LIFECYCLE_MANAGEMENT_CREATE_EMAIL_FAILED
Sent when email creation fails
Write Back Email
LIFECYCLE_MANAGEMENT_WRITE_BACK_EMAIL
Sent when email is synced back
Write Back Email Failed
LIFECYCLE_MANAGEMENT_WRITE_BACK_EMAIL_FAILED
Sent when email sync back fails
Change Password Failed
LIFECYCLE_MANAGEMENT_CHANGE_PASSWORD_FAILED
Sent when password change fails
Reset Password
LIFECYCLE_MANAGEMENT_RESET_PASSWORD
Sent when a password is reset
Reset Password Failed
LIFECYCLE_MANAGEMENT_RESET_PASSWORD_FAILED
Sent when password reset fails
Create Group Failed
LIFECYCLE_MANAGEMENT_CREATE_ENTITLEMENT_FAILED
Sent when entitlement creation fails
Rename Group
LIFECYCLE_MANAGEMENT_RENAME_ENTITLEMENT
Sent when an entitlement is renamed
Rename Group Failed
LIFECYCLE_MANAGEMENT_RENAME_ENTITLEMENT_FAILED
Sent when entitlement renaming fails
Sync Entitlement
LIFECYCLE_MANAGEMENT_SYNC_ENTITLEMENT
Sent when an entitlement is synced
Sync Entitlement Failed
LIFECYCLE_MANAGEMENT_SYNC_ENTITLEMENT_FAILED
Sent when entitlement sync fails
Custom Action Failed
LIFECYCLE_MANAGEMENT_CUSTOM_ACTION_FAILED
Sent when custom action fails
Action Succeed
LIFECYCLE_MANAGEMENT_ACTION_SUCCEED
Sent when an action succeeds
Action Failed
LIFECYCLE_MANAGEMENT_ACTION_FAILED
Sent when an action fails
Workflow Task Failed
LIFECYCLE_MANAGEMENT_WORKFLOW_TASK_FAILED
Sent when a workflow task fails
Extraction Processing Failed
LIFECYCLE_MANAGEMENT_EXTRACTION_EVENT_FAILED
Sent when extraction processing fails
LIFECYCLE_MANAGEMENT_CREATE_ACCESS_REVIEW
Sent when access review is created
LIFECYCLE_MANAGEMENT_INVALID_IDENTITIES_DETECTED
Sent when invalid identities are detected during policy execution
Access Request Action Run
LIFECYCLE_MANAGEMENT_ACCESS_REQUEST_ACTION_RUN
Sent when Access Request actions start running
Access Request State Changed
LIFECYCLE_MANAGEMENT_ACCESS_REQUEST_STATE_CHANGED
Sent when Access Request state changes
Access Request Approver Assigned
LIFECYCLE_MANAGEMENT_ACCESS_REQUEST_APPROVER_ASSIGNED
Sent when new approvers are assigned
Access Request Succeed
LIFECYCLE_MANAGEMENT_ACCESS_REQUEST_SUCCEED
Sent when Access Request succeeds
Access Request Failed
LIFECYCLE_MANAGEMENT_ACCESS_REQUEST_FAILED
Sent when Access Request fails
{{LOGIN_PASSWORD}}
The password (for password-related notifications)
{{EMAIL}}
Email address associated with the identity
{{SUCCEED_OR_FAILED}}
Status indicator ("succeeded" or "failed")
{{SENT_INVITE}}
Whether an invite was sent (for guest accounts)
Type of the beneficiary entity
{{ACCESS_REQUEST_TARGET_TYPE}}
Type of the target resource
{{ACCESS_REQUEST_TARGET_NAME}}
Name of the target resource
{{ACCESS_REQUEST_URL}}
URL to view the Access Request details
{{ACCESS_REQUEST_STATE}}
Current state of the Access Request
{{ACCESS_REQUEST_SOURCE_TYPE}}
Source type of the Access Request
{{EVENT_IDENTITY_ID}}
ID of the identity the workflow runs for
{{EVENT_IDENTITY_NAME}}
Name of the identity the workflow runs for, from the source of identity
{{ACTION_URL}}
Action notifications
{{ANY_CHANGES}}, {{ANY_CREATED}}
Workflow change flags
{{IDENTITY_CREATED}}, {{IDENTITY_SYNCED}}
Create or sync identity results
{{GUEST_ACCOUNT_CREATED}}, {{GUEST_ACCOUNT_INVITE_SENT}}, {{GUEST_ACCOUNT_SYNCED}}
Guest account results
{{ATTRIBUTES_NOT_SYNCED}}, {{FAILED_ATTRIBUTE_DUE_TO_CONFLICT}}
Sync identity results
{{CREATED_RELATIONSHIPS_COUNT}}, {{REMOVED_RELATIONSHIPS_COUNT}}, {{FAILED_CREATE_RELATIONSHIPS_COUNT}}, {{FAILED_REMOVE_RELATIONSHIPS_COUNT}}
Relationship management results
{{SOURCE_ENTITY_TYPE}}, {{SOURCE_ENTITY_ID}}, {{SOURCE_ENTITY_NAME}}
Source-of-identity reference
{{DEPROVISION_SUCCESSFUL}}, {{DEPROVISION_TYPE}}, {{LOGGED_OUT_USER}}, {{REMOVED_ALL_LICENSES}}, {{REMOVED_ALL_PERSONAL_DEVICES}}
Deprovision results
{{ENTITLEMENT_CREATED}}, {{ENTITLEMENT_RENAMED}}, {{ENTITLEMENT_SYNCED}}, {{MEMBERS_SYNCED_COUNT}}
Entitlement management results
{{RESULT_TYPE}}, {{PASSWORD_RESET_SUCCESSFUL}}, {{LOGIN}}, {{DELETE_SUCCESSFUL}}
Action outcome results
{{ROTATED_KEY_COUNT}}, {{FAILED_KEY_COUNT}}
Key rotation results
{{FULL_NAME}}, {{EMPLOYEE_ID}}, {{DELETED_AT}}, {{IDENTITY_LINK}}
Identity reference
{{SYNCED_ENTITY_LIST}}, {{SYNCED_ENTITY_COUNT}}
Sync results
{{EMAIL_ADDRESS}}, {{MESSAGE}}
General
<html><body>
Hello,<br>
<br>
New {{ENTITY_TYPE}} Guest Account Created <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
Name: {{ENTITY_NAME}} <br>
Login Name: {{LOGIN_NAME}} <br>
Invite Sent: {{SENT_INVITE}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
{{ENTITY_NAME}} attributes have been synced <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
{{ENTITY_NAME}} has been deleted <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
{{ENTITY_NAME}} has been disabled <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
<br>
</body></html><html><body>
Hello,<br>
An identity has been deleted from the identity source(s). <strong>User accounts previously provisioned in connected systems may require review and cleanup.</strong><br>
<br>
<div style="background-color: #fff3cd; border-left: 4px solid #ffc107; padding: 12px; margin: 16px 0;">
<strong>Systems with Provisioned Accounts ({{SYNCED_ENTITY_COUNT}}):</strong><br>
{{SYNCED_ENTITY_LIST}}<br>
</div>
<br>
<strong>Required Actions:</strong><br>
<ol>
<li>Navigate to the <a href="{{IDENTITY_LINK}}" style="color: #007bff; font-weight: 600;">identity</a> in Veza</li>
<li>Review the provisioned accounts displayed for this identity</li>
<li>Run deprovisioning workflows to remove or disable dormant accounts</li>
</ol>
<br>
<strong>Identity Details:</strong><br>
Name: <a href="{{IDENTITY_LINK}}" style="color: #007bff;">{{FULL_NAME}}</a><br>
Email: {{EMAIL}}<br>
Employee ID: {{EMPLOYEE_ID}}<br>
Deleted At: {{DELETED_AT}}<br>
<br>
<hr style="margin-top: 20px; border: none; border-top: 1px solid #ddd;">
<small style="color: #666;">This is an automated notification from Veza Lifecycle Management. Please take appropriate action to ensure security and compliance.</small>
</body></html><html><body>
Hello,<br>
<br>
{{ENTITY_NAME}} has a relationship removed from {{RELATIONSHIP_ENTITY_NAME}} <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
Relationship Type: {{RELATIONSHIP_ENTITY_TYPE}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
{{ENTITY_NAME}} had direct access removed from {{RELATIONSHIP_ENTITY_NAME}} <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
Resource Type: {{RELATIONSHIP_ENTITY_TYPE}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
{{ENTITY_NAME}} has the newly created email synced back to it <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
Email: {{EMAIL}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
{{ENTITY_NAME}} has had their password reset <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
Login Name: {{LOGIN_NAME}} <br>
Temporary Password: {{LOGIN_PASSWORD}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
An entry of {{ENTITY_TYPE}} is renamed with new name: {{ENTITY_NAME}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
An entry of {{ENTITY_TYPE}} has been re-synced with the target system: {{ENTITY_NAME}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
The request is currently in {{ACCESS_REQUEST_STATE}} state.
<br>
For details: {{ACCESS_REQUEST_URL}}
<br>
</body></html><html><body>
Hello,<br>
<br>
The request is failed, with an error message: {{EVENT_ERROR_MESSAGE}}
<br>
For details: {{ACCESS_REQUEST_URL}}
<br>
</body></html><html><body>
Hello,<br>
<br>
The request is currently in {{ACCESS_REQUEST_STATE}} state.
<br>
For details: {{ACCESS_REQUEST_URL}}
<br>
</body></html><html><body>
Hello,<br>
<br>
The request currently in {{ACCESS_REQUEST_STATE}} state has new been assigned new approvers.
<br>
For details: {{ACCESS_REQUEST_URL}}
<br>
</body></html><html><body>
Hello,<br>
<br>
Workflow has failed.<br>
<br>
Identity: {{IDENTITY_NAME}}<br>
Workflow Name: {{WORKFLOW_NAME}}<br>
Error Message: {{EVENT_ERROR_MESSAGE}}<br>
<br>
</body></html><html><body>
Hello,<br>
<br>
Extraction processing has failed.<br>
<br>
Datasource: {{DATASOURCE_ID}}<br>
Error Message: {{EVENT_ERROR_MESSAGE}}<br>
<br>
</body></html><html><body>
Hello,<br>
<br>
An access review has been created for {{IDENTITY_NAME}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
{{ENTITY_NAME}} has performed a custom action <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
Message: {{EVENT_ERROR_MESSAGE}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
Invalid identities were detected during policy execution.<br>
<br>
Policy: {{POLICY_NAME}} <br>
Extraction Event: {{EXTRACTION_EVENT_ID}} <br>
<br>
Summary: {{EVENT_MESSAGE}} <br>
<br>
Please review the validation filters and check the individual invalid identity events in the policy history for detailed information.<br>
<br>
</body></html>Reference guide for supported transformation functions and parameters for attribute transformers
This page includes a comprehensive list of all supported transformer functions and parameters. Some commonly used transformation functions include:
Replacing a character with a different one
Removing domains from email addresses
Transforming to upper, lower, title, sentence, camel, or snake case
Using a substring from the original value
See for configuration details, or for terminology definitions.
Each transformer below includes three types of examples:
Basic Usage: Shows the transformer used alone with a simple source attribute
In a Pipeline: Demonstrates chaining multiple transformers together
Example: Provides practical context from Lifecycle Management scenarios
Copy-paste these examples directly into your attribute transformer configuration, adjusting attribute names to match your source of identity.
Description: Converts a timestamp to a formatted date string using Go time layout syntax.
Syntax: {attribute | DATE_FORMAT, "layout"} or {attribute | DATE_FORMAT, "output_layout", "input_layout"}
Parameters:
Returns: String — the formatted date/time string
Examples:
The reference date Mon Jan 2 15:04:05 MST 2006 breaks down as:
Instead of Go layout strings, you can use these named aliases (case-insensitive):
For the full list of named aliases (including kitchen, rfc822, rfc1123, stamp, and others), see Go's standard .
Notes:
Input must be a valid timestamp
Use with or for time zone handling
When parsing non-standard input dates, provide both output and input layouts
Description: Converts all characters in a string to lowercase.
Syntax: {attribute | LOWER}
Parameters:
Returns: String — the input value with all characters converted to lowercase
Examples:
Notes: Only affects alphabetic characters. Numbers and special characters pass through unchanged.
Description: Replaces all occurrences of a substring with a replacement string.
Syntax: {attribute | REPLACE_ALL, "search", "replacement"}
Parameters:
Returns: String — the input with all occurrences of search replaced by replacement
Examples:
Notes:
Case-sensitive matching
To remove characters, use an empty string as the replacement: REPLACE_ALL, "x", ""
For removing multiple different characters, consider instead
Description: Extracts a portion of a string starting at a specified position.
Syntax: {attribute | SUB_STRING, offset, length}
Parameters:
Returns: String — the extracted substring
Examples:
Notes:
Index is 0-based (first character is position 0)
If offset + length exceeds the string length, returns characters up to the end
For extracting just the first N characters, consider as a simpler alternative
Description: Converts all characters in a string to uppercase.
Syntax: {attribute | UPPER}
Parameters:
Returns: String — the input value with all characters converted to uppercase
Examples:
Notes: Only affects alphabetic characters. Numbers and special characters pass through unchanged.
{hire_date | DATE_FORMAT, "dateonly"}
2024-03-15
03-15-2024
{start_date | DATE_FORMAT, "2006-01-02", "01-02-2006"}
2024-03-15
Month
1
1 or 2-digit month (1-12)
Month
Jan
3-letter abbreviation
Month
January
Full month name
Day
02
2-digit day (01-31)
Day
2
1 or 2-digit day (1-31)
Day
_2
Space-padded day
Hour
15
24-hour format (00-23)
Hour
03 or 3
12-hour format (01-12 or 1-12)
Minute
04
Minutes (00-59)
Second
05
Seconds (00-59)
AM/PM
PM
Uppercase form
AM/PM
pm
Lowercase form
Time zone
MST
Time zone abbreviation
Time zone
-0700
Numeric offset
Time zone
Z0700
Z for UTC, offset otherwise
20060102150405Z
20230315143025Z
Human readable
Jan 2, 2006
Mar 15, 2023
Date only
2006-01-02
2023-03-15
2006-01-02T15:04:05Z07:00
2023-03-15T14:30:25-07:00
win32
Active Directory FILETIME
133234218250000000
layout
Yes
String
Go time format layout or named alias (see tables below)
input_layout
No
String
Format of the input data (if non-standard)
2024-03-15T14:30:00Z
{hire_date | DATE_FORMAT, "2006-01-02"}
2024-03-15
2024-03-15T14:30:00Z
{hire_date | DATE_FORMAT, "01/02/2006"}
03/15/2024
2024-03-15T14:30:00Z
{hire_date | DATE_FORMAT, "Jan 2, 2006"}
Mar 15, 2024
Year
2006
4-digit year
Year
06
2-digit year
Month
01
ISO 8601 / RFC3339
2006-01-02T15:04:05Z07:00
2023-03-15T14:30:25-07:00
US date
01/02/2006
03/15/2023
European date
02/01/2006
15/03/2023
dateonly
2006-01-02
2023-03-15
timeonly
15:04:05
14:30:25
datetime
2006-01-02 15:04:05
2023-03-15 14:30:25
(none)
—
—
This function takes no parameters
JOHN
{first_name | LOWER}
john
John.Smith@Company.com
{email | LOWER}
john.smith@company.com
MixedCase123
{code | LOWER}
mixedcase123
search
Yes
String
The substring to find
replacement
Yes
String
The string to replace matches with
John Smith
{display_name | REPLACE_ALL, " ", "_"}
John_Smith
EMP-12345
{employee_id | REPLACE_ALL, "-", ""}
EMP12345
john smith@domain.com
{email | REPLACE_ALL, " ", "."}
john.smith@domain.com
offset
Yes
Integer
Starting position (0-based index)
length
Yes
Integer
Number of characters to extract
John
{first_name | SUB_STRING, 0, 1}
J
EMP12345
{employee_id | SUB_STRING, 3, 4}
1234
john.smith@company.com
{email | SUB_STRING, 0, 10}
john.smith
(none)
—
—
This function takes no parameters
sales
{department | UPPER}
SALES
john smith
{username | REMOVE_WHITESPACE | UPPER}
JOHNSMITH
Smith
{name | UPPER}
SMITH
2024-03-15T14:30:00Z
2-digit month (01-12)
LDAP/AD format
rfc3339
first_nameJohnlast_nameSmithJohn Smithfirst_nameJosé Maríalast_nameGarcíajosemaria.garciafirst_nameJohnjj.smith{last_name}MaxCount is greater than 0, FOR_EACH includes only the first MaxCount entities, in the order in which Veza reads themFOR_EACH joins the results with Separator
If no entity is found and DefaultValue is provided, the default is returned; otherwise an error occurs
::Account not foundSPLIT::Account not found::Account not found1A plain default such as "Account not found" (no ::) would be a single segment, so index 1 is out of range and returns an empty string
Results are joined using the separator (comma by default)
If no entities are found, returns an empty string
preferred_namefirst_nameJamesJamesUse case: The default can reference another attribute, which is used only when preferred_name is an empty string
job_titleEmployeecost_center001234001234ReturnColumnName value is returnedIf not found and DefaultReturnValue is provided, the default is returned
If not found and no default, an error is returned
location_codeIL001ChicagoUnknown Regionattribute_nameUser Display Name userDisplayNamejohnsmith@company.comjohnsmith2@company.comusernameJSmithc-jsmithuser42@temp.localphone_number(123) 456-78901234567890emailjohn.smith@company.comjohn_smithdepartmentHuman ResourceshumanresourcescommentIMPORTANT MESSAGE HERE Important message herenameJANE SMITH Jane Smithjohn.doeJohn.Doeemail_address" John.Smith@Company.com "john.smith@company.comcode---ABC123___ABC123000.8675309.USCA8675309raw_idxxxABC123ABC123codeABC123tempABC123Hours
INTEGER
Yes
Number of hours to add (use negative values to subtract)
Days
INTEGER
No
Number of days to add
Months
INTEGER
No
Number of months to add
Years
INTEGER
No
Number of years to add
Format
STRING
No
Date format used to parse the input value and to format the output. If omitted, Veza detects the input format automatically and uses it for the output.
Days
INTEGER
Yes
Number of days to add (use negative values to subtract)
Format
STRING
No
Date format used to parse the input value and to format the output. If omitted, Veza detects the input format automatically and uses it for the output.
EntityType
STRING
Yes
The entity type to iterate over, such as AwsIamPolicy. The value must match the entity type name exactly.
AttributeExpression
STRING
Yes
An attribute name, such as name, or an expression to evaluate for each entity, such as \{name\}: \{description\}. Attribute names are not case-sensitive.
MaxCount
NUMBER
No
The maximum number of entities to include. 0 includes all entities.
Separator
STRING
No
The characters that join the results. The default is a comma followed by a space (, ). An empty string ("") joins the results with no separator.
No entities of type EntityType are available
Returns empty string "" (no error)
Attribute missing on an entity
That entity's result is the unresolved placeholder. For example, arn1, {arn}, arn3
Number attribute values
Returned as text. For example, 42, 100
Result ordering
Results follow the order in which Veza reads the entities. Veza does not sort the results, so do not rely on which entities MaxCount includes
Expression fails for any entity
Returns the error FOR_EACH failed to execute transformer for entity type <EntityType>
{| FOR_EACH, "AwsIamPolicy", "name"}{| FOR_EACH, "AwsIamPolicy", "name", 2}{| FOR_EACH, "OktaGroup", "\{name\}: \{description\}"}{| FOR_EACH, "AwsIamPolicy", "\{name\} - \{arn\}", 0, " | "}EntityType
STRING
Yes
The type of graph entity to search (e.g., Employee, OktaUser, ActiveDirectoryUser)
SourceAttribute
STRING
Yes
The attribute on the entity to match against the input value
TargetAttribute
STRING
Yes
The attribute to return from the matched entity. Use id or type for built-in entity properties.
DefaultValue
STRING
No
Value to return if no matching entity is found
Empty input value
Returns empty string "" (no error)
Input wrapped in brackets [value]
Brackets are automatically stripped before lookup
TargetAttribute is id
Returns the entity's unique graph ID
TargetAttribute is type
Returns the entity's type name
No entity found, no default
Returns error with details about the failed lookup
{12345 | FROM_ENTITY_ATTRIBUTE, "Employee", "employee_id", "manager_name"}{john.doe@company.com | FROM_ENTITY_ATTRIBUTE, "OktaUser", "email", "department", "Unknown"}{$workday.employee_id | FROM_ENTITY_ATTRIBUTE, "Employee", "id", "cost_center" | UPPER}{john.smith | FROM_ENTITY_ATTRIBUTE, "OktaUser", "login", "id"}{email | FROM_ENTITY_ATTRIBUTE, "OAA.HRB.HRISEmployee", "email", "email" | FROM_ENTITY_ATTRIBUTE, "OAA.indigo.User", "email", "identity_unique_id", "::Account not found" | SPLIT, "::", 1}EntityType
STRING
Yes
The type of graph entity to search (e.g., Employee, OktaUser)
SourceAttribute
STRING
Yes
The attribute on entities to match against the input value
TargetAttribute
STRING
Yes
The attribute to return from all matched entities. Use id or type for built-in entity properties.
Separator
STRING
No
Character(s) to join multiple results (defaults to ,)
Empty input value
Returns empty string "" (no error)
Input wrapped in brackets [value]
Brackets are automatically stripped before lookup
No entities found
Returns empty string "" (no error)
Target attribute missing on some entities
Those entities are skipped (no error logged)
TargetAttribute is id
Returns the entity's unique graph ID
{john.doe@company.com | FROM_MANY_ENTITIES_ATTRIBUTE, "OktaGroup", "member_email", "name"}{12345 | FROM_MANY_ENTITIES_ATTRIBUTE, "Application", "owner_id", "app_name", ";"}{Engineering | FROM_MANY_ENTITIES_ATTRIBUTE, "Employee", "department", "id"}{john.doe@company.com | FROM_MANY_ENTITIES_ATTRIBUTE, "Identity", "email", "type"}Has a value
Value passed through
Value passed through
Is an empty string
Default value
Default value
Is missing
Default not applied, and a missing-attribute warning is reported
Default value, with no warning
Path
STRING
Yes
The path to the value to extract. Cannot be empty.
Separator
STRING
No
Characters that join the values when the path matches an array (defaults to ", "). An empty string is allowed.
a.b
The b field of the a object
arr.0
The element at index 0 of the arr array
arr.#.field
The field value of every element of the arr array
arr.#(k=="v").field
The field value of the arr element where k equals v
Value is a string, number, or boolean
Returned as text
Path matches an array
Values are joined with the separator. Nested arrays are flattened one level
Value is an object
Returned as JSON text
Path does not exist, or value is null
Returns empty string "" (no error)
Empty input value
Returns empty string "" (no error)
IndentSize
NUMBER
No
Number of spaces for each indentation level, from 0 to 10 (defaults to 2)
IndentChar
STRING
No
"space" or "tab" (defaults to "space"). With "tab", each level is indented with one tab, and IndentSize is ignored
Empty input value
Returns empty string "" (no error)
Input is not valid JSON
Fails with an error that starts with JSON_FORMAT failed to parse JSON input
IndentSize outside 0 to 10
Fails with JSON_FORMAT IndentSize must be between 0 and 10, got: <value>
IndentChar other than space or tab
Fails with JSON_FORMAT IndentChar must be "space" or "tab", got: <value>
{
"name": "test",
"nested": {
"value": 123
}
}TableName
STRING
Yes
Name or ID of the lookup table
ColumnName
STRING
Yes
Column to search for the input value
ReturnColumnName
STRING
Yes
Column whose value to return
DefaultReturnValue
STRING
No
Value to return when the input value is not found
Table name not found
Falls back to treating the parameter as a table ID
Value not found in table, default provided
Returns the default value
Value not found in table, no default
Returns error with lookup details
Other lookup errors
Returns error with full context
IF sys_attr__would_be_value_len le 20
{first_name | LOWER}.{last_name | LOWER | NEXT_NUMBER, 2, 3}
ELSE IF sys_attr__would_be_value_len le 30
{first_name | LOWER}.{last_name | LOWER | FIRST_N, 1 | NEXT_NUMBER, 2, 3}
ELSE
{first_name | LOWER | FIRST_N, 1}.{last_name | LOWER | FIRST_N, 1 | NEXT_NUMBER, 2, 3}EntityType or AttributeExpression is missing
Returns an error that required parameters are missing
EntityType or AttributeExpression is empty
Returns an error that names the empty parameter
MaxCount is not a number or is negative
Returns an error
Target attribute missing on entity
Returns error (unless default provided)
TargetAttribute is type
Returns the entity's type name
Result ordering
Results appear in graph discovery order (not guaranteed to be consistent)
Input is not valid JSON
Fails with JSON_EXTRACT failed to parse JSON input