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...
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.
Architecture overview and foundational concepts for deploying Lifecycle Management
After reviewing the getting started materials:
Configure Integrations: Enable your identity sources and target applications for LCM. See .
Set Up Identities: View and manage identities from your configured sources. See .
Create Access Profiles: Define birthright entitlements for user segments. See .
Build Policies
For an end-to-end walkthrough using Workday, Okta, and Active Directory, see .
Monitor policy status, workflow execution, and identity health at a glance
Track and audit all LCM actions, errors, and events
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.
Warning: DELETE_IDENTITY permanently removes accounts from target systems. Deleted data is typically unrecoverable. Consider using instead if you need to preserve audit trails or may need to reactivate accounts in the future.
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
Service account lifecycle management
Contractor account removal after project completion
Supported Integrations:
Active Directory (Users and Managed Service Accounts)
Okta
Google Cloud (Google Workspace Users)
PostgreSQL
OracleDB
GitHub
AWS RDS (MySQL, PostgreSQL, OracleDB)
Custom Application
Entity Type
The data source and target entity type to permanently delete
Unique Identifiers
Attributes used to locate the user account for deletion (e.g., username, email, or account ID)
Attribute Transformers
Define how to identify and match the user for deletion. See Transformers for more details
Common Synced Attributes
Shared transformation rules across multiple delete actions
Sync Action Names
Reference to previous Sync Identities actions for unique identifier resolution
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:
Policies: Displays your most recently updated Lifecycle Management Policies and their status
Access Profiles: Shows configured 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 the "Create Policy" button in the 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 Policies section displays all configured Lifecycle Management policies with their current status. Each policy shows its name, associated identity source, number of identities managed, and current status (Running/Stopped).
You can view all policies at a glance, create new ones with the "Create Policy" button, see which policies are actively running, access detailed configuration by clicking on 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:
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 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:
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)
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.
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
Validate access grants after onboarding (joiners)
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 an HRIS system). 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
The first LCM-triggered review for a workflow includes all results since there are no earlier reviews to compare against. Subsequent reviews only show changes.
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 "Sync Identities" action within a Lifecycle Management workflow:
Edit or create a Lifecycle Management policy
Edit the workflow containing the Sync Identities action
In the Sync Identities action configuration, click Add Fallback
Configure the Transformer to use as a fallback pattern for the unique attribute that might experience conflicts
Close the action sidebar and save your changes to the policy.
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:
{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)}
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 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)
This automated conflict resolution ensures provisioning can proceed without manual intervention, even when your standard naming conventions result in conflicts.
{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)}Validate policy behavior before enabling production execution
Pause or stop automation without deleting configurations
Lifecycle Management FAQ - Common questions and troubleshooting
Implementation and Core Concepts - Architecture overview
Dashboard - Monitor workflow execution and policy status
End-to-end example using Workday as source, with Okta and AD as targets
Automatically assign Microsoft 365 licenses during onboarding
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 step in the Dynamic Approver pipeline runs in sequence, processing the available attributes to produce an intermediate or final output.
The final transformer step 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 Lifecycle Management 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 steps. Use {last_output} in a subsequent step to reference the output of the previous step.
Go to Lifecycle Management > Settings.
Select the Access Request Settings tab.
Scroll to the Dynamic Approvers section and click Create Approver.
Enter a Name and optional
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.
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 > Settings > Access Request 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.
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
ENTITY_TYPE_IN_OUTPUT condition: Check if the previous action returned any OktaUser
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:
Use to check whether the action returned any nodes of a given type, or to check the graph directly. These conditions control 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.
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
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}
{first_name}{last_initial}{NEXT_NUMBER(1, 10)}
johns, johns1, johns2
Properties to Get
(Optional) Specific entity properties to include in the results. Leave empty to return all available properties.
If true (user found): Proceed with provisioning actions (e.g., assign Okta groups, sync attributes)
If false (user not found): Send a notification to the IT team to manually create the Okta account first
Entity 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
id
The entity's unique graph identifier
type
The entity type (e.g., OktaUser)
properties
(Optional) Maximum number of nodes to return. Default: 100. Maximum: 1000.
A key-value map of the entity's attributes (filtered by Properties to Get, or all properties if not specified)
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.
Passwords are passed as plain text to downstream actions. Use this only when the workflow requires it, and ensure receiving endpoints use HTTPS. Passwords are never written to the Veza database. They are available in memory during workflow execution only and are redacted from stored job payloads before persistence.
last_output
String
Output from the previous transformer step
access_profile_properties.<name>
String
Custom property value set on the Access Profile
catalog_definition_properties.<name>
String
Custom property value set on the Catalog Definition
Under Transformer Steps, click Add Transformer Step 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
{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.comCreate 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 and 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
{first_name}.{last_name}@company.com)Entity Type
The data source and target entity type to create an email for
Action Synced Attributes
Define how email attributes should be formatted. See for details
Sync Action Name
Supported Integrations:
Exchange Server
Requires VezaProvisioner service on the Exchange Server host. See for setup
Azure AD (Entra ID)
Creates email-enabled accounts via Microsoft Graph API
In a standard onboarding policy, Create Email is used as the second step after creating the user account:
Sync Identities 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 Sync Identities action, targeting Active Directory and mapping only email, sets the address on the AD user.
See the provisioning example in the Actions overview for a complete workflow.
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 Policies: Add policies to automate identity management processes.
For an overview of Lifecycle Management configuration using Okta, Workday, and Active Directory, see .
For API documentation, see .
Trigger email notifications and webhooks based on lifecycle events and action outcomes.
Triggers email notifications and webhooks based on lifecycle events and action success or failure. Notifications can be added to any action type under Edit Action > Action Notification Settings.
Example Use Cases:
Alert IT staff when provisioning is complete
Notify managers of access changes
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 the built-in event-specific template based on the lifecycle event being processed
Custom template: Uses a reusable custom email template you've created, allowing consistent messaging across multiple workflows
Custom templates support the same placeholders as event-specific templates, enabling dynamic content like identity names, workflow names, and action results. See for placeholder reference and template management.
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.
Example Use Cases:
Rotate Azure Key Vault keys on a scheduled basis to meet compliance requirements
Automatically rotate keys when a service account is offboarded
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.
Temporarily pause specific workflows or actions in a policy without removing configuration
This guide explains how to disable individual workflows or actions within a Lifecycle Management 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
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 new users - When enabled, the action will create new user accounts that don't exist in the target system
Update active users - When enabled, the action can update existing user accounts with attribute changes from the source of truth
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
Duration in seconds
Number of seconds to pause the workflow
Reference to a previous Sync Identities action for unique identifier resolution
Notification Settings
(Action notification settings) Configure email alerts on action success and/or failure for the specified recipients
Webhook Configuration
Configure webhooks to trigger on success and/or failure by specifying the URL to send the payload and optional auth header for the POST request
Veza Action
Select an existing Veza Action for pre-configured webhook or email settings
Notification Type
Select Email, Webhook, or Service Now
Email Template
(Email notifications only) Select the template to use for the notification. Choose "Default template" to use the event-specific template, or select a custom email template. See Custom Email Templates for details
Recipients
(Email notifications only) Specify email addresses to receive the notification, or select user attributes containing email addresses
Implementing seasonal policies: Temporarily disable workflows that only apply during certain periods
Workflow Testing: Disable production actions while testing new workflow logic
Disabling a workflow prevents it from running during policy execution. All conditions and actions within the workflow are also skipped.
Go to Lifecycle Management > Policies.
Select a policy and click Edit Workflow.
Toggle the workflow's Enabled control to disabled.
Click Save.
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.
Toggle the Enabled control 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, toggle the Enabled control back to enabled and save.
Set for new users only - The attribute value is set only when creating new user accounts
Set for new and existing users - 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:
Enable Update active users on the Sync Identity action
Select Set for new and existing users for the department attribute
Set for new and existing users (continuously sync attributes that change during employment):
First Name, Surname
Department
Title
Manager
Cost Center
AD Distinguished Name (DN)
AD User Principal Name (UPN)
AD Email
Set for new users only (preserve stable identifiers):
Active Directory sAMAccountName
Email Addresses (for Email Write-Back action)
This configuration ensures that dynamic attributes remain up to date while preserving stable identifiers.
You may not want to enable "Set for new and existing users" for attributes like user principal name, which may change due to marital status or legal name corrections but shouldn't be automatically updated in all systems.
Define workflow triggers and provisioning actions
Manage birthright entitlements and business roles
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
Attribute Mapping - How source attributes map to Veza
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
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
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 vs. access policies and the Azure Key Vault integration.
{{ROTATED_KEY_COUNT}}
Count of keys successfully rotated
{{FAILED_KEY_COUNT}}
Count of keys that failed to rotate
Define workflow triggers and provisioning actions
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
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 Identity, which permanently removes accounts, Deprovision Identity 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 all methods. The available methods are determined by the integration's DeProvisionIdentityDefinition and are shown in the action configuration dropdown.
See the in the Actions overview for a complete Active Directory offboarding configuration.
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
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
How source system properties become Veza attributes
When connecting to integrated systems (see ), 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 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 API.
Veza normalizes all property names for consistency:
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
One or more key names to rotate. Each key gets a new version; the previous version is not deleted
Customize identity attributes to override values from the source of identity
Delete
Permanently removes the account as part of deprovisioning
Some integrations treat deprovisioning as deletion
Relationships to Create
Entitlements to assign after deprovisioning (e.g., move to a "Terminated Users" group)
Logout User
Force-terminate active sessions after deprovisioning (supported integrations only)
Common Synced Attributes
Shared transformation rules across multiple deprovisioning actions
Action Synced Attributes
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)
Entity Type
The data source and target entity type to deprovision
Deprovision Type
The deprovisioning method to use (Disable, Suspend, or Delete — availability depends on the integration)
Remove All Relationships
Deprovision versus Delete: Use Deprovision Identity when you need to preserve audit trails, may need to reactivate accounts, or must comply with retention policies. Use Delete Identity when you need permanent removal (e.g., GDPR right to be forgotten, database user cleanup). For Active Directory Managed Service Accounts, use Delete Identity — Deprovision Identity is not supported for that entity type.
Okta: suspends the user session
Whether to remove existing group memberships and role assignments. Options include removing all relationships, only birthright relationships, or only synced relationships
Employee ID
employee_id
Spaces → underscores
BusinessTitle
business_title
CamelCase → snake_case
Cost-Center
cost_center
Special chars removed
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 customprop_ prefix
System-computed fields are identified with the sys_attr__ prefix
The following sections include some examples of how Veza handles attributes from common integrations.
Veza recognizes and standardizes many common attributes across source systems:
employee_id
string
Employee identifier
E-98765
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
Worker ID
workday_id
Unique worker identifier
Employee ID
employee_id
Okta → Veza
login
login
Username
email
Active Directory → Veza
sAMAccountName
account_name
Pre-Windows 2000 login
distinguishedName
distinguished_name
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
customprop_project_code - Project allocation
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 System Attributes 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 Trigger Conditions Reference for complete documentation.
In Transformers (Formatter/Pipeline Syntax):
Attribute transformers use curly braces and pipes to produce output values. See Transformers for complete documentation.
With Secondary Sources (in Conditions):
System Attributes - Computed attributes for advanced scenarios
Transformers - Modifying and combining attribute values
Policies - Using attributes in workflow conditions
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 trueImportant: These syntaxes cannot be interchanged. Use SCIM filter syntax only in condition fields, and formatter syntax only in attribute mapping fields.
Log audit records for compliance tracking
Entity Type
The target integration and entity type to operate on
Table
(ServiceNow) The table name to insert records into (e.g., incident, sc_request, u_custom_table)
Attribute Transformers
Supported Integrations:
ServiceNow
Insert records into any ServiceNow table
For detailed configuration examples including incident creation and audit logging, see ServiceNow Provisioning.
Custom Actions are non-idempotent. Each execution creates a new record. Running the same action multiple times will create duplicate records.
Configure reusable authentication for Send REST Payload actions in Lifecycle Management
REST Auth Credentials provide centralized, reusable authentication configurations for Send REST Payload actions in Lifecycle Management workflows. Instead of configuring authentication directly in each action, you can create named credential sets that multiple actions can reference.
Benefits:
Reuse: Share authentication across multiple Send REST Payload 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
Navigate to Lifecycle Management > Settings
Select the Rest Credentials tab
Click Create to add a new credential
Enter a Name for the credential
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.
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. Use this when the token endpoint expects credentials in the request body.
BASIC: Sends credentials in the Authorization: Basic base64(client_id:client_secret) header, with only grant_type=client_credentials
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.
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).
When configuring a action in a Lifecycle Management policy:
In the action configuration, select a credential from the REST Auth Credentials dropdown
The credential provides the authentication header and optional default URL/method
The action's Webhook 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
Create groups, roles, or distribution lists in target systems during lifecycle workflows.
Creates entitlements (groups, roles, or distribution lists) in target systems as part of lifecycle workflows. This action supports creating new entitlements, renaming existing ones, and synchronizing entitlement membership.
Example Use Cases:
Dynamically create department-specific Active Directory security groups during onboarding
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 Relationships 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.
Understanding the Lifecycle Management Provisioning Activity page for tracking provisioning operations
The Provisioning Activity page provides visibility into all provisioning operations performed by Veza's Lifecycle Management system. It serves as a record of all activities, including successful actions, errors, and failures.
A Lifecycle Management policy defines automated workflows that execute when changes occur in a source of identity. The Provisioning 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
Update HRIS systems with email addresses created during onboarding workflows.
Updates an HRIS or 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 . 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 instead.
Example Use Cases:
After creating an Exchange Server mailbox during onboarding, write the new email address back to the Workday Worker record
How to delegate Access Profile creation to specific Operators and Groups.
By default, only Administrators can create Access Profiles in Lifecycle Management. With Access Controls enabled, Administrators can grant Creator permissions to specific Operators and Groups, allowing them to create new profiles. Users who create a profile automatically become its Owner and can edit that profile, but cannot modify profiles created by others. Administrators always retain full access to all profiles.
Users must have the Operator role to use Creator permissions — non-Operator roles (Access Reviewer, Watcher, etc.) cannot create Access Profiles even with explicit permission grants.
You have the Administrator role on the root team
Map source attributes to target table fields. See Transformers for more details
Department Code
customprop_department_code
Custom fields prefixed
email
string
Primary email
department
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
Employee number
Business Title
business_title
Job position
Cost Center
cost_center
Financial allocation
Employee Type
employee_types
List (e.g., Full Time)
Manager
managers
List of manager names
Primary email
status
status
ACTIVE, SUSPENDED, etc.
department
department
Department name
manager
manager
Manager's email/ID
Full LDAP path
userPrincipalName
user_principal_name
user@domain format
memberOf
member_of
List of group DNs
department
department
Department name
title
title
Job title

Sync Members
When enabled, synchronizes the entitlement's membership to match the expected member list, adding missing members and removing unexpected ones
Group
name
Creates Okta groups
Azure AD
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)
Active Directory
Group
name
Creates security groups
CREATE_ENTITLEMENT
Sent when an entitlement is created
RENAME_ENTITLEMENT
Sent when an existing entitlement is renamed
SYNC_ENTITLEMENT
An Access Profile to associate with the newly created entitlement. When specified, the entitlement is automatically added to the profile after creation
Okta
Sent when entitlement membership is synchronized
Bearer
Bearer token authentication
JWT tokens, API tokens
Login to Bearer
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
None
No authentication header added
Public APIs, pre-authenticated endpoints
Select the Auth Type and complete the required fields (see Auth Type Configuration)
Optionally set a default URL and HTTP Method (actions can override these values)
Click Save
bearer_token_attribute
Yes
Dot-notation path to the token in the login response (e.g., value.token)
authentication_method
Yes
How to send credentials: FORM or BASIC (see below)
auth_url
No
Token endpoint URL. Defaults to {credential_url}/oauth2/token if not specified
ca_certificate_base64
No
Base64-encoded CA certificate for the OAuth2 token endpoint, if it uses a self-signed or internal CA
Header
Custom authorization header value
API keys, custom token formats
Basic
HTTP Basic authentication (username/password)
full_value
Yes
Complete header value (e.g., ApiKey sk-prod-xyz)
user_name
Yes
Authentication username
password
Yes
token
Yes
Bearer token value (encrypted at rest)
login_url
Yes
URL to send the login POST request
login_payload_json
Yes
client_id
Yes
OAuth2 client ID
client_secret
Yes
View credentials
Admin, Operator
Create, Update, Delete
Admin
Credentials referenced by published policy versions cannot be deleted. Remove the credential reference from all actions in published policies first.
The legacy Authorization Header field on the Send REST Payload action is deprecated. Migrate existing configurations to use REST Auth Credentials for centralized management and encrypted storage.
Legacy APIs, Basic authentication endpoints
Authentication password (encrypted at rest)
JSON body for the login request (encrypted at rest)
OAuth2 client secret (encrypted at rest)
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}"{
"value": {
"token": "eyJhbGciOiJIUzI1NiIs...",
"expires_in": 3600
}
}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 Provisioning Activity page provides four views of this activity across different tabs: Events, Jobs, Actions, and Workflow Tasks.
When the page opens, a Workflow Tasks stats card shows live counts for the last 24 hours: Scheduled, Queued, Running, Done, and Errored. Use this card to get an at-a-glance health check without applying any filters — Scheduled and Queued 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.
Event Type
The type of event that occurred (e.g., REMOVE_RELATIONSHIP, ADD_RELATIONSHIP, SYNC_IDENTITY)
Timestamp
When the event occurred
Success
The 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.
Started At
When the job started
Completed At
When the job completed
Action Name
The Actions tab shows high-level operations triggered by workflows. Actions typically involve one or more jobs that work together to accomplish a specific goal.
Started At
When the action started
Completed At
When the action completed
Action Name
See Actions 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 Policy.
Workflow
The name of the workflow
Identity
The identity for which the workflow was executed
Scheduled For
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)
Continuous sync settings
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 in the Activity Log
The Provisioning 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: Use the dropdown filters to focus on event type or state
Filter by manually triggered: In the Workflow Tasks tab, filter to show only manually triggered workflows or only automatically triggered ones
View error messages: Review issues by checking for error messages in the Message column
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 right now? Check the Workflow Tasks stats card at the top of the page — Scheduled, Queued, and Running counts update live without any filtering.
Troubleshoot a failed action: Go to the Jobs tab, filter by State = Errored, and read the Error Message column. Switch to the Actions tab for context on the broader operation that spawned the failing jobs.
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.
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 Provisioning Activity page are distinct from the system-wide Event Logs found in the Veza Administration section.
Review the Provisioning 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 LCM policy health metrics. Contact Veza Support for guidance on building LCM-specific monitoring dashboards for your deployment.
Entity Type
The HRIS or identity source entity type to update with the email address (e.g., Workday Worker)
Supported Integrations:
Workday
Writes email to the Worker record via the Workday API
Oracle HCM
Writes email to the Oracle HCM employee record
HiBob
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 Sync Identities 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 Sync Identities 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.
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
Choose Write Back Email when the workflow provisions the mailbox and you want that address in the HRIS. Choose Sync Identities 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.
In a typical Workday-to-Active Directory onboarding workflow, Write Back Email is the third step:
Sync Identities 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 Sync Identities 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 provisioning example in the Actions overview. For Exchange Server setup, see Exchange Server Provisioning.
The users receiving permissions have the Operator role assigned
To assign Access Profile creation permissions to users or groups:
Navigate to Lifecycle Management in the navigation sidebar.
Click Settings in the Lifecycle Management sidebar.
On the Settings page, locate the Access Profile Types section.
Click Manage Access Profile Creation Permissions.
The Manage Permissions modal opens, showing currently assigned users and groups.
Select the Type of principal to add:
User: Assign permissions to individual Veza users
Group: Assign permissions to a Veza Group (all members receive permissions)
Select the user or group from the dropdown menu.
The dropdown shows only users or groups that don't already have permissions assigned. The permission is assigned automatically when you make a selection.
Repeat steps 5-6 to assign permissions to additional users or groups.
When finished, click outside the modal or press ESC to close.
Result: Users and groups with Creator permissions can now create new Access Profiles from the Lifecycle Management > Access Profiles page.
To confirm that permissions were assigned correctly:
In the Manage Permissions modal, review the list of assigned users and groups.
Each row shows:
Principal name (user or group)
Principal type (User or Group)
Permission set name ("creator")
Assigned users should now see the Create Access Profile button on the Access Profiles page.
Users without permissions will not see the Create Access Profile button.
To revoke Access Profile creation permissions:
Navigate to Lifecycle Management > Settings.
Click Manage Access Profile Creation Permissions.
In the permissions table, locate the user or group to remove.
Click the delete (trash can) icon next to the user or group.
Confirm the deletion when prompted.
Result: The user or group can no longer create new Access Profiles. They retain read-only access to view existing profiles.
Permission Sets for Configurations and Integrations - Overview of the permission sets system
Access Profiles - Understanding Access Profiles and their role in Lifecycle Management
User Roles and Permissions - Veza role definitions and capabilities
Veza Groups - Creating and managing user groups for permission assignment
Important: Removing a user's Creator permissions prevents them from creating new Access Profiles. However, they retain Owner permissions on profiles they previously created, allowing them to continue editing those specific profiles.
To fully revoke a user's access to Access Profiles, you must remove both:
Their Creator permission (prevents creating new profiles)
Their individual Owner permissions on specific profiles (revokes editing rights for those profiles)
Only Administrators can manage these permission assignments.
Whether the event completed successfully (True/False)
Identity
The identity associated with the event
Entity Name
The name of the entity affected by the event
Entitlement Entity
The entitlement entity involved in the event, if applicable
Message
Additional details or error messages related to the event
The name of the action that initiated the job
Action Type
The type of action (e.g., SYNC_IDENTITIES, MANAGE_RELATIONSHIPS)
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
Error Message
Detailed error information if the job failed
The name of the action
Action Type
The type of action (e.g., SYNC_IDENTITIES, MANAGE_RELATIONSHIPS)
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
When the workflow was scheduled to run, if applicable
Started At
When the workflow started
Completed At
When the workflow completed
Entity Type
The type of entity processed by the workflow
State
The current state of the workflow (Completed, Errored)
Manually Triggered
Whether the workflow was triggered manually (Yes) or by an automatic policy evaluation (No)
Messages
Additional details or error messages related to the workflow
Writes email to the HiBob employee record
OAA Custom HRIS
Writes email to custom HRIS identity providers integrated via Open Authorization API
Full transformer support
Upstream requirement
Create Email, or a Google Workspace sync
None
Creates identities
No
No, disabled in write-back mode
Workday target
Workday Worker, directly
Workday Account, writing through to its linked worker
Make HTTP requests to external APIs and services as part of provisioning workflows.
Makes HTTP requests to external APIs and services as part of provisioning workflows. This action enables integration with custom applications, webhooks, and REST-based services that support identity management operations.
Example Use Cases:
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
Execute webhooks to coordinate multi-system workflows
Extract response data (like user IDs) from external systems for use in downstream actions
When constructing the webhook URL and JSON payload, you can reference identity attributes using curly brace syntax. Two sources of attributes are available specifically for this URL and payload context:
Source-of-identity (SOI) attributes: Attributes from the identity source triggering the workflow (e.g., Workday worker fields, Okta user attributes).
Sync Identities output entity attributes: When a Sync Identities action precedes this action in the same workflow, attributes from the provisioned or updated target user (such as Active Directory user attributes) are also available. See below.
Generated password (Early Access): When a or action precedes this action and password output is enabled, the generated password is available as {EntityType.password}. See below.
Available transformations include UPPER, LOWER, TRIM, and accessing nested attributes with dot notation, such as {Manager.email}. See for complete transformation syntax.
Note: If any placeholder in the URL or payload cannot be resolved (e.g., due to missing attributes), the entire transformation is skipped and the original URL is used without any substitution. The system logs a warning for troubleshooting. Ensure all referenced attributes exist in the source of identity to enable proper variable substitution.
When a Send REST Payload action is configured as part of an Access Request , the JSON payload can reference form field values submitted by the requester. This enables dynamic payloads where the requester provides values (such as a role name or resource ID) at request time, and those values are injected into the API call.
Use the {$form_field.field_name} syntax in the JSON payload, where field_name matches a field defined in the catalog definition's form fields.
To configure form field substitution:
Create a Send REST Payload action in a provisioning policy with placeholders in the JSON payload:
Create a Send REST Payload and add form fields with names that match the placeholders (e.g., role_name, role_id).
When a user submits an access request using this catalog definition, they complete the form fields. The submitted values replace the corresponding {$form_field.*} placeholders in the payload before the REST call is made.
Form field substitution applies to the JSON payload only. It does not apply to the webhook URL or authorization header. Each placeholder must sit inside a JSON string literal (between two " characters), as in "roleName": "{$form_field.role_name}". Placeholders outside string context are left untouched so the resulting JSON fails to parse at execution time rather than silently emitting malformed JSON.
Substituted form-field values are JSON-encoded automatically. Quotes, backslashes, and control characters in the submitted value are escaped, so a value such as alice"bob is emitted as alice\"bob and cannot break out of the surrounding string literal.
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.
The following attributes are populated on the sync_identities output entity for Active Directory integrations and can be used in variable substitutions:
Custom properties defined in the integration configuration are also available, using the key customprop_<property_name> (where <property_name> is the property's format name as configured).
When a or action precedes this action and password output is enabled, the password it generated is available to the webhook URL and JSON payload as {EntityType.password} — for example, {ActiveDirectoryUser.password}. This supports joiner workflows where Veza provisions an account and forwards the generated credentials to a downstream system such as an HR portal or ticketing API.
When "Add Response to Output Entities" is enabled, the action parses JSON responses and extracts specified entity data. This enables chaining actions where one API call creates a resource and returns an identifier that subsequent actions can 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 downstream workflow actions.
GET: Query operations, typically without payload; use for checking resource state or retrieving data. Does not set workflow change flags
POST: Create new resources; requires JSON payload; sets both AnyCreated and AnyChanges flags that can trigger downstream actions with "Only Send if Any Upstream Changes" enabled
PUT: Replace entire resources; requires JSON payload; sets AnyChanges
Workflow Integration: The
AnyCreatedandAnyChangesflags enable conditional workflow execution. Actions configured with "Only Send if Any Upstream Changes" will only execute when a previous action has set these flags, allowing you to build sophisticated conditional workflows (e.g., only send a notification webhook if a user was actually created, not just updated).
The authorization header supports common authentication methods:
No Authentication: Leave the authorization header empty when connecting to endpoints that don't require credentials, such as internal services or pre-authenticated URLs
Bearer Token: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
API Key: X-API-Key: secret-key-123 or Authorization: ApiKey sk-prod-xyz
Only JSON payloads are supported (no XML, form-data, or other formats)
Authentication must be header-based (OAuth flows requiring user interaction are not supported)
Response parsing requires valid JSON if "Add Response to Output Entities" is enabled
Timeout applies to entire request; no automatic retry on failure
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
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
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 Lifecycle Management Activity Logs 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.
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
Automatically review access for high-risk roles or sensitive systems
Create access reviews when users join specific departments or teams
The Certification Creation Plan is the core configuration element for CREATE_ACCESS_REVIEW:
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 the Certification Creation Plan 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
CREATE_ACCESS_REVIEW generates two notification events:
You can configure email notifications or webhooks for both events to track review creation progress. See for configuration details.
Related Topics:
: Behavior, filtering, entity matching, and troubleshooting
: Configuring certification plans and managing reviews
: Managing birthright entitlements included in reviews
Without 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 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:
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
You recognize that overrides should be used for exceptional cases, not routine operations
3.1 In the identity detail view, click the Properties tab to view all available attributes from the source of identity.
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
Change management coordination: Communicate with HR and identity provider teams when overrides are needed.
Data Source
Yes
Specifies which data to use: Current Data, Most Recent Snapshot, or a specific snapshot
Reviewer Assignment
No
Primary level reviewer assignment (manager, resource owners, or designated reviewers)
Fallback Reviewers
No
Reviewers to assign if automatic assignment fails
Due Date Offset
No
Time from certification start when reviews are due
Creation Mode
No
Publish immediately (sends the review to reviewers on creation) or Create as a draft (requires manual publishing)
Reviewers receive notifications to certify or revoke the identified access
Certification Creation Plan
Defines the review scope, certification criteria, and reviewer assignment. See configuration details below
Access Workflow
Yes
The Access Workflow ID where the certification is created
Name
No
CREATE_ACCESS_REVIEW_QUEUED
Immediate
Sent when the review creation is queued
CREATE_ACCESS_REVIEW
Asynchronous
Name of the certification. Supports attribute transformers (e.g., Review for {name}). Custom names appear in Dry Run results
Sent when the review campaign is created
Workflow Trigger Example:
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 an 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
Write system attribute names in their exact lowercase form, as shown in this reference (for example, sys_attr__is_mover, not SYS_ATTR__IS_MOVER). System attribute names are resolved by exact match, so a different case is not recognized as the system attribute — its special handling, such as expanding sys_attr__is_mover to the policy's mover properties for change detection, will not apply.
{
"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"JSON Payload
Request body in JSON format. Supports for attribute substitution: {"user": "{name}", "email": "{email}"}
Timeout
Maximum wait time in seconds for the request to complete (default: 60 seconds)
Only Send if Any Upstream Changes
When enabled, the request is only executed if a previous action in the workflow modified or created resources
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 response (required if "Add Response to Output Entities" is enabled)
Response Entity Attribute
JSON path to extract from response using dot notation (e.g., result extracts response.result, data.user extracts response.data.user)
Response ID Attribute
Attribute name containing the entity identifier in the response (defaults to id)
Response Name Attribute
Attribute name containing the entity display name in the response (defaults to name)
Execute from Insight Point
Optional data source to route the request through an Insight Point agent. Leave empty to execute from the control plane. See for configuration.
display_name
Display name (displayName)
department
Department
title
Job title
user_principal_name
UPN (login name) (userPrincipalName)
street_address
Street address (streetAddress)
password
Generated password (Early Access — requires password output; see )
PATCH: Partially update resources; requires JSON payload; sets AnyChanges flag
DELETE: Remove resources; payload optional; sets AnyChanges flag
HEAD: Metadata query without response body; payload optional; sets AnyChanges flag
OPTIONS: Describes communication options for the target resource; payload optional; sets AnyChanges flag
Custom Headers: Any header format your API requires
POST, PUT, and PATCH methods require non-empty, valid JSON payloads
Webhook URL
Target REST endpoint URL. Supports variable substitution using {attribute_name} syntax in URL path and query parameters
HTTP Method
Request method: GET, POST, PUT, PATCH, DELETE, HEAD, or OPTIONS. Methods are case-insensitive and automatically converted to uppercase. POST, PUT, and PATCH require a JSON payload
Authorization Header
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}"}email
Primary email address (mail)
given_name
Given name (givenName)
sur_name
Payload: {"username": "{user_principal_name}", "password": "{ActiveDirectoryUser.password}"}{
"result": {
"user_id": "12345",
"display_name": "John Doe"
}
}Passwords are passed as plain text to the target endpoint. Use this only when the workflow requires it, and ensure the endpoint uses HTTPS. Passwords are never written to the Veza database. They are available in memory during workflow execution only and are redacted from stored job payloads before persistence.
Required authentication header (e.g., Bearer <token>, X-API-Key: <key>, or custom authorization format)
Surname (sn)
Defining segmentation criteria in terms of Business Roles for identities in your organization.
Defining Role Conditions used in Lifecycle Management 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?
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 , OAA integrations using the , and .
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 and for the current capabilities.
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 LCM 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 LCM 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 policies.md.
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).
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 in Veza to model each segment.
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 custom properties 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.
Employee Number
Unique identifier for the employee.
Company
The company or subsidiary the employee works for.
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"
Cost Center equals "R&D"
Start Date on or after "2025-01-01"
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 Access Profiles mapped to those entitlements.
Examples: Access Profiles
AD Executive Employees
Active Directory
Executive Employee - Manager US (Active Directory Group)
AD Engineering Managers
Active Directory
When configuring the Manage Relationships action, administrators can grant or revoke access by choosing a Business Role that inherits the desired Profile.
Configure Business Roles 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 Transformers.
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 be kept in Continuous Sync, and which should only be created (and never modified after creating an entity).
Examples: Synced Attributes
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 enabling Continuous Sync.
account_name
display_full_name
{display_full_name}
distinguished_name
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:
account_name
display_full_name
{display_full_name}
distinguished_name
first_name, last_name
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.


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
Dynamically assign access based on user attributes (department, location, role)
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 firing once per duplicate.
This is useful for upstream systems that briefly emit more than one record for the same individual. The most common case is a contractor-to-employee conversion in an HRIS, where the legacy contractor record and the new employee record can coexist for a short period before the contractor record is closed.
Rules can be configured in the Policy Settings UI or via the .
Apply a Duplicate Resolution Rule when a single source of identity can produce more than one identity record for the same person, and you want a policy to act on only one. Typical situations:
Contractor-to-employee conversion: an HRIS keeps the open contractor record while creating a new employee record for the same person.
First Name
Employee's first name.
Last Name
Employee's last name.
Preferred Name
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.
Engineering - Manager US (Active Directory Group)
Azure Helpdesk Role
Azure
Helpdesk Administrator (Azure AD Role)
Google China Employees
Google Cloud
Google China Employees (Google Group)
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
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
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
Empty payload: The suspend endpoint requires a POST with an empty JSON object {} as the payload.
Webhook URL
https://{your-okta-domain}/api/v1/users/{employee_id | FROM_ENTITY_ATTRIBUTE,"OktaUser","employee_id","login"}/lifecycle/suspend
HTTP Method
POST
Authorization Header
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/unsuspendRemove Only Birthright Relationships
When enabled together with Remove Existing Relationships, restricts removal to relationships that were originally granted as birthright entitlements (created via a Manage Relationships action). Relationships added by other means are preserved.
Access Profiles
Static Access Profiles to assign to the identity. See for more details about managing birthright entitlements.
Dynamic Access Profiles
Attribute transformer expressions that resolve to Access Profile names to assign at runtime based on user attributes. See for details.
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 Dynamic Access Profiles for expression syntax.
Remove Existing Relationships
When enabled, removes all current relationships created by Lifecycle Management actions before applying the new set. Use Access Profiles to Remove instead when you need to selectively revoke specific entitlements rather than all existing ones.
System-generated duplicates: a SOI 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 at a time. It does not match a person across two different sources. That correlation is handled by the policy's primary and secondary source configuration. See Identities for cross-source behavior.
For each extraction of the source of identity:
Veza groups candidate identities that share the same values for the configured deduplication key properties.
For each group, Veza applies the ranking rules to choose the authoritative record. If no ranking rules are defined, the record with the smallest entity ID wins as a tie-breaker.
The non-authoritative records in the group are permanently deleted (hard-deleted, not soft-deleted) before workflows evaluate the resulting identity. Each deletion emits an IDENTITY_DELETED_FROM_SOURCES event, so event consumers and notification templates see one event per dropped record on the first extraction after a rule is enabled or changed. Unlike a record removed by normal LCM offboarding, a duplicate loser cannot be restored on rehire — it is gone from Veza entirely on the next extraction.
Policy workflows process the single authoritative record.
Groups larger than the configured max_duplicate_group_size are skipped and logged. A group with many members almost always means the deduplication key points at a non-unique field; review the rule configuration if you see skipped groups.
The rule lives on the policy:
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.
An empty {} is a no-op. Validation rejects rules that set ranking_rules or max_duplicate_group_size without dedup_key_properties.
dedup_key_properties
array of strings
Property names whose combined values uniquely identify a person. The list is AND-combined (all properties must match for two records to be considered duplicates). List order does not matter.
ranking_rules
array of RankingRule
scim_filter
string
SCIM filter expression. Candidates matching this filter are ranked higher than those that do not. The filter sees only the candidate identity itself, not related entities.
order_by
string
Property matching for dedup_key_properties is exact and type-aware:
Strings compared byte-for-byte (case- and whitespace-sensitive).
Type mismatches do not match. The string "1" and the number 1 are treated as different values.
List and struct element order matters. [1, 2] does not match [2, 1].
Group identities that share an email. Within each group, prefer records where is_active is true; among equally active records, prefer the most recently hired.
Group identities that share an employee_id. Within each group, prefer active records; among active records, prefer employees over contractors; among active employees, prefer the most recently hired. Each ranking rule applies only to ties from the previous rule.
Group identities that share both employee_id and country. Use the default ranking (smallest entity ID wins on ties).
PATCH cannot send null for this field (a null is treated as "field not in mask"). To clear an existing rule, send an empty object:
Update Policy Configuration: PATCH or PUT the policy version, including primary_duplicate_resolution_rule and per-secondary duplicate_resolution_rule.
Policies: policy structure and lifecycle.
Identities: identity behavior, including primary and secondary source of identity reconciliation.
{
"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": {}
}Enabling a rule on an existing policy, or changing ranking rules so a different record wins, hard-deletes the non-authoritative identities and cascades to their downstream entities. The deleted records cannot be recovered through LCM's rehire flow. Test changes in a draft policy first.
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)
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 Lifecycle Management 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
: 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
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
Ordered list of rules used to choose the authoritative record within a group. The first rule is the primary sort, the second is applied to ties, and so on. If empty, the smallest entity ID wins.
max_duplicate_group_size
integer
Upper bound on group size that Veza will resolve. Range: 2-20. Default: 3. Groups larger than this are skipped and logged.
Property name used as a secondary sort within the scim_filter match group. Supports string, number, bool, and lists of strings. If scim_filter is empty, order_by becomes the primary sort.
descending
bool
If true, order_by sorts descending.
provisioning
Yes
Must be true to enable Lifecycle Management
external_lifecycle_management_type
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_jsonconfiguration_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 Lifecycle Management policies. Remove the provider from all policies before changing this field.
tls: failed to verify certificate: x509: certificate signed by unknown authorityOVA 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
data_plane_id is set at creation and cannot be changed. To use a different Insight Point, delete and recreate the provider.
OAA template type (typically application)
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"]
}
}'Trigger an XML webhook in an internal ticketing system
Capture an identifier from a SOAP response and pass it to a downstream action
Webhook 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.
Authorization Header
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 Webhook 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 Webhook 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 Sync Identities 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 Webhook URL, Authorization Header, or Webhook 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
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. Provide credentials inline via Authorization Header, or reference a stored credential via REST Auth Credentials:
No Authentication: 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, cached for the action.
OAuth2 (OAUTH2): client credentials or other OAuth2 flow.
Set Datasource 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.
Datasource
(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.
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 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 Webhook 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>Insight Point execution cannot be combined with Only Send if Any Upstream Changes. Setting both datasource_id and the upstream-changes flag is rejected at validation.
Map 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 Relationship 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 Lifecycle Management 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 Lifecycle Management > Access Profiles.
Click Create Access Profile.
Under Access Profile Details, choose the Profile Type to create:
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 pause and resume it on the Lifecycle Management > Access Profiles page.
When configuring a policy to include the Manage Relationships 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.
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 have the Creator permission set for the relevant Access Profile Type. This is a two-step configuration process:
Grant Profile Type Permissions:
Navigate to Lifecycle Management > Settings
Select the Profile Types tab
Locate the profile type in the table
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
These permissions enable owners to not only manage their assigned profiles but also create additional profiles of any type they have access to.
Access Profile owners are managed through the Access Profiles interface:
Navigate to Lifecycle Management > 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 Lifecycle Management > 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.
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.
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).
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
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:
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:
Navigate to the Lookup Tables tab within your policy configuration
Enter Edit mode on a draft policy version (you can only add lookup tables to a draft)
Click Create Lookup Table
Provide a Name and optional Description for the lookup table
From the Lookup Tables tab, 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
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:
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.
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.
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
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:
Inline auth header (e.g., Bearer <token>). Ignored when REST Auth Credentials is set: the header is then built from the credential.
REST Auth Credentials
(Optional) Stored REST authentication credential. Same model as Send REST Payload: HEADER, BASIC, BEARER, LOGIN_TO_BEARER, OAUTH2.
Webhook Headers
(Optional) Additional request headers. Applied last, so entries here override defaults: including Content-Type (see Content-Type).
SOAP Action Header
(Optional) 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
Request timeout in seconds. Range: 0–3600. 0 uses the driver default.
Only Send if Any Upstream Changes
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 Children As Attributes
(Advanced) Flatten every direct child element and XML attribute under the response entity node into the output entity's attribute map.
UserId/text()
Response Name XPath
DisplayName/text()
Google Cloud
Google Asia Employees (Google Group)
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.
Profile 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.
Assigned Relationships:
Click Add Relationship
Choose the type of relationship to add:
Access Profile: Use the Relationship menu to pick one or more Access Profiles to grant those business roles or entitlements. This option is not available for Access Profiles of type "Profile".
Relationship: Choose the target data source and specific entities the Profile will govern access to (such as Google Cloud Platform > Google Group). This option is not available for Access Profiles with the "Business Role" type.
Click Assign to save the changes.
Click the Actions button (⋮) for that profile type
Select Manage Permissions from the dropdown menu
In the Manage Permissions dialog, select USER or GROUP from the Type dropdown
Choose the specific user or group to grant Creator permissions
Assign as Owner: Once a user or group has Creator permissions for the profile type, they can be designated as owners for individual Access Profiles of that type
Delete: Remove the Access Profile
Enables full control over the profile's configuration and lifecycle (pause/resume)
Creator permission globally for all Access Profiles
Grants the ability to create new Access Profiles of any type (subject to other constraints)
Scoped to the entire access_profiles table, not limited to specific Profile Types
This is a privilege escalation: first-time owner assignment grants global creation capability
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.
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 Operators and Groups (Early Access)
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)
Privilege Escalation: Becoming an Access Profile owner grants global Creator permission, allowing the user or group to create Access Profiles of any type (not just the type of the owned profile). Consider this privilege escalation when assigning ownership.
Owner Requirements: Every Access Profile must have at least one owner. The system will prevent you from removing the last owner from a profile to ensure ongoing management capability.
Cascade removal: If a custom attribute definition is removed from Access Profiles Settings, the system automatically removes that property from all profiles that had a value set for it. This cleanup is immediate and permanent. Review which profiles use a property before removing its definition.

Google Asia Employees
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
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
<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 Handling Missing Values.
Unexpected transformation results
Verify the lookup table content and ensure the correct columns are specified
{location | LOOKUP, "locationTable", "location_code", "city"}
"Los Angeles"
{location | LOOKUP, "locationTable", "location_code", "state"}
"California"
{location | LOOKUP, "locationTable", "location_code", "state_code"}
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

"CA"
Check that the name matches the table's Name exactly, including case, and that the table exists in the same policy version
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"}Gather authorization metadata using a variety of methods (custom connectors, APIs, manual JSON payloads, CSV files)
Sync Identities
✅
Create new users or update existing user attributes in the target application
Manage Relationships
✅
Administrative access in Veza to configure the integration
An existing OAA custom application integration in Veza with at least one successful extraction
Your custom application must expose SCIM 2.0-compliant endpoints; see Required SCIM 2.0 Endpoints 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 Lifecycle Management
To verify the configuration:
Open Lifecycle Management > Integrations
Search for the integration and click to view details
In the Properties panel, verify Lifecycle Management Enabled is active
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: Use the built-in SCIM connector for both basic data gathering and lifecycle management. This will provide visibility into supported SCIM entities and relationships with schedulable extractions, but not for the full range of entities and metadata that might be modeled using the Application Template such as roles and resources.
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.
Extraction Method
You build the OAA push payload directly
Auto-discovery via SCIM endpoints
Authorization Modeling
Full OAA Application support (roles, permissions, resources)
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}, etc.)
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
GET /Users/{id} - Retrieve specific user by ID
PATCH /Users/{id} - Update user attributes
DELETE /Users/{id} - Delete user (required if using Delete Identity action)
Group Management:
GET /Groups - List groups
GET /Groups/{id} - Retrieve specific group by ID
PATCH /Groups/{id} - Update group membership
DELETE /Groups/{id} - Delete group (optional)
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
name
Yes
Display name for the Custom Provider in Veza
custom_template
Yes
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.
scim_url
Yes
Base URL for SCIM API (without /Users or /Groups path)
""
* One of scim_token or the username/password pair is required for authentication.
Example Configuration with Bearer Token:
Example Configuration with Basic Authentication:
Push the OAA Application Payload as normal. See the Getting Started Guide 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:
user_name
userName
String
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:
GET /Users?filter=userName eq "jane.doe"Update the user:
PATCH /Users/{id}
Content-Type: application/scim+json{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{"op": "replace", "path": "displayName", "value": "Jane Smith"}
]
}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.
SCIM Operations:
Retrieve group details:
GET /Groups/{groupId}Add user to group:
PATCH /Groups/{groupId}
Content-Type: application/scim+json{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "add",
"path": "members",
"value": [{"value": "{userId}"}]
}
]
}Revoke a user's access by removing group membership.
SCIM Operation:
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": "{\"scim_url\":\"https://api.myapp.com/scim/v2\",\"scim_token\":\"your-bearer-token\"}"
}'{
"scim_url": "https://api.customerportal.internal.com/scim/v2",
"scim_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"scim_extension_schemas": true
}{
"scim_url": "https://legacy.mycompany.com/api/scim",
"username": "scim-service-account",
"password": "secure-password-here"
}custom_app = CustomApplication(
name="CustomerPortal", # Display name
application_type="CustomerPortal" # This determines entity types!
)POST /Users
Content-Type: application/scim+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
}PATCH /Users/{id}
Content-Type: application/scim+json{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{"op": "replace", "path": "active", "value": false}
]
}DELETE /Users/{id}PATCH /Groups/{groupId}
Content-Type: application/scim+json{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "remove",
"path": "members",
"value": [{"value": "{userId}"}]
}
]
}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.
Open Access Profiles > Profile Types.
Click New 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
Relationship Options:
Allow Inheritance from Other Access Profiles: When enabled, profiles with this type can use another access profile to specify the exact entitlements.
Allow Direct Relationships: 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.
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).
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 New Entitlement if None Exists: Configure the CREATE_ENTITLEMENT action to run when the policy is applied, including:
Click Create Profile Type to save the changes.
After saving a profile type, you can edit or delete it on the Access Profiles > Profile Types page.
To manage the users or groups allowed to create profiles of that type, click Actions > Manage Permissions.
To view profiles with a specific type, choose a profile type and click Show Access Profiles.
The Manage Permissions option controls who is eligible to be designated as owners of Access Profiles of a specific type. When you assign the Creator permission set to a user or group for a profile type:
They become eligible to be designated as owners of Access Profiles of that specific type
Once they become an owner of any profile, they automatically receive global Creator permission to create Access Profiles of any type
If a group receives Creator permissions, all group members inherit these capabilities (see Veza Groups for details on group management)
The Creator permission at the Profile Type level is scoped to access_profile_types.{type-id} and serves as a gating mechanism for ownership assignment
This permission configuration is required to assign Access Profile ownership. See Access Profile Ownership for details on designating owners for individual profiles.
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)
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)
Don't create new users
When checked, identities that don't already exist are skipped. Leave unchecked (the default) to create a new identity when none is found.
Attribute Sync
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 Sync Identities 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.
A Sync Identities 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 Sync Identities 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 checkbox appears on the Sync Identities action only for target systems that support it.
Active Directory
✅
✅
Azure AD
❌
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}Passwords are passed as plain text to downstream actions. Use this only when the workflow requires it, and ensure receiving endpoints use HTTPS. Passwords are never written to the Veza database. They are available in memory during workflow execution only and are redacted from stored job payloads before persistence.
Configure the conditions and actions that execute when workflows run.
When creating Lifecycle Management 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
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
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
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"
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
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 Actions If Any Error 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 notification actions (Slack, email, ServiceNow ticket) where each should fire regardless of the others.
Enable Continue Workflow on Error 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 Slack Notification, Update CMDB) where the Slack notification is nice-to-have but the other two must succeed.
The following workflow configuration for a Lifecycle Management 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):
To de-provision users, Veza moves accounts to a terminated users group and adds them to an OU 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
The following condition types enable workflow branching based on Access Graph data. They are designed to work with actions.
Checks whether entities matching an entity type and optional SCIM filter exist in the Access Graph. This is a graph-level check — it queries the Access Graph cache, independent of previous action results.
When to use: When the workflow should branch based on whether specific entities exist in the graph — for example, "only proceed if an active OktaUser matching this filter exists."
Checks whether any node of a specified entity type exists in the accumulated workflow output from previous actions.
When to use: When the workflow should branch based on whether a previous graph lookup returned results of a specific type — for example, "if the previous action found OktaUser nodes, proceed with provisioning."
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 SAP IQ (Sybase IQ) 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
Set role or group membership in a database-backed application
The target host must be reachable from the Veza control plane, or from an Insight Point when one is configured for the action (see ).
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 under Lifecycle Management > Settings > Credentials. Passwords are encrypted at rest and write-only on read, matching the REST authentication credential model.
To create a credential:
Go to Lifecycle Management > Settings > Credentials.
Click Add Credential and select the database type.
Enter host, port, database, username, and password (or, where supported, a certificate).
Save. The credential appears in the Credential
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:
Each Parameters entry accepts {attribute_name} substitution and transformer expressions. Available attribute sources:
Source-of-identity (SOI) attributes: fields on the identity record that triggered the workflow.
Sync Identities output entity attributes: when a preceding action provisioned or updated a target user in the same workflow.
Example, PostgreSQL insert with bound parameters:
Parameters list:
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 .
When a Send SQL Command action is configured as part of an Access Request , 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:
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 (/* ... */)
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:
Caveats:
MySQL and SAP IQ require a non-empty CA Certificate for both verify-ca and verify-full; an empty CA is rejected because the server certificate would otherwise not be verified.
Custom CA certificates are not yet honored for MySQL or PostgreSQL. Validation rejects a custom CA for those drivers; Microsoft SQL Server, Oracle, and SAP IQ accept custom CAs today.
Set Datasource 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).
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 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 .
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
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
Before you configure this feature, ensure you have:
Administrator access to Veza Lifecycle Management settings
An LCM-enabled integration that supports the action (such as Active Directory, Okta, or Snowflake)
A policy with a Sync Identities action configured for the target integration (see and )
An account-only Access Profile grants access to an application without attaching any entitlement relationships. The account itself is created by the Sync Identities 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 Sync Identities action uses its Unique Identifier to check whether the identity already has an account in the target integration.
If no account exists and the action has Create Allowed enabled, 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 Sync Identities action. See .
Open Lifecycle Management > Settings.
In the Profile Types section, click New Profile Type.
Enter the basic information:
Name
For the full reference on profile type options, see .
After you create the profile type, create an Access Profile that provisions accounts to a specific integration:
Open Lifecycle Management > Access Profiles.
Click Create Access Profile.
Under Access Profile Details, choose your account-only profile type (for example, "Application Access Only").
Confirm the target integration where accounts will be created.
For account provisioning to work, the policy that governs these identities must include a Sync Identities action for the target integration:
Open Lifecycle Management > Policies.
Edit the policy that governs the identities you want to provision.
In the workflow, confirm a Sync Identities action that:
Targets the same integration as your Access Profile
For details on configuring Sync Identities and attribute transformers, see and .
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 Sync Identities 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 local user/account only: Enabled
Sync Identities 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}
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 .
- Full reference for profile type configuration
- Creating and managing Access Profiles
- Configuring automated workflows
- The action that creates accounts
State Enabled by Admin: The Access Profile is created disabled and requires an administrator (not a regular user) to enable it.
Create local user/account only (if limited to a single integration): Create a local user account without specific entitlements.
Any member conditions (ANY to apply to all identities, or restricted by a condition string).
Attributes for the created entities using the specified formatters.
Enabling Continuous Sync to periodically recreate and reapply entitlements if removed within the target system.
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 local user/account only.
When enabled, this setting:
Disables adding entitlements (direct relationships) 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, Initial, Running, or Initial Start By Admin).
Access Request Policy: The default policy for access duration and approval workflows.
Click Create Profile Type.
Enter a Name and optional Description.
Click Assign to save the Access Profile.
Has Create Allowed enabled so new accounts can be created
Has attribute transformers for the required fields (such as username and email)
Publish the policy version.
givenName ← {first_name}sn ← {last_name}
department ← {department}
Conditions and Actions - All available workflow actions
Attribute Transformers - Mapping identity attributes to target systems
Add or remove users from groups
Deprovision Identity
✅
Deactivate user accounts (sets active=false in SCIM)
Delete Identity
✅
Permanently delete user accounts from the target application
Users and groups only
Lifecycle Management
Via SCIM endpoints
Via SCIM endpoints
Use Case
Complex custom applications where visibility or access reviews are needed.
Standard SaaS with SCIM support
OAA template type ("application")
provisioning
Yes
Must be set to true to enable Lifecycle Management
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_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
No
Fetch SCIM schemas for extension attribute support (default: false)
true
ca_certificate
No
Custom CA certificate for SSL verification (PEM format)
"-----BEGIN CERTIFICATE-----..."
Yes
Unique username
emails
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
Keep attributes in sync even after initial creation
Common Synced Attributes
Shared transformation rules across multiple sync actions
Action Synced Attributes
Create, format, and modify the specified target attributes. See Transformers for more details
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.
✅
Google Workspace
✅
— (no Reset Password action)
Execute actions in a defined order when conditions are met
Can trigger multiple actions when met
Can spawn additional conditions after successful action completion
Can check for entities in the Access Graph (NODE_IN_GRAPH) or in previous action output (ENTITY_TYPE_IN_OUTPUT)
Add to contractor AD groups: employment_type eq "CONTRACTOR"
CREATE_EMAIL: Generate email addresses
DEPROVISION_IDENTITY: Disable/remove access
DELETE_IDENTITY: Permanently delete accounts
CUSTOM_ACTION: Integration-specific operations (e.g., ServiceNow table inserts)
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
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
CN={first_name} {last_name},OU=Minnetonka,OU=US,OU=Evergreen Staff,DC=evergreentrucks,DC=local
user_principal_name
username
{username}@evergreentrucks.com
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
primary_group_dn
-
CN=Terminated Users,OU=Evergreen Groups,DC=evergreentrucks,DC=local
Generate email addresses via email providers
Disable accounts while preserving audit trails
Permanently remove accounts (databases, cleanup)
Execute ServiceNow-specific operations
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
Trigger emails or webhooks on action events
Reset user passwords in target systems
Automatically create certification campaigns
Rotate Azure Key Vault keys (NHI feature)
Look up entities in the Access Graph during workflow execution
Create groups, roles, or distribution lists in target systems
Continue Actions If Any Error (Condition)
All actions in a condition
If any action fails, the workflow continues instead of stopping
Continue Workflow on Error (Action)
One specific action
account_name
display_full_name
{display_full_name}
distinguished_name
account_name
display_full_name
{display_full_name}
distinguished_name
first_name, last_name
Create or update user accounts in target systems
Assign or remove group memberships, roles
Entity Type
(Required) The entity type to search for (e.g., OktaUser, AwsIamRole).
Filter
(Optional) SCIM filter to narrow the check (e.g., status eq "ACTIVE").
Entity Type
(Required) The entity type to check for in the workflow output (e.g., OktaUser).
Action Hierarchy Requirement: The Sync Identities action is the only action type that can be declared at the root condition level. All other actions must be defined within sub-conditions after establishing a root condition with Sync Identities. The UI enforces this hierarchy.
If this action fails, the workflow continues to the next step instead of stopping
first_name, last_name
CN={first_name} {last_name},OU=Evergreen Termination,OU=Evergreen Staff,DC=evergreentrucks,DC=local
PostgreSQL
Native PostgreSQL protocol
SAP IQ (Sybase IQ)
Sybase TDS protocol (SQL Anywhere)
Port
Database port. Inherited from the credential; inline value overrides.
Database
Database (catalog) name. Inherited from the credential; inline value overrides.
SSL Mode
One of disable, require, verify-ca, verify-full. See .
CA Certificate
(Optional) PEM-encoded CA certificate, used with verify-ca and verify-full. See .
SQL Statement
SQL to execute. Body placeholders are not supported: use bound parameters. See .
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 Any Upstream Changes
When enabled, the statement runs only if a prior action in the workflow modified or created resources. Cannot be combined with .
Oracle
:1, :2, …
SAP IQ (Sybase IQ)
?
{$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.
MySQL line comments (#, MySQL only)
verify-full
TLS with CA validation plus hostname verification. Requires a CA certificate.
Custom CA certificates are not yet honored for MySQL or PostgreSQL.
MySQL
Native MySQL protocol
Microsoft SQL Server
Native TDS protocol
Oracle
Credential
Stored connection credential. Database type, host, port, database, username, and password (or certificate) are configured once at Lifecycle Management > Settings > 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
MySQL
?
Microsoft SQL Server
?
PostgreSQL
INSERT INTO app_users (email, employee_id, department, status)
VALUES ($1, $2, $3, 'active')$1
{email}
$2
{employee_id}
$3
INSERT INTO app_users (email, role_name)
VALUES ($1, $2)$1
{$form_field.email}
disable
Plain TCP, no TLS.
require
TLS without server-certificate validation.
verify-ca
Datasource
(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.
Insight Point execution cannot be combined with Only Send if Any Upstream Changes. Setting both datasource_id and the upstream-changes flag is rejected at validation.
Native Oracle protocol
Database host or DNS name. Inherited from the credential; inline value overrides.
$1, $2, …
{department}
$2
TLS with CA validation. Requires a CA certificate.
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 Lifecycle Management > Access Profiles
Click Create Access Profile
Configure a profile for each department or role:
Create additional profiles as needed based on your organizational structure.
Next, create a Lifecycle Management policy using Workday as the source of identity:
Navigate to Lifecycle Management > Policies
Click Create Policy
Configure the policy:
Name: Workday Employee Lifecycle
Now add a workflow for new employee onboarding:
Edit your Workday Employee Lifecycle policy
Click Add Workflow
Configure the workflow:
Workflow Name: Active Employee
Add a workflow for handling employee role changes:
Edit your Workday Employee Lifecycle policy
Click Add Workflow
Configure the workflow:
Workflow Name: Mover Workflow - Regional Sales Manager
Finally, add a workflow for employee termination:
Edit your Workday Employee Lifecycle policy
Click Add Workflow
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 the overflow menu (three dots icon) at the top of the page.
Select Perform Dry Run.
In the Identity field, select an employee name from the dropdown menu.
Select Workday Employee Lifecycle policy.
Click Create Draft.
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, Have changed is typical: Workday emits reliable change events, so the extra re-processing of unchanged identities under Always 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
Target: OktaUser
Don't create new users: Unchecked (Veza creates identities that don't already exist)
Continuous Sync: Yes
All Employees
Assigns "All Okta Employee Access" profile
Does not remove existing relationships
US Developers
Condition: wd_location eq "US" and department eq "developer"
Assigns developer-specific access profiles
Does not remove existing relationships
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
Target: ActiveDirectoryUser
Don't create new users: Unchecked (Veza creates identities that don't already exist)
Continuous Sync: Yes
US Location
Condition: work_location eq "US"
Assigns US Groups
Removes existing relationships
Executive Group
Condition: employee_group eq "Executive"
Assigns the Executive Employee group
Removes existing relationships
China Location
Condition: work_location eq "China"
Assigns China Groups
Removes existing relationships
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
Target: OktaUser
Remove Relationships: No
Deprovisioning Method: Disabled
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
Target: ActiveDirectoryUser
Remove Relationships: No
Deprovisioning Method: Disabled
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 Sync Identities actions, add:
Add 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 > Provisioning 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 DEFAULT transformers 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
Safely preview policy changes and validate workflow logic before enabling policies in production
This guide explains how to use dry run simulations to test Lifecycle Management 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 Lifecycle Management 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 > Policies.
Select a policy to view its details.
Click Perform Dry Run.
Select an identity to test.
Go to Lifecycle Management > Identities.
Search for an identity and click to view its details.
Click the Actions menu and select Policy Dry Run.
Select a policy and optionally customize attributes.
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 > Policies.
Select a policy and click Perform Dry Run Bulk.
Choose your identity selection method:
Select All: Test against every identity in the policy
Dry run results show what would happen if the policy ran against the selected identities.
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 Potential Changes 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 complexity 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.
When running a bulk dry run, you can filter results to focus on identities where the policy would actually change attribute values. This helps you identify accounts that are out of sync with your policy's desired state, without manually reviewing every identity.
In the bulk dry run results table, use the Has Attribute Changes filter dropdown in the filter bar above the results to show only identities where one or more attributes would be modified. The results table shows which attributes would change for each identity. When multiple attributes would change, they appear as tags and collapse to Attribute Changes (N) when there are many.
For each attribute that would change, the dry run captures three values:
Current Value: The attribute value that Veza last synced to the target system
Current Graph Value: The value currently observed in the target system (which may have drifted from the last sync)
New Value: The value the policy would write on the next run
Reviewing these three values together helps you understand whether a difference is due to configuration drift, a manual change in the target system, or a policy update — and whether the proposed change is expected.
Bulk dry run results are preserved in a history table, so you can review previous tests and compare results across multiple runs.
Go to Lifecycle Management > Policies.
Select a policy.
Click See Dry Run Bulk History.
The history shows each dry run task with its filter criteria, identity counts, workflow matches, and timestamps.
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:
"First time only" workflow flags (the flag that prevents re-triggering)
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:
Optionally, modify identity attributes to simulate changes (such as a department transfer or status change).
Click Show Results.
Click Show Results.
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)
Click Run Dry Run.
Administrative access to Veza to create Lifecycle Management policies
Source of Identity: Workday
Data Source: Your Workday integration
Entity Type: Workday Worker
Click Create Policy to save the basic configuration
Condition: 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.
Continuous Sync: Enabled Continuous Sync is enabled, allowing updates to a user's source attributes—such as email, department, manager, or role—to be automatically synchronized to the target application on an ongoing basis 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”
Continuous Sync: Enabled
Add actions similar to the Joiner workflow, but ensure Remove Existing Relationships is enabled in the Manage Relationships 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. Enabling Remove Existing Relationships 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
The Dry Run takes seconds to execute. Click Show results.
Ensure that Okta and Active Directory contain the correct identity information for the employee.
Click Save Workflow. The workflow is now a draft version.
Continue to iterate on changes to the workflow until it is ready.
Click Publish when the policy performs satisfactorily.
Click Settings at the top of the page.
Click Policy Settings.
Enable the Enable Policy Draft Mode radio button.
In the Policy page, select your policy and click Actions.
In the Actions menu, select Start.
Logout User: No
Remove Personal Devices: No
Add Action > Write Back Email
Integration: Your Workday integration
Entity Type: Workday Worker
Name: Engineering Department 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
Profile Type: Application Entitlements
Description: Standard access for Marketing department employees
Entitlements:
- Active Directory Group: Marketing
- Okta Group: Marketing{username}@sigmacorpx.com
Yes
distinguished_name
CN={first_name} {last_name},OU=Minnetonka,OU=US,OU=Evergreen Staff,DC=evergreentrucks,DC=local
Yes
See for more information on distinguished_name.
distinguished_name
CN={first_name} {last_name},OU=Evergreen Termination,OU=Evergreen Staff,DC=evergreentrucks,DC=local
No
primary_group_dn
CN=Terminated Users,OU=Evergreen Groups,DC=evergreentrucks,DC=local
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"
first_name
{first_name}
Yes
last_name
{last_name}
Yes
country_code
{work_location}
Yes
login
{username}@sigmacorpx.com
No
Common transformer
user_principal_name
{username}@evergreentrucks.com
Yes
{username}@evergreentrucks.com
Yes
display_name
{display_full_name}
Yes
given_name
{first_name}
Yes
sur_name
{last_name}
Yes
country_code
{work_location}
Yes
job_title
{job_title}
Yes
primary_group_dn
CN=Domain Users,CN=Users,DC=evergreentrucks,DC=local
Yes
account_name
{display_full_name}
No
Common transformer
No

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
SCIM filter
Boolean
Decide WHAT value an attribute should have
Formatter (template)
String
Decide WHICH Access Profile to assign
Formatter (template)
String (profile name)
{| NOW | UTC_TO_TIME_ZONE, "-05:00" | ...}
Embedded transformer
Generate "today in EST" dynamically
Base syntax
SCIM filter (eq, le, and, or)
Template ({attribute})
Supports IF/ELSE
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)
System Attributes - Computed attributes like sys_attr__is_mover
Policies - Creating and configuring Lifecycle Management 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
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
Purpose
Gate execution
Construct values
Output
Boolean (yes/no)
Decide IF a subsequent action runs
Compare last day to threshold
String (the value)
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 Relationships 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 Engineering, the system evaluates this to dept-engineering.
Name 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 Log 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
Dynamic and static Access Profiles can be used together in the same action.
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 > Policies
Create or edit a policy
Add or edit a Manage Relationships action
In the Dynamic Access Profiles section:
Dynamic Access Profile expressions use the 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
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:
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:
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})
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
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.
- Conceptual overview of the different evaluation systems
- Creating and managing Access Profiles
- Configuring the Manage Relationships action
- Available formatters and syntax
Graceful Failure: By default, missing or non-existent profiles don't cause the entire workflow to fail
Validation
Profile existence validated when saving policy
Expression syntax validated when saving policy; profile existence checked at runtime
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
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
TEAM-{department}-{businessUnitCode} - Multiple attributes combined with static text
{location | UPPER}-{role | LOWER} - Multiple attributes with different formatters
co
Contains
groups co "Admins"
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
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
Test complex conditions: Use the Test Formatter feature to validate your IF/ELSE logic before deploying to production
Wrong profile applied
Similar profile names
Use distinctive naming patterns; avoid profile names that are substrings of others
ELSE statement has to be last
Two separate IF blocks in one field
You cannot stack two separate IF/ELSE blocks in one field. Solution: Either combine related conditions using ELSE IF branches in a single expression (see ), or use separate Access Profile Name fields for truly independent criteria (see ).
Lifecycle Management Policies - Policy configuration and workflows
Selection Time
Policy configuration time
Workflow execution time
Identifier Type
Access Profile ID
{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>eq
Equals
department eq "Engineering"
ne
Not equals
Department-based profile
Location-based profile
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_Selected`dept-{department
`location-{location
`role-{role
Profile not found in Activity Log
Name mismatch or profile is PAUSED
Check Activity Log for the exact resolved name; verify profile exists and is in RUNNING state
Formatter fails to resolve
Missing attribute or incorrect path
Multi-Branch Expressions Work in a Single Field
A single IF/ELSE IF/ELSE block with multiple branches is one expression and works perfectly in one Access Profile Name field. The expression evaluates conditions top-to-bottom and returns the first matching profile name.
Example: Department-Based Profile Selection
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_SelectedThis single expression handles four different outcomes in one field—no need for multiple fields.
When Multiple Fields Are Required
Use separate Access Profile Name fields only when you need to assign multiple independent profiles to the same user. Each field can contain one complete IF/ELSE expression.
This requires two separate fields (assigning profiles based on TWO independent criteria):
This does NOT require multiple fields (one criterion with multiple outcomes):
IF department eq "Sales"
SalesProfile
ELSE IF department eq "Engineering"
EngineeringProfile
ELSE
DefaultProfileError: Cannot Stack Separate IF Blocks
Placing two separate IF/ELSE blocks in the same field causes the error "ELSE statement has to be last". This happens because the parser sees a second IF keyword after an ELSE statement.
Incorrect (two separate IF blocks in one field):
IF department eq "Sales"
SalesProfile
ELSE
No_Profile_Selected
IF location eq "US"
USProfile
ELSE
No_Profile_SelectedCorrect approaches:
For multiple outcomes from the same criterion, use ELSE IF branches:
For independent criteria, use separate Access Profile Name fields (click Add Profile Name).
Access Profile name (resolved from expression)
status ne "Terminated"
Verify attribute exists on identity node; check secondary node paths exist
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 .
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
access-profile-qaUser with department=QA and businessUnitCode=12345 → Access Profile TEAM-QA-12345
User in any other department → No profile assigned (resolves to non-existent No_Profile_Selected)
No_Profile_Selected)When to use multiple fields: Use separate fields only when you need to assign multiple profiles independently. If you're selecting ONE profile from multiple options, use ELSE IF branches in a single field instead.
IF department eq "Sales"
SalesProfile
ELSE IF department eq "Engineering"
EngineeringProfile
ELSE
No_Profile_Selected{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_SelectedSee Integrations for detailed information on integrating the source of identity.
For Integration management using APIs, see the Datasource Management APIs.
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 Sync Identities 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, Sync Identities works alongside other key actions:
Manage Relationships (handling group/role memberships)
Deprovision Identity (removing access when users leave the organization)
Synchronization is executed through Lifecycle Management 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 SCIM for more information on usage.
See Open Authorization API (OAA) for detailed information.
Active Directory supports appending values to multi-value attributes during Identity Sync 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 Appending Multi-Value Attributes in the Transformers documentation.
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)
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:
Active
Any
Primary source
Inactive
Active
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
Integrations filter: Filter by source integration system
Policy filter: View identities managed by specific policies
Workflows Triggered filter: Identify identities that have triggered automation
Not in a Workflow: Find identities outside automated workflows
For each identity record, administrators can perform actions through the Actions menu:
View Details: Access identity information, attribute history, and related accounts
Trigger Workflow: Manually initiate a workflow in a policy
Request Access: Launch an Access Request for additional access (requires Veza Access Requests).
See Notification Templates for Lifecycle Management for customizing the Request Access Template.
Show in Graph: Visualize identity relationships and access patterns
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.
Providers: 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.
Last Workflow Triggered: The name of the workflow that was recently executed.
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.
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 Identity Override Attributes.
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
Security incidents: Immediate access restrictions are needed before HR systems can be updated
Temporary access grants: Providing temporary access while permanent changes are processed
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)
Select Create Override.
The Create Override window appears. The Property Name and Actual Value fields are populated.
Enter an Override Value.
Click Save.
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, Synced Entities, Action Run Info, and Workflow Failures are shown. Synced Relationships is available but not displayed by default.
Synced Entities
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
Clearing metadata
Action Run Info, Workflow Failures, and Synced Relationships each have a section-level Clear button that removes all stored metadata for that category. For Synced Entities, 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 Provisioning Activity 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:
Trigger Workflow
Request Access
Show in Graph
The Trigger Workflow option is a convenient way to test a specific user in a policy workflow. For example, you can test a new employee's identity in a joiner workflow to evaluate whether they have sufficient access to perform their duties.
Use the Trigger Workflow option to manually run a workflow for a specific user.
To trigger a workflow with a specific user, perform the following steps:
Select a workflow in the dropdown menu.
Click Trigger to run the workflow.
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 Access Profile and Access Profile Types for more information.
To grant an Access Profile, perform the following:
Click the Access Profile radio button.
The Choose from Access Profile window appears.
Enter a Reason for granting the Access Profile for the user.
Select an existing Access Profile from the dropdown menu.
Enter an Expiration Time in Hours or Days.
App option
An App refers to a target system, where user access is provisioned or deprovisioned as part of the identity lifecycle process.
To grant an App, perform the following:
Click the Access Profile radio button.
The Request Grant Access window appears.
Enter a Reason for granting the App for the user.
Select an existing Integration from the dropdown menu.
Use the arrows to select an Expiration Time in Days, where 0 means no expiration.
Click Create.
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.
Based on the integration you selected, the Target Entity Type is automatically populated.
Use the arrows to select a Target Entitlement.
Use the arrows to select an Expiration Time in Days, where 0 means no expiration.
Click Create.
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.
Indicates employment status.
Property Overrides
Shows "Yes" if identity has custom attribute overrides
Identifies identities with manual attribute modifications (overriding attributes from your SOI )
Department
Organizational department from SOI
Used for access assignment and reporting
Policy
Associated Lifecycle Management 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
Workflows
Associated Lifecycle Management workflow name
Identifies which policy workflow manages the identity
Secondary source
Active
Active
Primary source (default)
Inactive
Inactive
Primary source (default)
Failure tracking per workflow, including first and last failure timestamps and the number of consecutive failures.
Synced Relationships
Target relationship bindings (such as group memberships) that Lifecycle Management has established for this identity.

Complete 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".
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.
Trigger a cleanup workflow for employees terminated more than 30 days ago:
For a conceptual overview of how conditions and transformers work together, see .
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.
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
Add specificity: Combine multiple conditions with and
Check for broad patterns: co "" matches all non-null values
Verify logical grouping: Ensure and/or
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 Lifecycle Management policies
- Configure workflow actions and their triggers
- Transform attribute values using formatter syntax
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 LCM 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 relationships) that can be triggered from LCM 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 Pipeline > Extraction Interval section, set the global extraction interval
To override the global setting for specific integrations, use the Active Overrides section
Available extraction intervals are:
Auto (hourly, but may take longer when the extraction pipeline is full)
15 Minutes
1 Hour
6 Hours
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 Lifecycle Management column on the Integrations overview.
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 panel, click the magnifying glass icon under Lifecycle Management Enabled
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
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
Review operator choice: co for contains vs. eq for exact match
Use Dry Run: Test the condition against specific identities
- Complete list of transformation functions
- Available system attributes for conditions
- Formatter-based profile assignment
- 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
eq
Equal
Exact numeric match
department_code eq 100
eq
Equal
Boolean match
is_active eq true
eq
Equal
Exact timestamp match
hire_date eq "2024-01-15T00:00:00Z"
co
Contains
List contains a specific value
employee_types co "Full Time"
and
Both conditions must be true
is_active eq true and department eq "IT"
or
Either condition must be true
# 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"}NOW
Current UTC timestamp
`{
UTC_TO_TIME_ZONE
Convert to specific timezone
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\"}"1
NOW
(none)
Current UTC timestamp
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\"}"# 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"Limitation: The not() operator may not be fully supported in all LCM trigger condition contexts. If you encounter unexpected behavior with not(), rewrite the condition using ne or restructure the logic. For example, instead of not(status eq "Active"), use status ne "Active".
Escaping quotes: When embedding transformers in conditions, you must escape inner quotes with backslashes. For example: \"-05:00\" and \"DateOnly\".
1 Day
2 Days
3 Days
7 Days
30 Days
Any fields used in workflow trigger conditions
ActiveDirectoryUser
Substring match
email co "@company.com"
sw
Starts With
Prefix match
employee_id sw "EMP"
ew
Ends With
Suffix match
email ew "@company.com"
pr
Present
Attribute exists and is not null
manager_id pr
ne
Not Equal
Does not equal
level ne 0
lt
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
pr
Present
Attribute exists and is not null
access_level pr
ne
Not Equal
Boolean inverse
is_contractor ne true
pr
Present
Attribute exists and is not null
is_contractor pr
lt
Before
Earlier than
termination_date lt "2024-06-01T00:00:00Z"
le
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"
pr
Present
Attribute exists and is not null
termination_date pr
eq
Equal
List exactly matches value(s)
roles eq "Admin"
ne
Not Equal
List does not match value(s)
tags ne "deprecated"
pr
Present
Attribute exists and is not empty
groups pr
department eq "IT" or department eq "Engineering"
not
Negates a condition
not(status eq "Terminated")
`{
DATE_ADJUST_DAY
Add/subtract days
`{
DATE_FORMAT
Format for comparison
`{
2
UTC_TO_TIME_ZONE, "-05:00"
UTC timestamp
Eastern time timestamp
3
DATE_ADJUST_DAY, 0
EST timestamp
Today (or -2 for 2 days ago)
4
DATE_FORMAT, "DateOnly"
Adjusted timestamp
Date string for comparison
CustomHRISEmployee
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 Entitlement, Delete Identity
ActiveDirectoryGroup
-
✅
✅
✅
Delete Identity
AtlassianCloudAdminGroup
-
✅
✅
✅
Create Entitlement
AwsSsoGroup
-
✅
✅
✅
Reset Password, Create Email, Create Entitlement
AzureADGroup, AzureADRole, ExchangeOnlineDistributionGroup, AzureADLicense
Email management includes mailbox configuration (size limits, quotas, auditing) and client access settings (OWA, ActiveSync, MAPI, POP, IMAP)
✅
✅
✅
Delete Identity
ApplicationGroup, ApplicationRole
-
✅
✅
❌
Delete Identity
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 Identity
GithubOrganization, GithubTeam
-
✅
✅
✅
Delete Identity
LDAP group
Includes Red Hat Identity Manager and FreeIPA
✅
✅
✅
Delete Identity
GoogleWorkspaceGroup
-
✅
✅
✅
Delete Identity
MySQLRoleInstance
-
✅
✅
✅
Reset Password, Create Entitlement, Delete Identity
OktaGroup
Supports two deprovision types: SUSPENDED (temporary) and DISABLED (permanent deactivation)
✅
✅
✅
Delete Identity
OracleDBRole
-
✅
✅
✅
Delete Identity
OracleRole
-
❌
✅
❌
Write Back Email
-
-
✅
✅
❌
Delete Identity
PagerDutyTeam
Platform does not support user deactivation; use Delete Identity instead
✅
✅
✅
Delete Identity
PostgreSQLGroup
-
✅
✅
✅
-
SalesforceGroup, SalesforcePermissionSet, SalesforcePermissionSetGroup, SalesforceProfile, SalesforceUserRole
-
SAP ECC
✅
✅
✅
-
SapEccRole
Manage Relationships supports role assignment only (revocation is not supported)
✅
✅
✅
Delete Identity
SCIMGroup
Supports token authentication and OAuth2 client credentials
✅
✅
✅
Update ServiceNow Table
ServiceNowGroup, ServiceNowRole
Manage Relationships covers directly granted roles only; roles inherited through group membership are not managed
✅
✅
✅
-
SnowflakeRole
-
✅
✅
❌
Delete Identity
SplunkEnterpriseRole
Platform does not support user deactivation; use Delete Identity instead
✅
✅
❌
Write Back Email
WorkdaySecurityGroup
-
Veza
✅
✅
✅
-
VezaRoleBinding, VezaAccessProfile, VezaGroup
-


Configure how user attributes from a source of identity are transformed for target user accounts
When creating workflows in Lifecycle Management 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:
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.
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.
Common transformers 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.
After creating a common transformer, you can select it when editing a workflow action. You can edit or delete common transformers on the Edit Policy > Common Transformers tab. Remember that "Sync Identity" and "De-Provision Identity" actions can have action-level transformers override common transformers. If the same destination attribute is defined in both, the action-level transformer will take precedence.
Create common transformers when the same transformation logic appears in two or more places within the policy. Common transformers 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.
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
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
Aliases provide shorthand references to specific integrations and entity types, making transformers and conditions more readable in complex policies.
To configure aliases, open a Lifecycle Management policy, click Edit, and navigate to the Alias Definitions tab. 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 (SOI), 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 Formatter button next to the transformer field. Clicking it opens a test dialog:
Enter your transformer expression in the Attribute Transformer field
Click the Test Formatter 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 synced attributes
Unique identifiers
Common transformers
Date formatters
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 common transformers to define how values such as username, login, or ID are sourced for each LCM Policy. These transformers can then be reused across all identity sync and deprovision policy workflows.
For example, defining a common synced attribute to describe how to format Azure AD account names {username}@evergreentrucks.com enables reuse across multiple workflow actions. You can also define synced attributes 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.
Common Transformer 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 Identity Sync 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
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
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 and action notification settings. Custom email templates are:
Reusable: Single template for multiple workflows and actions
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.
Continuous Sync: Enabling this option ensures that the attribute is always synced, while applying any defined transformations. By default, attributes will not be synced if the target identity already exists.
{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
-
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).
Source only
{$workday$in.department}
Get the authoritative source value
$out
Target only
{$workday$out.department}
Get the current target value
co
Contains
String, string list
sw
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
`f{id | UPPER}`
Converts ID to uppercase
JSMITH" is the output derived from the userid, "jsmith"
Substring
FIRST_N, LAST_N, SUB_STRING, SPLIT
Extract portions of values
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
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
If first_name = John and last_name = Smith, the result is j.smith.
{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).
Enter sample values for each attribute
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
{start_date | DATE_FORMAT, "2006-01-02"}
2025-01-15T10:30:00Z
2025-01-15
{name | LOWER | REPLACE_ALL, " ", "."}
John Smith
john.smith
Basic account name
distinguished_name
CN={first_name} {last_name},OU={department},OU={location},DC=company,DC=local
Yes
Full AD path
user_principal_name
`{first_name
SUB_STRING,0,1
LOWER}.{last_name
{first_name}{last_name}@company.com
Yes
Email address
OktaAccountTransformer OktaUser
login
`{first_name
SUB_STRING,0,1
LOWER}.{last_name
{first_name}{last_name}@company.com
Yes
Email address
username_prefix
`{first_name
SUB_STRING,0,1
LOWER}.{last_name
AzureADTransformer AzureADUser
principal_name
{first_name}{last_name}
No
Primary identifier
mail_nickname
`{first_name
SUB_STRING,0,1
LOWER}{last_name
display_name
{first_name} {last_name}
Yes
Display name
GoogleAccountTransformer GoogleWorkspaceUser
{first_name}{last_name}@company.com
No
Primary email
email_addresses
{username}@company.com
No
Email list
recovery_email
{personal_email}
Yes
Backup email
ContractorTransformer ActiveDirectoryUser
account_name
c-{username}
No
Contractor prefix
distinguished_name
CN={first_name} {last_name},OU=Contractors,OU={department},DC=company,DC=local
Yes
Contractor OU
description
Contractor - {vendor_company} - Start Date: {start_date}
Yes
Metadata
RegionalEmailTransformer ExchangeUser
email_address
{username}@{region}.company.com
No
Regional email
alias
{first_name}.{last_name}@{region}.company.com
Yes
Regional alias
membermemberOfroleOccupanturl, 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
Destination attribute
The target attribute to set
email, username, distinguished_name
Formatter
The template that constructs the value
See Terminology
Continuous sync
Whether to update on existing users
Enabled/Disabled
Fallback formatters
Alternative templates if the primary causes conflicts
{first_name}.{last_name}1@company.com
Source of Identity (SOI)
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 SOI data
created_by
“Veza”
Disabled
isActive
true
Enabled
manager_id
(empty)
Enabled
isActive
false
first_name
{first_name}
Enabled
last_name
{last_name}
(none)
Output, then input
{$workday.department}
General attribute access
eq
Equals
Boolean, string, number, timestamp
ne
Not equals
{$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
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
UPPER
john.doe
JOHN.DOE
{email | SPLIT, "@", 0}
john.doe@example.com
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}
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"]Do not use a space character to represent an empty value. The formatter field trims leading and trailing whitespace on input, so a space is equivalent to leaving the field blank.
Validation Rules: Alias names allow only lowercase alphanumeric characters, underscores, and $. They must start with exactly one $ (not zero, not multiple), and cannot be $target (reserved for action-level attribute references).
Testing and Validation: Aliases work in test formatters, allowing you to validate your formatter expressions before deployment. Additionally, alias-resolved attribute values appear in dry run results, so you can preview exactly which values will be synced.
The test interface uses sample data you provide. Ensure your test values accurately represent the source attribute data types and formats you'll encounter in production.
Important: The $target function can only be used within the same Action.
Active Directory, Okta, Google Workspace, SaaS applications
Enabled
Enabled
$in
Boolean, string, number, timestamp
user_id
Clean and format string data
john.doe
No
Event-independent: Not associated with a specific lifecycle event type
Flexible: Can be used in both Send Notification actions and action notification settings (on_success/on_failure)
Standard placeholder support: Supports all the same placeholders as event-based templates
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
Save the template
To use a custom template, select it when configuring the Send Notification action, or in Action Notification Settings:
Send Notification action: Choose from the "Select Email Template" dropdown when configuring the action
Action Notification Settings: Select the template for on_success or on_failure email notifications on any action
When you select "Default template" in these dropdowns, the system uses the event-based template appropriate for the event. 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 Default Template Content 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 and work with all notification templates.
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:
The following static placeholders are available in all notification templates:
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}}
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 for password-related events
{{ACCESS_REQUEST_URL}} is only available for Access Request events
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}} to avoid ambiguity
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:
Built-in (uppercase)
{{ACTION_NAME}}
Populated directly by the workflow runner. No entity lookup. See .
Bare attribute
{{email}}
For the qualified form, when an entity type appears in both the output entities and the source of identity, the output (target) value is used. This means {{EntityType.attribute}} is the only form that can reference an attribute written to the target system, and the bare form always reads from the source of identity.
A notification template can be attached to three surfaces, and each receives a different set of attributes:
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
Target (output entity) attributes are only available downstream when the action that ran produces output entities:
Sync Identities
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
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:
A custom template referenced by ID on the action or notification setting, if one is configured.
The template assigned to the matching event usage, if one exists.
The built-in default template for that event.
Selection is evaluated per configuration surface and per outcome (success or failure), so an action can use a custom template on success and fall back to the built-in default on failure.
Veza performs flat text substitution. It replaces each {{key}} token with its value and does not evaluate conditional or block logic. Handlebars-style block syntax such as {{#if}}, {{/if}}, {{else}}, partials ({{>partial}}), and comments ({{!comment}}) is not supported. These tokens never match an attribute, so they remain in the output and are reported as unresolved placeholders in the job's activity log.
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 predefined placeholders 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 LCM 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 Sync Identity operation.
To create and manage a webhook, perform the following:
Go to Policies and select a policy.
Click Edit Policy.
Click Policy Settings.
Scroll down to Notifications and click Add Notification.
Choose the Webhook notification type.
Choose an event to trigger notifications:
Create Identity
Sync Identity
Add Relationship
Choose the status to trigger notifications (when an event is Successful, or On Failure).
Select an Existing 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 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}}{{OAA.Jira Cloud.User.email}}Placeholder Case Sensitivity: Placeholders are case-sensitive and must match the exact casing shown in the documentation. For example, {{ENTITY_TYPE}} will work, but {{entity_type}} or {{EntityType}} will not be replaced unless those exact attribute names exist in your data.
A bare placeholder such as {{email}} reads only from the source-of-identity record that triggered the workflow. To reference an attribute on the account the workflow created or updated in a target system, you must use the qualified {{EntityType.attribute}} form with the exact registered entity type.
The standalone Send Notification action runs with an empty job result, so it has no output entities. Templates on a Send Notification node can resolve source-of-identity attributes and built-in placeholders only. A qualified {{EntityType.attribute}} that points at a target system resolves to nothing on this surface. To send target-system attributes, attach the template to the action that produces them (for example, Sync Identities), using its on_success notification setting.
Remove Relationship
Create Email
Change Password
Delete Identity
Disable Identity
Manage Relationships
Write Back Email
Access Request Complete
Custom Action
Action Failed
Workflow Task Failed
Extraction Event Failed
Create Entitlement
Create Guest Account
Rename Entitlement
Create Access Review
Reset Password
Create Access Review Queued
Safety Limit Reached
Predictive Safety Limit Exceeded
Workflow Predictive Safety Limit Exceeded
Sync Entitlement
Subject: New {{ENTITY_TYPE}} Guest Account Created: {{ENTITY_NAME}}
Body:
SYNC_IDENTITY
Subject: Sync Identity Notification: {{ENTITY_TYPE}} account synced
Body:
DELETE_IDENTITY
Subject: Identity Deleted Notification: {{ENTITY_TYPE}} has an account deleted
Body:
DISABLE_IDENTITY
Subject: Identity Disabled Notification: {{ENTITY_TYPE}} has an account disabled
Body:
IDENTITY_DELETED_FROM_SOURCES
Subject: Action Required - Identity Deleted: {{FULL_NAME}}
Body:
Subject: Relationship Removed Notification: {{ENTITY_TYPE}} has an account whose relationship was remove from a {{RELATIONSHIP_ENTITY_TYPE}}
Body:
REMOVE_DIRECT_ACCESS
Subject: Direct Access Removed Notification: {{ENTITY_TYPE}} had direct access removed from {{RELATIONSHIP_ENTITY_TYPE}}
Body:
Subject: New Write Back Email Notification: {{ENTITY_TYPE}} has had an email sync to it
Body:
Subject: Reset Password Notification: {{ENTITY_TYPE}} has had their password reset
Body:
Subject: Rename entitlement notification: an entry of {{ENTITY_TYPE}} is renamed
Body:
SYNC_ENTITLEMENT
Subject: Sync entitlement notification: an entry of {{ENTITY_TYPE}} is renamed
Body:
Subject: {{ACCESS_REQUEST_SOURCE_TYPE}} for {{ACCESS_REQUEST_ENTITY_NAME}} is {{ACCESS_REQUEST_STATE}}
Body:
ACCESS_REQUEST_FAILED
Subject: {{ACCESS_REQUEST_SOURCE_TYPE}} for {{ACCESS_REQUEST_ENTITY_NAME}} is failed
Body:
ACCESS_REQUEST_STATE_CHANGED
Subject: {{ACCESS_REQUEST_SOURCE_TYPE}} for {{ACCESS_REQUEST_ENTITY_NAME}} is {{ACCESS_REQUEST_STATE}}
Body:
ACCESS_REQUEST_APPROVER_ASSIGNED
Subject: {{ACCESS_REQUEST_SOURCE_TYPE}} for {{ACCESS_REQUEST_ENTITY_NAME}} in {{ACCESS_REQUEST_STATE}} as new assigned approvers
Body:
Subject: Workflow Failed: {{WORKFLOW_NAME}} for identity {{IDENTITY_NAME}}
Body:
EXTRACTION_EVENT_FAILED
Subject: Lifecycle Management extraction processing failed for {{DATASOURCE_ID}}
Body:
Subject: Create Access Review Notification: for identity {{IDENTITY_NAME}}
Body:
Subject: Predictive Safety Limit Exceeded: Policy {{POLICY_NAME}} has blocked changes before processing
Body:
WORKFLOW_PREDICTED_SAFETY_LIMIT_EXCEEDED (Workflow-Level Predictive Safety Limit)
Subject: Workflow Predictive Safety Limit Exceeded: A workflow in policy {{POLICY_NAME}} has blocked changes before processing
Body:
CUSTOM_ACTION
Subject: New Custom Action Notification: {{ENTITY_TYPE}} has performed a custom action
Body:
INVALID_IDENTITIES_DETECTED
Subject: Invalid Identities Detected: Policy {{POLICY_NAME}}
Body:
Source-of-identity (input) entities only. Never resolves a target-system attribute.
Qualified attribute
{{OktaUser.email}}
Output (target) entities first, then source-of-identity entities.
Available from that action's output entities
Send Notification action (standalone workflow node)
Available
Not available
No. Runs with an empty result.
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.
Create Identity
Add Relationship
Create Email
LIFECYCLE_MANAGEMENT_CREATE_EMAIL
Change Password
LIFECYCLE_MANAGEMENT_CHANGE_PASSWORD
Create Entitlement
Custom Action
Create Access Review Queued
LIFECYCLE_MANAGEMENT_CREATE_ACCESS_REVIEW_QUEUED
Safety Limit Reached
LIFECYCLE_MANAGEMENT_SAFETY_LIMIT_REACHED
Access Request Created
LIFECYCLE_MANAGEMENT_ACCESS_REQUEST_CREATED
Rotate Key
LIFECYCLE_MANAGEMENT_ROTATE_KEY
<html><body>
Hello,<br>
<br>
Here is the information for your new-hire: {{ENTITY_NAME}} <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
Login Name: {{LOGIN_NAME}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
{{ENTITY_NAME}} has a new relationship to {{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}} has a new email address <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
Email: {{EMAIL}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
{{ENTITY_NAME}} has a password <br>
<br>
Account Type: {{ENTITY_TYPE}} <br>
Login Name: {{LOGIN_NAME}} <br>
New Password: {{LOGIN_PASSWORD}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
An entry of {{ENTITY_TYPE}} is created: {{ENTITY_NAME}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
{{ACCESS_REQUEST_ENTITY_NAME}} has been {{ACCESS_REQUEST_TYPE}} with: {{ACCESS_REQUEST_TARGET_NAME}}.<br>
<br>
User Type: {{ACCESS_REQUEST_ENTITY_TYPE}} <br>
Target Type: {{ACCESS_REQUEST_TARGET_TYPE}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
Action has failed.<br>
<br>
Identity: {{IDENTITY_NAME}}<br>
Action Name: {{ACTION_NAME}}<br>
Action Type: {{ACTION_TYPE}}<br>
Workflow Name: {{WORKFLOW_NAME}}<br>
Error Message: {{EVENT_ERROR_MESSAGE}}<br>
<br>
</body></html><html><body>
Hello,<br>
<br>
An access review has been queued for {{IDENTITY_NAME}} <br>
<br>
</body></html><html><body>
Hello,<br>
<br>
The hard safety limit for policy {{POLICY_NAME}} has been reached. No further identity changes were processed.<br>
</body></html><html><body>
Hello,<br>
<br>
Key {{ENTITY_NAME}} has been rotated.<br>
<br>
{{EVENT_MESSAGE}}<br>
<br>
</body></html>Placeholder
Description
{{ENTITY_TYPE}}
The type of entity (e.g., "ActiveDirectoryUser", "OktaUser")
Placeholder
Description
{{RELATIONSHIP_ENTITY_TYPE}}
Type of the related entity
Placeholder
Description
{{ACTION_NAME}}
Name of the action being performed; serves as the stable unique identifier for the action
Placeholder
Description
{{ACCESS_REQUEST_TYPE}}
Type of Access Request
Placeholder
Description
{{EVENT_TYPE}}
Type of lifecycle event
Placeholder
Description
{{POLICY_NAME}}
Name of the lifecycle policy
{{EVENT_MESSAGE}}
Event notifications
LIFECYCLE_MANAGEMENT_CREATE_IDENTITY
Sent when a new identity/account is created
Create Identity Failed
LIFECYCLE_MANAGEMENT_CREATE_IDENTITY_FAILED
Sent when identity creation fails
Sync Identity
LIFECYCLE_MANAGEMENT_SYNC_IDENTITY
Sent when an identity is synchronized
Sync Identity Failed
LIFECYCLE_MANAGEMENT_SYNC_IDENTITY_FAILED
Sent when identity sync fails
Delete Identity
LIFECYCLE_MANAGEMENT_DELETE_IDENTITY
Sent when an identity is deleted
Delete Identity Failed
LIFECYCLE_MANAGEMENT_DELETE_IDENTITY_FAILED
Sent when identity deletion fails
Disable Identity
LIFECYCLE_MANAGEMENT_DISABLE_IDENTITY
Sent when an identity is disabled
Disable Identity 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 Deleted From Sources
LIFECYCLE_MANAGEMENT_IDENTITY_DELETED_FROM_SOURCES
Sent when an identity is deleted from its connected source(s)
LIFECYCLE_MANAGEMENT_ADD_RELATIONSHIP
Sent when a relationship is added
Add Relationship Failed
LIFECYCLE_MANAGEMENT_ADD_RELATIONSHIP_FAILED
Sent when adding relationship fails
Remove Relationship
LIFECYCLE_MANAGEMENT_REMOVE_RELATIONSHIP
Sent when a relationship is removed
Remove Relationship 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
Sent when an email is created
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
Sent when a password is changed
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
LIFECYCLE_MANAGEMENT_CREATE_ENTITLEMENT
Sent when an entitlement is created
Create Entitlement Failed
LIFECYCLE_MANAGEMENT_CREATE_ENTITLEMENT_FAILED
Sent when entitlement creation fails
Rename Entitlement
LIFECYCLE_MANAGEMENT_RENAME_ENTITLEMENT
Sent when an entitlement is renamed
Rename Entitlement 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
LIFECYCLE_MANAGEMENT_CUSTOM_ACTION
Sent when a custom action is performed
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 Event Failed
LIFECYCLE_MANAGEMENT_EXTRACTION_EVENT_FAILED
Sent when extraction processing fails
Sent when access review is queued
Create Access Review
LIFECYCLE_MANAGEMENT_CREATE_ACCESS_REVIEW
Sent when access review is created
Sent when a hard safety limit is reached during processing
Predictive Safety Limit Exceeded
LIFECYCLE_MANAGEMENT_PREDICTED_SAFETY_LIMIT_EXCEEDED
Sent when a predictive safety limit blocks changes before processing
Workflow Predictive Safety Limit Exceeded
LIFECYCLE_MANAGEMENT_WORKFLOW_PREDICTED_SAFETY_LIMIT_EXCEEDED
Sent when a workflow-level predictive safety limit blocks changes
Invalid Identities Detected
LIFECYCLE_MANAGEMENT_INVALID_IDENTITIES_DETECTED
Sent when invalid identities are detected during policy execution
Sent when an Access Request is created
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
Sent when a Non-Human Identity key is rotated
{{ENTITY_NAME}}
The name of the entity/identity
{{LOGIN_NAME}}
The login/username for the account
{{LOGIN_PASSWORD}}
The password (for password-related notifications)
{{EMAIL}}
Email address associated with the identity
{{RELATIONSHIP_ENTITY_NAME}}
Name of the related entity
{{ACTION_TYPE}}
Type of action
{{ACTION_JOB_ID}}
Unique identifier for the action job
{{SUCCEED_OR_FAILED}}
Status indicator ("succeeded" or "failed")
{{SENT_INVITE}}
Whether an invite was sent (for guest accounts)
{{ACCESS_REQUEST_ENTITY_NAME}}
Name of the entity requesting access
{{ACCESS_REQUEST_ENTITY_TYPE}}
Type of the requesting 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
{{JOB_ID}}
Job identifier
{{EVENT_ERROR_MESSAGE}}
Error message for failed events
{{EVENT_IDENTITY_ID}}
Identity ID associated with the event
{{EVENT_IDENTITY_NAME}}
Identity name associated with the event
{{WORKFLOW_NAME}}
Name of the workflow; serves as the stable unique identifier for the workflow
{{DATASOURCE_ID}}
Datasource identifier
{{EXTRACTION_EVENT_ID}}
Extraction events
{{ACTION_URL}}
Action notifications
{{ANY_CHANGES}}, {{ANY_CREATED}}, {{SHOULD_STOP_NEXT_JOB}}
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>
The predictive safety limit for policy {{POLICY_NAME}} has been exceeded. The predicted number of workflow runs exceeds the configured threshold. All changes have been blocked before processing. Review the blocked tasks and take action to proceed.<br>
</body></html><html><body>
Hello,<br>
<br>
A workflow-level predictive safety limit in policy {{POLICY_NAME}} has been exceeded. The predicted number of workflow runs for the workflow exceeds its configured threshold. Review the blocked tasks and take action to proceed.<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>Configure automated workflows for Lifecycle Management actions, including common attribute transformers and event notification settings
Lifecycle Management 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 Policies.
Click Create 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 Lifecycle Management Policy
When editing a policy, open the Dry Run tool to preview changes for any identity:
Go to Policies.
Click a policy to view its details.
Click Dry Run Policy at the top right.
Choose the identity and policy to test workflows.
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.
Expand the Actions menu at the top right and click Policy Dry Run.
Select a policy, customize entity attributes, and click Show Results.
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) are configured to trigger "only when trigger 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 common transformers 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: In the Policies page, click on the Action overflow icon (three dots) to Start the policy in the Initial state, and Pause or Unpause at the Running state.
The Workflow Version state includes:
Draft - In draft mode for editing and modification
Published - Functional and active
Retired - No longer active or usable
The Policy Draft Mode is a state where a policy is saved but not yet active. In Policy 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.
To enable the Policy Draft Mode, perform the following:
On the Lifecycle Management Dashboard page, click Settings in the top menu.
The Lifecycle Management Settings page appears. Click Policy Settings.
Switch ON the Enable Policy Draft Mode button.
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 by going to the Actions menu (three dots icon) and clicking Start. The Create Draft
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 (Integrations > API Key).
Store each key in a password manager or secrets vault.
Set environment variables for the migration script:
VEZA_TOKEN
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 schedules for identity sources are configured via the Veza API. To modify extraction frequency or timing, contact for assistance with API configuration.
The maximum number of concurrent workflows is configured at the tenant level via API. This setting controls how many workflow jobs can run simultaneously across all policies. Contact to adjust concurrency limits for your deployment.
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 Policies overview:
Go to Lifecycle Management > Policies
Find the policy you want to manage
Search for a specific policy by name
Filter to show all providers by their current state
Selecting View Details opens the policy's run details. When a policy draws identities from more than one source, this view covers each source separately.
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.
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, the policy version the run used, and the run status:
Running: the selected source is processing.
Stopped: the run halted before finishing, for example when a safety limit was reached or identity validation blocked processing.
Awaiting: the policy is waiting for the next extraction from the identity source.
Disabled: the policy is not published to run. A run status appears once a draft version is published.
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 in Lifecycle Management history.
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, and errors.
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.
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".
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, which enable more complex or refined triggering logic within workflows (e.g., matching specific attribute filters to drive provisioning).
To add a workflow, perform the following:
Select a policy.
Click Create Workflow.
In Details, enter the workflow name and description.
In the Priority field, use the dropdown menu to select:
Not set
Low
Normal
Medium
The levels dictate the order/priority in which the workflows are run. The higher-priority setting will be processed first. A fairness algorithm is built in to prevent lower-priority workflow tasks from being starved.
In the New Workflow pane, click trigger attribute. The Edit Workflow pane appears.
In the Triggering Condition (Condition String) field, select a conditional string from the dropdown menu to create a logical syntax that automatically starts the workflow. Once a condition has been set, another conditional string can follow, or an action can be taken.
In the Options section, select one of the following:
Note: All workflow errors must be resolved before it can be saved.
Clone or Delete a Workflow
Once an LCM Policy workflow is saved, the clone and delete options appear alongside the workflow name:
Click on the copy icon to clone the workflow.
Click on the trash bin icon to delete the workflow.
Webhook notifications after Sync Identity
For ITSM integrations that need to receive all attributes after a Sync Identity action completes:
Place the webhook action under a condition that follows the Sync Identity 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 transformer is a rule or function 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 transformer, perform the following:
Select a policy.
Click Transformers.
Click Add Transformer.
In the New Transformer window, enter a transformer name and description.
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:
Select a policy.
Click Lookup Table.
Click Add 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:
Select a policy.
Click Properties.
The Mover Properties appear. Click Edit Properties.
In the Properties window, click the Edit Properties field to display a dropdown menu of attributes.
Password Complexity 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 complexity 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 Sync Identities, Deprovision Identity, and Reset Password actions when working with integrations that support complex password requirements.
To add Password Complexity Rules, perform the following:
Select a policy.
Click Password Complexity Rules.
Click Create Password Complexity Rule.
In the New Password Complexity 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:
Select a policy.
Click Transformer Functions.
Click Create Custom Transformer Function.
In the New Custom Transformer Function window, enter a name and description of the transformer. Note: The name of the transformer must start with the dollar sign symbol, $, with snake case and no spaces. For example, $CLEAN_TEXT.
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
Enable continuous synchronization to ensure identities are up-to-date
The Details view shows the 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.
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.
In the Select Identity Source field, select a data source. 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 pane, select a Primary Attribute from the dropdown menu.
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. These notifications can be optionally configured as their own discrete action in a workflow or as an option when another action is executed. Lifecycle Management supports email- and webhook-based notifications.
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. 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 Sync Identity operation.
Use the Notifications to add and manage notifications:
In the Notifications pane, click Add Notification.
Choose the notification type (Email or Webhook).
Choose the event to trigger notifications:
See for customizing email notifications.
Identity Syncing Option
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 applies only to workflows with Continuous Sync enabled. Without Continuous Sync, the setting has no effect — the workflow instead follows first-match trigger behavior (see ).
It is a per-workflow trigger setting, chosen in the workflow editor under Run Workflow → Identity properties. Each new policy is created with a default mode of Have changed that its workflows inherit; a workflow can override it in its own settings. As with the other , the policy-level default is set when the policy is created (and adjustable through the API) and is not editable in the policy Advanced Settings pane.
When you choose Always, a throttle appears: Unless an unchanged identity already ran in the last N 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 Have changed or Always.
If you selected Always, set the throttle interval under Unless an unchanged identity already ran in the last … (default: 24 hours).
Safety Limits
Safety Limits prevent unintended mass changes to identities by enforcing a configurable threshold. The policy-level Safety Limits section configures the Hard Limit for the policy as a whole. Per-workflow safety limits, predictive blocking, and retry behavior are configured in each workflow's Execution Guardrails (see below).
Enable Maximum Changes - Identities (Hard Limit)
The Enable Maximum Changes - Identities toggle — referred to in this guide as the Hard Limit (formerly "Safety Limit") — is a reactive mechanism that stops processing during execution once the configured number of identity changes has been reached. When the limit is triggered, no further identity changes are processed for the current policy run.
To configure:
Enable the Enable Maximum Changes - Identities toggle.
In the number field next to the helper text Select maximum number of identities to process, enter the threshold.
Workflow-level guardrails
Each workflow has its own Execution Guardrails section in the workflow edit panel. 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.
Blocked Tasks
When the Predictive Safety Limit triggers, no changes are processed. A warning appears on the Blocked Tasks page with options to:
Review what would have changed
Run the blocked tasks (manually approve execution)
Abandon the blocked tasks (discard without executing)
Processing of future extractions is paused until the administrator acknowledges the warning and resumes processing. Activity log event types PREDICTED_SAFETY_LIMIT_EXCEEDED and WORKFLOW_PREDICTED_SAFETY_LIMIT_EXCEEDED are recorded when predictive limits trigger.
Identity Validation
Identity Validation gates which identities a policy is allowed to process by evaluating each identity against before workflows run. Identities that fail validation are marked invalid and counted against a configurable threshold. When the invalid count exceeds the threshold, the policy stops processing until an operator reviews the results.
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 and go to Advanced Settings.
Under Identity Validation, toggle Enable Identity Validation on.
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
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.
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 (SOI).
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 the Additional Identity Source to add more data sources and correlating attributes.
Click Add Source.
Use the arrows to search for an Identity Source.
In Primary Attributes, select a primary attribute from the dropdown menu.
In Additional Attributes, select another attribute from the dropdown menu.
Click Add to add more Primary Attributes and/or Additional Attributes.
The Only enrich identity if existing in Primary Identity Source 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.
The Skip Workflow Runs on Extraction option controls whether workflows are triggered when this identity source is extracted:
Enabled: Updates identity attributes from this source without running workflows. Use this when you want to enrich identities with supplementary data but don't need provisioning or deprovisioning actions to run.
Disabled (default): Workflows run normally when extractions occur from this source.
Click Save. 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 Potential Changes section to see all job requests that would be generated (e.g., edits to user attributes, adding/removing access profiles).
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:
Conditions evaluate: Conditions within a workflow evaluate sequentially, in the order defined.
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 on Error enabled, or the parent condition has Continue Actions if Any Error enabled.
Dry Run - In test mode
Click the overflow menu (three dots) and select Perform 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.
Becomes visible in reporting, monitoring, and compliance views.
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 Log approximately 30 minutes after extraction completes.
Click the three dots icon ⋮ in the rightmost column to expand the Actions menu
View Details - Displays the date (or timeframe) the policy was last updated and its integrations. Use this view to create a workflow, transformer, property, password complexity rules, or transformer functions.
Pause - Pause the Running state of the policy.
Delete - Deletes the policy.
Critical
Run only when trigger condition is first met -
If Enabled: The workflow executes only when the trigger condition is initially met, and on every subsequent transition from "not met" to "met."
If Disabled: The workflow runs on every check where the condition is true, regardless of its previous status.
Run only if specific properties change - This workflow is conditionally triggered for an identity when a change is detected in one or more of its specified properties. When enabled, the Properties field appears. 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 System Attributes. Because this option gates on a change to the selected properties, a workflow does not run when its trigger condition first becomes true for a reason unrelated to those properties (for example, a time-based condition such as hire_date <= TODAY catching up to an unchanged date). See the LCM FAQ.
In the Properties field, select a property attribute from the dropdown menu. As the defining attributes of identities, accounts, and entitlements, properties furnish the data points upon which a policy can base its action-oriented logic.
In the Date Formatters, 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.
In the Minimum Delay Before Running field, set the delay in hours, minutes, and seconds. 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 Workflow.
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.
The Fallback Formatters option appears. Click this option to provide an alternative formatter when a conflict occurs if the primary formatter generates a value that is already in use.
Optionally, enable the Continuous Sync function to keep the target entity up-to-date with values from the source of truth.
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.
Enable the buttons for:
Allow lowercase characters
Allow uppercase characters
Allow numeric characters
Allow special characters
Note: At least numbers, lowercase, or uppercase characters must be allowed.
In the Disallow Character field, enter one or more characters that are not allowed in the password.
Select one or more attributes for your property.
Click Save.
Be tailored per integration or scenario using custom configurations.
Click the Function Express field to display a dropdown menu of operator functions.
Click Save.
Set a maximum number of actions for a policy to prevent unexpected issues
Select an Additional Attribute from the dropdown menu. Note: The Only enrich identity if existing in Primary Identity Source 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) Enable Skip Workflow Runs on Extraction to update identity attributes from this source without triggering workflows. This is useful when you want to enrich identities with supplementary data (such as manager information from a departmental system) but don't need provisioning or deprovisioning actions to run each time this source is extracted.
Sync Identity
Add Relationship
Remove Relationship
Create Email
Change Password
Delete Identity
Disable Identity
Manage Relationships
Write Back Email
Access Request Complete
Custom Action
Action Failed
Workflow Task Failed
Extraction Event Failed
Create Entitlement
Create Guest Account
Rename Entitlement
Create Access Review
Reset Password
Create Access Review Queued
Safety Limit Reached
Sync Entitlement
Choose the status to trigger notifications (when an event is Successful, or On Failure).
Select an Existing 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 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, add a recipient name. Use a comma when adding additional names.
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.
Click Save.
Block workflow run when predicted changes exceed limit (called the Predictive Safety Limit in the rest of this guide): a proactive mechanism that blocks all changes before execution begins if the workflow predicts that more than the configured number of identities would be processed in a single workflow run. The accompanying number field shows the helper text Max identities per workflow run. Use the Predictive Safety Limit to prevent 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 Events 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 Max Invalid Allowed to Proceed 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.
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
Have changed
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.
Always
Also re-runs matching identities whose properties have not changed, subject to a per-identity throttle (below).
Goal
Filter


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.
OAA template restriction for Source of Identity: When using an OAA custom provider as a Source of Identity, only providers configured with the HRIS or Identity Provider (IdP) template type are eligible. Providers using the Application or Principal template types can serve as provisioning targets but cannot be used as identity sources. No additional provider needs to be created if an existing HRIS or IdP OAA provider is already configured.
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:
Runningonly_enrich_existing = true): Only adds attributes to existing identities created from primary sources.Hybrid mode (only_enrich_existing = false): Can create new Policy Identities if they don't exist in primary sources.
worker_idProcess 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
6:00 AM - Scheduled extraction skipped (job still running)
6:30 AM - Initial extraction completes
7:00 AM - Next scheduled extraction runs successfully
Generate IDs: Create unique identifiers from existing data
Active
Active
Primary source (default)
Inactive
Inactive
Primary source (default)
Data source associations and identity mappings
Access profile assignments and permissions
Safety limit configurations
Notification templates and settings
Secondary identity source configurations
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
Can create Access Reviews (Root team only)
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
Source Data: Identity might not exist in the configured data source
Safety Limits: Changes blocked due to a Hard Limit (during processing) or a Predictive Safety Limit (before processing begins). Check the Blocked Tasks page for predictive limit blocks
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
Triggers on
Lifecycle events (CREATE_IDENTITY, ADD_RELATIONSHIP, etc.)
Individual action success or failure
Available data
Entity details (names, emails, attributes)
Action metadata (name, type, status) only
Configuration
Policy Settings > Notifications
Edit Action > Action Notification Settings
Best for
User and stakeholder communications
Simple operational confirmations
Availability
Password Reset Workflows
Automatically reset passwords during user lifecycle events (termination, role changes)
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
Role
Availability
Team Support
LCM Policies & Workflows
Access Profiles
Special Capabilities
Administrator
Generally Available
Root only
Example: If Azure Sync fails after AD notifications, the workflow retries and notifications send again. Enable "Skip if action has already been run" on notification actions to prevent duplicates.
Safety limits are critical for production environments. Never proceed in re-enabling a policy without careful consideration. Safety Limits can be overridden with explicit API parameters.
Unexpected Re-processing: If workflows unexpectedly re-trigger for all users without a new CSV upload, check if:
Someone modified the policy configuration
UID mapping was changed
Workflow conditions were updated
These changes trigger re-extraction of the datasource and can cause all identities to be re-evaluated.
CSV transformations have different capabilities than full LCM transformers - they support basic string operations and functions but not conditional logic or complex expressions.
Email writeback requires write permissions to the Source of Identity system, which may require additional configuration and security considerations. Refer to the specific integration documentation for setup requirements.
The entire Veza application catalog can potentially be LCM-enabled. Contact your Customer Success Manager to discuss enabling specific applications.
The raw JSON contains sensitive configuration information. Only share policy JSON with authorized personnel and avoid exposing credentials or other sensitive data when sharing configurations.
Secondary source
Full access: Create, edit, delete policies and workflows
{{FirstName}} {{LastName}}SPLIT(Email, "@")[1]LEFT_PAD({{employee_id}}, "0", 6)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.
No
String
Format of the input data (if non-standard)
2024-03-15T14:30:00Z
{hire_date | DATE_FORMAT, "Jan 2, 2006"}
Mar 15, 2024
2024-03-15T14:30:00Z
{hire_date | DATE_FORMAT, "dateonly"}
2024-03-15
03-15-2024
{start_date | DATE_FORMAT, "2006-01-02", "01-02-2006"}
2024-03-15
2-digit year
Month
01
2-digit month (01-12)
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
European date
02/01/2006
15/03/2023
LDAP/AD format
20060102150405Z
20230315143025Z
Human readable
Jan 2, 2006
Mar 15, 2023
Date only
2006-01-02
2023-03-15
datetime
2006-01-02 15:04:05
2023-03-15 14:30:25
rfc3339
2006-01-02T15:04:05Z07:00
2023-03-15T14:30:25-07:00
win32
Active Directory FILETIME
133234218250000000
MixedCase123
{code | LOWER}
mixedcase123
Yes
String
The string to replace matches with
john smith@domain.com
{email | REPLACE_ALL, " ", "."}
john.smith@domain.com
Yes
Integer
Number of characters to extract
john.smith@company.com
{email | SUB_STRING, 0, 10}
john.smith
Smith
{name | UPPER}
SMITH
layout
Yes
String
Go time format layout or named alias (see tables below)
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"}
Year
2006
4-digit year
Year
ISO 8601 / RFC3339
2006-01-02T15:04:05Z07:00
2023-03-15T14:30:25-07:00
US date
01/02/2006
dateonly
2006-01-02
2023-03-15
timeonly
15:04:05
(none)
—
—
This function takes no parameters
JOHN
{first_name | LOWER}
john
John.Smith@Company.com
{email | LOWER}
search
Yes
String
The substring to find
John Smith
{display_name | REPLACE_ALL, " ", "_"}
John_Smith
EMP-12345
{employee_id | REPLACE_ALL, "-", ""}
offset
Yes
Integer
Starting position (0-based index)
John
{first_name | SUB_STRING, 0, 1}
J
EMP12345
{employee_id | SUB_STRING, 3, 4}
(none)
—
—
This function takes no parameters
sales
{department | UPPER}
SALES
john smith
{username | REMOVE_WHITESPACE | UPPER}
Go Time Layout Syntax: Unlike most date formatting systems that use patterns like YYYY-MM-DD, Go uses a reference date: Mon Jan 2 15:04:05 MST 2006. Each component of this specific date represents a format element.
input_layout
03/15/2024
06
03/15/2023
14:30:25
john.smith@company.com
replacement
EMP12345
length
1234
JOHNSMITH
first_name = John and last_name = Smith, output is John Smithfirst_name = José María, last_name = García, output is josemaria.garciafirst_name = John, output is jj.smith by combining the first initial with {last_name}If no entity is found and DefaultValue is provided, the default is returned; otherwise an error occurs
Jane SmithUnknownDefaultValue (::Account not found) is passed through SPLIT too. Splitting ::Account not found on :: places Account not found at index 1, so the fallback text is returnedA 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
cost_center = 001234, output is 001234 (first removes then re-applies padding)If found, the corresponding ReturnColumnName value is returned
If not found and DefaultReturnValue is provided, the default is returned
If not found and no default, an error is returned
location_code = IL001 and locationTable contains that code, output is ChicagoResult: Returns mapped region name, or Unknown Region if code not in table
attribute_name = User Display Name , output is userDisplayNamejohnsmith@company.com, johnsmith2@company.com, etc.username = JSmith, output is c-jsmithuser42@temp.localphone_number = (123) 456-7890, output is 1234567890email = john.smith@company.com, output is john_smithdepartment = Human Resources, output is humanresourcescomment = IMPORTANT MESSAGE HERE , output is Important message hereDefaultValue from that lookup is also passed through SPLIT. A default that doesn't contain the split delimiter is treated as a single segment, so index 1 (or higher) returns an empty string. To surface a readable fallback through a split, include the delimiter in the default so the text lands at the target index. For example, a default of "::Not found" split on "::" at index 1 returns Not found.name = JANE SMITH , output is Jane Smithjohn.doe to John.Doe)email_address = " John.Smith@Company.com ", output is john.smith@company.comcode = ---ABC123___, output is ABC123000.8675309.USCA to 8675309)raw_id = xxxABC123, output is ABC123code = ABC123temp, output is ABC123Hours
INTEGER
Yes
Number of hours to add (use negative values to subtract)
Days
INTEGER
No
Number of days to add
Months
INTEGER
Days
INTEGER
Yes
Number of days to add (use negative values to subtract)
Format
STRING
No
Output format (defaults to auto-detection)
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
Empty input value
Returns empty string "" (no error)
Input wrapped in brackets [value]
Brackets are automatically stripped before lookup
TargetAttribute is id
{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
Empty input value
Returns empty string "" (no error)
Input wrapped in brackets [value]
Brackets are automatically stripped before lookup
No entities found
{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"}TableName
STRING
Yes
Name or ID of the lookup table
ColumnName
STRING
Yes
Column to search for the input value
ReturnColumnName
STRING
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
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}Unlike FROM_ENTITY_ATTRIBUTE, this transformer does not error when entities are missing the target attribute—it silently skips them. Verify your results include all expected values.
Table name matching is case-sensitive. Ensure the table name in your transformer exactly matches the lookup table name defined in your policy, including capitalization.
No
Number of months to add
Years
INTEGER
No
Number of years to add
Format
STRING
No
Output format (defaults to auto-detection)
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
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
Target attribute missing on entity
Returns error (unless default provided)
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 ,)
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
TargetAttribute is type
Returns the entity's type name
Result ordering
Results appear in graph discovery order (not guaranteed to be consistent)
Yes
Column whose value to return
DefaultReturnValue
STRING
No
Value to return when the input value is not found
Returns error with lookup details
Other lookup errors
Returns error with full context
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
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: as your source of identity
Azure AD Integration: as a target system with the following permissions:
Directory.ReadWrite.All
Before configuring the workflow, map your organization's license requirements to Workday attributes:
Create a policy using Workday as the source of identity:
Navigate to Lifecycle Management > Policies
Click Create Policy
Configure the policy in the wizard:
Policy Name: Workday Azure License Provisioning
Add a workflow that triggers when new employees are hired:
Edit your policy and click Add Workflow
Configure the workflow trigger:
Workflow Name: New Employee Onboarding
Condition: is_active eq true
First, create the user in Azure AD:
In your workflow, click Add Action
Select Sync Identities
Configure the action:
Description: Create Azure AD user from Workday
Before adding the license assignment action, create Access Profiles that contain the license entitlements:
Navigate to Lifecycle Management > Access Profiles
Click Create Access Profile
Configure the profile:
Name: Microsoft 365 E3 License
Repeat this process to create additional Access Profiles for different license types:
Now add the license assignment using Manage Relationships with your Access Profiles:
Click Add Action
Select Manage Relationships
Configure the action:
Description: Assign Microsoft 365 licenses
For assigning the same license to all employees:
Condition: (leave empty for all users matching workflow)
Access Profiles: Select "Microsoft 365 E3 License"
Remove Existing Relationships: No
For different licenses based on department, add multiple Manage Relationships actions with conditions:
Engineering Department (E5):
Condition: department eq "Engineering"
Access Profiles: Select "Microsoft 365 E5 License"
Remove Existing Relationships: No
All Other Departments (E3):
Condition: department ne "Engineering"
Access Profiles: Select "Microsoft 365 E3 License"
Remove Existing Relationships: No
Full-Time Employees:
Condition: worker_type eq "Full_Time"
Access Profiles: Select "Microsoft 365 E3 License"
Remove Existing Relationships: No
Contractors:
Condition: worker_type eq "Contractor"
Access Profiles: Select "Microsoft 365 Business Basic"
Remove Existing Relationships: No
If you want to ensure Exchange Online is configured:
Click Add Action
Select Create Email
Configure the action:
Description: Enable Exchange Online mailbox
Ensure your actions execute in the correct order:
Sync Identities - Creates the user account (must run first)
Manage Relationships - 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 the overflow menu (three dots icon) and select Perform Dry Run
In the Identity field, select an employee from the dropdown
Click Show results to verify:
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:
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 Relationships action.
Option 2: Add multiple Manage Relationships 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 Relationships action with:
Remove Existing Relationships: Yes (removes old licenses)
To remove licenses when employees leave:
In your Leaver Workflow, add Deprovision Identity action:
Remove All Licenses: Yes
De-provisioning Method: Disabled
Alternatively, use Manage Relationships with Remove Existing Relationships enabled before deprovisioning.
- Azure AD integration reference
- Workday configuration
Group.ReadWrite.AllGroupMember.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 Lifecycle Management policies
Engineering
ENTERPRISEPREMIUM
Microsoft 365 E5
Contractor
Any
O365_BUSINESS_ESSENTIALS
Microsoft 365 Business Basic
Description: (Optional) Describe the policy purpose
Primary Identity Source: Select your Workday integration (the entity type is shown alongside the integration name)
Click Save to create the policy
AND hire_date ge "2024-01-01T00:00:00"Continuous Sync: Enabled
Target: Azure AD User
Integration: Your Azure AD integration
Create new users: Enabled
Continuous Sync: Enabled
Configure attribute mappings:
mail_nickname
{username}
Yes
first_name
{first_name}
Yes
last_name
{last_name}
Yes
department
{department}
Yes
job_title
{job_title}
Yes
usage_location
US
Yes
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
Microsoft 365 Business Basic
O365_BUSINESS_ESSENTIALS
Contractors
Access Profiles: Select the appropriate Access Profile(s)
Remove Existing Relationships: No (to preserve any manually assigned licenses)
Target: Azure AD User
Integration: Your Azure AD integration
User creation attributes are correct
License assignment action is included
No errors are reported
User account was created
Correct license(s) are assigned
Usage location is set
Full-Time
Any
ENTERPRISEPACK
Microsoft 365 E3
principal_name
{username}@yourdomain.com
Yes
display_name
{first_name} {last_name}
Microsoft 365 E3 License
ENTERPRISEPACK
Standard employees
Microsoft 365 E5 License
ENTERPRISEPREMIUM
Action 1: Manage Relationships
- Description: Assign base Microsoft 365 license
- Access Profiles: Microsoft 365 E3 License
Action 2: Manage Relationships
- Description: Assign Power BI Pro license
- Condition: department eq "Analytics" OR department eq "Finance"
- Access Profiles: Power BI Pro License
Action 3: Manage Relationships
- Description: Assign Visio license
- Condition: department eq "Engineering"
- Access Profiles: Visio Plan 2 LicenseUsage Location Required: The usage_location attribute must be set before licenses can be assigned. This two-letter country code (ISO 3166-1 alpha-2) determines which services are available to the user based on regional compliance requirements.
Full-Time
Yes
Engineering department
hire_date
{hire_date | DATE_FORMAT, "2006-01-02"}
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 timezone
01/02/2006
03/15/2024
US date format