All pages
Powered by GitBook
1 of 58

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Lifecycle Management

Introduction to Lifecycle Management with Veza

Lifecycle Management requires a separate Veza license. Confirm that your organization is licensed for Lifecycle Management before you configure it. If it is not part of your subscription, contact your Veza account team to add it.

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.

Key features

  • 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

Topic
Description

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 .

  1. Enable Integrations: Configure your data sources and enable them for Lifecycle Management.

  2. Define Access Profiles: Create profiles that map your organizational structure to application-specific entitlements.

  3. 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 .

- How source attributes map to Veza

  • - Computed attributes for advanced logic

  • ).
    Configure Workflows
    : Design workflows within policies to handle specific lifecycle events.

    Monitor LCM activity and policy status

    View and manage identities from your sources

    In this section

    Core concepts

    Policies

    Workflows

    Access Profiles

    Actions

    Attribute transformers

    Conditions and transformers

    Notifications

    Getting started

    Understanding Conditions and Transformers
    Trigger Conditions Reference
    Transformer Reference
    Dynamic Access Profiles
    Policies
    Workflows
    Access Profiles
    Actions
    Transformers
    Understanding Conditions and Transformers
    Notification Templates
    Lifecycle Management Integrations
    Creating Access Profiles
    Building Lifecycle Management Policies
    Workday, Okta, and Active Directory
    Lifecycle Management APIs

    Create and configure automation policies

    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
    System Attributes
    Configuring Workflows
    Dashboard
    Identities
    Policies
    Conditions and Actions
    Access Profiles
    Attribute Transformers
    Notifications
    Access Reviews
    Integrations
    FAQ

    Getting Started

    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.

    In this section

    Topic
    Description

    Architecture overview and foundational concepts for deploying Lifecycle Management

    After reviewing the getting started materials:

    1. Configure Integrations: Enable your identity sources and target applications for LCM. See .

    2. Set Up Identities: View and manage identities from your configured sources. See .

    3. Create Access Profiles: Define birthright entitlements for user segments. See .

    4. Build Policies

    For an end-to-end walkthrough using Workday, Okta, and Active Directory, see .

    : Automate JML workflows with conditions and actions. See
    .

    Monitor policy status, workflow execution, and identity health at a glance

    Provisioning Activity

    Track and audit all LCM actions, errors, and events

    Where to go next

    Integrations
    Identities
    Access Profiles
    How-to: Workday, Okta, and Active Directory
    Implementation and Core Concepts
    Lifecycle Management Dashboard
    Policies

    Disable Workflows and Actions

    Temporarily pause specific workflows or actions in a policy without removing configuration

    Overview

    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

    • 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 pauses it. The workflow does not run during policy execution, and Veza skips all conditions and actions within it. During the pause, Veza retains each identity's trigger history, the birthright access profiles the workflow granted, and its failure and retry state.

    1. Go to Lifecycle Management > Policies.

    2. Select a policy and open its draft: click Create Draft, or Go to Draft Version if a draft exists. On the workflow's card, open the ⋮ menu and select Workflow Settings.

    3. Turn off the Enable Workflow toggle.

    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.

    1. Open the workflow editor.

    2. Select the action you want to disable.

    3. Turn off the Action Enabled toggle in the action settings.

    4. Click Save.

    Disabled workflows are evaluated by default during dry run simulations. This allows you to preview what would happen if you re-enabled a disabled workflow and validate trigger conditions and action configurations before making them active.

    When you run a dry run simulation, the results show what actions would run if the workflow were enabled.

    To re-enable a disabled workflow or action, turn the Enable Workflow toggle (in Workflow Settings) or the Action Enabled toggle (in the action settings) back on and save. A re-enabled workflow does not run again for identities it processed before you disabled it.

    Manage Access Profile Creation Permissions

    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

    Click Save.
  • Click Publish to apply the change.

  • Disable a workflow

    Disable an action

    Test disabled workflows with dry run

    Re-enable a workflow or action

    See also

    Lifecycle Management policies
    Conditions and actions
    Dry run testing
    Access Controls are enabled on your tenant (contact Veza support)
  • The users receiving permissions have the Operator role assigned

  • To assign Access Profile creation permissions to users or groups:

    1. Go to Access Profiles > Profiles.

    2. Click Settings.

    3. On the Access Profile Settings page, go to the Permissions step.

      The step lists the users and groups that currently have creation permissions.

    4. Click Add Permissions.

    5. In Type, 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)

    6. In Name, select the user or group, then click Add.

      The dropdown shows only users or groups that don't already have permissions assigned.

    7. Repeat steps 5-6 to add more users or groups.

    8. Click Done to save the permissions.

    Result: Users and groups with Creator permissions can now create new Access Profiles from the Access Profiles > Profiles page.

    To confirm that permissions were assigned correctly:

    1. On the Permissions step of the Access Profile Settings page, review the list of assigned users and groups.

      Each row shows the principal name and its type (User or Group).

    2. Assigned users should now see the Create button on the Profiles page.

    3. Users without permissions will not see the Create button.

    To revoke Access Profile creation permissions:

    1. Go to Access Profiles > Profiles and click Settings.

    2. Go to the Permissions step.

    3. Locate the user or group to remove.

    4. Click the Remove Permission (trash can) icon next to the user or group. The permission is removed immediately.

    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

    Overview

    Early Access Feature: This feature requires enablement by Veza support. Contact your Veza support team to enable Access Controls for your tenant.

    Before you start

    Grant Access Profile creation permissions

    Verify permissions

    Remove Access Profile creation permissions

    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:

    1. Their Creator permission (prevents creating new profiles)

    See also

    Custom Action

    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.

    CUSTOM_ACTION currently supports ServiceNow only, and appears as Update ServiceNow Table in the action picker. For generic HTTP requests to external APIs, use the action instead.

    Example Use Cases:

    • Insert records into ServiceNow tables when employees join or change roles

    • Create ServiceNow incidents or requests as part of onboarding workflows

    • Update ServiceNow CMDB records during employee lifecycle events

    • Log audit records for compliance tracking

    Setting
    Description

    Supported Integrations:

    Integration
    Custom Action Capability
    Documentation

    For detailed configuration examples including incident creation and audit logging, see .

    Write Back Email

    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

    Their individual Owner permissions on specific profiles (revokes editing rights for those profiles)

    Only Administrators can manage these permission assignments.

    Entity Type

    The target integration and entity type to operate on

    Action Synced Attributes

    Map source attributes to target table fields. The required table attribute sets the table to insert records into (e.g., incident, sc_request, u_custom_table). See Transformers for more details

    ServiceNow

    Insert records into any ServiceNow table

    ServiceNow Provisioning

    Custom Actions are non-idempotent. Each execution creates a new record. Running the same action multiple times will create duplicate records.

    ServiceNow Provisioning
    Send REST Payload
    Update an OAA-based HRIS source with email addresses generated by provisioning workflows
    Setting
    Description

    Entity Type

    The HRIS or identity source entity type to update with the email address (e.g., Workday Worker)

    Supported Integrations:

    Integration
    Notes

    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.

    Behavior
    Write Back Email
    Sync Identities (write-back mode)

    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:

    1. Sync Identities creates the AD user account from the Workday Worker.

    2. Create Email creates an Exchange Server mailbox, generating the email address.

    3. Write Back Email writes the new email address back to the Workday Worker record.

    4. 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.

    Create Email
    Sync Identities

    Write Back Email writes only to an HRIS or identity source. To set an email attribute on a target application such as Active Directory or Okta, use with an email attribute transformer.

    Required upstream action

    Choosing between Write Back Email and Sync Identities

    Example: Exchange Server onboarding with email write-back

    Create Access Review

    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.

    CREATE_ACCESS_REVIEW is a control-plane action that executes within the Veza platform. The action creates review campaigns asynchronously: first queuing the review, then creating it based on the defined certification plan.

    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 Create Access Review action editor contains the following settings, stored in the action's certification_creation_plan object:

    Setting
    Required
    Description

    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.

    1. In the Review Name section of the Create Access Review action, select Test.

    2. 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.

    3. 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.

    1. A lifecycle event triggers a workflow containing the CREATE_ACCESS_REVIEW action

    2. The action evaluates its settings against the identity that triggered the event

    3. A review campaign is queued in Veza Access Reviews

    4. The review campaign is created and assigned to the designated reviewers

    CREATE_ACCESS_REVIEW generates two notification events:

    Event
    Timing
    Description

    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

    Pause

    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

    Setting
    Description

    Duration in seconds

    Number of seconds to pause 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

    Sync Identities

    Reviewers

    No

    Primary level reviewer assignment (manager, resource owners, or designated reviewers)

    Fallback Reviewers

    No

    Reviewers to assign if automatic assignment fails

    Review Duration

    Yes

    Number of days to review: time from certification start when reviews are due

    Creation Instructions

    No

    Publish immediately (sends the review to reviewers on creation) or Create as a draft (requires manual publishing)

    Reviewers receive notifications to certify or revoke the identified access

    Review Configuration

    Yes

    The Access Workflow (review configuration) where the certification is created

    Review Name

    No

    CREATE_ACCESS_REVIEW_QUEUED

    Immediate

    Sent when the review creation is queued

    CREATE_ACCESS_REVIEW

    Asynchronous

    Action settings

    Early Access: Multi-level approval (second and third level reviewers) is in Early Access and may require Veza support to enable.

    Testing the review name formatter

    How It Works

    Event Notifications

    LCM-triggered reviews have special behaviors including automatic exclusion of unchanged results and entity type matching requirements. See Access Reviews from Lifecycle Management for complete behavior documentation.

    Notification Templates
    Access Reviews from Lifecycle Management
    Access Reviews documentation
    Access Profiles

    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

    Create Local Accounts Without Entitlements

    Configure an Access Profile Type that provisions local user accounts in a target system without granting specific entitlements.

    Overview

    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:

    1. The policy's Sync Identities action uses its Action Unique Identifier to check whether the identity already has an account in the target integration.

    2. If no account exists and the action has Don't create new users unchecked, Veza creates a local account using the attribute transformers you configured.

    3. 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 .

    1. Open Access Profiles > Profile Types.

    2. Click New Profile Type.

    3. Enter the basic information:

      • Name: A descriptive name (for example, "Application Access Only").

    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:

    1. Open Access Profiles > Profiles.

    2. Click Create.

    3. In Create Access Profile, choose your account-only profile type under Access Profile Type (for example, "Application Access Only"), then click Next.

    For account provisioning to work, the policy that governs these identities must include a Sync Identities action for the target integration:

    1. Open Lifecycle Management > Policies.

    2. Edit the policy that governs the identities you want to provision.

    3. 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

    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.

    The Create local user/account only checkbox is available only after you choose Limit to a single integration type or Limit to a single integration.

    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, State Disabled, State Enabled, or State Enabled by Admin).

    • Access Request Policy: The default policy for access duration and approval workflows.

  • Click Create Profile Type.

  • Confirm the target integration where accounts will be created.
  • Enter a Name and optional Description.

  • Click Save to save the Access Profile.

  • Has Don't create new users unchecked 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

  • Before you start

    The Sync Identities action defines how accounts are created, including which attributes are synchronized and whether new accounts can be created. Without a Sync Identities action that allows account creation, provisioning has nothing to create the account with.

    How it works

    Create an account-only profile type

    Create an access profile

    Configure the policy

    Assign identities

    Example: provision Active Directory accounts

    Related pages

    Sync Identities
    Policies
    Conditions and Actions
    Attribute Transformers
    Access Profile Types
    Sync Identities
    Attribute Transformers
    Fallback Formatters
    Access Profile Types
    Access Profiles
    Policies
    Sync Identities

    Reset Password

    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

    Setting
    Description

    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 .

    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.

    Entity Type

    The target integration and entity type (e.g., AD User, Okta User)

    Password complexity requirements, unique identifier options, and force-change-on-login settings vary by integration. See the integration-specific guides below for configuration details.

    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.

    Early Access: Veza Support enables password output for your tenant on request.

    Active Directory
    Azure AD
    Okta
    support matrix

    System Attributes

    Computed properties for advanced workflow triggering and conditional transformations in Lifecycle Management

    Overview

    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.

    Available System Attributes

    sys_attr__is_mover

    A boolean attribute that indicates whether an identity has undergone changes to monitored properties during the most recent extraction.

    Type: Boolean Persistence: Transient (re-evaluated each extraction cycle) Available in: Workflow trigger conditions

    Configuration: Define monitored properties in the policy configuration:

    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)

    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.

    • - Complete SCIM filter syntax for workflow conditions

    • - Complete list of transformation functions

    • - Attribute transformation concepts and examples

    • - Configuring mover properties and workflows

    Alternatives with NEXT_NUMBER: l.f2, l.f3, l.f4

    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.

    sys_attr__is_new_identity

    sys_attr__would_be_value

    sys_attr__would_be_value_len

    Integration with NEXT_NUMBER

    sys_attr_changed__<property>

    Because all sys_attr_changed__ attributes are set to true for new identities, adding a sys_attr_changed__ check to a condition that already includes sys_attr__is_new_identity eq true does not narrow the results further. Every property on a new identity is considered changed. Use sys_attr_changed__ to filter movers — identities that already exist in Veza and changed a specific property. For new identity workflows, rely on sys_attr__is_new_identity eq true alone or combined with attribute value conditions such as employment_status eq "ACTIVE".

    See Also

    Trigger Conditions Reference
    Transformer Functions Reference
    Transformers
    Policies
    {
      "mover_properties": ["department", "manager_id", "title", "location"]
    }
    sys_attr__is_mover eq true
    sys_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.com
    IF 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"

    Access Profiles

    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.

    Example Profiles

    Profile Name
    Target
    Relationship

    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 Access Profiles > Profiles.

    1. Click Create.

    2. In the Create Access Profile dialog, choose the Access Profile Type to create, then click Next:

      1. 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 Access Profiles > 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:

    1. Grant Profile Type Permissions:

      • Navigate to Access Profiles > Profile Types

      • Locate the profile type in the table

      • Click the Actions button (⋮) for that profile type

    When a user or group is designated as an Access Profile owner, they automatically receive three distinct permissions:

    1. 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:

    1. Navigate to Access Profiles > Profiles.

    2. Locate the Access Profile in the list.

    3. Click the Actions button (⋮) for that profile.

    4. 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:

    1. Navigate to Access Profiles > Profiles.

    2. Click Settings in the page header.

    3. In the settings sidebar, select Custom Attribute Definitions.

    4. 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:

    1. In the Access Profile create or edit form, scroll to the Custom Properties section.

    2. Click Add Custom Property.

    3. 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).

    Lifecycle Management Dashboard

    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.

    Dashboard Overview

    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:

    Policies and Workflows

    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.

    Topic
    Description
  • 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

  • Dashboard Actions

    Policies

    Access Profiles

    Identities

    Integrations

    Access Requests

    Errors

    Recent Activity

    Next Steps

    Access Profiles
    Integrations
    Events
    creating and managing policies
    Configuring Access Profiles
    Lifecycle Management integrations
    Learn about creating Lifecycle Management policies
    Configure access profiles for your organization
    Set up integrations with identity sources
    Understand available Lifecycle Management actions

    Google Cloud

    Google Asia Employees (Google Group)

    Profile: Profiles define entitlements that can be assigned to users in target applications, such as groups, roles, or permission sets assigned to users as birthright entitlements. Profiles cannot be inherited from other Access Profiles, but can be inherited by Business Roles. Use this profile type to define the birthright entitlements within one or more applications (such as group memberships or role assignments).

  • Details: Enter the Access Profile Name and Description. You should follow a standard naming convention for all profiles to help identify them, describing the employee segment or applications the Access Profile applies to.

  • Labels: Labels are available for quickly finding access profiles when configuring actions in a policy. Apply and create labels as needed to organize your Access Profiles by employee segment and the applications they apply to.

  • Entitlements: Click Assign Entitlements Manually, then choose the target data source and specific entities the Profile will govern access to (such as Google Cloud Platform > Google Group). This step is not available for Access Profiles with the "Business Role" type.

  • Access Profile Inheritance: Click Assign Inherited Access Profiles to pick one or more Access Profiles to grant those business roles or entitlements. This step is not available for Access Profiles of type "Profile".

  • Click Save.

  • 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

  • : Perform create operations within the profile context
  • 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 the attribute definition includes predefined values, the value field is a dropdown.
  • If no predefined values are set, the field accepts free text.

  • Save the profile.

  • Veza Groups

  • 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)

    Access Profile Types

    Profiles

    Business Roles

    Best Practices for Access Profile Types

    Configuring Access Profiles

    Access Profile Ownership

    Who Can Be Owners

    Owner Eligibility Requirements

    Group Ownership Behavior: When a group is assigned as an owner, all its members inherit the ownership capabilities. Individual group members will also appear as available owners in the interface.

    Owner Permissions

    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.

    Managing Owners

    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.

    Access Profile Creation Permissions (Early Access): By default, only Administrators can create Access Profiles. With Access Controls enabled, you can delegate creation permissions to specific Operators and Groups. See Manage Access Profile Creation Permissions for details.

    Custom Properties

    Defining custom attribute schemas

    Setting custom property values on a profile

    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.

    See Also

    Dynamic Access Profiles
    Veza Groups
    Dynamic Approvers
    Manage Relationships
    Dynamic Access Profiles
    Lifecycle Management Policies
    Access Profile Types
    Inherited Profiles and Business Roles

    Google Asia Employees

    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

    Policies

    Create and configure automation policies for identity sources

    In this section

    Key concepts

    Related topics

    Implementation and Core Concepts

    The IAM challenge

    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.

    IAM framework before Veza showing manual processes and disconnected systems

    How Veza streamlines IAM

    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.

    IAM framework with Veza showing automated workflows and centralized management

    Before you begin creating draft Policies for automating Lifecycle Management workflows, you should establish and document how employees in your organization are mapped to business roles, and corresponding birthright entitlements (default access permissions granted based on an employee's role) such as groups and roles in target applications.

    Implementing Veza Lifecycle Management will require:

    • Defining segmentation criteria in terms of Business Roles for identities in your organization.

    • Defining Role Conditions used in 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?

    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 .

    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:

    1. Employee or contractor status

    2. Roles and job positions

    3. Business Units (BUs)

    4. Locations

    Example Business Roles:

    • Sales

    • Developers

    • Executive Employees

    • US 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.

    1. 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.

    2. Check if any custom attributes can be used to define role conditions, and ensure these are enabled in the Veza Access Graph.

    3. Document how employee populations correspond to the attribute values contained in the source of identity.

    Examples: Source attributes for role conditions

    The following standard attributes are available by all HRIS integrations that use an Open Authorization API template, along with any enabled for the integration. You can typically import data from any HRIS system to Veza using this template, sourced from a generated report, API calls, or CSV data.

    Attribute
    Description

    Using this standard identity metadata, a Lifecycle Management workflow runs specific actions for identities where some or all of the conditions are true:

    • Employment Status equals "Pending"

    • Employment Types equals "Full Time"

    • Department equals "Engineering"

    • Work Location equals "US"

    A Profile defines a set of entitlements for a specific application that can be assigned to users. For each target application, application owners will need to establish levels of birthright entitlements by defining Profiles mapped to groups, roles, or other entitlements that can be assigned to a user.

    1. 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.

    2. Create Lifecycle Management mapped to those entitlements.

    Examples: Access Profiles

    Profile Name
    Target
    Relationship

    When configuring the action, administrators can grant or revoke access by choosing a Business Role that inherits the desired Profile.

    Configure to inherit the corresponding access profiles, mapping entitlements to employee segments.

    1. Create Business Roles for each segment.

    2. For each Business Role, inherit a corresponding access profile.

    3. 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 .

    1. For each application, understand the supported attributes for provisioned users.

    2. 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.

    3. 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.

    Active Directory Attribute
    Source Attributes
    Transformer Value

    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:

    Active Directory Attribute
    Source Attributes
    Transformer Value
    • 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.

    Attribute Mapping

    How source system properties become Veza attributes

    Overview

    When connecting to integrated systems (see Veza Integrations), Veza ingests properties from the source systems (e.g., Workday, Okta, Active Directory) and normalizes them into standardized attributes that appear when configuring Workflow trigger conditions, configuring Actions, and in Identities views.

    While these standardized attributes are intended to ensure consistent naming across different systems, it is important to understand that some attributes may appear differently than their original names in the source system.

    You can retrieve the original attribute names for enabled Lifecycle Management integrations using the ListLifecycleManagerDatasources API.

    Attribute Naming Conventions

    Veza normalizes all property names for consistency:

    Original Format
    Veza Format
    Rule Applied

    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

    The following sections include some examples of how Veza handles attributes from common integrations.

    Veza recognizes and standardizes many common attributes across source systems:

    Attribute
    Type
    Description
    Example Value

    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

    Workday Property
    Veza Attribute
    Notes

    Okta → Veza

    Okta Property
    Veza Attribute
    Notes

    Active Directory → Veza

    AD Property
    Veza Attribute
    Notes

    Some integrations support custom property extraction for organization-specific fields from custom reports or extended schemas:

    • Always prefixed with customprop_

    • Automatically discovered during extraction once enabled

    • Follow standard normalization rules (lowercase, underscores)

    Examples:

    • customprop_department_code - Custom department identifier

    • customprop_employeeou - Organizational unit

    • customprop_region - Geographic region

    Some entity attributes are computed by Veza, and not derived from source data:

    • sys_attr__is_mover - Identity has changed monitored properties

    • sys_attr__would_be_value - Preview value in conditional transformers

    • sys_attr__would_be_value_len - Preview value length in conditional transformers

    See for details.

    When configuring a Workflow trigger condition or an action that syncs attributes, you can choose from available attributes using a dropdown menu.

    Primary Source - Attributes from the main identity source appear without prefixes:

    Secondary Sources - Attributes from additional sources are prefixed with the entity type:

    Lifecycle Management uses two different expression syntaxes depending on the context:

    In Workflow Conditions (SCIM Filter Syntax):

    Trigger conditions use SCIM filter syntax to evaluate boolean expressions. See for complete documentation.

    In Transformers (Formatter/Pipeline Syntax):

    Attribute transformers use curly braces and pipes to produce output values. See for complete documentation.

    With Secondary Sources (in Conditions):

    • - Computed attributes for advanced scenarios

    • - Modifying and combining attribute values

    • - Using attributes in workflow conditions

    Conditions and Actions
    Trigger Conditions Reference
    Notifications
    LCM-Triggered Access Reviews
    • 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.

  • 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.

  • China Employees

    Cost Center equals "R&D"

  • Start Date on or after "2025-01-01"

  • Employee Number

    Unique identifier for the employee.

    Company

    The company or subsidiary the employee works for.

    AD Executive Employees

    Active Directory

    Executive Employee - Manager US (Active Directory Group)

    AD Engineering Managers

    Active Directory

    account_name

    display_full_name

    {display_full_name}

    distinguished_name

    account_name

    display_full_name

    {display_full_name}

    distinguished_name

    first_name, last_name

    Planning Your Implementation

    Key considerations and requirements

    Security considerations

    Define Segmentation Criteria (Business Roles)

    Define Role Conditions

    OAA HRIS Built-In Attributes

    Define Profiles

    Map Business Roles to Profiles

    Define synced attributes

    policies.md
    custom properties
    Access Profiles
    Manage Relationships
    Business Roles
    Transformers

    Custom fields are identified with a customprop_ prefix

  • System-computed fields are identified with the sys_attr__ prefix

  • customprop_project_code - Project allocation

    Employee ID

    employee_id

    Spaces → underscores

    BusinessTitle

    business_title

    CamelCase → snake_case

    Cost-Center

    cost_center

    Special chars removed

    employee_id

    string

    Employee identifier

    E-98765

    Worker ID

    workday_id

    Unique worker identifier

    Employee ID

    employee_id

    login

    login

    Username

    email

    email

    sAMAccountName

    account_name

    Pre-Windows 2000 login

    distinguishedName

    distinguished_name

    workday_id
    employee_id
    business_title
    hire_date
    email
    customprop_department_code
    OktaUser.login
    OktaUser.department
    AzureADUser.job_title
    ActiveDirectoryUser.distinguished_name
    employee_types co "Full Time" and department eq "Engineering"
    {first_name}.{last_name}@{customprop_domain}.com
    OktaUser.status eq "ACTIVE" and WorkdayWorker.is_active eq true

    Attribute Types and Mappings

    Standard Attributes

    Source-Specific Mappings

    Custom Properties

    System Attributes

    Using Attributes in Workflows

    Primary vs Secondary Sources

    Example Usage

    Important: These syntaxes cannot be interchanged. Use SCIM filter syntax only in condition fields, and formatter syntax only in attribute mapping fields.

    See Also

    System Attributes
    Trigger Conditions Reference
    Transformers
    System Attributes
    Transformers
    Policies
    Selecting attributes in a workflow trigger condition.

    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.

    Email

    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

    email

    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

    integrations
    Custom HRIS template
    CSV upload
    Actions
    Integrations
    Business Role

    Department Code

    customprop_department_code

    Custom fields prefixed

    email

    string

    Primary email

    jane.doe@company.com

    department

    string

    Department name

    Engineering

    title

    string

    Job title

    Senior Engineer

    business_title

    string

    Business position

    Senior Engineer

    manager

    string

    Manager reference

    john.smith@company.com

    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

    Lookup Tables

    Use lookup tables to transform identity attributes for target systems

    Overview

    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

    1. Geographic Information:

      • Transform location codes to country, region, city, or time zone information

      • Map office codes to physical addresses or facility types

    2. Organizational Mapping:

    The Table Lookup Transformer references CSV-based mappings between source and destination values. When synchronizing user attributes, Veza:

    1. Takes the source attribute value

    2. Looks up this value in the specified lookup table

    3. Returns the corresponding value from the designated return column

    4. 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:

    1. Open a draft version of your policy (you can only add lookup tables to a draft) and select the Workflow Components tab

    2. Select the Lookup Tables card

    3. Click + on the card. When the policy has no lookup tables yet, you can also click Create Lookup Table

    4. Provide a Name

    From the Lookup Tables card, you can:

    • Export the table's CSV

    • Edit the table's name, description, or CSV. Renaming a table also updates the formatters that reference it by its old name

    • Delete tables that are no longer needed. Delete is unavailable while an action, workflow, condition, transformer, or transformer function still references the table

    To update an existing lookup table:

    1. Create a new policy draft version.

    2. Delete the CSV from the existing lookup table (do not delete the table itself).

    3. Upload the updated CSV.

    4. Publish the draft.

    To use a Table Lookup Transformer in a common or action-synced attribute:

    1. In Destination Attribute, choose the attribute on the target entity that will be updated

    2. In Formatter, choose the source attribute to transform

    3. 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:

    Formatter
    Result

    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

    1. 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.

    2. Document Mappings: Add descriptions for each lookup table to explain its purpose

    3. 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.

    Issue
    Resolution
  • 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

  • and optional
    Description
    for the lookup table
  • Drag a CSV file or click Browse to upload your reference data (one CSV file, up to 10 MB)

  • Review the preview of the uploaded rows

  • Click Save to store the lookup table

  • <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

    Examples

    How It Works

    Lookup Table Structure

    Creating and Managing Lookup Tables

    Creating a Lookup Table

    Managing Lookup Tables

    Updating a lookup table

    Using Table Lookup Transformers

    Basic Syntax

    Examples

    Advanced Features

    Pipeline Transformations

    Handling Missing Values

    Technical Details

    Implementation Notes

    Best Practices

    Troubleshooting

    Common Issues

    Related Topics

    Attribute Transformers
    Common Transformers
    Then Apply
    Lifecycle Management Workflows
    Configuring an action-level attribute transformer using lookup tables.

    "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"}

    Identities

    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.

    In this section

    Topic
    Description

    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

    Create Email

    Create email accounts in Exchange Server or Azure AD as part of onboarding workflows.

    Creates email accounts for identities through integrated email providers. This action is typically used in onboarding workflows alongside Sync Identities and Write Back Email to provision a user account, create their email, and update the HR system with the new address.

    Example Use Cases:

    • Create Exchange Server mailboxes for new employees during onboarding

    • Provision Azure AD email accounts as part of identity lifecycle workflows

    • Generate email addresses using transformer-based formatting (e.g., {first_name}.{last_name}@company.com)

    Setting
    Description

    Supported Integrations:

    Integration
    Notes

    In a standard onboarding policy, Create Email is used as the second step after creating the user account:

    1. Sync Identities creates the user account in Active Directory or the target system.

    2. Create Email creates the email account in Exchange Server, generating the email address using attribute transformers.

    3. Write Back Email updates the source of identity (for example, Workday) with the newly created email address.

    4. A second Sync Identities action, targeting Active Directory and mapping only

    See the in the Actions overview for a complete workflow.

    Manage Relationships

    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)

    Setting
    Description

    How-to Guides

    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.

    In this section

    Guide
    Description

    End-to-end example using Workday as source, with Okta and AD as targets

    • - Common questions and troubleshooting

    • - Architecture overview

    • - Monitor workflow execution and policy status

    Attribute Synchronization

    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.

    Action Level

    At the action level, there are two distinct options to govern provisioning and user update processes:

    • Don't create new users - Keep this setting off for the action to create user accounts that don't exist in the target system. When it is on, users that don't already exist are skipped.

    • Update only on create or reactivate - Keep this setting off for the action to update existing active user accounts with attribute changes from the source of truth. When it is on, existing active users are not modified, and changes apply only when a user is created or reactivated.

    At the attribute level, there are two explicit choices that define how and when attribute values are applied to user accounts:

    • 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:

    1. Turn off Update only on create or reactivate on the Sync Identities action

    2. Select Set for new and existing users for the department attribute

    Set for new and existing users (continuously sync attributes that change during employment):

    • Given Name, Surname

    • Department

    • Title

    • Manager

    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.

    Cost Center
  • AD Distinguished Name (DN)

  • AD User Principal Name (UPN)

  • AD Email

  • Attribute Level

    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.

    Recommended Settings

    Identity Override Attributes

    Customize identity attributes to override values from the source of identity

    Key concepts

    Related topics

    Attribute Mapping
    System Attributes
    Managing Identities

    Automatically assign Microsoft 365 licenses during onboarding

    Test Policies with Dry Run

    Validate policy behavior before enabling production execution

    Disable Workflows and Actions

    Pause or stop automation without deleting configurations

    Explain Run Errors with Access AI

    Use the LCM Run Analyst to explain a failed provisioning action

    Additional resources

    Lifecycle Management FAQ
    Implementation and Core Concepts
    Dashboard
    Workday, Okta, and Active Directory
    Assign O365 Licenses with Workday and Azure AD
    email
    , sets the address on the AD user.

    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 Transformers for details

    Sync Action Name

    Exchange Server

    Requires VezaProvisioner service on the Exchange Server host. See Exchange Server Provisioning for setup

    Azure AD (Entra ID)

    Creates email-enabled accounts via Microsoft Graph API

    Typical workflow

    provisioning example

    Reference to a previous Sync Identities action for unique identifier resolution

    Remove Only Synced Relationships created by Veza

    Available when Remove Existing Relationships is enabled. Restricts removal to relationships that Veza created. Relationships added by other means are preserved.

    Remove Only Birthright Relationships

    Available when Remove Only Synced Relationships created by Veza is enabled. Further restricts removal to relationships that were granted as birthright entitlements.

    Access Profiles

    Static Access Profiles to assign to the identity. See for more details about managing birthright entitlements.

    Dynamic Access Profiles to Add

    Attribute transformer expressions that resolve to Access Profile names to assign at runtime based on user attributes. See for details.

    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 the identity's existing relationships before applying the new set. Use Access Profiles to Remove instead when you need to selectively revoke specific entitlements rather than all existing ones.

    Delete Identity

    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

    Setting
    Description

    Supported Integrations:

    • Active Directory (Users and Managed Service Accounts)

    • Okta

    • Azure AD (Users)

    • Google Cloud (Google Workspace Users)

    Deprovision Identity

    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:

    Method
    Description
    Example

    Not all integrations support both methods. The Deprovision Type dropdown lists the methods the integration supports, and appears only when more than one is available.

    Setting
    Description

    See the in the Actions overview for a complete Active Directory offboarding configuration.

    Conditions and Actions

    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

    Test Policies with Dry Run

    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

    Access Profiles
    Dynamic Access Profiles

    Entitlements to create

    Entitlements to assign after deprovisioning (e.g., move to a "Terminated Users" group)

    Logout the user from all current sessions

    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 or Suspend, depending on the integration)

    Remove all entitlements

    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.

    Deprovisioning methods

    example deprovisioning workflow

    Okta: suspends the user session

    Whether to remove existing group memberships and role assignments. Use Excluded from removal to keep specific entitlements

    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.

    1. Go to Lifecycle Management > Policies.

    2. Select a policy, then open a version from the Policy Versions panel.

    3. Click Dry Run and select Dry Run with Single Identity. Alternatively, on the Policies list, open the policy row's ⋮ menu and select Perform Dry Run.

    4. Select an identity to test.

    5. Optionally, modify identity attributes to simulate changes (such as a department transfer or status change).

    6. Click Show Results.

    1. Go to Lifecycle Management > Identities.

    2. Search for an identity and click to view its details.

    3. Click the ⋮ menu and select Policy Dry Run.

    4. Select a policy and optionally customize attributes.

    5. Click Show Results.

    You can also select Policy Dry Run from an identity's ⋮ menu in the Identities table.

    Use bulk dry run to test a policy against multiple identities at once. You can test against all identities or filter to a specific subset.

    1. Go to Lifecycle Management > Policies.

    2. Select a policy, then open a version from the Policy Versions panel. Open the Dry Run menu and select Dry Run with Multiple Identities. Alternatively, on the Policies list, open the policy row's ⋮ menu and select Perform Bulk Dry Run.

    3. Choose your identity selection method:

      • Select All: Test against every identity in the policy

      • Select Identities individually: Choose specific identities from a searchable list

      • Select Identities based on properties: Enter a SCIM filter expression to target identities by attribute values (for example, department eq "Engineering" or is_active eq true). Select Show matching identities to preview the identities that match.

    4. Click Perform Dry Run.

    Only one bulk dry run can run for a policy at a time. While it runs, a banner on the policy page links to its progress.

    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 Actions Run section lists all actions that would run, including:

    • User accounts that would be created or updated

    • Attributes that would be synced

    • Access profiles that would be assigned or removed

    • Relationships (group memberships) that would be added or removed

    Click View Details on any action to see its full configuration, including sync attributes, relationship mappings, REST payload contents, and password 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.

    1. Go to Lifecycle Management > Policies.

    2. Select a policy, then open a version from the Policy Versions panel.

    3. Click Dry Run and select View Dry Run History for Multiple Identities.

    The Bulk Dry Run History page lists each dry run with its version, filter, processed identities, status, start and completion times, and duration. Select Show Results to open a run, or Cancel Dry Run to stop a run in progress.

    Veza keeps bulk dry run results for 30 days after they were last viewed, then permanently deletes them. Opening a run's results restarts the 30-day period. Export any results you need to keep.

    To export results, use the table's export option. In Export Dry Run Results, select Excel-compatible (UTF-8 BOM) to display non-ASCII characters correctly in Excel. Leave it cleared for other tools. The export includes the visible columns.

    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 Disable workflows and actions.

    Dry run has several important limitations:

    Dry runs validate trigger and condition matching but do not evaluate:

    • The Identity newly matches the condition workflow setting (the setting that prevents re-triggering for identities that already matched)

    • Property change detection (for sync workflows)

    • Scheduled triggers

    • "Skip if action has already been run" action flags

    These behaviors only execute in live policy runs. Test these scenarios with individual identities in a controlled environment before full deployment.

    • No integration testing: Dry run does not check whether integrations are functioning properly or whether target systems are accessible. A broken integration might cause workflow-defined changes not to be applied when the policy runs.

    • No action validation: Dry run evaluates whether workflow conditions are met, not whether actions would succeed. It does not validate that changes could be successfully applied.

    • Simulation only: Dry run identifies actions that would execute but does not perform them.

    • Test with representative identities: Select identities that represent different scenarios (new hires, role changes, terminations) to validate all workflows in your policy.

    • Simulate attribute changes: Modify identity attributes during dry run to test trigger conditions such as department changes, employment status updates, or location transfers.

    • Test edge cases: Use dry run to test unusual scenarios that might not occur frequently, such as same-day rehire after termination or simultaneous department and location changes.

    Before publishing a policy version:

    • Lifecycle Management policies

    • Disable workflows and actions

    • Run Dry Run on Identity API

    Overview

    Before you start

    Run a dry run for a single identity

    From a policy

    From an identity

    Run a bulk dry run

    Bulk dry runs may take 8-9 hours to complete for large populations. Focus review on joiner and leaver counts. Investigate unusually high counts (especially leavers) before publishing—this may indicate a misconfigured trigger condition.

    Review dry run results

    Matched workflows

    Planned actions

    Result: 0 changes

    Filter bulk dry run results by attribute changes

    View dry run history

    Test disabled workflows

    Limitations

    What dry run does not evaluate

    Integration and action validation

    Dry run does not test integration connectivity. Issues like API timeouts, authentication failures, or attribute mapping errors are not detected during simulation.

    Best practices

    Pre-publish checklist

    See also

    Common Synced Attributes

    Shared transformation rules across multiple delete actions

    Sync Identity Actions

    Reference to previous Sync Identities actions for unique identifier resolution

    PostgreSQL
  • MySQL

  • OracleDB

  • GitHub

  • AWS RDS (MySQL, PostgreSQL, OracleDB)

  • Custom Application

  • Entity Type

    The data source and target entity type to permanently delete

    Action Unique Identifier

    Attribute used to locate the user account for deletion (e.g., username, email, or account ID)

    Action Synced Attributes

    Managed Service Accounts: For Active Directory Managed Service Accounts, DELETE_IDENTITY is the primary decommissioning action, since DEPROVISION_IDENTITY is not supported for that entity type. See Active Directory provisioning.

    Deprovision Identity

    Define how to identify and match the user for deletion. See for more details

    Can contain multiple workflows to handle different scenarios (joiner, mover, leaver)

  • Support continuous synchronization to keep identities up-to-date

  • Enable email notifications and webhooks for action-related events

    • Define specific sequences of actions that execute based on trigger conditions

    • Handle different lifecycle scenarios (e.g., new hire onboarding, role changes, terminations)

    • Support conditional execution based on user attributes (department, location, role, etc.)

    • Allow for complex decision trees through nested conditions

    • Execute actions in a defined order when conditions are met

    • Define when specific actions should occur within a workflow

    • Can be based on any attribute from the source of identity

    • Support SCIM filter expressions for precise targeting

    • Can be nested to create sophisticated logic trees

    • Can trigger multiple actions when met

    • Can spawn additional conditions after successful action completion

    • Use one of two condition types: Always runs the actions unconditionally, and Condition String runs them only when the SCIM filter expression matches

    Example Conditions for Lifecycle Management Actions:

    • Add to engineering groups based on department: department eq "Engineering"

    • Grant manager access based on role: is_manager eq true

    • Assign cost center groups: cost_center eq "IT-1234"

    • Add to contractor AD groups: employment_type eq "CONTRACTOR"

    • Represent specific tasks such as creating users, syncing attributes, or managing access

    • Types of actions include:

      • SYNC_IDENTITIES: Create/update user accounts

      • MANAGE_RELATIONSHIPS: Grant/revoke access

      • CREATE_EMAIL: Generate email addresses

      • DEPROVISION_IDENTITY: Disable/remove access

      • DELETE_IDENTITY: Permanently delete accounts

      • CUSTOM_ACTION: Write attributes to a ServiceNow table (shown as Update ServiceNow Table in the action picker)

      • WRITE_BACK_EMAIL: Update source system

      • PAUSE: Add workflow delays

      • SEND_REST_PAYLOAD: Make HTTP requests to external APIs

      • SEND_XML_PAYLOAD: Send an XML or SOAP body over HTTP

      • SEND_SQL_COMMAND: Run a SQL statement against an external database

      • SEND_NOTIFICATION: Trigger alerts

      • RESET_PASSWORD: Reset existing user password

      • CREATE_ACCESS_REVIEW: Trigger access review campaigns

      • ROTATE_KEY: Rotate cryptographic keys in Azure Key Vault (Non-Human Identity (NHI) action; not offered in the policy editor)

      • GET_NODE_FROM_GRAPH: Query the Access Graph for entities by type and filter

      • CREATE_ENTITLEMENT: Create roles, groups, or distribution lists in target systems (not offered in the workflow editor)

    By default, when an action fails during workflow execution, the workflow stops and no further actions in that condition are executed. Two options allow workflows to continue past action failures instead of stopping:

    Enable Continue if any action fails on a condition to keep the workflow running even if any action under that condition fails. This is a blanket setting — if any action fails, the workflow continues to the next action instead of stopping. It applies equally to every action in the condition.

    When to use: When all actions in a condition are independent and none are prerequisites for others. For example, a condition with three notification actions (Slack, email, ServiceNow ticket) where each should fire regardless of the others.

    Enable Continue if this action fails on an individual action to keep the workflow running if that specific action fails. The workflow continues to the next step instead of stopping, while other actions in the condition remain critical.

    When to use: When most actions in a condition are critical but one specific step is optional. For example, a condition with three actions (Revoke Access, Send Slack Notification, Update CMDB) where the Slack notification is nice-to-have but the other two must succeed.

    Setting
    Scope
    Effect

    Continue if any action fails (Condition)

    All actions in a condition

    If any action fails, the workflow continues instead of stopping

    Continue if this action fails (Action)

    One specific action

    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):

    Active Directory Attribute
    Source Attributes
    Transformer Value

    account_name

    display_full_name

    {display_full_name}

    distinguished_name

    To de-provision users, Veza moves accounts to a terminated users group and adds them to an OU for terminated employees:

    Active Directory Attribute
    Source Attributes
    Transformer Value

    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

    Action
    Use When You Need To...

    Create or update user accounts in target systems

    Assign or remove group memberships, roles

    Understanding Policies, Workflows, and Actions

    Policies

    Workflows

    Conditions

    Actions

    Error Handling for Actions

    Continue if any action fails (Condition-level)

    Continue if this action fails (Action-level)

    When either option is enabled, failed actions are still recorded as Errored in the page, but the overall workflow task completes successfully. This ensures errors remain visible and auditable even though they did not halt execution.

    Example Conditions and Actions: Provisioning to Active Directory

    Sync Active Directory Accounts for Active Employees (Joiners/Movers)

    Sync Active Directory Attributes for Withdrawn Employees (Leavers)

    Action Types

    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.

    Quick Reference

    Managing Identities

    Manage user identities and lifecycle automation in Veza, including synchronization, access profiles, and workflow triggers for joiner, mover, and leaver processes.

    Identities

    Identities in Veza Lifecycle Management represent a top-level view of an individual user, used to automate provisioning and deprovisioning across systems, applications, or services.

    This can include birthright access managed throughout the user's lifecycle, triggered by joiner, mover, or leaver events, as well as ad-hoc, just-in-time access granted upon approval of an access request.

    Identities can refer to users who may be employees, contractors, or external collaborators (partners). Active Directory Managed Service Accounts are also supported, with a simplified action set. See Active Directory provisioning.

    With Lifecycle Management, workflows defined within policies dictate the users’ onboarding, job-function change, and offboarding processes, ensuring that corresponding identities have precisely the access they need as their roles evolve or their status within the organization changes. Similarly, access granted to identities may also change as just-in-time access requests are fulfilled or revoked.

    The Lifecycle Management > Identities page serves as a central hub for viewing identities known to Lifecycle Management and Access Requests, as well as performing actions on individual identities.

    Identities are populated into Lifecycle Management by first identifying the entire user population by integrating their source of identity (SOI) and creating and enabling a policy that uses that data source. A policy does not require configured workflows to begin populating identity data. Enabling a policy against an identity source is sufficient to start the Identities table. This may require enabling a built-in integration for your identity source (e.g., Workday integration), uploading user data in CSV format (CSV Upload integration), or using a custom OAA connector.

    See for detailed information on integrating the source of identity.

    For Integration management using APIs, see .

    Identities are maintained through synchronization with the identity sources. Syncing identities ensures that all systems reflect the most current user state, whether through onboarding, role changes, or attribute updates, keeping access aligned, consistent, and audit-ready.

    The 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 for more information on usage.

    • See 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 in the Transformers documentation.

    Column
    Description
    Usage

    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:

    Primary Source Status
    Secondary Source Status
    Displayed Attributes Source

    This behavior ensures the table reflects the most current and relevant source of identity information. For example, when an employee terminates (primary source becomes inactive) but remains as an active contractor in a secondary source, their attributes are displayed from the contractor system.

    To start, you can use filtering options to locate specific identities or analyze a group of identities based on standard criteria. The following filters are available on the Identities overview:

    • Search by name: Locate specific individuals using a name-based search

    • Department filter: View identities by organizational unit

    • Status filter: Filter by Active or Inactive employment status

    • Access Profiles filter: Find identities with specific profile assignments

    For each identity record, administrators can perform actions through the Actions menu:

    • View Details: Access identity information, attribute history, and related accounts

    • Policy Dry Run: Simulate a policy for the identity without making changes

    • Run Workflow Manually: Manually initiate a workflow in a policy

    • Request Access: Launch an Access Request for additional access (requires Veza Access Requests).

    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

    When executing a policy where user attributes at the source of identity are incorrect, slow to update, or temporarily need adjustment, you can override the existing attribute with a different value until the issue is corrected. For more information, see .

    Here are some examples of incorrect or slow-to-update attributes:

    • Employee termination: An employee has been terminated and needs immediate deprovisioning, but the termination status is not yet reflected at the source of identity

    • Role changes: An employee has immediately changed roles and needs new birthright access, but the role change and the new manager haven't been updated in the source system

    • Contract extensions: A contractor's end date has been extended, but the extension isn't reflected yet at the source of identity

    To create an Override Value, perform the following:

    1. Select an identity by name.

    2. Click Details.

    3. Click Properties in the Details menu.

    4. Click Actions (three dots icon)

    The Internal Metadata tab on the Identity details view exposes Lifecycle Management's internal sync state for an identity. This is useful when troubleshooting stuck syncs, correcting identity mismatches, or forcing a resync after source-of-identity corrections.

    For example, if an HR system initially created an employee with the wrong employee ID and the identity was already synced to a target system, Lifecycle Management retains the original mapping in its internal metadata. Correcting the employee ID at the source alone does not clear the stale mapping. The Internal Metadata tab allows administrators to clear the stuck mapping directly, so the next sync cycle picks up the corrected identity.

    Enabling the tab

    The Internal Metadata tab is hidden by default. To enable it:

    1. Go to Lifecycle Management > Settings > Identity Settings.

    2. Under Display Settings, enable the Show internal metadata toggle.

    3. 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.

    Section
    Description

    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 page. Each event includes the identity, the fields that changed, and the previous and new values.

    Click the overflow icon (three dots) to display options for performing actions on the identity. Next, click on the desired action:

    • Policy Dry Run

    • Run Workflow Manually

    • Request Access

    • Show in Graph

    Use Run Workflow Manually to run a workflow for one identity outside the normal extraction cycle, for example to re-run a joiner workflow for a new hire. The workflow's actions run against live systems and cannot be undone. The option is available only when the policy is running and its published version has at least one workflow. To preview results without making changes, use a .

    To trigger a workflow with a specific user, perform the following steps:

    1. In the Manually trigger workflow for identity dialog, select a workflow from the Workflow list.

    2. Click Run 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 and for more information.

    To grant an Access Profile, perform the following:

    1. Click the Access Profiles radio button.

    2. The Choose from Access Profiles window appears.

    3. Enter a Reason for granting the Access Profile for the user.

    4. Select an existing Access Profile from the dropdown menu.

    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:

    1. Click the App radio button.

    2. The Request Access for App window appears.

    3. Enter a Reason for granting the App for the user.

    4. Select an existing Integration from the dropdown menu.

    Entitlements option

    Granting Entitlements to a user provides specific access permissions (roles, permissions, group memberships) required to perform their responsibilities.

    Note: By granting Entitlements to a specific user, you pre-fill an Access Request with the appropriate configuration settings and policy.

    To grant an Entitlement, perform the following:

    1. Click the Entitlements radio button.

    2. The Request Grant Access window appears.

    3. Enter a Reason for granting the Entitlement for the user.

    4. Select an existing Integration from the dropdown menu.

    Use the Show in Graph option to display a graph that represents all assigned Access Profiles, Apps, and Entitlements, including all associations.

    This is a graphical representation of John Smith’s assigned access and entitlements to roles/groups.

    Get Node From Graph

    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

    Setting
    Description

    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:

    1. Trigger condition: employment_status eq "ACTIVE" — fires for new hires or active employees

    2. 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

    3. Condition String: OktaUser.is_active eq true

    Each retrieved node is an entity from the Access Graph with the following data:

    Field
    Description

    Retrieved nodes are added to the workflow context and can be used in three ways:

    Add a condition after the action and set its Condition Type to Condition String. The condition string is evaluated against the source identity and the nodes that earlier actions retrieved, so it can reference a retrieved node's attributes by prefixing them with the entity type (for example, OktaUser.is_active eq true). The condition controls which subsequent actions execute.

    Subsequent Get Node From Graph or actions can reference retrieved node attributes in their SCIM filters and payloads using transformer template variables. The transformer service resolves {EntityType.attribute} expressions against the accumulated nodes.

    For example, if a Get Node From Graph action retrieved an OktaUser node with login = "jsmith@company.com", a subsequent action's filter could reference {OktaUser.login} to use that value.

    Note: The entity type prefix is case-sensitive and must match the graph type exactly (e.g., OktaUser, not oktauser). 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.

    REST Auth Credentials

    Configure reusable authentication for Send REST Payload and Send XML Payload actions in Lifecycle Management

    REST Auth Credentials provide centralized, reusable authentication configurations for and 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 one authentication configuration across multiple actions

    • Security: Sensitive fields (passwords, tokens, secrets) are encrypted at rest

    Sync Identities

    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:

    Access Profile Types

    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

    LCM-Triggered Access Reviews

    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)

    Transformers

    If this action fails, the workflow continues to the next step instead of stopping

    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

    email

    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

    Create Email

    Generate email addresses via email providers

    Deprovision Identity

    Disable accounts while preserving audit trails

    Delete Identity

    Permanently remove accounts (databases, cleanup)

    Custom Action (Update ServiceNow Table)

    Write attributes to a ServiceNow table

    Write Back Email

    Update HRIS with newly created email addresses

    Pause

    Add delays between workflow actions

    Send REST Payload

    Make HTTP requests to external APIs

    Send XML Payload

    Send XML or SOAP payloads to legacy endpoints

    Send SQL Command

    Run SQL statements against external databases

    Send Notification

    Trigger emails or webhooks on action events

    Reset Password

    Reset user passwords in target systems

    Create Access Review

    Automatically create certification campaigns

    Rotate Key

    Rotate Azure Key Vault keys from NHI Security (not offered in the policy editor)

    Get Node From Graph

    Look up entities in the Access Graph during workflow execution

    Create Entitlement

    Create groups, roles, or distribution lists in target systems (not offered in the workflow editor)

    Sync Identities
    Manage Relationships
    Provisioning Activity

    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

    Active

    Active

    Primary source (default)

    Inactive

    Inactive

    Primary source (default)

    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

  • See Notification Templates for Lifecycle Management for customizing the Request Access Template.

  • Show in Graph: Visualize identity relationships and access patterns

  • : 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.

  • 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

  • Select Create Override.

  • The Create Override window appears. The Property Name and Actual Value fields are populated.

  • Enter an Override Value.

  • Click Save.

  • Synced Relationships

    Target relationship bindings (such as group memberships) that Lifecycle Management has established for this identity.

    Delete Identity (shown only for deleted identities)

    Enter an Expiration Time in Hours or Days.

    Use the arrows to select an Expiration Time in Days, where 0 means no expiration.

  • Click Create.

  • Based on the integration you selected, the Target Entity Type is automatically populated.

  • Use the arrows to select the Target Entitlements.

  • Use the arrows to select an Expiration Time in Days, where 0 means no expiration.

  • Click Create.

  • Name

    Identity display name

    The full display name is an attribute composed of the user's given name and surname.

    Status

    Current lifecycle status (Active/Inactive)

    Active

    Any

    Primary source

    Inactive

    Active

    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

    Identity Synchronization

    Multi-Value Attribute Management

    Identities Table

    Identity attribute display priority

    Early Access: Enhanced display prioritization may require Veza support to enable. Contact your Customer Success Manager for scenarios where secondary identities should be displayed when primary identities become inactive.

    Filter and Search an Identity

    Identity Actions

    View User Details

    Attribute Overrides

    Internal metadata

    Performing Actions on an Identity

    Run Workflow Manually

    Request Access for an Identity

    Show in Graph

    Integrations
    the Datasource Management APIs
    SCIM
    Open Authorization API (OAA)
    Appending Multi-Value Attributes
    Identity Override Attributes
    Provisioning Activity
    Dry Run
    Access Profile
    Access Profile Types
    Graph Example

    Indicates employment status.

    Secondary source

    Failure tracking per workflow, including first and last failure timestamps and the number of consecutive failures.

    Properties to Get

    (Optional) Specific entity properties to include in the results. Leave empty to return all available properties.

    checks the
    OktaUser
    node that the previous action returned. When it matches, the condition's provisioning actions run (e.g., assign Okta groups, sync attributes). When the lookup returned no active
    OktaUser
    , the condition does not match and its actions are skipped.

    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

    This action runs in the control plane, not on Insight Points. Results accumulate in the workflow context. To branch on the results, add a condition with a Condition String that references the retrieved node's attributes (see Condition branching).

    Entity types discovered through an OAA connector are namespaced with the application type they came from — for example OAA.Jira Cloud.User rather than JiraUser. Pick the type from the dropdown rather than typing it, since the namespace depends on how the application is registered.

    Data freshness

    Example: Verify Jira User Before Provisioning

    Output and Downstream Usage

    1. Condition branching

    2. Filter template variables in subsequent actions

    3. Chaining multiple graph lookups

    The graph lookup transformer functions FROM_ENTITY_ATTRIBUTE and FROM_MANY_ENTITIES_ATTRIBUTE also query the Access Graph, but operate within attribute transformers rather than as standalone workflow actions. Use Get Node From Graph when you need to branch workflow logic based on the existence or attributes of graph entities.

    Attribute Transformers
    Send REST Payload

    (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)

    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:

    1. Direct match in source node types: The policy identity type matches directly

    2. Direct match in destination node types: The policy identity type matches the destination

    3. 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

    Overview

    CREATE_ACCESS_REVIEW action

    Troubleshoot missing reviews

    This behavior prevents duplicate review efforts and focuses reviewer attention on changed or new access. The comparison count (default: 5) is configurable by Veza support using the CertificationCountToExcludeUnchanged setting.

    Understand unchanged result filtering

    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.

    Resolve entity type mismatches

    Fix missing enriched identity columns

    Customize review names

    Related topics

    Centralized management: Update credentials in one place; all referencing actions use the latest configuration

  • Audit: Track credential usage and creation history

  • Auth Type
    Description
    Use Case

    Header

    Custom authorization header value

    API keys, custom token formats

    Basic

    HTTP Basic authentication (username/password)

    1. Navigate to Lifecycle Management > Settings

    2. Select the Credentials tab

    3. Click New REST/XML Credentials to add a new credential

    4. Enter a Name for the credential

    5. Select the Auth Type and complete the required fields (see )

    6. For the OAuth2 and OAuth2 (Password Grant) auth types, enter any scopes the token endpoint requires in Scope (Optional), separated by spaces (see )

    7. Optionally set a default URL and method in URL (Optional) and Method (Optional) (actions can override these values)

    8. For the Login to Bearer, OAuth2, and OAuth2 (Password Grant) auth types, optionally set a Token Reuse Window (Seconds) (see )

    9. Click Save

    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.

    Field
    Required
    Description

    full_value

    Yes

    Complete header value (e.g., ApiKey sk-prod-xyz)

    The value is sent as the Authorization header on each request.

    HTTP Basic authentication with username and password.

    Field
    Required
    Description

    user_name

    Yes

    Authentication username

    password

    Yes

    Veza constructs the Authorization: Basic {base64(username:password)} header automatically.

    Bearer token authentication.

    Field
    Required
    Description

    token

    Yes

    Bearer token value (encrypted at rest)

    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.

    Field
    Required
    Description

    login_url

    Yes

    URL to send the login POST request

    login_payload_json

    Yes

    How it works:

    1. Veza sends a POST request to login_url with login_payload_json as the body

    2. The JSON response is parsed using bearer_token_attribute to extract the token

    3. 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.

    Field
    Required
    Description

    client_id

    Yes

    OAuth2 client ID

    client_secret

    Yes

    Veza performs the client credentials flow to obtain an access token, then uses it as a Bearer token for the REST request.

    Some token endpoints reject a client credentials request that has no scope. Microsoft Entra ID, for example, expects the target resource's .default scope, such as https://<environment>.operations.dynamics.com/.default for Dynamics 365 finance and operations apps. Check the token endpoint's documentation for the scope value to use.

    Choosing an authentication method:

    • FORM (default): Sends client_id and client_secret as form-encoded parameters in the POST body alongside grant_type=client_credentials, plus scope when set. Use this when the token endpoint expects credentials in the request body.

    • BASIC: Sends credentials in the Authorization: Basic base64(client_id:client_secret) header, with grant_type=client_credentials, plus scope when set, in the POST body. Use this when the token endpoint requires HTTP Basic authentication.

    Check your target API's OAuth2 documentation to determine which method it supports. Both conform to RFC 6749 §2.3.1. When in doubt, try FORM first as it is the default and more widely supported.

    OAuth 2.0 resource owner password credentials grant (RFC 6749 §4.3). Veza posts a resource owner's username and password to the token endpoint and uses the returned access token as a Bearer token for the REST request.

    Field
    Required
    Description

    user_name

    Yes

    Resource owner username

    password

    Yes

    A public client sends neither client_id nor client_secret. The resource owner's username and password are what authenticate the request. When client_id is set, authentication_method decides whether the client credentials travel in the Authorization header (BASIC) or in the request body (FORM), as described under OAuth2.

    No authentication header is added to the request. Use this when the target API is public or when authentication is handled through other means (e.g., network-level security, pre-shared keys in URL parameters).

    None is also the only way to save a Send REST Payload or Send XML Payload action whose Authorization Header (Legacy) field is empty. Both actions skip the non-empty check on that field only when the selected credential is this type; without it, validation requires a header value.

    A Lifecycle Management policy runs one job per identity, and by default every job fetches its own token. A policy that touches 500 identities makes 500 requests to the target's token endpoint. Set Token Reuse Window (Seconds) on a credential to reuse one fetched token across the jobs in a policy run instead of fetching a new one for each job.

    Setting
    Description

    Token Reuse Window (Seconds)

    How long Veza reuses a fetched token before fetching another. Range: 0–172800 (48 hours). 0 (the default) fetches a token for every job.

    The field applies only to the auth types that fetch a token per job: Login to Bearer, OAuth2, and OAuth2 (Password Grant). The other types carry a static credential and have no token to fetch, so Veza does not display the field for them and rejects a nonzero value set through the API. Changing a credential to a static auth type resets the window to 0 when you save.

    In the private Lifecycle Management API described above, this setting is the token_cache_ttl_seconds field. The credential list does not show the window; use the credential's edit panel to read or change it.

    The window applies to both the Send REST Payload and Send XML Payload actions, in provisioning policies and in Access Requests, whether the action runs in the control plane or through an Insight Point. An action's Test Connection check uses it too, so a test can succeed on a token cached earlier rather than proving the credential still works.

    Start from the target's own token lifetime and stay well inside it. A window needs only to outlast a single policy run: after it does, a longer window saves no further token requests while leaving a revoked token in play for longer. Veza reuses a token for exactly the number of seconds you set, with no safety margin subtracted.

    Reuse is not tenant-wide: Veza can fetch more than one token per window, and an Insight Point deployment can account for several. Size any rate-limit headroom for a small number of token requests per window rather than exactly one.

    If the target rate-limits token issuance, a policy run without a window fails at the authentication step rather than at the API call: nothing is provisioned, and the error points at authentication instead of at request volume.

    A new value takes effect on the next job, but it does not discard the token cached under the old value. Veza caches a token against the window it was fetched under, so writing any different number, including 0, moves to an entry with nothing cached and the next job fetches a fresh token.

    This matters when you are recovering from a revoked credential. To force a fresh token:

    1. Set Token Reuse Window (Seconds) to 0 and save.

    2. Re-run the policy. Each job now fetches its own token.

    3. To turn reuse back on, either wait for the old window to elapse or set a different number of seconds. Restoring the number you were running with moments ago can hand out the same dead token again.

    Rotating a secret on the credential in Veza needs no such step: Veza keys a cached token to the authentication material it was fetched with, so a rotated secret is not served a token minted from the old one.

    When configuring a Send REST Payload action in a Lifecycle Management policy:

    1. In the action configuration, select a credential from the Auth Credentials dropdown

    2. The credential provides the authentication header and optional default URL/method

    3. The action's URL and HTTP Method settings override the credential defaults when specified

    Operation
    Required Role

    View credentials

    Admin, Operator

    Create, Update, Delete

    Admin

    • Send REST Payload Action: Action configuration and payload options

    • Custom Application with Send REST Payload: Route requests through Insight Points for on-premises targets

    • Transformers: Attribute transformation syntax for dynamic URLs and payloads

    Overview

    Send REST Payload
    Send XML Payload
    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
      }
    }

    Supported Authentication Types

    Configuring REST Auth Credentials

    Using the Veza UI

    The URL (Optional) and Method (Optional) fields on credentials are defaults. When a Send REST Payload action specifies its own URL or HTTP Method, those values take precedence over the credential defaults.

    Using the REST API

    Credentials referenced by published policy versions cannot be deleted. Remove the credential reference from all actions in published policies first.

    Auth Type Configuration

    Header

    Basic

    Bearer

    Login to Bearer

    OAuth2

    ca_certificate_base64 only applies to the OAuth2 token endpoint (the auth_url connection). It does not affect TLS verification for the main REST request to your target API. If the target API itself uses an internal CA certificate, you must configure that certificate in the Insight Point's truststore. See (OVA) or (install script).

    OAuth2 (Password Grant)

    This grant sends a user's password to the token endpoint in the request body, and OAuth 2.1 deprecates it. Use OAuth2 wherever the target supports client credentials. Select this type only for targets that expose no other machine-to-machine grant.

    Use an HTTPS token endpoint. Veza logs an informational message when auth_url is plain http and then sends the request anyway, so nothing stops a misconfigured credential from putting the password on the wire as plain text.

    None

    Token Reuse Window

    Veza does not detect a token that the target has expired or revoked. Nothing inspects the target's response, so a token that stops working mid-window keeps being used, and every job on that credential fails until the window elapses. Set the window below the lifetime the target gives its tokens; the 48-hour maximum is too long for most targets.

    Choosing a Window

    Changing the Window

    Using Credentials in Actions

    REST Auth Credentials handle how to authenticate requests. To control where requests execute from (control plane versus Insight Point), configure the Data Source field separately. See for Insight Point routing.

    The Authorization Header (Legacy) field on the Send REST Payload action is deprecated and appears only on actions that already have an inline header. Migrate existing configurations to use REST Auth Credentials for centralized management and encrypted storage.

    Permissions

    See Also

    • 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

    Setting
    Description

    Entity Type

    The data source and type of identity to sync (e.g., Okta User, Azure AD User)

    Don't create new users

    When on, identities that don't already exist are skipped. Leave it off (the default) to create a new identity when none is found.

    Update only on create or reactivate

    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.

    Target system
    Sync Identities
    Reset Password

    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.

    Early Access: Veza Support enables password output for your tenant on request.

    Write back to an identity source

    Writing an email back to an HRIS this way is different from the action. Write Back Email pushes the address a previous action just created and takes no attribute mapping. A write-back Sync Identities action lets you set the attribute to any value with a transformer. See .

    Referencing attributes from earlier actions

    Enforce password change on login

    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.

    1. Open Access Profiles > Profile Types.

    2. Click New Profile Type.

    3. 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

      • Relationships:

        • 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 a new entitlement if none exists: Configure the CREATE_ENTITLEMENT action to run when the policy is applied, including:

    4. 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)

    Overview

    Access Profiles

    Common Access Profile Type Categories

    Managing Access Profile Types

    Creating a New Profile Type

    Managing Profile Type Permissions

    Permission Scoping: The Creator permission at the Profile Type level controls ownership eligibility, not the ability to create profiles. The ability to create Access Profiles is controlled by a global table-level permission that is automatically granted when a user or group becomes the owner of an Access Profile.

    Best Practices for Access Profile Types

    Understanding Conditions and Transformers

    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.

    Terminology

    These terms are used throughout Lifecycle Management documentation.

    Term
    Definition
    Example
    When You Need To...
    Use This System
    Syntax Type
    Output

    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:

    Component
    Layer
    Purpose

    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.


    Feature
    Workflow Conditions
    Attribute Transformers

    • - Complete SCIM syntax for workflow triggers

    • - Formatter syntax and pipeline functions

    • - All available transformation functions

    • - Formatter-based profile assignment

    Send XML Payload

    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 Send REST Payload 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

    • Trigger an XML webhook in an internal ticketing system

    • Capture an identifier from a SOAP response and pass it to a downstream action

    Setting
    Description

    Content-Type is hard-coded to text/xml. There is no Content-Type field in the action settings.

    To send a different media type, override the header through Request Headers. Entries in that map are applied last, so they win over the default. For example, to send SOAP 1.2:

    Header key
    Header value

    The URL and XML Payload fields accept {attribute_name} placeholders. Sources include the source of identity and any prior action in the workflow (including a preceding action).

    Transformer expressions (UPPER, LOWER, TRIM, dot notation for nested attributes) work the same way as in Send REST Payload. See .

    When a Send XML Payload action is configured as part of an Access Request , 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:

    1. Author the XML Payload with {$form_field.*} placeholders in each element or attribute that takes a requester-supplied value:

    2. On the matching catalog definition, add form fields whose names match the placeholders (email and role_name in the example above).

    3. When a user submits an access request, the value entered for each form field replaces the corresponding {$form_field.*}

    Form field substitution applies to the XML Payload only. It does not apply to the URL or Request Headers.

    Substituted form-field values are XML-escaped automatically, and the substituted document is re-checked for well-formedness before send. Placeholders inside XML comments or CDATA sections cannot be safely escaped: a value containing -- or ]] can fail the well-formedness recheck, and the action will error.

    Field names must contain only letters, numbers, and underscores (role_name is valid, role-name is not). A field whose name contains an unsupported character might be accepted at catalog-definition save time but is not substituted at execution time, and the literal {$form_field.*} placeholder is emitted in the payload. If a placeholder references a field that was not provided on the access request, the placeholder is likewise left unchanged.

    When Add response to output entities is enabled, the action parses the XML response and runs the configured XPath expressions:

    Mapping field
    Example

    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 credential model. Select a stored credential in Auth Credentials. The field is required:

    • None (NONE): no authentication header is added; for internal services or pre-authenticated URLs.

    • Header (HEADER): arbitrary inline header value.

    • Basic (BASIC): username and password, base64-encoded.

    The Login-to-Bearer, OAuth2, and OAuth2 (Password Grant) types fetch a token for each job, so a policy that touches many identities makes that many requests to the token endpoint. To reuse one token across the jobs in a policy run, set a on the credential. Veza does not reuse tokens unless you set one.

    Set Data Source to route execution through an Insight Point instead of the control plane. Use this when the target endpoint is unreachable from the Veza control plane.

    Setting
    Description

    The XML payload is checked for well-formedness at save time. Common rejections:

    • Multiple root elements

    • Non-whitespace text outside the root

    • Unbalanced or improperly nested tags

    Validation runs again on the substituted payload at execution time, so a body that becomes ill-formed because of a substituted value fails safely instead of being sent.

    Add the action through the Policy Editor or the policy update API:

    • Policy Editor: open the policy, choose Add New Action, then select Send XML Payload.

    • API: include the action in the policy's actions array. The action type identifier is SEND_XML_PAYLOAD. See .

    • XML only. Use for JSON payloads.

    • Content-Type is fixed to text/xml; override via Request Headers for a different media type.

    • No separate XML namespace registration: declare prefixes inline in each XPath expression.

    Dynamic Approvers

    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.

    How it works

    When an access request is submitted, Veza evaluates any policy steps configured with a Dynamic Approver:

    1. Veza considers the name of the Access Profile or Catalog Definition being requested, and any custom properties set on that profile.

    2. Each transformer step in the Dynamic Approver pipeline runs in sequence, processing the available attributes to produce an intermediate or final output.

    3. The final transformer step must output one or more approver email addresses.

    4. Veza assigns those email addresses as approvers for that policy step.

    The following attributes are available as inputs to transformer expressions:

    Attribute
    Type
    Description

    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.

    1. Go to Lifecycle Management > Settings.

    2. Select the Access Request Settings tab.

    3. Scroll to the Dynamic Approvers section and click Create Approver.

    4. 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.

    1. In the Create or Edit Dynamic Approver dialog, scroll to Test Configuration.

    2. Under Test Source, select Access Profile or Catalog Definition, then choose a specific record to test with.

    3. 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:

    1. Go to Lifecycle Management > Settings > Access Request Policies.

    2. Create or edit a policy.

    3. Under Approver Settings, add or edit an approval step.

    4. 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.

    Identity Override Attributes

    Overview

    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.

    Problem scenarios for attribute overrides

    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.

    1. Click Lifecycle Management in the navigation sidebar, then select the Identities tab.

    2. 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:

    1. Properties: Use this tab to show side-by-side comparisons of actual values from the source of identity and override values

    2. Overview: This tab includes a consolidated view of all active overrides for an identity

    To change the value of an attribute override:

    1. Navigate to the identity's Properties tab. Access the same identity detail view where you created the override.

    2. Locate the attribute with an active override. Find the attribute showing "yes" in the Override column.

    3. 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:

    1. Access the identity's Properties tab. Navigate to the identity detail view with active overrides.

    2. Identify the override to remove. Locate the attribute with "yes" in the Override column.

    3. 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 Provisioning Activity 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.

    Create Entitlement

    Create groups, roles, or distribution lists in target systems during lifecycle workflows.

    Creates entitlements (groups, roles, or distribution lists) in target systems. This action supports creating new entitlements, renaming existing ones, and synchronizing entitlement membership. It is not offered in the workflow editor. Run it from the Create Entitlement option in an integration row's action menu under Lifecycle Management > Integrations.

    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

    Setting
    Description
    Integration
    Entitlement Type
    Required Attributes
    Notes

    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:

    Event
    Description

    You can configure email notifications or webhooks for these events. See for configuration details.

    Create with AI for Lifecycle Management

    Use Access AI to draft and refine condition strings and formatters from inside the Lifecycle Management workflow editor.

    Early Access: Create with AI for Lifecycle Management is available to opt-in tenants. Contact Veza Support to enable it in your environment. See .

    AI-generated content: Create with AI uses generative AI. The LCM Policy Agent drafts condition strings and formatters from your description, and its suggestions can be inaccurate or incomplete. Review every suggestion and its explanation before you apply it, and validate the result with a before you save the workflow.

    Overview

    The Create with AI button in the Lifecycle Management workflow editor opens an Access AI chat thread with the LCM Policy Agent. Describe the condition or the transformed value you want in plain language, and the agent returns the matching syntax with a short explanation. The suggestion appears as an action card in the Access AI chat panel, and nothing changes until you apply it. Applying a suggestion updates the form field only; the change is saved when you save the workflow.

    The button appears next to these fields:

    • Condition strings

      • The Identity matches this condition clause in a workflow's trigger panel.

      • A condition node, when its condition type is not Always.

    • Formatters

      • The Formatter of an attribute on a Sync Identities action, once a destination attribute is set. Structured attributes and the fallback formatter have no button.

      • The unique identifier attribute of a Sync Identities action.

      • The

    Other actions, such as Create Email and Deprovision Identity, do not offer the button.

    Create with AI requires all of the following. If any is missing, the Create with AI button does not appear.

    • Tenant enablement: Veza Support enables Access AI, Access AI chat, and the LCM Policy Agent for your tenant.

    • Early access option: each user turns on the Access AI Chat early access option, which is off by default.

    • The Administrator role. Only administrators can edit Lifecycle Management workflows. See .

    The LCM Policy Agent reads the policy's configuration with your own permissions, not an elevated service identity. It does not read identity or run data, and it cannot save a workflow. A suggestion takes effect only when you apply it and then save the workflow yourself.

    1. Open Lifecycle Management, select a policy, and open the workflow in the workflow editor.

    2. Open the field to draft:

      • For the trigger condition, click the Trigger box. In the trigger panel, find the Identity matches this condition clause.

    Apply Condition is available only while a condition field is open on a workflow editor page. On any other page, the card shows Go to Workflow instead, which returns you to the workflow.

    1. Open Lifecycle Management, select a policy, and open the workflow in the workflow editor.

    2. Select a Sync Identities action and find the attribute to format. For a common transformer, open it for editing instead.

    3. Click Create with AI next to the Formatter field. The Access AI chat panel opens, and the agent receives the destination attribute, the entity type, and the current formatter if one is set.

    When the suggestion includes pipeline functions, applying it also replaces the Then Apply value. When it has none, the existing Then Apply value is left unchanged, so clear it yourself if it no longer applies.

    Apply Formatter is available only while a formatter field for the same destination attribute is on screen. If you close the attribute or move to another action, return to it to apply the suggestion. The formatter card has no Go to Workflow button.

    Each click of Create with AI starts a new Access AI thread. The LCM Policy Agent keeps the context it was opened with, such as the policy and the field, across every turn in that thread, so follow-up requests do not need to restate it.

    To return to a past thread, open Access AI > Threads in the main navigation. To rename, move, or delete a thread, use Rename Thread, Move Thread, or Delete Thread in the thread's options menu.

    • : workflow triggers, conditions, and actions.

    • : SCIM filter syntax for condition strings.

    • : formatter functions and the Then Apply pipeline.

    Explain Run Errors with Access AI

    The LCM Run Analyst explains why a Lifecycle Management provisioning action failed, reading the error the target system returned together with the attribute values the action sent.

    The LCM Run Analyst is an Access AI agent that explains why a Lifecycle Management provisioning action failed. It reads the error that the target system returned together with the values the action sent, and identifies the system property involved and the value in your policy that caused the failure.

    Get AI explanations from the error banner when viewing failed record details on the page:

    1. Navigate to Lifecycle Management > Provisioning Activity.

    2. Open the failed record from the Workflow Tasks, Integration Jobs, or

    Send Notification

    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

    : The Access Profile starts active and is immediately functional with no additional action required.
  • State Enabled by Admin: The Access Profile is created disabled and requires an administrator (not a regular user) to enable it.

  • Limit to a single integration: Profiles are limited to a single integration (such as one or more entitlements from a specific Okta integration).
  • Create local user/account only (if limited to a single integration): Create a local user account without specific entitlements.

  • The target integration and entity type to create.
  • 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 Allow continuous sync of Access Profile to periodically recreate and reapply entitlements if removed within the target system.

  • You recognize that overrides should be used for exceptional cases, not routine operations

    Open the identity's Properties tab:

    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

  • 3.3. Confirm the action when prompted

    Change management coordination: Communicate with HR and identity provider teams when overrides are needed.

    Before you start

    Configure identity override attributes

    Create attribute overrides for individual identities

    Update existing overrides

    Cancel attribute value overrides

    Important considerations

    Override scope and limitations

    Operational best practices

    See also

    Lifecycle Management Policies
    Lifecycle Management Overview
    Access Profiles
    Conditions and Actions

    Legacy APIs, Basic authentication endpoints

    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

    OAuth2 (Password Grant)

    OAuth 2.0 resource owner password credentials grant

    Targets that expose no other machine-to-machine grant

    None

    No authentication header added

    Public APIs, pre-authenticated endpoints

    Authentication password (encrypted at rest)

    JSON body for the login request (encrypted at rest)

    bearer_token_attribute

    Yes

    Dot-notation path to the token in the login response (e.g., value.token)

    OAuth2 client secret (encrypted at rest)

    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

    scope

    No

    Space-delimited list of scopes to request. Sent as the scope parameter on the token request only when set

    ca_certificate_base64

    No

    Base64-encoded CA certificate for the OAuth2 token endpoint, if it uses a self-signed or internal CA

    Resource owner password (encrypted at rest)

    authentication_method

    Yes

    How to send the client credentials: FORM or BASIC. Applies only when client_id is set

    auth_url

    No

    Token endpoint URL. Defaults to {credential_url}/oauth2/token if not specified

    client_id

    No

    OAuth2 client ID. Omit for a public client

    client_secret

    No

    OAuth2 client secret (encrypted at rest)

    scope

    No

    Space-delimited list of scopes to request

    ca_certificate_base64

    No

    Base64-encoded CA certificate for the token endpoint, if it uses a self-signed or internal CA. Applies to the auth_url connection only, as described under OAuth2

    Auth Type Configuration
    OAuth2
    Token Reuse Window
    Custom Certificate Configuration
    Using Custom Certificates
    Custom Application with Send REST Payload

    When enabled, existing active users aren't modified. Changes apply only when a user is newly created or reactivated. Disable to keep attributes in sync 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

    Action Unique Identifier

    The attribute Veza uses to locate an existing user when syncing. Defaults to the integration's primary identifier (for SCIM integrations, userName)

    Enforce password change on login

    Force newly created users to change their password at first login. Availability varies by target system — see Enforce password change on login.

    ✅

    Google Workspace

    ✅

    — (no Reset Password action)

    ServiceNow

    ✅

    — (no Reset Password action)

    Write Back Email
    Choosing between Write Back Email and Sync Identities
    Formatter
    of a common transformer.
    For a condition node, select the node on the canvas.
  • Click Create with AI. The Access AI chat panel opens. If the field is empty, the agent drafts a new condition string. If it has a value, the agent refines it.

  • Describe the condition in plain language, for example: "Active Workday workers in the Engineering department whose start date is within the next 7 days".

  • Review the Condition String action card, which contains the suggested condition and an explanation.

  • Click Apply Condition to write the suggestion into the field, replacing its current value. The card then reads Condition Applied. To decline the suggestion, click Reject. The card then reads Rejected, and you can keep chatting to ask for another suggestion.

  • Review the value, and save the workflow.

  • Describe the value in plain language, for example: "Lowercase the first initial and full surname, joined with a period, then append @example.com".
  • Review the Formatter for attribute action card. Pipeline functions in the suggestion appear under Then apply:.

  • Click Apply Formatter to write the suggestion into the Formatter field, replacing its current value. The card then reads Formatter Applied. To decline the suggestion, click Reject.

  • Review the value, and save the workflow.

  • Before you start

    Create a condition string with AI

    Apply Condition writes to the condition field that is open in the workflow editor, not necessarily the one you opened the thread from. Before you apply a suggestion, confirm that the intended trigger panel or condition node is open.

    Create a formatter with AI

    Conversation threads

    Related

    Roles
    Policies
    Trigger Conditions Reference
    Transformer Reference
    Before you start
    Simulation Dry Run

    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

    CREATE_ENTITLEMENT is idempotent: if the entitlement already exists in the target system, the action updates its attributes and membership rather than failing or creating a duplicate.

    Supported Integrations

    Rename and Sync Behaviors

    Renaming entitlements

    Not all integrations support renaming. Check the integration's allow_rename capability before configuring rename workflows.

    Membership synchronization

    Access Profile Integration

    Event Notifications

    Access Profile
    Notification Templates

    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

    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

    Description
    .
  • 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.

  • Click Test Configuration. The Resolved Approvers section shows the email addresses that would be assigned as approvers.

    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

    Available attributes

    Transformer expressions

    Creating a Dynamic Approver

    The final transformer step determines the approver emails. Intermediate steps can use String List output to return multiple values, which are then accessible via {last_output} in the next step.

    Example: Two-step pipeline

    Testing a Dynamic Approver

    Using a Dynamic Approver in a policy

    See Also

    Access Profiles Settings
    attribute transformers
    Lookup Table
    Lookup Tables
    Access Profiles — Custom Properties
    Lookup Tables
    Transformers
    Access Request Policies

    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.com

    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

    Workflow Trigger Condition

    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)

    Key relationship: A Transformer CONTAINS a Formatter. The transformer is the complete configuration (which attribute to set, the formatter template, sync options). The formatter is just the template string that defines how to construct the value.

    Quick Reference

    The Four Systems

    Workflow Trigger Conditions

    Conditions on Success

    Attribute Transformers

    Dynamic Access Profiles

    Dynamic Access Profiles answer "which profile?" not "should we assign a profile?" They use formatter syntax, not SCIM conditions.

    Combining Conditions and Transformers

    Example: Time-Windowed Leaver Trigger

    Summary

    Related Topics

    Trigger Conditions Reference
    Conditions and Actions
    Attribute Sync and Transformers
    Dynamic Access Profiles
    Dynamic Value Comparisons
    Trigger Conditions Reference
    Attribute Sync and Transformers
    Transformer Reference
    Dynamic Access Profiles

    Decide IF a subsequent action runs

    Compare last day to threshold

    String (the value)

    Request Headers

    (Optional) Additional request headers. Applied last, so entries here override defaults: including Content-Type (see ).

    SOAPAction (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 prior actions resulted in a change

    When enabled, the request runs only if a prior action in the workflow modified or created resources. Cannot be combined with .

    Add response to output entities

    Extract XPath-selected values from the response and expose them as entity attributes for downstream actions.

    Output Entity Type

    Entity type created from the response. Required when Add response to output entities is enabled.

    Response Entity XPath

    XPath selecting the parent node that contains the result data.

    Response ID XPath

    XPath selecting the entity identifier within the response.

    Response Name XPath

    XPath selecting the entity display name within the response.

    Capture all child elements as attributes

    (Advanced) Flatten every direct child element and XML attribute under the response entity node into the output entity's attribute map.

    placeholder in the XML Payload before the request is sent.

    Response Name XPath

    DisplayName/text()

    Bearer (BEARER): Bearer <token>.

  • Login-to-Bearer (LOGIN_TO_BEARER): exchange credentials at a login endpoint for a Bearer token.

  • OAuth2 (OAUTH2): client credentials or other OAuth2 flow.

  • OAuth2 (Password Grant) (OAUTH2_PASSWORD): resource owner password credentials grant, for targets that offer no other machine-to-machine grant.

  • 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.

  • URL

    Target endpoint URL. Supports {attribute_name} substitution in the path and query string.

    HTTP Method

    Request method. POST is typical for SOAP; GET, PUT, PATCH, DELETE, HEAD, and OPTIONS are also supported.

    Auth Credentials

    Content-Type

    application/soap+xml; action="urn:example:hr:CreateUser"

    <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>
    <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>

    Output Entity Type

    LegacyAppUser

    Response Entity XPath

    //CreateUserResponse

    Response ID XPath

    Data Source

    (Optional) Custom Provider data source to route through. Must be configured as an Insight Point Custom Application. When empty, the action runs on the control plane.

    Settings

    Content-Type

    Variable substitution

    Substituted values are XML-escaped automatically. <, >, &, and quote characters are escaped in identity-derived values, and the substituted document is re-checked for well-formedness before send. No manual escaping is required.

    Form field substitution (Access Requests only)

    XPath response capture

    Capture all child elements as attributes flattens every direct child element and XML attribute under the response entity node into the output entity's attribute map, alongside the explicit id and name. Use it when the returned field set varies and enumerating each one isn't practical.

    Authentication

    Insight Point execution

    Insight Point execution cannot be combined with Only send if prior actions resulted in a change. Setting both datasource_id and the upstream-changes flag is rejected at validation.

    Save-time validation

    Configuration

    Limitations

    Sync Identities
    Transformers
    catalog definition
    Send REST Payload
    token reuse window
    Update Policy Configuration
    Send REST Payload

    (Required) Stored REST authentication credential. For endpoints that need no authentication, select a credential of type NONE. Same model as : HEADER, BASIC, BEARER, LOGIN_TO_BEARER, OAUTH2, NONE, OAUTH2_PASSWORD.

    UserId/text()

    Events
    tab.
  • In the error banner at the top of the detail view, select Explain with AI.

  • The Access AI panel opens a new conversation with the LCM Run Analyst and asks it to explain the failure. The initial question is pre-filled, and it is scoped to the record you opened.

    The banner appears in three detail views:

    • Workflow Tasks tab, Triggered Workflow detail: when the task errored and recorded one or more messages. The banner reads Task failed. A task that was skipped, blocked, or completed with messages shows Task skipped, Task blocked, or Completed with warnings instead, without the button.

    • Integration Jobs tab, Integration Job detail: when the job recorded an error message. The banner reads Job failed.

    • Events tab, Event detail: when the event has a message and did not succeed. The banner reads Event failed.

    The Workflow Actions tab detail view has no error banner, so it has no Explain with AI button. Open the underlying job from the Integration Jobs tab instead.

    Explain with AI is hidden when a record carries neither a workflow task ID nor an action job ID. Every lookup the analyst performs requires one of those two identifiers.

    For the run you opened, the analyst retrieves and considers all action-level details:

    • The action and its target. The action name and type, the integration the action ran against, and the identity it ran for.

    • The raw error the target system returned, including any Veza context and application-specific error messages.

    • The values the action sent. Each value appears with both names: the Veza attribute name your policy configured, and the target system's own property name. That pairing helps the analyst quote the exact value behind an error such as Invalid value specified for property 'mailNickname'.

    • Lifecycle Management's own recorded findings for the run, if the run includes them. These can indicate which attribute collided, the account it collided with, whether an identity was found at all, which attributes did not sync, and any alternative value a retry substituted. A recorded finding takes precedence over the information in the error string.

    Sent attribute values are available for Sync Identities, Reset Password, Deprovision Identity, and Create Email actions. These action types record the resolved values they sent. For other action types, the analyst explains the error without considering attribute values, and states this instead of offering theoretical values.

    An explanation identifies the action that failed and the integration it targeted, states what the error means, ties it to the specific value that produced it, and gives a resolution: correct the value at the source, or correct the attribute mapping or formatter that produced it. It also suggests whether retrying the run is likely to help.

    The analyst has built-in knowledge of provisioning errors for common enterprise systems:

    • Active Directory and LDAP, including result codes, the sub-codes carried in error 49 bind and logon failures, and referrals

    • Microsoft Entra ID through Microsoft Graph

    • Okta

    For other integrations, it explains what it can from the error text and the action, and stays within what the run recorded.

    A workflow task can fail before any action runs, and a run that failed that way has no target system error to explain. The analyst handles these cases from the task's own state and messages:

    • A pre-flight validation failure or a policy configuration error, which is recorded on the task rather than on an action.

    • A dry run, which simulates the workflow and sends nothing to the target. There is no target system error because nothing was sent.

    • An attempt recorded as Skipped with an error on it, which is an attempt that Lifecycle Management superseded with a retry. The error is real, but a later attempt might have succeeded.

    • A run your role cannot see, which the analyst reports as not visible rather than as a run without errors.

    Where a message carries no target system payload at all, such as a bare RPC error or a timeout, the analyst identifies it as internal and directs you to Veza Support instead of attributing it to a cause in your configuration.

    When opened with Explain with AI, the LCM Run Analyst explains the failed record you opened it from.

    Other questions belong to other Access AI agents:

    What you need to know
    Where to ask

    Why one action failed, and what to change

    LCM Run Analyst

    Why a provisioning outcome did not take effect, such as access that persists or an account that was never created

    LCM Run Analyst

    How a policy's runs performed over a period, which runs failed, and what the failures share

    The analyst cannot retry, re-run, or cancel anything, and it cannot change a policy. Acting on an explanation is a separate step you take yourself.

    The conversation keeps the run you opened in context, so follow-up questions in the same thread stay on that run. To ask about a different run, open that run and select Explain with AI from its banner.

    The analyst does not reuse run identifiers from earlier in a conversation, because a stale identifier would return an answer about the wrong run.

    Values the analyst reads pass through two controls before an explanation is composed:

    • Credential masking. An attribute whose name contains password, secret, token, or credential, or the whole word key or keys, has its value replaced with <redacted>. A policy can legitimately map a credential as a destination attribute, so the resolved plain text value is masked by name before it leaves Lifecycle Management. The analyst reports that a credential was sent without showing it.

    • Server error detail. Detail from an internal failure is withheld rather than relayed. Only the status codes that Lifecycle Management writes for a caller to read, such as not found, invalid argument, permission denied, and canceled, carry their detail into an answer.

    Lookups use the permissions of the user asking, not an elevated service identity. See Which runs you can explain. Inference runs on Amazon Bedrock within Veza's environment, not against a third-party model provider API.

    To use the LCM Run Analyst, you need:

    • Tenant enablement: Veza Support enables Access AI, Access AI chat, and the LCM Run Analyst for your tenant.

    • Early access option: each user turns on the Access AI Chat early access option, which is off by default.

    • A built-in role that includes Access AI: Administrator, Operator, Viewer, Watcher, Access Reviewer, Access Reviews Admin, Access Reviews Monitor, Re-assigner, or NHI Security Admin. Other built-in roles do not include it. See Roles.

    Explain with AI does not appear for a user missing any of these.

    A role that includes Access AI lets you open the analyst. It does not widen which runs you can see. The analyst reads each run with your own permissions, so it can explain only the runs you can open on the Provisioning Activity page:

    • Administrators and Operators can explain any run.

    • Users with any other role can explain only runs for their own identity. The analyst reports any other run as not visible.

    • Provisioning Activity

    • Test Policies with Dry Run

    • Attribute Mapping

    • Attribute Transformers

    Early Access: The LCM Run Analyst is available for Veza SaaS tenants with Access AI enabled. Contact Veza Support to activate it in your environment. See Prerequisites.

    AI-generated content: The LCM Run Analyst uses generative AI to explain a failed provisioning action, so its answers can be inaccurate or incomplete. Treat an explanation as a starting point for your own diagnosis, not as a verdict. Confirm the cause against the raw error message and the attribute values shown in the run detail, and validate any policy change with a dry run before you enable it.

    Open the analyst from a failed run

    Provisioning Activity

    What the analyst reads

    What the answer contains

    Runs where no action failed

    Internal Veza errors

    What the analyst does not do

    Ask follow-up questions

    How sent values are protected

    Prerequisites

    Which runs you can explain

    Related topics

    Create a service desk ticket for any manual steps
  • Send standardized notifications using custom templates across workflows

  • Setting
    Description

    Notification Type

    Select Email, Webhook, or Service Now

    Select 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 for details

    Recipients

    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 Notification Templates for placeholder reference and template management.

    Email Template Selection

    Fallback Formatters

    Configure fallback formatters for uniquely identifying attributes during identity synchronization

    Overview

    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.

    Terminology: A formatter is the template string within an attribute transformer that defines how to construct a value. A fallback formatter is an alternative template used when the primary formatter produces a value that conflicts with an existing record. See for more on these terms.

    Understanding Fallback Formatters

    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 Sync Identities Action to ensure new users can be onboarded efficiently, regardless of naming conflicts.

    Use Case: Username Conflicts

    The most common use case for fallback formatters is handling username conflicts. For example:

    Your organization uses a standard username format of first initial + last name (e.g., jsmith for John Smith).

    When multiple employees have similar names, this can lead to conflicts:

    • John Smith already has jsmith

    • Jane Smith already has jsmith1

    • James Smith already has jsmith2

    When Jennifer Smith joins, the fallback formatter automatically assigns jsmith3, maintaining your naming convention while ensuring uniqueness.

    Fallback formatters can be configured as part of the "Sync Identities" action within a Lifecycle Management workflow:

    1. Edit or create a Lifecycle Management policy

    2. Edit the workflow containing the Sync Identities action

    3. In the Sync Identities action configuration, click Add Fallback

    4. Configure the to use as a fallback pattern for the unique attribute that might experience conflicts

    Several transformers can be used for implementing fallback formatters depending on your specific use case.

    A typical approach is to use the NEXT_NUMBER transformer, which is specifically designed to generate sequential numerical alternatives when naming conflicts occur.

    The NEXT_NUMBER transformer:

    • Generates a set of sequential integers as strings

    • Takes two parameters: BeginInteger (starting number) and Length (how many numbers to generate)

    • Is unique among transformers in that it returns multiple values, making it ideal for fallback scenarios

    In addition to NEXT_NUMBER, other transformers can be valuable for creating fallback formatters:

    Using Random Alphanumeric for Unique Usernames:

    This could generate usernames like jsmith8f3d instead of sequential jsmith1, jsmith2, etc.

    Using UUID for Guaranteed Uniqueness:

    This would append the first 8 characters of a UUID, creating identifiers like jsmith-a7f3e9c2.

    When configuring a fallback formatter with the NEXT_NUMBER transformer:

    1. Select the attribute that requires uniqueness (e.g., username, email)

    2. Configure the primary pattern (e.g., {first_initial}{last_name})

    3. 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:

    Primary Format
    Fallback Pattern
    Examples

    When Lifecycle Management attempts to provision a new identity with a unique attribute value that already exists:

    1. The system first tries the primary format (e.g., jsmith)

    2. If a conflict is detected, it automatically tries the first alternative using the NEXT_NUMBER transformer (e.g., jsmith1)

    3. If that value also exists, it tries the next alternative (e.g., jsmith2)

    This automated conflict resolution ensures provisioning can proceed without manual intervention, even when your standard naming conventions result in conflicts.

    Provisioning Activity

    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:

    1. Policies define the overall automation framework for managing identities

    2. Workflows determine which actions should be executed for specific identities

    LCM Run Analyst

    What actions a policy performs, how it formats an attribute, how to author a condition, or why a policy did not run at all

    LCM Policy Agent

    What a class of error means in general, with no run behind the question

    Veza Documentation Agent

    Access AI
    Condition on Success
    Attribute Transformer
    Dynamic Access Profile
    Send REST Payload
    Content-Type
    Insight Point execution

    (Email notifications only) Specify email addresses to receive the notification, or select user attributes containing email addresses

    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

    Select Recipient (Veza Action) / Select Existing Webhook / Select Config

    Select an existing Veza Action for pre-configured email or webhook settings. The field label depends on the notification type

    Custom Email Templates

    Close the action sidebar and save your changes to the policy.

    {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

    This process continues until either:

    • A unique value is found

    • All alternatives from the NEXT_NUMBER range are exhausted (in which case an error would be reported)

    {first_initial}{last_name}

    {first_initial}{last_name}{NEXT_NUMBER(1, 10)}

    jsmith, jsmith1, jsmith2, etc.

    {first_name}.{last_name}

    {first_name}.{last_name}{NEXT_NUMBER(1, 10)}

    Configuring Fallback Formatters

    Transformer Options for Fallback Formatters

    Using the NEXT_NUMBER Transformer

    Other Useful Transformers for Fallbacks

    Implementation Example

    Common Fallback Patterns

    How Fallback Resolution Works

    Transformer
    Transformers

    john.smith, john.smith1, john.smith2

    {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)}

    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: Workflow Tasks, Workflow Actions, Integration Jobs, and Events.

    When the page opens, a Workflow Tasks stats card shows live totals of Scheduled, Waiting, and Running tasks, followed by Done and Errored counts under Last 24 Hrs. Use this card to get an at-a-glance health check without applying any filters. Scheduled and Waiting counts show how much work is pending, and Running shows what is actively executing.

    Each tab can help track recent actions, verify that expected changes have occurred, identify patterns or issues in lifecycle events, and monitor the overall health of your Lifecycle Management implementation.

    The Events tab shows individual changes made to entities and relationships within the system. Each event represents an atomic change resulting from a successful action.

    Column
    Description

    Event Type

    The type of event that occurred (e.g., REMOVE_RELATIONSHIP, ADD_RELATIONSHIP, SYNC_IDENTITY)

    Timestamp

    When the event occurred

    Success

    The Integration Jobs tab displays individual jobs executed as part of actions. Jobs represent specific tasks performed on target systems, such as creating a user account or updating attributes. Use this tab to review whether individual jobs executed successfully or encountered an error and could not be completed.

    Column
    Description

    Parent

    The name of the action or access request that initiated the job

    Parent Type

    Whether the job came from a Workflow Action or an Access Request

    Integration

    The Workflow Actions tab shows high-level operations triggered by workflows. Actions typically involve one or more jobs that work together to accomplish a specific goal.

    Column
    Description

    Name

    The name of the action

    Action Type

    The type of action (e.g., Sync Identities, Manage Relationships)

    Workflow

    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.

    Column
    Description

    Name

    The name of the workflow

    Identity

    The identity for which the workflow was executed

    Entity Type

    For each identity, Lifecycle Management follows this process:

    1. Validation: The system validates the identity against workflow trigger conditions

    2. 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)

    3. Task Creation: If execution is needed, a workflow task is created

    4. Action Execution: The system executes conditions and actions via the task runner

    5. Result Storage: The result is stored as an event on the Provisioning Activity page

    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: Click the link in a row's first column to open its details panel, which shows the full error message

    • What happened in the last extraction? Open the Recent Extractions filter and click the relevant extraction to scope Workflow Tasks to that run instantly.

    • Is provisioning running now? Check the Workflow Tasks stats card at the top of the page. The Scheduled, Waiting, and Running totals update live without any filtering.

    • Troubleshoot a failed action: Go to the Integration Jobs tab, filter by State = Errored, and open the failed job. Switch to the Workflow Actions tab for context on the broader operation that spawned the failing jobs. See Explain Run Errors with Access AI for an AI explanation of the failure.

    • 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.

    Overview

    Workflow Tasks stats card

    Provisioning Activity tabs

    Events Tab

    Integration Jobs Tab

    Workflow Actions Tab

    Workflow Tasks Tab

    Workflow Execution Process

    Using the Provisioning Activity page

    Common tasks

    Log Retention and Security

    Best practices

    Review timing

    Custom monitoring dashboards

    Whether the event completed successfully (True/False)

    Identity

    The identity associated with the event

    Local User

    The account affected by the event (hidden by default)

    Entitlement Entity

    The entitlement entity involved, if applicable

    The target integration

    Job Type

    The type of action (e.g., Sync Identities, Manage Relationships)

    Workflow

    The workflow that ran the action, if applicable

    Started At

    When the job started

    Completed At

    When the job completed

    Duration

    How long the job ran

    Identity

    The identity associated with the job

    State

    The current state of the job (Completed, Errored)

    Any Changes

    Whether the job resulted in changes to the system

    Policy

    The policy that ran the job (hidden by default)

    The workflow that ran the action

    Identity

    The identity associated with the action

    Started At

    When the action started

    Completed At

    When the action completed

    Duration

    How long the action ran

    State

    The current state of the action (Completed, Errored)

    Jobs Started

    Number of jobs initiated by this action

    Any Changes

    Whether the action resulted in changes to the system

    Policy

    The policy that ran the action (hidden by default)

    The type of entity processed by the workflow (hidden by default)

    Created At

    When the workflow task was created (hidden by default)

    Scheduled For

    When the workflow was scheduled to run, if applicable

    Started At

    When the workflow started

    Completed At

    When the workflow completed

    Duration

    How long the workflow ran

    State

    The current state of the workflow (Completed, Errored)

    Policy

    The policy the workflow belongs to (hidden by default)

    Manually Triggered

    Whether the workflow was triggered manually (Yes) or by an automatic policy evaluation (No)

    Dynamic Access Profiles

    Use attribute formatters to dynamically select Access Profiles at runtime based on user attributes

    Overview

    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.

    Terminology: Dynamic Access Profiles use formatter syntax—the same template syntax used in attribute transformers. A formatter is a template string like {department | LOWER} that constructs a value from identity attributes. See for more context.

    How It Works

    Runtime Resolution Process

    When a Lifecycle Management workflow runs with dynamic Access Profiles configured:

    1. 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.

    2. 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.

    3. Profile Lookup: Veza looks up an Access Profile with that exact name

    4. 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.

    5. Graceful Continuation: If the profile name doesn't resolve or doesn't exist, Veza logs the issue to Provisioning Activity 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.

    Aspect
    Static Access Profiles
    Dynamic Access Profiles

    Before configuring Dynamic Access Profiles:

    1. Create Access Profiles following a consistent naming convention that includes attribute values

    2. Identify User Attributes that will drive profile selection (e.g., department, location, role)

    3. Plan Naming Pattern that incorporates these attributes predictably

    1. Navigate to Lifecycle Management > Policies

    2. Create or edit a policy

    3. Add or edit a Manage Relationships action

    4. In the Dynamic Access Profiles to Add section (or Dynamic Access Profiles to Remove, to remove profiles resolved at runtime):

    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:

    Operator
    Meaning
    Example

    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:

    Access Profile Name

    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.

    Issue
    Cause
    Solution
    • - Conceptual overview of the different evaluation systems

    • - Creating and managing Access Profiles

    • - Configuring the Manage Relationships action

    • - Available formatters and syntax

    Rotate Key

    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.

    NHI feature: ROTATE_KEY is part of Veza's Non-Human Identity (NHI) management capabilities. Veza Support enables key rotation for your tenant. It does not require an LCM license. This action is not offered in the policy editor. To rotate a key manually, use the Rotate Key action on a key entity's row in NHI Security → Keys & Secrets.

    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

    • Trigger key rotation after a security incident

    Setting
    Description

    Supported Integrations:

    Integration
    Notes

    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 and the .

    Placeholder
    Description

    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

    Azure Key Vault

    Only supported provider. Requires an Azure datasource configured with Key Vault permissions

    {{ROTATED_KEY_COUNT}}

    Count of keys successfully rotated

    {{FAILED_KEY_COUNT}}

    Count of keys that failed to rotate

    Required Azure permissions

    Result placeholders (for notification templates)

    Azure RBAC versus access policies
    Azure Key Vault integration

    One or more key names to rotate. Each key gets a new version; the previous version is not deleted

  • 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

    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 Provisioning Activity

    Name mismatch or profile is PAUSED

    Check Provisioning Activity for the exact resolved name; verify profile exists and is in RUNNING state

    Formatter fails to resolve

    Missing attribute or incorrect path

    Failure Handling: Dynamic Access Profile resolution failures do not stop workflow execution. When a profile cannot be resolved or doesn't exist, the system logs "Dynamic access profile not found" to Provisioning Activity and continues processing other profiles. This prevents a single missing profile from blocking all access provisioning.

    Key Characteristics

    Comparison: Static versus Dynamic Access Profiles

    Configuration

    Prerequisites

    Configuring Dynamic Access Profiles

    Formatter Expression Syntax

    Conditional Profile Selection with IF/ELSE

    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_Selected

    This 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):

    Access Profile Name (Field 1)
    Access Profile Name (Field 2)

    This does NOT require multiple fields (one criterion with multiple outcomes):

    Error: 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_Selected

    Correct approaches:

    1. For multiple outcomes from the same criterion, use ELSE IF branches:

    2. For independent criteria, use separate Access Profile Name fields (click Add Profile Name).

    Examples

    Example 1: Department-Based Access Profiles

    Scenario: Provision users to department-specific Access Profiles based on their department attribute.

    Access Profile Setup:

    • Create Access Profiles named: access-profile-engineering, access-profile-sales, access-profile-qa

    • Each profile contains entitlements appropriate for that department

    Dynamic Access Profile Configuration:

    With this formatter prefix:

    Runtime Behavior:

    • User with department=Engineering → Access Profile access-profile-engineering

    • User with department=Sales → Access Profile access-profile-sales

    • User with department=QA

    Example 2: Multi-Attribute Profile Selection

    Scenario: Provision users based on both department and business unit for more granular access control.

    Access Profile Setup: Create Access Profiles with names combining department and business unit:

    • TEAM-Engineering-12345

    • TEAM-Engineering-67890

    • TEAM-Sales-12345

    • TEAM-QA-12345

    Dynamic Access Profile Configuration:

    Runtime Behavior:

    • User with department=Engineering and businessUnitCode=12345 → Access Profile TEAM-Engineering-12345

    • User with department=Sales and businessUnitCode=12345 → Access Profile TEAM-Sales-12345

    Example 3: Location and Role Combination

    Scenario: Provision users based on geographic location and job role.

    Access Profile Setup:

    • US-manager

    • US-engineer

    • EMEA-manager

    • EMEA-engineer

    Dynamic Access Profile Configuration:

    Runtime Behavior:

    • User with location=us and role=Manager → Access Profile US-manager

    • User with location=emea and role=Engineer → Access Profile EMEA-engineer

    Example 4: Combining Static and Dynamic Profiles

    Scenario: All employees get a base access profile, plus department-specific access.

    Manage Relationships Action Configuration:

    • Access Profiles (static): all-employees-base-access

    • Dynamic Access Profiles to Add: dept-{department | LOWER}

    Runtime Behavior: Every user receives:

    1. Entitlements from all-employees-base-access (static)

    2. Entitlements from their department-specific profile (dynamic)

    Example 5: Secondary Node Attributes

    Scenario: Use attributes from a secondary identity source.

    Setup:

    • Primary identity: Okta User

    • Secondary identity: HRIS Employee record with department attribute

    Dynamic Access Profile Configuration:

    Runtime Behavior: The system evaluates the department attribute from the secondary HRIS Employee node, not the primary Okta User node.

    Example 6: Multi-Branch Department Selection (Single Field)

    Scenario: Assign different Access Profiles based on which department a user belongs to. Since this is one criterion with multiple possible outcomes, use a single expression with ELSE IF branches.

    Access Profile Setup:

    • Legal Department - For Legal department users

    • M&A Department - For Mergers and Acquisitions users

    • Information Technology Department - For IT users

    • (No actual profile named No_Profile_Selected exists)

    Dynamic Access Profile Configuration:

    This uses a single Access Profile Name field with multiple ELSE IF branches:

    Runtime Behavior:

    • User in Legal department → Receives Legal Department profile

    • User in M&A department → Receives M&A Department profile

    • User in IT department → Receives Information Technology Department profile

    Example 7: Independent Criteria (Multiple Fields Required)

    Scenario: Assign profiles based on TWO independent criteria—department membership AND user-specific overrides for testing. Since these are unrelated conditions that could both apply simultaneously, use separate fields.

    Access Profile Setup:

    • SalesforceAdmins - For finance/sales department users with Account Manager role

    • Salesforce User - For specific test users

    • (No actual profile named No_Profile_Selected exists)

    Dynamic Access Profile Configuration:

    This requires two separate Access Profile Name fields because you want to potentially assign both profiles to the same user. Click Add Profile Name to add the second field.

    Access Profile Name (Field 1) - Department/Role based:

    Access Profile Name (Field 2) - Test user override:

    Runtime Behavior:

    • User in Finance department with "Account Manager" title → Receives SalesforceAdmins profile

    • User with first_name "user04" → Receives Salesforce User profile

    • User meeting both conditions → Receives both profiles

    Best Practices

    Naming Conventions

    Using IF/ELSE Conditionals

    Timing and Order

    Validation and Monitoring

    Troubleshooting

    See Also

    attribute formatter
    Understanding Conditions and Transformers
    Access Profiles
    Manage Relationships Action
    Attribute formatters
    Understanding Conditions and Transformers

    Access Profile name (resolved from expression)

    status ne "Terminated"

    Verify attribute exists on identity node; check secondary node paths exist

    Duplicate Resolution Rules

    Consolidate multiple records for the same person in a single source of identity into a single authoritative record before policy workflows act on them.

    A Duplicate Resolution Rule consolidates multiple records for the same person within a single source of identity into one authoritative record. The rule applies during workflow processing, so policy workflows act on a single resolved identity rather than once per duplicate.

    The most common case is a contractor-to-employee conversion in an HRIS, where the contractor record and the new employee record coexist until the contractor record is closed.

    Configure a rule in the Veza UI, where it appears as Duplicate identity resolution in a policy's identity source settings, or through the policy update API. Both write the same fields.

    When to use a rule

    Use a Duplicate Resolution Rule when one source of identity can produce more than one record for the same person, and a policy should act on only one of them:

    • Contractor-to-employee conversion: an HRIS keeps the open contractor record while creating a new employee record for the same person.

    • System-generated duplicates: a source of identity emits a placeholder record alongside the real one during onboarding.

    • Merged data sources: a CSV upload or custom OAA connector merges feeds that share individuals.

    A rule resolves duplicates within one source of identity. Each source carries its own rule, and a rule never matches a person across two sources. Cross-source correlation is handled by the policy's primary and secondary source configuration. See .

    For each extraction of the source of identity:

    1. Veza groups identities that share the same values for all of the configured deduplication key properties.

    2. Veza applies the ranking rules to choose the authoritative record in each group. When no rule produces a single winner, the record with the lowest entity ID is kept. Entity IDs are compared as text, not as numbers, so 10 sorts before 9.

    3. Veza hard-deletes the other records in the group before workflows evaluate the resulting identity. No soft-deleted record remains, so a dropped duplicate cannot be restored through the Lifecycle Management rehire flow.

    Veza skips any group larger than the configured max_duplicate_group_size. Every record in a skipped group passes through unresolved, and workflows run for each one. A large group usually means that a deduplication key property is not unique to one person.

    Clearing a rule does not restore the records it dropped. If the source still emits them, they return on the next extraction as new identities, and no downstream state from the original records is carried over.

    Duplicate resolution produces few visible signals:

    • No deletion event is emitted for a dropped record. An Identity Deleted From Sources notification does not fire for records dropped by a rule.

    • The kept record is marked. Veza sets the system attribute sys_attr__has_duplicates to true on the surviving identity. This attribute is excluded from change detection, so setting it does not trigger a workflow.

    • Counts are recorded internally. Veza records backend metrics, including lcm.duplicate_identities_resolved_total

    Available in Veza v2026.5.25 and later.

    • A permission set that allows updating Lifecycle Management, such as an administrator role.

    • A policy with a source of identity selected. The controls stay disabled until a source is chosen, because the property list comes from that source's entity type.

    • At least one completed extraction of that source, so that its properties are available.

    1. Open Lifecycle Management and select a policy.

    2. Click Policy Settings.

    3. Open the step for the source of identity:

      • For the primary source, open the Primary Identity Source step.

    The policy creation wizard includes both steps, so a rule can also be configured when a policy is created.

    The Duplicate identity resolution dialog contains three settings:

    1. In Match on these properties, select the properties whose combined values identify one person. Records that share the same values for all selected properties are duplicates. The list contains the properties Veza discovered for the source's entity type; internal sys_attr_ properties are not selectable.

    2. In Maximum group size, set the largest group that Veza resolves. The field appears after at least one match property is selected, with a default of 3 and a range of 2 to 20. Veza resolves no records in a group that exceeds the limit.

    3. Under

    Ranking rules are evaluated in order. The first rule that produces a single winner decides the outcome. A rule that leaves a tie, or matches no records, passes the group to the next rule. Use the arrows beside a rule to reorder it, and the delete icon to remove it.

    For example, to keep the most recently hired active record, and the most recently updated record when none is active:

    • Rule #1: filter is_active eq true, sort by hire_date, Descending selected.

    • Rule #2: sort by last_updated, Descending selected.

    1. Click Save in the dialog. This stores the rule in the settings form but does not apply it.

    2. Click Save on the Policy Settings page.

    The rule takes effect on the next extraction of that source of identity. See .

    The Duplicate identity resolution section summarizes a configured rule: its match properties, maximum group size, and a numbered table of ranking rules. With no ranking rules, the summary reads "None — record with the smallest entity ID is kept."

    Click Edit to change the rule, or Remove to clear it. Remove does not ask for confirmation.

    The rule is stored on the policy, not on a policy version:

    • primary_duplicate_resolution_rule on the Policy, for the primary source of identity.

    • duplicate_resolution_rule on each entry in secondary_source_of_identities, for secondary sources.

    Set both through the policy update endpoint, with the policy object as the request body:

    Validation rejects a rule that sets ranking_rules or max_duplicate_group_size without dedup_key_properties.

    Field
    Type
    Description
    Field
    Type
    Description

    Matching on dedup_key_properties is exact and type-aware:

    • Strings are compared byte for byte, so case and whitespace are significant.

    • Values of different types do not match: the string "1" and the number 1 are different.

    • Element order in lists and structs is significant: [1, 2] does not match [2, 1].

    Sorting by order_by is case-insensitive. Two sort values that differ only in case are a tie, which passes to the next ranking rule.

    Validation trims whitespace around a scim_filter before parsing it, but the rule does not trim it at run time. A padded filter can therefore pass validation and then fail to parse during an extraction. An unparseable filter matches every candidate, which makes that ranking rule ineffective without failing the run. Send filters without leading or trailing whitespace. The Veza UI trims filters on save.

    A candidate against which the filter cannot be evaluated is scored as not matching, so it can lose its group and be deleted.

    • : policy endpoints, including the update endpoint above. updates a policy version and does not carry these fields.

    • : policy structure and lifecycle.

    • : identity behavior, including reconciliation of primary and secondary sources of identity.

    Group identities that share an email. Prefer records where is_active is true, then the most recently hired.

    Group identities that share an employee_id. Prefer active records, then employees over contractors, then the most recently hired.

    Group identities that share both employee_id and country, with the default ranking.

    Send an empty object:

    An empty object is the only way to clear a rule. When a request omits the rule or sends null, the API keeps the rule already stored on the policy, because the Policy Settings page does not include the rule in every request it sends.

    Send REST Payload (Insight Point Routing)

    Route Send REST Payload actions through Insight Points for custom OAA integrations

    Overview

    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:

    1. The provider's data source appears in the Send REST Payload action's Data Source dropdown

    2. Selecting it routes the HTTP request through the associated Insight Point

    3. 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 .

    Field
    Required
    Description
    • 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:

    1. In the policy editor, add a Send REST Payload action

    2. In the Data Source field, select your configured Custom Provider

    3. Configure the URL, method, headers, and payload as needed

    4. 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:

    1. No providers configured: Verify you have at least one Custom Provider with external_lifecycle_management_type: SEND_REST_PAYLOAD

    2. Provisioning not enabled: Check that provisioning: true is set on the provider

    3. 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:

    1. Network connectivity: Verify the Insight Point can reach the target API

    2. Firewall rules: Ensure outbound HTTPS is allowed from the Insight Point to the target

    3. DNS resolution: Confirm the target hostname resolves from the Insight Point's network

    4. 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

    → Access Profile
    access-profile-qa

    User 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)

    User meeting neither condition → No profiles assigned (both resolve to non-existent No_Profile_Selected)

    Department-based profile

    Location-based profile

    This pattern is ideal when you have many possible values for a single attribute. You can add as many ELSE IF branches as needed—all within one field.

    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.

    Example 6
    Example 7

    Policy workflows process the authoritative record.

    , and trace logs for each resolved and skipped group. Contact Veza Support to obtain these figures for an investigation.
  • The Identities page changes only after the next extraction. Until the source of identity is extracted again, the page still lists the records that the rule will drop.

  • For an additional source, open the Additional Identity Sources step. The section is at the bottom of that source's card, below the enrichment options.

  • Locate the Duplicate identity resolution section. If no rule exists, it reads "Not configured. Workflows treat every record as a distinct identity."

  • Click Add Resolution.

  • Ranking Rules
    , click
    Add ranking rule
    , then set a
    Filter
    , a
    Sort
    property, or both:
    • Filter: a SCIM filter expression, such as is_active eq true. Records that match rank above records that do not. The filter evaluates only the candidate record, so it cannot reference related entities.

    • Sort: a property to sort by, such as hire_date. Select Descending to prefer the highest value.

    Save stays disabled until every rule sets a filter or a sort property.

    max_duplicate_group_size

    integer

    Largest group that Veza resolves. Range: 2-20. Send 0 or omit the field to use the default of 3. Out-of-range values are clamped when the rule runs. Larger groups pass through unresolved.

    descending

    bool

    If true, order_by sorts in descending order.

    A record that lacks a key property, or holds a null value for it, is not grouped and passes through unchanged.

    dedup_key_properties

    array of strings

    Property names whose combined values identify a person. All properties must match for two records to be duplicates; list order does not matter. Names are matched exactly against the record's own properties, so nested or dotted paths are not supported. Reserved sys_attr_ names, empty or whitespace-only names, and duplicate entries are rejected.

    ranking_rules

    array of RankingRule

    scim_filter

    string

    SCIM filter expression. Matching candidates rank above those that do not. The filter sees only the candidate identity, not related entities.

    order_by

    string

    How resolution works

    Enabling a rule on an existing policy, or changing ranking rules so that a different record wins, hard-deletes the non-authoritative identities and removes them from their access profiles. Those records cannot be recovered through the rehire flow, and the UI does not ask for confirmation before saving a rule. Test a rule on a separate, non-production policy first.

    Confirm that a rule took effect

    Configure a rule in the Veza UI

    Before you start

    Open the duplicate resolution settings

    Configure the rule

    Save the rule

    Changes made in Policy Settings affect all versions of the policy, including published, draft, and retired versions.

    Review, edit, or remove a rule

    Rule configuration through the API

    Fields

    RankingRule

    A scim_filter can reference id and type, but they are not valid for dedup_key_properties or order_by unless the record also carries them as properties.

    Matching behavior

    SCIM filter handling for API callers

    API reference

    Examples

    Match on a single field, prefer active records

    Stack multiple ranking criteria

    Match on a composite of two fields

    Clear an existing rule

    Identities
    Confirm that a rule took effect
    Policies
    Update Policy Configuration
    Policies
    Identities

    Ordered rules for choosing the authoritative record. Each rule applies to ties left by the previous one. If empty, the lowest entity ID wins.

    Property to sort by within the scim_filter match group, or the primary sort when scim_filter is empty. Supports strings, numbers, booleans, and lists of strings. Matched by exact name; nested or dotted paths are not supported.

    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.

    No
    configuration_json
    : Unlike
    , Send REST Payload does not use configuration_json. Including it in the request will cause a validation error. Authentication is configured per-action using the
    setting or
    .
  • 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 authority
    . You must add the CA certificate to the Insight Point's truststore:
    • OVA deployment: See Custom Certificate Configuration

    • Install script deployment: See Using Custom Certificates

    )
  • Insight Point: Agent deployment, connectivity requirements, and high availability

  • Open Authorization API: Custom integration development

  • name

    Yes

    Display name for the Custom Provider

    custom_template

    Yes

    When to Use This Configuration

    How It Works

    Configuration

    Insight Point Required: You must have a deployed Insight Point before configuring this feature. Find your Insight Point ID in the Veza UI at Integrations > Insight Points.

    Create Custom Provider with Send REST Payload Support

    Update Existing Custom Provider

    data_plane_id is set at creation and cannot be changed. To use a different Insight Point, delete and recreate the provider.

    Required Fields

    Validation Rules

    Using in Lifecycle Management Policies

    The Data Source field is optional. If left empty, requests execute directly from Veza's infrastructure. Only select a data source when you need Insight Point routing.

    Combining with REST Auth Credentials

    Troubleshooting

    Data Source Dropdown is Empty

    Validation Error: "external_lifecycle_management_type requires provisioning to be true"

    Validation Error: "data_plane_id: Cannot be empty"

    Validation Error: "cannot change external_lifecycle_management_type while provider is in use by LCM"

    Request Fails from Insight Point

    Testing connectivity: The fastest way to verify an Insight Point can reach your target API is to create a webhook at Integrations > Veza Actions, select your Insight Point, enter the target URL, and click Test. This requires only a URL (credentials are optional and no Lifecycle Management policy is required). Once connectivity is confirmed, configure a Send REST Payload action with your Data Source selected for full LCM use. Note that Veza Actions webhooks support Basic and Token authentication only. For OAuth2 or Login-to-Bearer endpoints, proceed directly to the LCM action configuration.

    See Also

    policy editor
    REST Auth Credentials
    Lifecycle Management Integrations
    Send REST Payload Action
    REST Auth Credentials
    SCIM for Custom Applications

    OAA template type (typically application)

    SCIM configuration
    Authorization Header
    REST Auth Credentials
    IF department eq "Sales"
      SalesProfile
    ELSE IF department eq "Engineering"
      EngineeringProfile
    ELSE
      DefaultProfile
    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_Selected
    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
    IF first_name eq "user04"
      Salesforce User
    ELSE
      No_Profile_Selected
    PUT /api/private/lifecycle_management/policies/{policy_id}
    PATCH /api/private/lifecycle_management/policies/{policy_id}
    {
      "primary_duplicate_resolution_rule": {
        "dedup_key_properties": ["email"],
        "ranking_rules": [
          { "scim_filter": "is_active eq true" },
          { "order_by": "hire_date", "descending": true }
        ],
        "max_duplicate_group_size": 3
      }
    }
    {
      "primary_duplicate_resolution_rule": {
        "dedup_key_properties": ["employee_id"],
        "ranking_rules": [
          { "scim_filter": "is_active eq true" },
          { "scim_filter": "worker_type eq \"Employee\"" },
          { "order_by": "hire_date", "descending": true }
        ],
        "max_duplicate_group_size": 3
      }
    }
    {
      "primary_duplicate_resolution_rule": {
        "dedup_key_properties": ["employee_id", "country"],
        "ranking_rules": [],
        "max_duplicate_group_size": 3
      }
    }
    {
      "primary_duplicate_resolution_rule": {}
    }
    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"]
        }
      }'

    Send SQL Command

    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

    Database
    Driver

    The target host must be reachable from the Veza control plane, or from an Insight Point when one is configured for the action (see ).

    Setting
    Description

    A non-empty inline value overrides the corresponding credential field. One credential can drive many actions while individual actions retarget host or database without a new credential entry.

    Credentials live in the SQL Credentials table under Lifecycle Management > Settings > Credentials. Passwords are encrypted at rest and write-only on read, matching the REST authentication credential model.

    To create a credential:

    1. Go to Lifecycle Management > Settings > Credentials.

    2. In the SQL Credentials table, click New SQL Credentials and select the database type.

    3. Enter host, port, database, username, and password (or, where supported, a certificate).

    4. Save. The credential appears in the

    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:

    Database
    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:

    Position
    Value

    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:

    1. Build the SQL statement with driver-native placeholders for every requester-supplied value, and add a Parameters entry for each:

      Position
      Value

    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:

    Mode
    Behavior

    Caveats:

    • SAP IQ requires a non-empty CA Certificate for both verify-ca and verify-full. MySQL also requires a CA certificate for these modes but does not accept a custom CA, so verify-ca and verify-full are not available for MySQL.

    • Custom CA certificates are not supported for MySQL, Oracle, or PostgreSQL. Validation rejects a custom CA for these databases. Microsoft SQL Server and SAP IQ accept a custom CA.

    Set Data Source to route execution through an Insight Point instead of the control plane. Use this when the target database is unreachable from the Veza control plane (for example, a Postgres instance behind a firewall).

    Setting
    Description
    Field
    Description

    rows_affected is exposed to downstream conditions and actions in the workflow context.

    Add the action through the Policy Editor or the policy update API:

    • Policy Editor: open the policy, choose Add New Action, then select Send SQL Command.

    • API: include the action in the policy's actions array. The action type identifier is SEND_SQL_COMMAND. See .

    • 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

    Send REST Payload

    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

    Setting
    Description

    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:

    1. Create a Send REST Payload action in a provisioning policy with placeholders in the JSON payload:

    2. Create a Send REST Payload and add form fields with names that match the placeholders (e.g., role_name, role_id).

    3. 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:

    Attribute key
    Description

    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 prior actions resulted in a change enabled

    • PUT: Replace entire resources; requires JSON payload; sets AnyChanges

    Workflow Integration: The AnyCreated and AnyChanges flags enable conditional workflow execution. Actions configured with Only send if prior actions resulted in a change 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).

    A stored REST credential supplies the authentication header for the request. Credentials live in the REST/XML Credentials table under Lifecycle Management > Settings > Credentials, where one entry serves many actions. To add one, click New REST/XML Credentials. Sensitive fields are encrypted at rest, and an entry can carry a default URL and HTTP method for actions that set neither.

    To use one, select it from the Auth Credentials dropdown in the action configuration. For endpoints that don't require authentication, such as internal services, pre-authenticated webhook URLs, or endpoints behind a VPN, select a credential of type None. See for the supported authentication types and their fields, including the OAuth2 grants Veza performs on your behalf. That page also covers the , which governs how often Veza fetches a token.

    A credential builds the authentication header and overrides the Authorization Header (Legacy) field. In the action editor, selecting any credential, including one of type None, clears the legacy header. For actions configured through the API, a None credential adds no header of its own and leaves an existing inline value in place.

    The field supports these authentication methods:

    • Bearer Token: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

    • API Key: X-API-Key: secret-key-123 or Authorization: ApiKey sk-prod-xyz

    • Custom Headers: Any header format your API requires

    Set Data Source to route the request through an Insight Point instead of the Veza control plane. Use this to reach endpoints that are not publicly accessible, such as internal APIs behind a firewall. Leave it empty to execute from the control plane.

    Setting
    Description
    • Only JSON payloads are supported (no XML, form-data, or other formats)

    • Authentication is header-based. Through a stored credential Veza can run the OAuth2 client credentials and password grants itself, but flows requiring interactive user consent 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

    PostgreSQL

    Native PostgreSQL protocol

    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 prior actions resulted in a change

    When enabled, the statement runs only if a prior action in the workflow modified or created resources. Cannot be combined with .

    SQL Auth Credentials
    picker for any
    Send SQL Command
    action.

    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.

    . To branch on query results, use
    when the data is already in the Access Graph, or
    when a JSON return value is required.
  • Custom CA certificates are not supported for MySQL, Oracle, or PostgreSQL.

  • MySQL

    Native MySQL protocol

    Microsoft SQL Server

    Native TDS protocol

    Oracle

    SQL Auth Credentials

    Stored connection credential. Database type, host, port, database, username, and password (or certificate) are configured once in the SQL Credentials table at 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

    Data Source

    (Optional) Custom Provider data source to route through. Must be configured as an Insight Point Custom Application. When empty, the action runs on the control plane.

    rows_affected

    Rows affected by the statement, as reported by the driver. Use it to assert that an UPDATE or DELETE matched the intended rows.

    Supported targets

    Settings

    Centrally-managed credentials

    Parameter binding

    Form field substitution (Access Requests only)

    Statement validation

    TLS

    Insight Point execution

    Insight Point execution cannot be combined with Only send if prior actions resulted in a change. Setting both datasource_id and the upstream-changes flag is rejected at validation.

    Output

    Configuration

    Limitations

    Insight Point execution
    Sync Identities
    Transformers
    catalog definition
    Update Policy Configuration

    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.

    Get Node From Graph
    Send REST Payload

    Auth Credentials

    Stored REST authentication credential. Required unless the action already has a legacy authorization header. Supplies the authentication header, and a default URL and HTTP method when this action sets neither. For endpoints that don't require authentication, select a credential of type None. See

    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 prior actions resulted in a change

    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)

    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 )

    flag
  • 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

  • POST, PUT, and PATCH methods require non-empty, valid JSON payloads

    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 (Legacy)

    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"
      }
    }

    Data Source

    (Optional) Custom Provider data source to route the request through. The dropdown only shows Custom Providers configured with external_lifecycle_management_type: SEND_REST_PAYLOAD. If no data sources appear, see Custom Application with Send REST Payload for configuration.

    Variable Substitution

    Form field substitution (Access Requests only)

    Form field substitution and identity attribute substitution can be combined in the same payload. For example: {"user": "{email}", "role": "{$form_field.role_name}"} substitutes the identity's email from the source of identity and the role name from the access request form.

    Standard Active Directory attributes available for substitution

    Password output (Early Access)

    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.

    Early Access: Veza Support enables password output for your tenant on request. The producing action (Sync Identities or Reset Password) must also have password output enabled.

    Response Handling

    HTTP Method Guidelines

    Authentication Patterns

    Centrally-managed credentials

    Inline authorization header

    The inline Authorization Header (Legacy) field is deprecated. It appears only on actions that already have an inline header, under the Legacy Authorization Header Detected banner. You can't add one to a new action. Migrate existing configurations to a stored credential.

    Insight Point execution

    TLS certificates: If the target API uses an internal or self-signed CA certificate, the Insight Point must trust that CA or the request will fail with x509: certificate signed by unknown authority. Configure the CA certificate in the Insight Point's truststore before enabling Insight Point routing. See Custom Certificate Configuration (OVA) or Using Custom Certificates (install script).

    Limitations

    Example: Suspend Okta users via REST API

    The Send REST Payload action can call Okta lifecycle APIs to suspend users, enabling workflows that handle leave of absence (LOA) scenarios before native Suspend action support is available.

    Configuration:

    Setting
    Value

    Key notes:

    • User identification: Okta's suspend API requires the user's Okta ID or login. Use the FROM_ENTITY_ATTRIBUTE transformer to look up the Okta login from the Authorization Graph based on a source attribute like employee_id.

    • Authorization format: Okta API tokens must be prefixed with SSWS (e.g., SSWS 00abcd1234...), not Bearer, so use a Header credential rather than a Bearer credential.

    Example workflow condition:

    To suspend users when their SOI lifecycle status changes to a leave state:

    Unsuspending users: To reactivate suspended users, create a separate workflow condition with the unsuspend endpoint:

    This approach is used when the SOI lifecycle status changes back to an active state (e.g., lifecycle_status eq "Employed").

    Standard Active Directory attributes available for substitution
    Sync Identities
    Reset Password
    Password output (Early Access)
    Transformers
    catalog definition
    catalog definition
    Sync Identities
    Reset Password
    REST Auth Credentials
    token reuse window

    Deprecated inline authentication header (e.g., Bearer <token>, X-API-Key: <key>). Appears only on actions that already have one. Use Auth Credentials instead. See

    Surname (sn)

    SAP IQ (Sybase IQ)
    TLS
    TLS
    Parameter binding
    Insight Point execution

    Empty payload: The suspend endpoint requires a POST with an empty JSON object {} as the payload.

    URL

    https://{your-okta-domain}/api/v1/users/{employee_id | FROM_ENTITY_ATTRIBUTE,"OktaUser","employee_id","login"}/lifecycle/suspend

    HTTP Method

    POST

    Auth Credentials

    A Header credential with the value SSWS {your-okta-api-token}

    JSON Payload

    {}

    Inline authorization header
    REST Auth Credentials
    transformer syntax
    Password output (Early Access)
    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/unsuspend

    Assign O365 Licenses with Workday and Azure AD

    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.

    Overview

    When a new employee is hired in Workday, you can configure Veza Lifecycle Management to:

    1. Create a user account in Azure AD

    2. Assign the appropriate Microsoft 365 licenses based on employee attributes (department, role, location)

    3. 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:

    1. Workday Integration: as your source of identity

    2. 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:

    Employee Type
    Department
    License SKU
    License Name

    Create a policy using Workday as the source of identity:

    1. Navigate to Lifecycle Management > Policies

    2. Click Create Policy

    3. Configure the policy in the wizard:

      • Policy Name: Workday Azure License Provisioning

    Add a workflow that triggers when new employees are hired:

    1. Edit your policy and click Create Workflow

    2. Configure the workflow trigger:

      • Workflow Name: New Employee Onboarding

      • Condition: is_active eq true

    First, create the user in Azure AD:

    1. In your workflow, click Add New Action

    2. Select Sync Identities

    3. Configure the action:

      • Description: Create Azure AD user from Workday

    Destination Attribute
    Source/Format
    Continuous Sync

    Before adding the license assignment action, create Access Profiles that contain the license entitlements:

    1. Navigate to Access Profiles > Profiles

    2. Click Create

    3. Configure the profile:

      • Name: Microsoft 365 E3 License

    Repeat this process to create additional Access Profiles for different license types:

    Access Profile Name
    License SKU
    Use Case

    Now add the license assignment using Manage Relationships with your Access Profiles:

    1. Click Add New Action

    2. Select Manage Relationships

    3. 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:

    1. Click Add New Action

    2. Select Create Email

    3. Configure the action:

      • Description: Enable Exchange Online mailbox

    Ensure your actions execute in the correct order:

    1. Sync Identities - Creates the user account (must run first)

    2. Manage Relationships - Assigns licenses via Access Profiles (requires user to exist)

    3. Create Email (optional) - Enables mailbox (requires user and license)

    Use the drag handles in the workflow editor to reorder actions if needed.

    1. Select your policy

    2. Click Dry Run and select Dry Run with Single Identity

    3. In the Identity field, select an employee from the dropdown

    4. Click Show Results to verify:

    1. Identify a test user in Workday (or create one in a test environment)

    2. Ensure the test user matches your workflow conditions

    3. Enable the policy and trigger a sync

    4. 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:

    1. Create a Mover Workflow with the condition: department changed

    2. Add a Manage Relationships action with:

      • Remove Existing Relationships: Yes (removes old licenses)

    To remove licenses when employees leave:

    1. In your Leaver Workflow, add Deprovision Identity action:

      • Remove all entitlements: Yes (removes licenses along with other entitlements)

      • Deprovision Type: Not shown. Azure AD supports only Disable, which Veza applies automatically.

    Alternatively, use Manage Relationships with Remove Existing Relationships enabled before deprovisioning.

    • - Azure AD integration reference

    • - Workday configuration

    Group.ReadWrite.All
  • GroupMember.ReadWrite.All

  • User.EnableDisableAccount.All

  • Completed Extractions: At least one successful extraction for each integration

  • Available Licenses: Sufficient Microsoft 365 licenses in your Azure AD tenant for the license SKUs you plan to assign

  • Administrative Access: Veza administrative access to create 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 Create to create the policy

  • (optionally add
    AND hire_date ge "2024-01-01T00:00:00"
    to limit to employees hired after a specific date). The date format follows ISO 8601 (RFC 3339) syntax.
  • Identity newly matches the condition: Cleared (the workflow runs on every extraction where the identity matches, not only the first time it matches)

  • Entity Type: Azure AD User

  • Integration: Your Azure AD integration

  • Don't create new users: Unchecked (Veza creates users that don't already exist)

  • Update only on create or reactivate: Unchecked (Veza keeps attributes in sync after creation)

  • 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)

  • Entity Type: 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

  • Add conditional license assignments for the new role

    Actions

  • Attribute Transformers

  • Provisioning Activity

  • 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 License

    System Architecture

    Prerequisites

    Finding License SKU IDs: To assign licenses, you'll need the SKU IDs for your Microsoft licenses. You can retrieve these using the Microsoft Graph API endpoint GET /subscribedSkus. For a complete list of Microsoft product names and SKU identifiers, see the Microsoft product names and service plan identifiers documentation.

    Implementation Steps

    Step 1: Identify License Requirements

    SKU IDs versus Display Names: The SKU IDs shown above (like ENTERPRISEPACK) are internal Microsoft identifiers. The display names (like "Microsoft 365 E3") are what you see in the Azure portal and Veza UI.

    Step 2: Create the Lifecycle Management Policy

    Step 3: Configure the Joiner Workflow

    Step 4: Add Sync Identities Action

    Usage 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.

    Converting Date Formats Between Systems

    When mapping date attributes between Workday and Azure AD, you may need to convert date formats. Use the DATE_FORMAT transformer with Go time layout syntax to specify the output format.

    Example: Converting hire_date to ISO 8601 format

    If Workday provides dates in MM/DD/YYYY format but Azure AD expects YYYY-MM-DD:

    Destination Attribute
    Source/Format

    The reference date for Go time layouts is Mon Jan 2 15:04:05 MST 2006. Common format patterns:

    Pattern
    Output Example
    Description

    For more transformer options, see .

    Step 5: Create Access Profiles for Licenses

    Access Profiles Best Practice: Create separate Access Profiles for each license type rather than combining multiple licenses in one profile. This provides flexibility for conditional assignment and easier maintenance.

    Step 6: Add License Assignment Action

    Basic License Assignment (All Employees)

    Conditional License Assignment (By Department)

    Conditional License Assignment (By Employee Type)

    Step 7: Add Email Creation Action (Optional)

    Create Email versus License Assignment: The Create Email action specifically assigns an Exchange Online license and enables email functionality. If your main license (E3, E5) already includes Exchange Online, this step may be redundant. Use this action when you need to ensure email is enabled regardless of which base license is assigned.

    Step 8: Configure Action Order

    Access Profiles Must Exist First: The Access Profiles referenced in your Manage Relationships actions must be created before you configure the workflow. Access Profile creation (Step 5) is a one-time setup that happens outside the workflow itself.

    Step 9: Test the Configuration

    Test with Simulation Dry Run

    Test with a Single User

    Advanced Configuration

    Multiple License Assignments

    Access Profile Strategy: Option 2 (separate Access Profiles) provides more flexibility for conditional logic and makes it easier to manage license changes independently. Option 1 is simpler when all licenses are always assigned together.

    License Removal on Role Change (Mover Workflow)

    License Removal on Termination (Leaver Workflow)

    See Also

    Configured Workday for Lifecycle Management
    Configured Azure AD for Lifecycle Management
    Access Profiles
    Azure Lifecycle Management
    Workday Integration
    Lifecycle Management with Workday, Okta, and Active Directory

    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

    Attribute Transformers

    Full ISO 8601 with time zone

    01/02/2006

    03/15/2024

    US date format

    Attribute Transformers

    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.

    Terminology: For definitions of transformer, formatter, pipeline function, and condition, see .

    An attribute transformer is the complete configuration for mapping a source attribute to a destination attribute. It consists of:

    Component
    Description
    Example

    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.

    Term
    Description
    Examples

    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:

    1. Assign a name and description to the transformer, and specify the data source to which it applies.

    2. Entity Type: Choose the target entity type in the destination system.

    3. 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. To edit or delete common transformers, open the policy's draft version, select the Workflow Components tab, and select the Transformers card. Remember that Sync Identities and Deprovision 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:

    Destination Attribute
    Formatter
    Apply to existing users

    For activating a re-hired employee:

    Destination Attribute
    Formatter
    Apply to existing users

    To clear an attribute value, leave the formatter field empty. The behavior at the destination depends on system type:

    • SQL-based destinations (Oracle, MySQL, MSSQL): an empty formatter sends NULL to the database column.

    • SCIM destinations: an empty formatter sends an empty string to the provider.

    • Active Directory: an empty formatter clears the attribute on the user account.

    For deactivating a user or clearing a manager reference:

    Destination Attribute
    Formatter
    Apply to existing users

    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:

    Destination Attribute
    Formatter Example
    Apply to existing users

    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 the draft version of a Lifecycle Management policy, select the Workflow Components tab, and select the Alias Definitions card. Click + on the card to add an alias. Each alias requires:

    • Alias Name: Must start with $ followed by at least one lowercase letter, number, or underscore. Additional $ characters can appear after the first character. The $ prefix is added automatically if omitted. Valid examples: $workday, $hr_system, $ad$corp. Invalid examples: $, $AD (uppercase), $$double (multiple leading

    Aliases can resolve attributes from two contexts:

    • Input: Values from the source system before any sync action runs (the authoritative data)

    • Output: Values currently in the target system (what's already provisioned)

    By default, the system checks output first, then falls back to input. Use suffixes to explicitly control resolution:

    Suffix
    Resolves From
    Example
    Use Case

    Use these operators in IF conditions to compare attribute values:

    Operator
    Meaning
    Supported Types

    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:

    Destination Attribute
    Formatter
    Description
    Example

    Refer to the page for complete documentation of all supported functions, parameters, and usage examples. The reference includes:

    Category
    Functions
    Use Cases

    You can pipeline multiple transformation functions together, separated by a vertical bar (|). Each will apply in sequence, allowing for complex attribute formatters that use the output of one function as the input of another.

    • {name | UPPER}

      • If name = Smith, the result is SMITH.

    • {first_name | SUB_STRING,0,1 | LOWER}.{last_name | LOWER}

    Before deploying transformers in production policies, you can validate formatter expressions directly in the Veza UI. This allows you to verify that your transformation logic produces the expected output without affecting live data.

    When adding or editing a transformer in a policy, look for the Test button next to the Formatter field. Clicking it opens the Test Formatter dialog:

    1. Enter your transformer expression in the Formatter field

    2. Click the Test button to open the test dialog

    3. 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

    Expression
    Test Input
    Expected Output

    For complex pipelines, test incrementally:

    1. Test the first function alone to verify it handles the input correctly

    2. Add each subsequent pipe and verify intermediate results

    3. 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.

    Scenario
    Use

    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:

    Transformer & Entity Type
    Attribute
    Value Format
    Apply to existing users
    Description

    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:

    1. New values are added to the end of the existing attribute values

    2. Duplicate values are automatically removed

    3. The order of existing values is preserved

    4. 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

    Leaver: Move a user’s Active Directory account to an Organizational Unit (OU) reserved for terminated accounts.
    Destination Attribute: Choose the attribute that Veza will create or update for the target entity.
  • 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.

    • Set for new users only / Set for new and existing users: Select Set for new and existing users to keep the attribute synced on existing target identities, while applying any defined transformations. By default (Set for new users only), attributes will not be synced if the target identity already exists.

    email

    {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

    -

    between source and target systems while defining LCM Workflow Conditions
  • You need to detect movers based on changes in a specific system

  • Test formatters (for validation before deployment)
    $
    ).
  • 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

    email

    {first_name}{last_name}@company.com

    Yes

    Email address

    OktaAccountTransformer OktaUser

    login

    `{first_name

    SUB_STRING,0,1

    LOWER}.{last_name

    email

    {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

    email

    {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

    member
    ,
    memberOf
    ,
    roleOccupant
  • url, 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

    Apply to existing users

    Whether to update the attribute on existing users. The transformer editor shows this choice as Set for new users only or Set for new and 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.com
    IF $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

    Dry Run

    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"]

    Attribute transformers are also available when mapping columns in CSV Upload integrations. This enables you to combine columns, reformat dates, standardize case, and apply other transformations during CSV import—without requiring Lifecycle Management workflows.

    Key Terminology

    Adding transformers

    Best practices

    When to use common transformers

    When to use transformer functions

    Formatter syntax

    Some formatters should enable continuous synchronization for the attribute, while others should not. For example, the value of "Created By" should be immutable once a user account is provisioned. Other attributes that represent a state or status should be synchronized throughout the user's or account's lifecycle.

    Simple Value Setting

    Empty Values

    Attributes marked as required or configured as unique identifiers cannot have an empty formatter — the policy will not save until a value is provided for those fields.

    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.

    Attribute references

    Alias Definitions

    Early Access: Alias Definitions is currently in early access. Contact your Veza representative to enable this feature for your tenant.

    When to use aliases

    Alias Naming: The system automatically adds a $ prefix to all alias names. For example, if you create an alias named workday in the UI, it becomes $workday when used in formatters and conditions.

    Configuring aliases

    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.

    Input and output resolution

    When to Use Suffixes: Use $in when you need the authoritative value from the source system (e.g., HR system). Use $out when you need to compare against what's currently provisioned in the target. Without a suffix, the system checks the target first—useful when you want the most recent value regardless of source.

    Comparison operators

    String List Attributes: For multi-value attributes (string lists), co checks whether the list contains an element that exactly matches the value, for example: IF $workday.roles co "Manager". eq compares the entire list as a set, ignoring order and duplicates, and ne is its negation. Other operators evaluate to false. Matching is case-sensitive.

    Examples

    Transformation functions

    Transformation function categories

    Contact Veza if you require additional transformations for your use case.

    Then Apply {#then-apply}

    Example Then Apply

    Testing Transformers Inline

    Using the Test Interface

    Testing Examples

    Testing Then Apply

    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.

    When to Use Inline Testing versus Dry Run

    Common Transformers

    Create common transformers to consistently form attributes for specific entity types, and reuse them to avoid errors and save time when creating actions for that entity type. The order of common transformers matters when multiple transformers set the same destination attribute. Drag-and-drop to reorder common transformers and control precedence.

    $target Attribute Transformer Function

    Important: The $target function can only be used within the same Action.

    Using Transformed Attributes as Lookup Keys

    Order matters: Transformers run in the order they are defined. Place the transformer that sets the source attribute before any transformer that references it via $target.

    Custom Attribute Transformer Function

    Naming Convention: Custom functions must be in ALL CAPS and prefixed with a $ to avoid conflicts with built-in functions.

    Appending Multi-Value Attribute (Active Directory only)

    This feature is specific to Active Directory and is not available for other integrations.

    Attribute Synchronization
    Transformer Reference
    username@sample.com
    Understanding Conditions and Transformers

    Active Directory, Okta, Google Workspace, SaaS applications

    Enabled

    Enabled

    $in

    Boolean, string, number, timestamp

    user_id

    Clean and format string data

    john.doe

    No

    You can also draft a Formatter with Access AI. Click Create with AI next to the Formatter field to open a chat thread that suggests a value scoped to the destination attribute and entity type. See .

    Integrations

    Overview of supported provisioning integrations in Veza, with capabilities and supported actions for target applications and sources of identity.

    Overview

    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:

    1. Native Integrations: Direct, API-based provisioning, with out-of-the-box support for 25+ validated target applications (listed below).

    2. SCIM 2.0 Protocol: Standards-based provisioning for any enterprise application that exposes a SCIM 2.0 interface.

    3. 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.

    4. 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:

    Identity Source
    Supported Entity Types
    Notes

    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.

    Target Application
    Manage Relationships
    Sync Identities
    Deprovision Identity
    Additional Actions
    Supported Entitlement Types
    Notes

    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.

    1. Go to Veza Administration > System Settings

    2. In the Integrations section, set the global Extraction Interval

    3. To override the global setting for specific integrations, use the Active Overrides section

    Available extraction intervals are:

    • Auto (each integration's default, which is 1 hour for most of them)

    • 1 Hour

    • 6 Hours

    • 12 Hours

    One hour is the shortest extraction interval for most integrations. A 15-minute option appears in the Discovery Interval control, which is a separate setting and does not apply to extraction. See .

    To manually trigger an extraction:

    1. Go to Integrations > All Data Sources

    2. Search for the desired data source

    3. 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:

    1. Open the Integrations page (in the Featured section of the navigation sidebar), or Lifecycle Management > Integrations (in the Products section).

    2. Search for the integration you want to enable and open its settings.

    3. 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:

    1. Open Lifecycle Management > Integrations (in the Products section of the navigation sidebar), or the main Integrations page (in the Featured section)

    2. Search for the integration and click the name to view details

    3. In the Properties sidebar on the right (not the Properties tab), click the magnifying glass icon next to the Provisioning Support value

    Many identity source systems have API rate limits that can affect extraction timing. Avoid forcing repeated extractions within short time windows (typically 5 minutes) to prevent API errors that delay workflow execution.

    For systems using custom or user-defined fields (UDFs), maintain clear documentation of:

    • Field purpose and mapping

    • Expected data formats and validation rules

    • Which fields are used in workflow trigger conditions

    This documentation ensures consistency when fields are added or modified.

    Understand the data retention policies of your identity sources, particularly for terminated employees or contractors. Some systems retain terminated records for limited periods (e.g., 90 days), which affects leaver workflow design. Plan workflow timing to ensure LCM can process records before they're purged from the source system.

    Changes to core identity fields can break LCM workflows. Coordinate with system administrators before modifying:

    • Unique identifiers (employee ID, username)

    • Employment status fields

    • Date fields (hire date, termination date)

    • Location or department identifiers

    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

    Workday, Okta, and Active Directory

    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.

    This guide uses Okta as the Identity Provider example, but the same architecture applies to any Veza-integrated IdP. You can substitute Azure AD, OneLogin, PingOne, or any other supported IdP in place of Okta throughout this guide.

    System Architecture

    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:

    Integration Architecture

    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:

    1. 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:

    1. Go to Access Profiles > Profiles

    2. Click Create

    3. 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:

    1. Navigate to Lifecycle Management > Policies

    2. Click Create Policy

    3. Configure the policy:

      • Policy Name: Workday Employee Lifecycle

    Now add a workflow for new employee onboarding:

    1. Edit your Workday Employee Lifecycle policy

    2. Click Create Workflow

    3. Configure the workflow:

      • Workflow Name: Active Employee

    Add a workflow for handling employee role changes:

    1. Edit your Workday Employee Lifecycle policy

    2. In the workflows list, click Create

    3. Configure the workflow:

      • Workflow Name: Mover Workflow - Regional Sales Manager

    Finally, add a workflow for employee termination:

    1. Edit your Workday Employee Lifecycle policy

    2. In the workflows list, click Create

    3. 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.

    1. Select Workday Employee Lifecycle policy.

    2. Click Dry Run at the top of the page.

    3. Select Dry Run with Single Identity.

    4. In the Identity field, select an employee name from the dropdown menu.

    1. Select Workday Employee Lifecycle policy.

    2. Click Create Draft. If a draft already exists, click Go to Draft Version instead.

    3. Select Edit Workflow.

    4. 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 Run 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

    • Entity Type: OktaUser

    • Don't create new users: Unchecked (Veza creates identities that don't already exist)

    • Update only on create or reactivate: Unchecked (Veza keeps attributes in sync after creation)

    Destination Attribute
    Source/Format
    Continuous Sync
    Notes

    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

    • Entity Type: ActiveDirectoryUser

    • Don't create new users: Unchecked (Veza creates identities that don't already exist)

    • Update only on create or reactivate: Unchecked (Veza keeps attributes in sync after creation)

    Destination Attribute
    Source/Format
    Continuous Sync
    Notes

    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

    • Entity Type: OktaUser

    • Remove all entitlements: No

    • Deprovision Type: Disable

    Controls the offboarding process for on-premises Active Directory, including moving accounts to a terminated user's organizational unit.

    Configuration:

    • Description: Disables identities in Active Directory

    • Entity Type: ActiveDirectoryUser

    • Remove all entitlements: No

    • Deprovision Type: Not shown. Active Directory supports only Disable, which Veza applies automatically.

    Destination Attribute
    Value
    Continuous Sync

    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:

    1. In your Joiner workflow, after the Sync Identities actions, add:

      • Add New Action > Create Email

      • Configure for your email system

    2. 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:

    1. Navigate to Lifecycle Management > Provisioning Activity

    2. Filter by policy name to see all actions for your Workday policy

    3. Look for failed actions and investigate error messages

    4. 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

    Dry Run
    Create with AI for Lifecycle Management
    1 Day
  • 2 Days

  • 3 Days

  • 7 Days

  • 30 Days

  • Any fields used in workflow trigger conditions

    ActiveDirectoryUser

    Supported Integrations

    Identity Sources

    Target Application Support

    Configuring Integrations for Provisioning

    Insight Points for provisioning

    Scheduled and Manual Extractions

    Enabling provisioning

    Checking provisioning data sources

    Best practices for identity sources

    API rate limits

    Custom field management

    Data retention policies

    Critical field changes

    Additional Resources

    Send REST Payload
    Send XML Payload
    Send SQL Command
    Insight Point Documentation
    Extraction and Discovery Intervals
    The Edit Integration panel showing the Enable usage for Provisioning checkbox
    The Integrations overview showing Enabled in the Lifecycle Management column for configured integrations
  • Administrative access to Veza to create Lifecycle Management policies

  • Source of Identity Integration: Your Workday integration (entity type Workday Worker, set by the integration you select)

  • Click Create to save the basic configuration

  • 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.

  • Identity newly matches the condition: Cleared With this checkbox cleared, the workflow runs on every extraction where the identity matches the condition, not only the first time it matches. Updates to a user's source attributes (such as email, department, manager, or role) continue to reach the target application after the user is provisioned.

  • Add actions to the workflow as detailed in the section.

  • Condition: is_active eq true AND first_name eq “Sarah” AND last_name eq “Johnson” AND position eq “Regional Sales Manager”

  • Identity newly matches the condition: Cleared

  • 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. 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.

  • On the Policies list, open the policy row's ⋮ menu.

  • Select Enable, then confirm.

  • Logout the user from all current sessions: No

    Add New 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: Engineering
    Name: Marketing Department Access
    Profile Type: Application Entitlements
    Description: Standard access for Marketing department employees
    
    Entitlements:
    - Active Directory Group: Marketing
    - Okta Group: Marketing

    email

    {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 information
    Trigger: 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 instructions
    Trigger: 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 manager
    Trigger: 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 notification
    Trigger: 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 compliance
    Trigger: 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"

    JML Process Flow

    Prerequisites

    Implementation Steps

    Step 1: Define Access Profiles

    Example: Engineering Department Profile

    Example: Marketing Department Profile

    Step 2: Create a Lifecycle Management Policy associated with Workday

    Step 3: Configure Joiner Workflow

    Step 4: Configure Mover Workflow

    Step 5: Configure Leaver Workflow

    Step 6: Enable and Test the Policy

    Test using Simulation Dry Run

    Test using Draft Versioning

    Make changes to the Workday application to test your policy

    Identity Synchronization Configuration Reference

    Enable Identity Synchronization

    Sync Okta Identities

    Attribute Mappings

    Conditional Actions

    Sync Active Directory Identities

    Attribute Mappings

    Conditional Actions

    Deprovisioning Configuration Reference

    Deprovision Okta Identities

    Deprovision Active Directory Identities

    Attribute Transformations

    Expanded Joiner/Mover/Leaver Scenarios

    Joiner Scenarios

    Example 1: Full-Time Employee Onboarding

    Example 2: Contractor Onboarding

    Mover Scenarios

    Example 1: Department Change

    Example 2: Promotion to Manager

    Leaver Scenarios

    Example 1: Standard Termination

    Example 2: Involuntary Termination (Security Risk)

    Advanced Attribute Transformer Examples

    Workday to Okta Transformer (Enhanced)

    Workday to Active Directory Transformer (Enhanced)

    Advanced Configuration

    Using Attribute Overrides

    Email Write-Back to Workday

    Conditional Logic Best Practices

    Location-Based Conditions

    Role-Based Conditions

    Employment Type Conditions

    Monitoring and Troubleshooting

    Provisioning Activity Monitoring

    Common Issues and Solutions

    Username Conflicts

    Missing Attributes

    Group Assignment Failures

    Configured Workday for Lifecycle Management
    Configured Okta for Lifecycle Management
    Configured Active Directory for Lifecycle Management
    Identity Syncing mode
    Identity Override Attributes
    Provisioning Activity
    Fallback Formatters
    JML Workflow

    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

    email

    {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

    Configuration Reference
    Microsoft Lightweight Directory Access Protocol

    CustomHRISEmployee

    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, Delete Identity

    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

    -

    Active Directory
    ADP Workforce Now
    Active Directory
    Beeline
    Coupa CCW
    Custom IDP
    Custom HRIS (OAA)
    Database HRIS
    HiBob
    LDAP
    Ivanti Neurons HR
    Azure AD
    Google Workspace
    Okta
    Oracle HCM
    ServiceNow
    UKGPro
    Workday
    Atlassian Cloud
    AWS SSO
    Azure
    Custom Application (OAA Template)
    Database Application
    Exchange Server
    GitHub
    LDAP
    Google Workspace (Google Cloud)
    MySQL
    Okta
    Oracle Database
    Oracle Fusion Cloud
    Oracle HCM
    PagerDuty
    PostgreSQL
    Salesforce
    SCIM
    ServiceNow
    Snowflake
    Splunk Enterprise
    Workday

    Trigger Conditions Reference

    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 Filter Syntax Overview

    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".

    Comparison Operators

    The pr (present) operator does not evaluate as expected in LCM conditions. To test that an attribute has a value, use attribute ne "".

    String Operators

    Operator
    Name
    Description
    Example
    Operator
    Name
    Description
    Example
    Operator
    Name
    Description
    Example

    Timestamp comparisons use ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ).

    Operator
    Name
    Description
    Example

    For attributes that contain multiple values (arrays), the following operators are supported:

    Operator
    Name
    Description
    Example

    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.

    Operator
    Description
    Example
    • 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)

    Function
    Purpose
    Example

    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:

    Step
    Function
    Input
    Output

    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 .

    Available in Veza v2026.8.31 and later.

    A WHEN() expression compares a date attribute to the current date, a fixed date, or another date attribute. Veza converts each expression into the equivalent embedded-transformer comparison (see ) every time it evaluates the condition, so you don't write the NOW and DATE_ADJUST_DAY pipeline yourself.

    • The attribute comes first and is required.

    • WHEN and the pattern keywords are case-insensitive. when(start_date within last 7 days) and WHEN(start_date WITHIN LAST 7 DAYS) are equivalent.

    • A WHEN() expression is a complete clause. Combine it with other clauses using

    You can use WHEN() in workflow trigger conditions (Identity matches this condition) and in Condition String conditions. Transformers and attribute formatters don't accept it.

    In the table, N and M are day counts. A day count is a positive whole number or the name of an attribute that holds one. DATE is a date in YYYY-MM-DD format or the name of another date attribute.

    Pattern
    Matches when the attribute is
    Example

    WHEN() counts only in days. Write day or days after the count. For a week, use 7 days. For month and year spans, use a embedded transformer instead.

    The condition editor rejects an expression that:

    • Has no closing parenthesis, or has no attribute before the pattern

    • Uses a day count of zero or less, or a between range where N isn't less than M

    • Uses a date that isn't in YYYY-MM-DD format

    Each attribute that begins a WHEN() expression needs an entry in Properties for ‘When’ Expressions in Conditions. The entry sets the format and time zone Veza uses to build the comparison dates for that attribute.

    In Select Format, choose Date Only for attributes that store a calendar date, such as 2026-01-15. Choose Date and Time for attributes that store a timestamp, such as 2026-01-15T08:00:00Z.

    The time zone decides when "today" begins and ends. Choose one time zone for every identity, or select Based on Location (Lookup Table) to read each identity's time zone from a policy lookup table. For a lookup, select the Key Attribute on the identity, the Lookup Table, the Match on Column that holds the key values, and the return column that holds an IANA time zone name (such as America/New_York) or a UTC offset (such as -05:00). An identity whose key value has no matching row uses UTC. An identity without the key attribute doesn't match the WHEN() expression.

    To add an entry:

    1. Open the policy's draft version and select the Workflow Components tab.

    2. Select the Properties card.

    3. Under Properties for ‘When’ Expressions in Conditions, click Add.

    4. In Select Source Attributes, select one or more attributes. The list shows only date and time attributes, and an attribute can belong to only one entry.

    Changes to these entries take effect when you publish the policy version. You can't delete an entry while a WHEN() expression uses one of its attributes.

    While you type a condition, the editor flags any WHEN() attribute that has no entry, and the condition isn't valid until you add one. Click Add Properties to create an entry, or Apply Properties to add the attributes to the most recently added entry with its format and time zone.

    is today, is DATE, before today, and after today compare dates only, whatever the format. The time zone doesn't apply to before DATE, after DATE, and is DATE. A policy saved through the API without an entry for an attribute uses Date Only and UTC for that attribute.

    An identity that has no value for the attribute doesn't match the within, between, after, or is patterns. It does match the before patterns, because Veza treats a missing date as earlier than any date. To exclude those identities, add a non-empty check:

    Veza compares attribute values in ISO 8601 form, such as 2026-01-15 or 2026-01-15T08:00:00Z, as dates. It compares values in other formats, such as 01/15/2026, as text, and those comparisons don't return reliable results.

    Veza evaluates a WHEN() expression against the current time at each policy run, so an identity can start matching without any change to its attributes. With Have changed and Specific properties selected, a workflow doesn't run for a match caused only by the passage of time. See the .

    Before enabling a policy, use the Dry Run feature to preview which identities match your trigger conditions. This helps catch overly broad or restrictive conditions before they affect real accounts.

    Consider what happens when attributes are null or empty:

    1. Check value case: String values are matched case-sensitively — eq "Sales" will not match sales. Normalize with LOWER or UPPER if needed (see ).

    2. Check attribute names: Ensure the attribute name matches the source attribute, using its lowercase form

    1. Add specificity: Combine multiple conditions with and

    2. Check for broad patterns: co "" matches all non-null values

    3. Verify logical grouping: Ensure and/or

    1. Use ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ

    2. Include timezone: Always use Z suffix for UTC

    3. 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

    and
    ,
    or
    , and parentheses, for example
    WHEN(start_date within next 7 days) and department eq "Sales"
    .

    Uses is now. Use before now or after now instead.

  • Adds words after the pattern, such as as datetime or in America/New_York. Set the format and time zone in the policy properties instead.

  • Choose the format and the time zone, then click Save.

  • Verify data types: String values need quotes, booleans don't
  • Review operator choice: co for contains vs. eq for exact match

  • Use Dry Run: Test the condition against specific identities

  • precedence is correct

    - 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

    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\"}"
    WHEN(<attribute> <pattern>)

    within last N days

    In the last N days, up to and including today

    WHEN(start_date within last 7 days)

    within next N days

    WHEN(termination_date before today) and termination_date ne ""
    # Joiner: start date is today or in the next 7 days
    WHEN(start_date within next 7 days) and employee_types co "Full Time"
    
    # Leaver: termination date has passed
    WHEN(termination_date before today) and termination_date ne ""
    
    # Cleanup: terminated between 30 and 90 days ago
    WHEN(termination_date between 30 and 90 days ago) and employment_status eq "Terminated"
    # Good: Specific and targeted
    department eq "Engineering" and job_level ge 3 and is_active eq true
    
    # Avoid: Too broad, may affect unintended users
    department eq "Engineering"
    # Use parentheses for clarity when mixing and/or
    (department eq "IT" or department eq "Engineering") and is_active eq true
    
    # Without parentheses, this evaluates differently due to precedence:
    # department eq "IT" or (department eq "Engineering" and is_active eq true)
    department eq "IT" or department eq "Engineering" and is_active eq true
    # Explicit check for non-empty department
    department ne "" and department eq "Engineering"
    
    # Check for active status before other conditions
    is_active eq true and department eq "Engineering"

    Numeric Operators

    Boolean Operators

    Timestamp Operators

    String List Operators

    The co operator is most commonly used for checking membership in a list. Use eq for exact list matching and ne "" to verify the attribute has a value.

    Case sensitivity

    This differs from the SCIM standard, which compares string values case-insensitively unless the attribute is defined as caseExact. Lifecycle Management always compares string values case-sensitively.

    Logical Operators

    The not() operator takes a condition in parentheses and can negate a group, such as not(department eq "IT" or department eq "Engineering"). To negate a single comparison, ne is shorter: status ne "Terminated".

    Precedence

    Common Trigger Condition Patterns

    Joiner Scenarios

    Mover Scenarios

    Leaver Scenarios

    Attribute-Based Access Control

    System Attributes in Conditions

    Dynamic Value Comparisons with Embedded Transformers

    Syntax

    Common Functions for Dynamic Conditions

    Example: 2-Day Leaver Window

    Example: Pre-Hire Provisioning

    Example: Post-Termination Cleanup

    Escaping quotes: When embedding transformers in conditions, you must escape inner quotes with backslashes. For example: \"-05:00\" and \"DateOnly\".

    Timezone consideration: Use UTC_TO_TIME_ZONE to ensure date comparisons align with your organization's business timezone. Without timezone conversion, comparisons use UTC which may cause workflows to trigger at unexpected times.

    Related Documentation

    Relative Date Conditions with WHEN()

    Supported patterns

    Set the date format and time zone

    Identities without a date value

    Examples

    Create with AI writes time-based conditions as WHEN() expressions. For month and year spans, it writes a DATE_ADJUST expression instead. See .

    Best Practices

    Use Specific Conditions

    Test with Dry Run

    Combine Conditions Thoughtfully

    Handle Edge Cases

    Troubleshooting

    Condition Not Matching Expected Users

    Condition Matching Too Many Users

    Timestamp Issues

    Related Topics

    Dynamic Value Comparisons with Embedded Transformers
    system attributes
    System Attributes
    System Attributes
    Transformer Reference
    Understanding Conditions and Transformers
    Dynamic Value Comparisons with Embedded Transformers
    DATE_ADJUST
    LCM FAQ
    Case sensitivity
    Understanding Conditions and Transformers
    Policies
    Conditions and Actions
    Attribute Transformers

    Not Equal

    Does not match

    status ne "Terminated"

    co

    Contains

    Substring match

    email co "@company.com"

    sw

    Starts With

    Prefix match

    employee_id sw "EMP"

    ew

    Ends With

    Suffix match

    email ew "@company.com"

    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

    ne

    Not Equal

    Boolean inverse

    is_contractor ne true

    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"

    eq

    Equal

    List exactly matches value(s)

    roles eq "Admin"

    ne

    Not Equal

    List does not match value(s)

    tags ne "deprecated"

    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

    In the next N days, starting today

    WHEN(start_date within next 7 days)

    between N and M days ago

    Between N and M days in the past, excluding both boundary days. N must be less than M.

    WHEN(termination_date between 30 and 90 days ago)

    between N and M days from now

    Between N and M days in the future, excluding both boundary days. N must be less than M.

    WHEN(contract_end_date between 30 and 90 days from now)

    before now, after now

    Earlier or later than the current time. With the Date Only format, Veza compares against today's date.

    WHEN(termination_date before now)

    before today, after today

    Earlier or later than today's date

    WHEN(start_date after today)

    is today

    Today's date

    WHEN(start_date is today)

    before DATE, after DATE

    Earlier or later than DATE

    WHEN(start_date before 2027-01-01)

    is DATE

    The same as DATE

    WHEN(start_date is hire_date)

    N days before <attribute>

    Earlier than the date N days before the other attribute

    WHEN(start_date 5 days before hire_date)

    N days after <attribute>

    Later than the date N days after the other attribute

    WHEN(start_date 30 days after hire_date)

    Transformer Reference
    System Attributes
    Dynamic Access Profiles
    Attribute Mapping
    Create with AI for Lifecycle Management

    Transformer Reference

    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:

    1. Basic Usage: Shows the transformer used alone with a simple source attribute

    2. In a Pipeline: Demonstrates chaining multiple transformers together

    3. 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:

    Parameter
    Required
    Type
    Description

    Returns: String — the formatted date/time string

    Examples:

    Input
    Expression
    Output

    The reference date Mon Jan 2 15:04:05 MST 2006 breaks down as:

    Component
    Reference Value
    Meaning
    Output Format
    Go Layout String
    Example Output

    Instead of Go layout strings, you can use these named aliases (case-insensitive):

    Alias
    Equivalent Layout
    Example Output

    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:

    Parameter
    Required
    Type
    Description

    Returns: String — the input value with all characters converted to lowercase

    Examples:

    Input
    Expression
    Output

    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:

    Parameter
    Required
    Type
    Description

    Returns: String — the input with all occurrences of search replaced by replacement

    Examples:

    Input
    Expression
    Output

    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:

    Parameter
    Required
    Type
    Description

    Returns: String — the extracted substring

    Examples:

    Input
    Expression
    Output

    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:

    Parameter
    Required
    Type
    Description

    Returns: String — the input value with all characters converted to uppercase

    Examples:

    Input
    Expression
    Output

    Notes: Only affects alphabetic characters. Numbers and special characters pass through unchanged.

    Notifications

    Customizing email notifications and Webhook configuration for Lifecycle Management events and Access Requests.

    Email Templates Overview

    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.

    Template Management: You can manage notification templates in the Veza UI (Lifecycle Management > Settings > Notifications) or through the Notification Templates API.

    Access Reviews Notification Templates: For access review workflow notifications, see .

    Custom Email Templates

    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

    • 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:

    1. Navigate to Lifecycle Management > Settings > Notifications

    2. Click Create Template

    3. Select For custom mail (as opposed to "For event")

    4. Define your template name, subject, and body using HTML and placeholders

    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 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

    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:

    1. Verify exact casing: Placeholders are case-sensitive

      • ✅ Correct: {{ENTITY_TYPE}}

      • ❌ Wrong: {{entity_type}}, {{EntityType}}, {{Entity_Type}}

    Best Practices:

    • Start with predefined placeholders: Use the documented static placeholders (uppercase) whenever possible

    • Test templates: Send test notifications to verify placeholder replacement before deploying to production

    • Document custom attributes: Keep a reference of the attribute names and casing used by your integrations

    • Use typed format for clarity

    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:

    Form
    Example
    Resolves against

    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:

    Surface
    Source-of-identity attributes
    Target (output entity) attributes

    Target (output entity) attributes are only available downstream when the action that ran produces output entities:

    Action
    Populates output entities

    When in doubt, confirm the source of an attribute against the producing action rather than assuming it is available everywhere in the workflow.

    The qualified form requires the exact entity type string that the integration registered, not a friendly label from the UI. For OAA integrations, that string has the form OAA.<Provider Display Name>.<Entity Type>, and it includes any spaces in the provider's display name.

    For example, a Jira Cloud user's email attribute is referenced as:

    The space inside Jira Cloud is required. Veza splits the entity type from the attribute on the final period, so spaces inside the provider name are preserved. If the provider display name contains a period, the qualified form cannot address it.

    To find the canonical entity type for an integration, inspect an entity of that type in the Veza catalog or query the entity type through the API. Use the registered type string exactly as shown, including capitalization and spaces.

    For a given notification, Veza selects the template to render in this order:

    1. A custom template referenced by ID on the action or notification setting, if one is configured.

    2. The template assigned to the matching event usage, if one exists.

    3. 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 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:

    1. Go to Policies and select a policy.

    2. Click Policy Settings in the policy header.

    3. Scroll down to Notifications and click Add Notification.

    4. Choose the Webhook notification type.

    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}

    A subset of these functions is also supported in identity mapping template expressions. See Identity Mapping Templates for the supported list.

    Reading the Examples

    APPEND

    APPEND

    This transformer enables string concatenation by appending text to the end of attribute values during identity provisioning workflows.

    Parameter Format

    Characters (STRING, required)

    Basic Usage

    • Destination Attribute: email

    • Formatter: {username}

    • Then Apply: | APPEND, "@company.com"

    • Result: If username = john.smith, output is john.smith@company.com

    In a Pipeline

    • Destination Attribute: display_name

    • Formatter: {first_name}

    • Then Apply: | APPEND, " " | APPEND, "{last_name}"

    Example

    • Destination Attribute: user_principal_name

    • Formatter: {first_name}.{last_name}

    • Then Apply: | LOWER | APPEND, "@contoso.com"

    ASCII

    ASCII

    Removes non-printable characters and replaces non-ASCII characters with their closest ASCII equivalents. Particularly useful for Active Directory sAMAccountName and other legacy systems with strict character requirements.

    Note: The ASCII transformer performs operations on the base level, not the extended set.

    Parameter Format

    None (no parameters required)

    Basic Usage

    • Destination Attribute: username

    • Formatter: {first_name}

    • Then Apply: | ASCII

    • Result: If first_name = Łukasz, output is Lukasz

    In a Pipeline

    • Destination Attribute: login_name

    • Formatter: {first_name}.{last_name}

    • Then Apply: | ASCII | LOWER | REMOVE_WHITESPACE

    Example

    • Destination Attribute: sAMAccountName

    • Formatter: {first_name}

    • Then Apply: | ASCII | SUB_STRING, 0, 1 | LOWER

    ASSUME_TIME_ZONE

    ASSUME_TIME_ZONE

    Interprets the incoming time string as if it were in the specified time zone, then converts it to a UTC time. (example: if the input is "1/2/2025 11pm" and the defined time zone is America/Los_Angeles the function will treat "1/2/2025 11pm" as local time in Los Angeles and output the corresponding UTC time "1/3/2025 7am")

    Parameter Format

    String - Time Zone String (Optional) - Format

    Usage Example

    Input:

    {activation_date | ASSUME_TIME_ZONE, "America/Los_Angeles"}

    {activation_date | ASSUME_TIME_ZONE, "America/Los_Angeles", "RFC3339"}

    {activation_date | ASSUME_TIME_ZONE, "-07:00"}

    {activation_date | ASSUME_TIME_ZONE, "-07:00", "RFC3339"}

    COUNTRY_CODE_ISO3166

    COUNTRY_CODE_ISO3166

    Transforms country code to ISO 3166 format.

    ISO 3166 defines codes for the representation of country names, dependent territories, and their subdivisions

    Parameter Format

    Format (STRING, optional): [alpha2, alpha3, numeric], defaults to alpha2

    Usage Example

    Input:

    {"US" | COUNTRY_CODE_ISO3166, "alpha3"}

    Output:

    USA

    DATE_ADJUST

    DATE_ADJUST

    Adjusts date values based on hour, day, month, and year inputs. Provides full control over all time components for complex date manipulation.

    Parameter Format

    Parameter
    Type
    Required
    Description

    Usage Example

    Input:

    {activation_date | DATE_ADJUST, +1, 2, 3, -1}

    Adjusts the date by adding 1 hour, 2 days, 3 months, and subtracting 1 year.

    {activation_date | DATE_ADJUST, +1, 2, 3, -1, "RFC3339"}

    {activation_date | DATE_ADJUST, +1, 2, 3, -1, "2006-01-02T15:04:05Z07:00"}

    Example

    If the input date is 2021-01-01 00:00:00 and you apply DATE_ADJUST, +1, 2, 3, -1, the output is 2020-04-03 01:00:00 (added 1 hour, 2 days, 3 months, subtracted 1 year).

    DATE_ADJUST_DAY

    DATE_ADJUST_DAY

    A convenience transformer that adjusts date values by a specified number of days only. Use this for simple day-based calculations; use DATE_ADJUST for more complex adjustments involving hours, months, or years.

    Parameter Format

    Parameter
    Type
    Required
    Description

    Usage Example

    Input:

    {activation_date | DATE_ADJUST_DAY, +1}

    Adds 1 day to the activation date.

    {activation_date | DATE_ADJUST_DAY, +1, "RFC3339"}

    {activation_date | DATE_ADJUST_DAY, +1, "2006-01-02T15:04:05Z07:00"}

    Example

    If the input date is 2021-01-01 00:00:00 and you apply DATE_ADJUST_DAY, +1, the output is 2021-01-02 00:00:00.

    DATE_FORMAT

    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.

    Go date format reference

    Common format patterns

    Named format aliases

    The win32 format outputs the Windows FILETIME format used by Active Directory for attributes like accountExpires. This represents 100-nanosecond intervals since January 1, 1601 UTC.

    FIRST_N

    FIRST_N

    Picks the first N characters of a string. Useful for creating shortened identifiers or initials.

    Parameter Format

    Length (NUMBER, required): Number of characters to return

    Basic Usage

    • Destination Attribute: initial

    • Formatter: {first_name}

    • Then Apply: | FIRST_N, 1

    • Result: If first_name = John, output is J

    In a Pipeline

    • Destination Attribute: username

    • Formatter: {first_name}.{last_name}

    • Then Apply: | FIRST_N, 1 | LOWER

    Example

    • Destination Attribute: username

    • Formatter: {first_name}

    • Then Apply: | FIRST_N, 1 | LOWER

    FROM_ENTITY_ATTRIBUTE

    FROM_ENTITY_ATTRIBUTE

    Looks up an entity in the Veza graph by matching an attribute value, then returns a different attribute from that entity. This is useful for cross-referencing related entities, such as finding a manager's email from an employee ID.

    This transformer operates within attribute mappings. To query the Access Graph as a standalone workflow action — for example, to branch logic based on whether an entity exists — use the action type instead.

    Parameter Format

    Parameter
    Type
    Required
    Description

    How It Works

    1. The input value (before the |) is used as the search term

    2. The transformer finds an entity of type EntityType where SourceAttribute equals the input value

    3. It returns the TargetAttribute value from that entity

    Special Behaviors

    Scenario
    Behavior

    Usage Examples

    Example 1: Get manager's name from employee ID

    • Input: 12345 (an employee ID)

    • Finds: An Employee entity where employee_id = 12345

    • Returns: The manager_name

    Example 2: Get department from email with a default value

    • Input: john.doe@company.com

    • Finds: An OktaUser entity where email = john.doe@company.com

    • Returns: The department

    Example 3: Chain with other transformers

    • Takes the employee ID from Workday

    • Looks up the employee's cost center

    • Converts the result to uppercase

    Example 4: Get entity's graph ID

    • Looks up an OktaUser by login

    • Returns the entity's unique graph ID (useful for subsequent lookups)

    Example 5: Return a readable fallback that survives a downstream SPLIT

    • Resolves an HR email, looks up the matching user's identity_unique_id, then splits the result on :: and keeps index 1

    • On a match: returns the portion of identity_unique_id after ::

    FROM_MANY_ENTITIES_ATTRIBUTE

    FROM_MANY_ENTITIES_ATTRIBUTE

    Looks up multiple entities in the Veza graph by matching an attribute value, then returns a specified attribute from all matching entities as a combined string. Use this when an input value may match multiple entities and you need all their values.

    Parameter Format

    Parameter
    Type
    Required
    Description

    How It Works

    1. The input value (before the |) is used as the search term

    2. The transformer finds ALL entities of type EntityType where SourceAttribute equals the input value

    3. It collects the TargetAttribute value from each matched entity

    Special Behaviors

    Scenario
    Behavior

    Usage Examples

    Example 1: Get all group names for a user

    • Input: john.doe@company.com

    • Finds: All OktaGroup entities where member_email = john.doe@company.com

    • Returns: Engineering,Sales,All-Employees

    Example 2: Custom separator for multi-value attributes

    • Input: 12345 (an owner ID)

    • Finds: All Application entities owned by this user

    • Returns: Slack;Salesforce;Jira (semicolon-separated)

    Example 3: Get all entity IDs

    • Finds all employees in the Engineering department

    • Returns their graph IDs as a comma-separated list

    Example 4: Get entity types

    • Looks up all identity nodes with the given email

    • Returns their type names (e.g., OktaUser,ActiveDirectoryUser,WorkdayWorker)

    LANGUAGE_RFC5646

    LANGUAGE_RFC5646

    Transforms language to RFC 5646 format.

    RFC 5646 defines "Tags for Identifying Languages." It does not contain a fixed, exhaustive list of language codes within the RFC itself. Instead, it specifies the structure and rules for constructing language tags, which are then built using codes from various external standards and registries.

    Parameter Format

    None (no parameters required)

    Usage Example

    Input:

    {"Spanish" | LANGUAGE_RFC5646}

    Output:

    es

    LAST_N

    LAST_N

    Picks the last N characters of a string, where N is the number of characters to return.

    Parameter Format

    Length (NUMBER, required)

    Usage Example

    Input:

    {"helloworld" | LAST_N, 5}

    Output:

    world

    LEFT_PAD

    LEFT_PAD

    Adds padding characters to the left side of a string until it reaches the specified length. Useful for creating fixed-width identifiers.

    Parameter Format

    Length (NUMBER, required): Target string length Pad (CHARACTER, optional): Character to use for padding (default is space)

    Basic Usage

    • Destination Attribute: employee_id

    • Formatter: {id}

    • Then Apply: | LEFT_PAD, 5, "0"

    • Result: If id = 123, output is 00123

    In a Pipeline

    • Destination Attribute: formatted_code

    • Formatter: {cost_center}

    • Then Apply: | TRIM_CHARS, "0" | LEFT_PAD, 6, "0"

    Example

    • Destination Attribute: employee_id

    • Formatter: {employee_id}

    • Then Apply: | REMOVE_CHARS, "#" | TRIM_CHARS, "0" | LEFT_PAD, 6, "0"

    LOOKUP

    LOOKUP

    Transforms a value using a lookup table defined in your Lifecycle Management policy. Essential for mapping codes to descriptive values or standardizing data across systems.

    Parameter Format

    Parameter
    Type
    Required
    Description

    How It Works

    1. The transformer first tries to match TableName against configured lookup table names

    2. If no name match is found, TableName is treated as a table ID

    3. The input value is searched in ColumnName

    Special Behaviors

    Scenario
    Behavior

    Basic Usage

    • Destination Attribute: city

    • Formatter: {location_code}

    • Then Apply: | LOOKUP, "locationTable", "location_code", "city"

    With Default Value

    • Destination Attribute: region

    • Formatter: {office_code}

    • Then Apply: | LOOKUP, "regionTable", "code", "region_name", "Unknown Region"

    In a Pipeline

    • Destination Attribute: office_email_domain

    • Formatter: {office_code}

    • Then Apply: | LOOKUP, "officeTable", "code", "domain" | LOWER

    Example

    • Destination Attribute: office_location

    • Formatter: {location}

    • Then Apply: | LOOKUP, "locationTable", "location_code", "city"

    LOWER

    LOWER_SNAKE_CASE

    LOWER_SNAKE_CASE

    Transforms string to lowercase with underscores.

    Parameter Format

    None (no parameters required)

    Usage Example

    Input:

    {"Hello World" | LOWER_SNAKE_CASE}

    Output:

    hello_world

    LOWER_CAMEL_CASE

    LOWER_CAMEL_CASE

    Transforms a string to lower camel case (also known as dromedaryCase). The first word is lowercase, and subsequent words are capitalized with no separators.

    Parameter Format

    None (no parameters required)

    Basic Usage

    • Destination Attribute: identifier

    • Formatter: {field_name}

    • Then Apply: | LOWER_CAMEL_CASE

    • Result: If field_name = hello world, output is helloWorld

    In a Pipeline

    • Destination Attribute: api_field

    • Formatter: {attribute_name}

    • Then Apply: | TRIM | LOWER_CAMEL_CASE

    Example

    • Destination Attribute: json_property

    • Formatter: {column_name}

    • Then Apply: | LOWER_CAMEL_CASE

    NEXT_NUMBER

    NEXT_NUMBER

    Generates a set of alternative values by appending sequential numbers. Essential for handling unique constraint conflicts during user provisioning. Returns an empty string first, then "2", "3", "4", etc.

    Parameter Format

    Start Integer (NUMBER, required): First number in sequence Length (NUMBER, required): How many alternatives to generate

    Basic Usage

    • Destination Attribute: username

    • Formatter: {first_name}.{last_name}

    • Then Apply: | LOWER | NEXT_NUMBER, 2, 3

    • Result: Generates john.smith, john.smith2, john.smith3, john.smith4 as fallback options

    In a Pipeline

    • Destination Attribute: email

    • Formatter: {first_name}{last_name}

    • Then Apply: | LOWER | NEXT_NUMBER, 2, 5 | APPEND, "@company.com"

    Example

    • Destination Attribute: user_principal_name

    • Formatter: (see conditional example below)

    • Then Apply: N/A (used within IF statement)

    • Use case: Intelligent username generation with length-based fallbacks:

    This handles both name length constraints and uniqueness conflicts automatically.

    NEXT_NUMBER Max Length

    NEXT_NUMBER Max Length

    This transformer supports an optional maximum length parameter to simplify complex username generation workflows. It automatically evaluates combined strings (such as {first_name}_{last_name}) and truncates to specified character limits before appending numerical suffixes.

    Generates a set of integers as strings.

    Parameter Format

    Integer (NUMBER, required), Length (NUMBER, required)

    Usage Example

    Input:

    {"foobar" | NEXT_NUMBER, 1, 12, 4}

    Output:

    foob foo1 foo2 foo3 foo4 foo5 foo6 foo7 foo8 foo9 fo10 fo11 fo12

    NOW

    NOW

    Returns the current time in UTC. An optional argument indicates the outgoing time format; by default, the RFC3339 format.

    Parameter Format

    String (Optional) - Format

    Usage Example

    Input:

    {NOW}

    {| NOW, "RFC3339"}

    {NOW, "RFC3339"}

    {NOW, "2006-01-02T15:04:05Z07:00"}

    PHONE_NUMBER_E164

    PHONE_NUMBER_E164

    Transforms a phone number into the E.164 format.

    E.164 numbers are formatted [+] [country code] [subscriber number including area code] and can have a maximum of fifteen digits.

    Parameter Format

    Region (STRING, optional): ISO 3166-1 alpha-2 format

    Usage Example

    Input:

    {"+1-800-555-1212" | PHONE_NUMBER_E164}

    Output:

    +18005551212

    PREPEND

    PREPEND

    Adds text to the beginning of attribute values. Useful for adding prefixes like organization codes or type indicators.

    Parameter Format

    Characters (STRING, required): Text to add at the beginning

    Basic Usage

    • Destination Attribute: location_code

    • Formatter: {city_code}

    • Then Apply: | PREPEND, "CORP_"

    • Result: If city_code = NYC, output is CORP_NYC

    In a Pipeline

    • Destination Attribute: contractor_username

    • Formatter: {username}

    • Then Apply: | PREPEND, "c-" | LOWER

    Example

    • Destination Attribute: account_name

    • Formatter: {username}

    • Then Apply: | PREPEND, "c-"

    RANDOM_ALPHANUMERIC_GENERATOR

    RANDOM_ALPHANUMERIC_GENERATOR

    Generates a random alphanumeric string.

    Parameter Format

    Length (NUMBER, required)

    Usage Example

    Input:

    {| RANDOM_ALPHANUMERIC_GENERATOR, 8}

    Output:

    a1B2c3D4

    Note: This transformer generates an alphanumeric string with eight characters.

    RANDOM_INTEGER

    RANDOM_INTEGER

    Generates a random integer value between specified minimum and maximum values (inclusive). Useful for creating unique test IDs or temporary identifiers. Does not require an input value.

    Parameter Format

    Min (NUMBER, required): The minimum value (inclusive) Max (NUMBER, required): The maximum value (inclusive)

    Basic Usage

    • Destination Attribute: test_id

    • Formatter: TEST

    • Then Apply: | RANDOM_INTEGER, 1000, 9999

    • Result: Output is TEST followed by random number like TEST4827

    In a Pipeline

    • Destination Attribute: temp_username

    • Formatter: user

    • Then Apply: | RANDOM_INTEGER, 1, 100 | APPEND, "@temp.local"

    Example

    • Destination Attribute: temporary_id

    • Formatter: TEST

    • Then Apply: | RANDOM_INTEGER, 1000, 9999

    RANDOM_NUMBER_GENERATOR

    RANDOM_NUMBER_GENERATOR

    Generates a random number string.

    Parameter Format

    Length (NUMBER, required)

    Usage Example

    Input:

    {| RANDOM_NUMBER_GENERATOR, 4}

    Output:

    4829

    Note: This transformer generates a random numeric string with four characters.

    RANDOM_STRING_GENERATOR

    RANDOM_STRING_GENERATOR

    Generates a random string.

    Parameter Format

    Length (NUMBER, required)

    Usage Example

    Input:

    {| RANDOM_STRING_GENERATOR, 6}

    Output:

    uFkLxw

    Note: This transformer generates a random alpha string with six characters.

    REMOVE_CHARS

    REMOVE_CHARS

    Removes all instances of specified characters from a string. Useful for cleaning up data and removing unwanted punctuation or special characters.

    Parameter Format

    Characters (STRING, required): String containing all characters to be removed

    Basic Usage

    • Destination Attribute: username

    • Formatter: {email}

    • Then Apply: | REMOVE_CHARS, "@."

    • Result: If email = john.doe@example.com, output is johndoeexamplecom

    In a Pipeline

    • Destination Attribute: phone

    • Formatter: {phone_number}

    • Then Apply: | REMOVE_CHARS, "()- "

    Example

    • Destination Attribute: user_id

    • Formatter: {email}

    • Then Apply: | REMOVE_CHARS, "-"

    REMOVE_DIACRITICS

    REMOVE_DIACRITICS

    Removes diacritics (accents, etc.) from input string.

    Parameter Format

    None (no parameters required)

    Usage Example

    Input:

    {"José" | REMOVE_DIACRITICS}

    Output:

    Jose

    REMOVE_DOMAIN

    REMOVE_DOMAIN

    Removes the domain portion from an email address, leaving only the username. One of the most frequently used transformers for generating usernames from email addresses.

    Parameter Format

    None (no parameters required)

    Basic Usage

    • Destination Attribute: username

    • Formatter: {email}

    • Then Apply: | REMOVE_DOMAIN

    • Result: If email = john.smith@company.com, output is john.smith

    In a Pipeline

    • Destination Attribute: login_name

    • Formatter: {email}

    • Then Apply: | REMOVE_DOMAIN | REPLACE_ALL, ".", "_"

    Example

    • Destination Attribute: username

    • Formatter: {email}

    • Then Apply: | REMOVE_DOMAIN

    REMOVE_WHITESPACE

    REMOVE_WHITESPACE

    Removes all whitespace characters (spaces, tabs, newlines) from a string. Useful for creating compact identifiers and ensuring data consistency.

    Parameter Format

    None (no parameters required)

    Basic Usage

    • Destination Attribute: username

    • Formatter: {display_name}

    • Then Apply: | REMOVE_WHITESPACE

    • Result: If display_name = John A. Doe, output is JohnA.Doe

    In a Pipeline

    • Destination Attribute: tag

    • Formatter: {department}

    • Then Apply: | REMOVE_WHITESPACE | LOWER

    Example

    • Destination Attribute: cost_center_code

    • Formatter: {cost_center}

    • Then Apply: | REMOVE_WHITESPACE

    REPLACE_ALL

    RIGHT_PAD

    RIGHT_PAD

    Right pads a string with a character.

    Parameter Format

    Length (NUMBER, required),

    Pad (CHARACTER, optional): Default is space

    Usage Example

    Input:

    {"123" | RIGHT_PAD, 5, "0"}

    Output:

    12300

    SENTENCE_CASE

    SENTENCE_CASE

    Capitalizes only the first non-whitespace character of a string and lowercases the rest. Preserves any leading whitespace. Useful for standardizing sentence-formatted text fields.

    Parameter Format

    None (no parameters required)

    Basic Usage

    • Destination Attribute: description

    • Formatter: {notes}

    • Then Apply: | SENTENCE_CASE

    • Result: If notes = THE QUICK BROWN FOX, output is The quick brown fox

    In a Pipeline

    • Destination Attribute: formatted_notes

    • Formatter: {comment}

    • Then Apply: | TRIM | SENTENCE_CASE

    Example

    • Destination Attribute: job_description

    • Formatter: {job_title}

    • Then Apply: | SENTENCE_CASE

    SPLIT

    SPLIT

    Splits a string and returns the string at the given index.

    Parameter Format

    Split String (STRING, required), Index (NUMBER, required)

    Usage Example

    Input:

    {"first.last@domain.com" | SPLIT, "@", 0}

    Output:

    first.last

    Notes

    • The index is zero-based (the first segment is index 0).

    • If the index is greater than or equal to the number of segments the split produces, SPLIT returns an empty string "" (not an error), and any remaining pipeline functions still run.

    • When SPLIT follows a lookup such as

    SUB_STRING

    TITLE_CASE

    TITLE_CASE

    Capitalizes the first letter of each word and lowercases the rest. Also handles dot-separated values by capitalizing the first letter of each segment. Useful for formatting names and titles.

    Parameter Format

    None (no parameters required)

    Basic Usage

    • Destination Attribute: display_name

    • Formatter: {full_name}

    • Then Apply: | TITLE_CASE

    • Result: If full_name = john doe, output is John Doe

    In a Pipeline

    • Destination Attribute: formatted_name

    • Formatter: {name}

    • Then Apply: | TRIM | TITLE_CASE

    Example

    • Destination Attribute: display_name

    • Formatter: {username}

    • Then Apply: | TITLE_CASE

    TRIM

    TRIM

    Removes leading and trailing whitespace from a string. Essential for cleaning up data from external systems.

    Parameter Format

    None (no parameters required)

    Basic Usage

    • Destination Attribute: username

    • Formatter: {display_name}

    • Then Apply: | TRIM

    • Result: If display_name = " John Doe ", output is John Doe

    In a Pipeline

    • Destination Attribute: email

    • Formatter: {email_address}

    • Then Apply: | TRIM | LOWER

    Example

    • Destination Attribute: display_name

    • Formatter: {display_name}

    • Then Apply: | TRIM

    TRIM_CHARS

    TRIM_CHARS

    Removes all specified characters from both the beginning and end of a string. Useful for removing padding characters or cleaning up formatted data.

    Parameter Format

    Characters (STRING, required): String containing all characters to remove from both ends

    Basic Usage

    • Destination Attribute: employee_id

    • Formatter: {id_number}

    • Then Apply: | TRIM_CHARS, "0."

    • Result: If id_number = 000.123.000, output is 123

    In a Pipeline

    • Destination Attribute: clean_code

    • Formatter: {code}

    • Then Apply: | TRIM_CHARS, "-_" | UPPER

    Example

    • Destination Attribute: office_code

    • Formatter: {office_code}

    • Then Apply: | TRIM_CHARS, ".0" | TRIM_CHARS_RIGHT, ".USCA"

    TRIM_CHARS_LEFT

    TRIM_CHARS_LEFT

    Removes all specified characters from the beginning of a string only. Useful for removing leading zeros or prefixes.

    Parameter Format

    Characters (STRING, required): String containing all characters to remove from the beginning

    Basic Usage

    • Destination Attribute: cost_center

    • Formatter: {cost_center_code}

    • Then Apply: | TRIM_CHARS_LEFT, "0"

    • Result: If cost_center_code = 00012345, output is 12345

    In a Pipeline

    • Destination Attribute: identifier

    • Formatter: {raw_id}

    • Then Apply: | TRIM_CHARS_LEFT, "x" | UPPER

    Example

    • Destination Attribute: cost_center

    • Formatter: {cost_center}

    • Then Apply: | TRIM_CHARS_LEFT, "0"

    TRIM_CHARS_RIGHT

    TRIM_CHARS_RIGHT

    Removes all specified characters from the end of a string only. Useful for removing trailing characters or suffixes.

    Parameter Format

    Characters (STRING, required): String containing all characters to remove from the end

    Basic Usage

    • Destination Attribute: office_code

    • Formatter: {raw_office_code}

    • Then Apply: | TRIM_CHARS_RIGHT, "0"

    • Result: If raw_office_code = ABC12300, output is ABC123

    In a Pipeline

    • Destination Attribute: clean_code

    • Formatter: {code}

    • Then Apply: | TRIM_CHARS_RIGHT, "temp" | UPPER

    Example

    • Destination Attribute: office_code

    • Formatter: {office_code}

    • Then Apply: | TRIM_CHARS_RIGHT, "0"

    UPPER

    UPPER_CAMEL_CASE

    UPPER_CAMEL_CASE

    Transforms a string to upper camel case.

    Parameter Format

    None (no parameters required)

    Usage Example

    Input:

    {"hello world" | UPPER_CAMEL_CASE}

    Output:

    HelloWorld

    UPPER_SNAKE_CASE

    UPPER_SNAKE_CASE

    Transforms string to uppercase with underscores.

    Parameter Format

    None (no parameters required)

    Usage Example

    Input:

    {"hello world" | UPPER_SNAKE_CASE}

    Output:

    HELLO_WORLD

    UTC_TO_TIME_ZONE

    UTC_TO_TIME_ZONE

    Interprets the incoming time string as if it were in UTC and then converts it to the specified time zone. (example: if the input is "1/2/2025 11pm" and the specified time zone is America/Los_Angeles the function will treat "1/2/2025 11pm" as the UTC time zone and output the corresponding America/Los_Angeles time "1/2/2025 3pm") Note: When using the time zone parameter, a named time zone (America/Los_Angeles) accounts for daylight saving time, whereas a time zone offset (-07:00) is always calculated from UTC, ignoring daylight saving time.

    Parameter Format

    String - Time Zone String (Optional) - Format

    Usage Example

    Input:

    {activation_date | UTC_TO_TIME_ZONE, "America/Los_Angeles"}

    {activation_date | UTC_TO_TIME_ZONE, "America/Los_Angeles", "RFC3339"}

    {activation_date | UTC_TO_TIME_ZONE, "-07:00"}

    {activation_date | UTC_TO_TIME_ZONE, "-07:00", "RFC3339"}

    UUID_GENERATOR

    UUID_GENERATOR

    Generates a UUID.

    A UUID (Universally Unique Identifier) is a 128-bit identifier used to uniquely identify information in computer systems.

    Parameter Format

    None (no parameters required)

    Usage Example

    Input:

    {| UUID_GENERATOR}

    Output:

    123e4567-e89b-12d3-a456-426614174000

    ZERO_PAD

    ZERO_PAD

    Adds left zero-padding to numerical string values until they reach the specified length. If the input is non-numeric, it passes through unchanged. If the numeric value is already longer than the specified length, it remains unchanged.

    Parameter Format

    Length (NUMBER, required): Target string length for zero-padding

    Basic Usage

    • Destination Attribute: employee_id

    • Formatter: {id}

    • Then Apply: | ZERO_PAD, 6

    • Result: If id = 1234, output is 001234

    Example

    • Destination Attribute: badge_number

    • Formatter: {badge_id}

    • Then Apply: | ZERO_PAD, 6

    Attribute Sync and Transformers
    Understanding Conditions and Transformers
    time package constants
    ASSUME_TIME_ZONE
    UTC_TO_TIME_ZONE
    REMOVE_CHARS
    FIRST_N

    input_layout

    03/15/2024

    06

    03/15/2023

    14:30:25

    john.smith@company.com

    replacement

    EMP12345

    length

    1234

    JOHNSMITH

    Save the template

    , use
    {{employee_id}}
  • 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

  • : When working with multiple entity types, use
    {{EntityType.attribute}}
    to avoid ambiguity

    Qualified attribute

    {{OktaUser.email}}

    Output (target) entities first, then source-of-identity entities.

    Send Notification action (standalone workflow node)

    Available

    Not available

    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.

    Choose an event to trigger notifications. See Notifications for the event list.

  • Under Send a notification if:, choose Changes were made successfully, The action failed, or both.

  • Select the Veza Action in Select Veza Action.

    A Veza Action is an integration with functionality for sending data to external systems, enabling downstream processes around Veza alerts, and access to reviewer actions. Use a Veza Action to configure generic webhooks or enable email notifications.

    See Veza Actions Webhooks on how to create and deploy a webhook.

  • To customize the Webhook setting, perform the following:

    • In the Webhook URL field, enter the endpoint configured to receive the webhook payload.

    • In the Webhook Auth Header field, enter the Auth Header if the webhook listener requires authentication.

    When configured, webhook requests include an Authorization header containing the credentials specified in the Webhook Auth Header field. This allows the receiving endpoint to authenticate the request using Bearer tokens, API keys, or other authentication schemes.

  • Click Save.

  • <html><body>
    <br>
    <br> Here is the notification that lifecycle job has failed. <br>
    Error message: {{EVENT_ERROR_MESSAGE}}<br>
    <br>
    For reference:
    <br> job_id: {{JOB_ID}}<br>
    <br> identity_id: {{EVENT_IDENTITY_ID}}
    <br> identity_name: {{EVENT_IDENTITY_NAME}}
    <br> entity_type: {{ENTITY_TYPE}}
    <br> entity_name: {{ENTITY_NAME}}
    </body></html>
    <img src="cid:<name_of_attachment>"
    Hello,
    New account created for {{ENTITY_NAME}} with type {{ENTITY_TYPE}}.
    <!-- Untyped - uses attribute from any entity -->
    User email: {{email}}
    Department: {{department}}
    
    <!-- Typed - uses attribute from specific entity type -->
    Okta email: {{OktaUser.email}}
    AD username: {{ActiveDirectoryUser.sAMAccountName}}

    Built-in (uppercase)

    {{ACTION_NAME}}

    Populated directly by the workflow runner. No entity lookup. See Predefined placeholders.

    Bare attribute

    {{email}}

    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

    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

    {{OAA.Jira Cloud.User.email}}

    Custom templates support all standard placeholders documented in the Placeholders section. The available values depend on the context in which the template is used (e.g., action notifications have action-related placeholders, event notifications have event-related placeholders).

    Default Templates

    Identity Management Events
    Event Type
    API Usage Value
    Description

    Create Identity

    Identity Deleted From Sources covers identities removed from a source through normal processing. It does not fire for records dropped by a , which are hard-deleted without emitting an event.

    Relationship Management Events
    Event Type
    API Usage Value
    Description

    Add Relationship

    Email Management Events
    Event Type
    API Usage Value
    Description

    Create Email

    Password Management Events
    Event Type
    API Usage Value
    Description

    Change Password

    Entitlement Management Events
    Event Type
    API Usage Value
    Description

    Create Entitlement

    Actions and Workflows Events
    Event Type
    API Usage Value
    Description

    Custom Action

    Access Reviews Events
    Event Type
    API Usage Value
    Description

    Create Access Review Queued

    LIFECYCLE_MANAGEMENT_CREATE_ACCESS_REVIEW_QUEUED

    Safety Events
    Event Type
    API Usage Value
    Description

    Safety Limit Reached

    LIFECYCLE_MANAGEMENT_SAFETY_LIMIT_REACHED

    Access Request Events
    Event Type
    API Usage Value
    Description

    Access Request Created

    Non-Human Identity (NHI) Events
    Event Type
    API Usage Value
    Description

    Rotate Key

    LIFECYCLE_MANAGEMENT_ROTATE_KEY

    Default Template Content

    Identity Management Templates

    CREATE_IDENTITY

    • Subject: New Hire Notification: {{ENTITY_TYPE}} account created

    • Body:

    <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>

    CREATE_GUEST_ACCOUNT

    • 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:

    Relationship Management Templates

    ADD_RELATIONSHIP

    • Subject: New Relationship Added Notification: {{ENTITY_TYPE}} has an account with new relationship to a {{RELATIONSHIP_ENTITY_TYPE}}

    • Body:

    <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>

    REMOVE_RELATIONSHIP

    • 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:

    Email Management Templates

    CREATE_EMAIL

    • Subject: New Email Notification: {{ENTITY_TYPE}} has an account with new email

    • Body:

    <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>

    WRITE_BACK_EMAIL

    • Subject: New Write Back Email Notification: {{ENTITY_TYPE}} has had an email sync to it

    • Body:

    Password Management Templates

    CHANGE_PASSWORD

    • Subject: Password Change Notification: {{ENTITY_TYPE}} has an account with a new password

    • Body:

    <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>

    RESET_PASSWORD

    • Subject: Reset Password Notification: {{ENTITY_TYPE}} has had their password reset

    • Body:

    Entitlement Management Templates

    CREATE_ENTITLEMENT

    • Subject: Create entitlement notification: an entry of {{ENTITY_TYPE}} is created

    • Body:

    <html><body>
    Hello,<br>
    <br>
    An entry of {{ENTITY_TYPE}} is created: {{ENTITY_NAME}} <br>
    <br>
    </body></html>

    RENAME_ENTITLEMENT

    • 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:

    Access Request Templates

    ACCESS_REQUEST_COMPLETE

    • Subject: Access Request {{ACCESS_REQUEST_TYPE}} for {{ACCESS_REQUEST_ENTITY_NAME}} has {{SUCCEED_OR_FAILED}}

    • Body:

    <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>

    ACCESS_REQUEST_CREATED

    • 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:

    Error and Failure Templates

    ACTION_FAILED

    • Subject: Action Failed: {{ACTION_NAME}} for identity {{IDENTITY_NAME}}

    • Body:

    <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>

    WORKFLOW_TASK_FAILED

    • Subject: Workflow Failed: {{WORKFLOW_NAME}} for identity {{IDENTITY_NAME}}

    • Body:

    EXTRACTION_EVENT_FAILED

    • Subject: Lifecycle Management extraction processing failed for {{DATASOURCE_ID}}

    • Body:

    Access Review Templates

    CREATE_ACCESS_REVIEW_QUEUED

    • Subject: Create Access Review Queued Notification: for identity {{IDENTITY_NAME}}

    • Body:

    <html><body>
    Hello,<br>
    <br>
    An access review has been queued for {{IDENTITY_NAME}} <br>
    <br>
    </body></html>

    CREATE_ACCESS_REVIEW

    • Subject: Create Access Review Notification: for identity {{IDENTITY_NAME}}

    • Body:

    Safety and Custom Action Templates

    SAFETY_LIMIT_REACHED (Hard Limit)

    • Subject: Safety Limit Reached Notification: Policy {{POLICY_NAME}} has stopped processing identity changes

    • Body:

    <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>

    PREDICTED_SAFETY_LIMIT_EXCEEDED (Predictive Safety Limit)

    • 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:

    Non-Human Identity (NHI) Templates

    ROTATE_KEY

    • Subject: Key Rotation Notification: {{ENTITY_NAME}}

    • Body:

    <html><body>
    Hello,<br>
    <br>
    Key {{ENTITY_NAME}} has been rotated.<br>
    <br>
    {{EVENT_MESSAGE}}<br>
    <br>
    </body></html>

    Image Attachments

    Image Requirements: For API-based template management, small images under 64kb can be attached when configuring a template. The image must be base64-encoded and specified in the attachments field of the API request.

    Placeholders

    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.

    How placeholders work

    When to Use Typed Format: Use {{EntityType.attribute}} format when your workflow processes multiple entity types and you need to reference a specific entity's attributes. For example, if your workflow processes both OktaUser and ActiveDirectoryUser, use {{OktaUser.email}} to specifically reference the Okta user's email address.

    Predefined placeholders

    Identity and Entity Information

    Placeholder

    Description

    {{ENTITY_TYPE}}

    The type of entity (e.g., "ActiveDirectoryUser", "OktaUser")

    Relationship Information

    Placeholder

    Description

    {{RELATIONSHIP_ENTITY_TYPE}}

    Type of the related entity

    Action and Job Information

    Placeholder

    Description

    {{ACTION_NAME}}

    Name of the action being performed; serves as the stable unique identifier for the action

    Access Request Information

    Placeholder

    Description

    {{ACCESS_REQUEST_TYPE}}

    Type of Access Request

    Event and Error Information

    Placeholder

    Description

    {{EVENT_TYPE}}

    Type of lifecycle event

    Policy and Workflow Information

    Placeholder

    Description

    {{POLICY_NAME}}

    Name of the lifecycle policy

    Troubleshooting placeholders

    Placeholder Resolution and Entity Scope

    What each placeholder form resolves against

    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.

    Which configuration surface provides which attributes

    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.

    Which actions populate target attributes

    Finding the canonical entity type for OAA integrations

    Template selection order

    Unresolved placeholders and unsupported syntax

    Additional placeholders

    Action and result placeholders
    Placeholder
    Typical context

    {{EVENT_MESSAGE}}

    Event notifications

    Webhook Configuration Overview

    Create a Webhook

    Default Template Content
    predefined placeholders
    Access Reviews Notification Templates

    Source-of-identity (input) entities only. Never resolves a target-system attribute.

    Available from that action's output entities

    No. Runs with an empty result.

    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

    LIFECYCLE_MANAGEMENT_CREATE_EMAIL

    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

    LIFECYCLE_MANAGEMENT_CHANGE_PASSWORD

    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

    LIFECYCLE_MANAGEMENT_ACCESS_REQUEST_CREATED

    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

    Duplicate Resolution Rule
    <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>
    Result: If first_name = John and last_name = Smith, output is John Smith
    Use case: Generate standardized email addresses for Azure AD user provisioning
    Result: If first_name = José María, last_name = García, output is josemaria.garcia
    Use case: Generate Active Directory account names that comply with character restrictions while handling international names (converts "Łukasz" to "l")
    Result: If first_name = John, output is j
    Use case: Create abbreviated usernames in the format j.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

    attribute from that employee (e.g.,
    Jane Smith
    )
    attribute, or
    Unknown
    if no user is found
    On a miss: the DefaultValue (::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 returned
  • A 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

  • (comma-separated group names)
    Result: If cost_center = 001234, output is 001234 (first removes then re-applies padding)
    Use case: Standardize employee IDs to 6-digit format (converts "##001234##" to "001234")

    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

  • Result: If location_code = IL001 and locationTable contains that code, output is Chicago

    Result: Returns mapped region name, or Unknown Region if code not in table

    Result: Looks up domain from table, then converts to lowercase
    Use case: Convert abbreviated location codes (like "IL001", "CA002") to full city names for user profiles, maintaining consistency across different source systems
    Result: If attribute_name = User Display Name , output is userDisplayName
    Use case: Convert database column names or display names to JSON property names following JavaScript/TypeScript conventions
    Result: Creates email alternatives: johnsmith@company.com, johnsmith2@company.com, etc.
    Result: If username = JSmith, output is c-jsmith
    Use case: Identify contractor accounts by prefixing their usernames (converts "jsmith" to "c-jsmith" to distinguish from employee accounts)
    Result: Output like user42@temp.local
    Use case: Generate unique test identifiers for sandbox environments (produces values like "TEST4827", "TEST8391")
    Result: If phone_number = (123) 456-7890, output is 1234567890
    Use case: Create clean user IDs from email addresses by removing hyphens (converts "" to "")
    Result: If email = john.smith@company.com, output is john_smith
    Use case: Extract usernames for target systems that don't use email-style logins (converts "jsmith@company.com" to "jsmith")
    Result: If department = Human Resources, output is humanresources
    Use case: Ensure cost center codes have no embedded spaces for system integration (converts "CC 12345" to "CC12345")
    Result: If comment = IMPORTANT MESSAGE HERE , output is Important message here
    Use case: Normalize job descriptions from all-caps source data to sentence case for cleaner display
    , the DefaultValue 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.
    Result: If name = JANE SMITH , output is Jane Smith
    Use case: Format dot-separated usernames for display (converts john.doe to John.Doe)
    Result: If email_address = " John.Smith@Company.com ", output is john.smith@company.com
    Use case: Clean up imported user data that may have padding whitespace from CSV files or database fields
    Result: If code = ---ABC123___, output is ABC123
    Use case: Clean up office codes with variable padding (converts 000.8675309.USCA to 8675309)
    Result: If raw_id = xxxABC123, output is ABC123
    Use case: Remove leading zeros from cost center codes while preserving trailing zeros (converts "00012345" to "12345")
    Result: If code = ABC123temp, output is ABC123
    Use case: Remove trailing zeros from office codes while preserving leading zeros (converts "ABC12300" to "ABC123")
    Use case: Standardize badge numbers to 6-digit format for access control systems (converts "1234" to "001234", leaves "12345678" unchanged, and passes non-numeric values like "admin" through unchanged)

    Hours

    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

    Date format used to parse the input value and to format the output. If omitted, Veza detects the input format automatically and uses it for the output.

    EntityType

    STRING

    Yes

    The 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}

    When used in sync workflows, this transformer checks previously computed values from the current job before querying the graph cache. This optimization prevents redundant lookups during batch operations.

    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.

    Get Node From Graph

    No

    Number of months to add

    Years

    INTEGER

    No

    Number of years to add

    Format

    STRING

    No

    Date format used to parse the input value and to format the output. If omitted, Veza detects the input format automatically and uses it for the output.

    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

    SPLIT
    john-doe@example.com
    johndoe@example.com
    FROM_ENTITY_ATTRIBUTE

    Policies

    Configure automated workflows for Lifecycle Management actions, including common attribute transformers and event notification settings

    Overview

    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:

    1. Go to Policies.

    2. Click Create Policy.

    3. 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:

    1. Go to Policies.

    2. Click a policy to view its details, then open a version from the Policy Versions panel.

    3. Click Dry Run and select Dry Run with Single Identity. You can also start this dry run from the Policies list: click ⋮ on the policy's row and select Perform Dry Run.

    From Identity Details

    You can start a Dry Run when viewing details for any account on the Identities page:

    1. Go to Identities.

    2. Search for an identity and click to view its details.

    3. Open the ⋮ menu and select Policy Dry Run.

    4. Select a policy, customize entity attributes, and click Show Results.

    You can also select Policy Dry Run from an identity's ⋮ menu in the Identities table.

    Dry Run Notes:

    Result: 0 Changes

    When a dry run returns "0 changes", it means:

    • The selected identity does not meet any of the trigger conditions defined in your policy's workflows

    • No actions would be executed for this identity when the policy runs

    • This is not an error - it simply means the identity doesn't qualify for any of the configured workflows

    Limitations

    Dry Run has several important limitations:

    • Dry Run evaluates whether workflow conditions are met, not whether actions would succeed

    • It does not check whether integrations are functioning properly and whether target systems are accessible

    • It does not validate that changes could be successfully applied

    • A broken integration might cause workflow-defined changes not to be applied to an identity

    Best Practices

    Use Dry Run to validate that policies and their workflows are working as intended before enabling them in a live environment.

    1. Test with Representative Identities: Select identities that represent different scenarios (new hires, role changes, terminations) to validate all workflows in your policy.

    2. 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:

    1. Extraction completes: Data is pulled from the identity source.

    2. 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 .

    3. Workflow triggers evaluate: Veza begins evaluating trigger conditions within approximately 1 second of extraction completing. Actual evaluation time scales with the number of managed identities. Policies with thousands of identities can take several minutes to process. For policies with multiple identity sources, evaluation waits until all configured sources have completed extraction.

    "First time only" triggers

    Most workflows (except sync workflows) have Identity newly matches the condition selected, so they trigger only when the condition is first met. This means:

    • The workflow triggers the first time an identity matches the condition.

    • If the condition clears (identity no longer matches) and then matches again, the workflow triggers again as if it were the first time.

    • This behavior handles rehire scenarios where a previously terminated employee returns.

    Sync workflows

    Sync workflows track specific properties for changes. When adding new properties that require syncing:

    • Update the tracked property list in the workflow configuration.

    • Update sync-related 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: On the Policies page, click the overflow icon (three dots) on a policy's row and select Enable to start a policy in the Initial state or resume a Paused policy, or Disable to pause a Running policy.

    The Workflow Version state includes:

    • Draft - In draft mode for editing and modification

    • Published - Functional and active

    • Retired - No longer active or usable

    Draft mode is a state where a policy is saved but not yet active. In draft mode, you can create, edit, and test policy configurations (such as workflows, actions, or mappings) without affecting real users, identities, or access profiles. Once you are satisfied, you can publish the policy, which moves it from the work-in-progress state to an operational state.

    Draft-and-publish is the standard flow for every provisioning policy. There is no setting to turn it on.

    Test Policy Workflows using Draft Versioning

    You can test and refine your policy workflows to ensure that it is working as expected through a series of draft versions with Dry Run simulations. Once the workflow’s result is satisfactory, publishing the version will change the policy status to ‘active’.

    Perform the following steps to test your policy workflow:

    1. Create and save a new policy.

    2. Create a new workflow and Save.

    3. After creating a new workflow, click Publish.

    4. By publishing your workflow, it is ready for activation: on the Policies page, click ⋮ on the policy's row and select Enable. The

    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.

    1. In both sandbox and production tenants, log in as an Integration Manager or Administrator and create API keys (Administration > API Keys).

    2. Store each key in a password manager or secrets vault.

    3. Set environment variables for the migration script:

      • VEZA_TOKEN

    1. In the target tenant, create a new draft version of the policy and note the version number.

    2. If any of the following changed since the last migration, update the lookup table CSV (provided by support) with new IDs:

      • Access Profiles

      • Email Templates

    Extraction frequency for an identity source is set by its extraction interval, which an administrator can change in System Settings. See .

    To extract at a specific time of day instead, so that identity data is current before a workflow runs, configure a per-data source schedule through the Veza API. There is no UI for this setting, and a schedule replaces the extraction interval for that data source. See .

    Concurrency limits apply at the tenant level, across all policies. Set them on the Performance tab of the Lifecycle Management Settings page:

    • Workflow tasks: how many triggered workflows run in parallel. Each task runs one identity through its policy workflow.

    • Access request fulfillments: how many approved requests apply their access changes in parallel.

    • Provisioning jobs: how many actions Veza sends to connected applications in parallel. Keep this at or above the other two values, or provisioning jobs become the bottleneck.

    Raise these values gradually. Higher concurrency adds load to target systems and downstream integrations.

    Disabling a policy pauses any running workflows. Re-enabling the policy does not resume paused workflows—they restart on the next extraction cycle.

    Use the Policies page for an overview of initial, running, and paused policies. New policies are created in the "Initial" state, enabling a review period before activating the policy. Active ("Running") policies will apply the next time the data source is extracted.

    To manage policies on the main Policies overview:

    1. Go to Lifecycle Management > Policies

    2. Find the policy you want to manage

      • Search for a specific policy by name

      • Filter to show all providers by their current state

    On the policy page, click View Details on the Last Policy Run panel to open the policy's run details. When a policy draws identities from more than one source, this view covers each source separately. You can also open this view by selecting the status in the Run Status column on the Policies page.

    Identity Source

    Each source of identity appears as a card under Identity Source, showing the data source, the entity type that source contributes, and Started at for that source's most recent run. A source with no run history reads No extractions yet, and a source with a run in progress shows a running indicator. Select a card to scope the rest of the view to that source.

    Veza orders cards by the start time of each source's most recent run, most recent first. Sources with no run history appear last. When the view opens, Veza selects a source that is currently running. If no source is running, Veza selects the source whose most recent run started last.

    Started at is when Veza began processing that source's most recent run. It is not the time the source last extracted data.

    Run summary

    The summary above the execution steps reads Current Policy Run while the selected source is running, and Last Policy Run otherwise. It reports the processing time and the policy version. The view shows Status only when the run is Running or Stopped. The Run Status column on the Policies page also shows Awaiting (the policy is waiting for the next extraction) and Disabled (the policy is not published to run).

    If a safety limit stopped the run, the view shows the alert Policy run stopped to avoid exceeding safety limit. Select View Details to open the Blocked Tasks page.

    Execution steps

    Three steps describe what the run did for the selected source:

    • Analyze Identities determines which identities changed, validates them against the policy's identity settings, and saves them to Veza. It reports counts of new, deleted, property-changed, and unchanged identities. When valid identity settings are enabled on the policy, it also reports valid and invalid identity counts, and the invalid count links to the matching entries on the Provisioning Activity page.

    • Evaluate Workflows matches identities against workflow trigger conditions and reports how many identities each workflow runs for.

    • Execute Workflows runs the workflow tasks and reports task counts, completions, errors, and the number of tasks a safety limit held back. Blocked task counts are reported per workflow as well as for the run, so a workflow that reached its own limit is visible individually. The blocked count is a live figure that decreases as tasks are run or abandoned from the Blocked Tasks

    For the sequence Veza follows for an individual identity, see .

    Policies with multiple sources of identity

    Each policy run covers one extraction from one source, so sources succeed or fail independently. A failure on one source does not change the status of another, and no combined status is reported across sources.

    A policy with more than one source of identity does not process an extraction until every configured source has extracted at least once. Extractions that arrive before then wait. After that, extractions are processed and identities are saved, but workflows do not run until the most recent extraction of every source, primary and secondary, has finished successfully. Workflows start on the extraction after that point. This gate applies once, when the policy first starts: afterward, a failed extraction from one source does not stop workflows for the others.

    Policies contain one or more workflows. Typically, workflows correspond to Active and Inactive user states, but not always. More specifically, workflows define a sequence of actions to run when a condition is met, based on events and identity changes captured at the source of identity. These workflows apply to scenarios such as new employee hiring, internal employee mobility changes (e.g., promotions, transfers, new managers), or employee departures.

    Workflows comprise a tree-like sequence of conditions designed to meet the specific requirements of your joiner, mover, and leaver processes. For example, you may want to grant specific entitlements to users with specific roles, locations, or groups.

    The following diagrams illustrate typical joiner and leaver workflow implementations, showing how identity changes in your HR system trigger coordinated provisioning and de-provisioning actions across multiple target applications.

    Joiner Workflow

    When a new employee is created in Workday, Veza automatically provisions accounts and assigns appropriate access across connected systems based on the employee's role and attributes.

    Leaver Workflow

    When an employee's status changes to inactive or terminated in Workday, Veza automatically de-provisions accounts and removes access to protect your organization's security posture.

    Workflows and Trigger Conditions

    Trigger Conditions refer to rules or filters that initiate (or delay) provisioning and deprovisioning workflows based on certain events, criteria within identity data sources, or lifecycle workflows. Trigger conditions use SCIM filter syntax to evaluate whether an identity matches specific criteria.

    See for SCIM filter syntax and available operators, or for a comparison with transformer syntax.

    • Trigger conditions are often tied to HR events, such as employee hiring (joiner), role changes (mover), or termination (leaver). For example, provisioning flows can be triggered when an employee is hired or deprovisioned when terminated.

    • Trigger Conditions can be time-based, such as "create the Active Directory account 15 days before a new employee's start date". To compare a date attribute to the current date, use a WHEN() expression. See .

    • Advanced implementations also support relationship-based triggers (e.g., launching workflows when a worker is added to a specific department).

    To add a workflow, perform the following:

    1. Open the policy, open the draft version from the Policy Versions panel, and select the Workflows tab.

    2. Click Create (Create Workflow when the policy has no workflows yet).

    3. In Name & Description, enter the workflow name and description.

    4. Use the

    Note: All workflow errors must be resolved before it can be saved.

    Save Conflicts

    When you click Save in the workflow editor, Veza checks whether the draft version changed after you opened the editor, for example because another user saved changes to it. If it did, Veza doesn't save. The Draft Changed Since You Started Editing dialog opens instead and shows who last edited the draft, when they saved, and when your edit started.

    Under Choose how to resolve, select an option and click Confirm:

    Option
    Result

    To return to the editor with your edits intact, click Cancel. Nothing is saved.

    Clone or Delete a Workflow

    Each workflow card on the version's Workflows tab has a menu with these options, alongside Edit Workflow and Workflow Settings:

    • Clone Workflow copies the workflow.

    • Delete Workflow deletes it.

    • Run Workflow Manually runs the workflow for selected identities in the published version.

    • See Notes displays the workflow notes, when notes exist.

    Webhook notifications after Sync Identity

    For ITSM integrations that need to receive all attributes after a Sync Identity action completes:

    1. Place the webhook action under a condition that follows the Sync Identity action in the workflow tree.

    2. Add a pause action before the webhook if needed to allow time for attribute propagation.

    3. 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:

    1. Open the policy and open its draft version from the Policy Versions panel. If the policy has no draft, click Create Draft.

    2. Select the Workflow Components tab.

    3. On the Transformers card, click +. When the policy has no transformers yet, you can also click Create Transformer.

    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:

    1. Open the policy's draft version and select the Workflow Components tab.

    2. Select the Lookup Tables card.

    3. Click + on the card. When the policy has no lookup tables yet, you can also click Create Lookup Table.

    4. 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:

    1. Open the policy's draft version and select the Workflow Components tab.

    2. Select the Properties card.

    3. The Mover Properties appear. Click Edit.

    4. In the Edit Properties panel, click the Select options

    The Properties card also holds Properties for ‘When’ Expressions in Conditions, which set the date format and time zone for attributes used in WHEN() expressions. See .

    Password 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:

    1. Open the policy's draft version and select the Workflow Components tab.

    2. Select the Password Complexity Rules card.

    3. Click + on the card. When the policy has no rules yet, you can also click Create Password Complexity Rule.

    4. In the New Password Complexity Rule

    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:

    1. Open the policy's draft version and select the Workflow Components tab.

    2. Select the Transformer Functions card.

    3. Click + on the card. When the policy has no transformer functions yet, you can also click Create Custom Transformer Function.

    4. In the New Custom Transformer Function

    The Policy Settings page provides information about a specific policy and allows for additional configuration, including:

    • Modify the primary identity source

    • Define an additional data source to the primary identity source

    • Configure email notifications or a webhook for action-related events

    • Set execution guardrails that limit how many identities or workflow runs an extraction can affect, to prevent unexpected issues

    The Details view shows the Policy Name and Description fields. These fields are editable for name change or description refinement, if required.

    The Primary Identity Source pane displays the integration name of the data source. The Integration field displays all available data sources, where you can add or remove, if required.

    A Primary Identity Source is the authoritative system that serves as the source of truth for user identities (e.g., HR system, Active Directory, identity provider like Okta/Entra ID). Typically, one type of source of identity is associated with one integration.

    The role of the Primary Identity Source includes:

    • Acts as the authoritative record for user information (emails, roles, statuses).

    • Lifecycle rules such as provisioning, updates, or deprovisioning are typically triggered based on changes detected in this data source.

    • Ensures consistency and accuracy across target systems where access is granted or revoked.

    The Duplicate identity resolution section of this pane consolidates multiple records for the same person within this source into a single record. See .

    As an option, the Additional Identity Sources pane is typically used to add a different type of integration from the Primary Identity Source, which requires that the additional data source be already configured into Lifecycle Management. You can also correlate primary attributes and additional attributes to be associated with the data source. The added data source will sync for authentication, user updates, or provisioning.

    To add an Additional Identity Source, perform the following:

    1. Click Add Source.

    2. Select a data source in the Search Identity Sources picker. Note: Leave 'These types are not related' unchecked (the default) when you want Veza to match identities across both sources using the correlating attributes defined below. Enable the option when the additional source has no correlation to the primary — for example, when adding it purely for enrichment and identity matching is not needed. With the option enabled, Veza hides the Correlating Attributes section and skips identity matching between the two sources.

    3. In the Correlating Attributes section, select an attribute in the Attribute in primary source column.

    To update identity attributes from this source without running workflows (for example, when it only supplies manager information from a departmental system), clear the source under Extraction is processed from in each workflow. See .

    When events occur during the execution of a policy’s workflow, notifications can be triggered upon execution of actions in workflows as a means to inform stakeholders or integrate with external systems. 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:

    1. In the Notifications pane, click Add Notification.

    2. Choose the notification type (Email or Webhook).

    3. Choose the event to trigger notifications:

    See for customizing email notifications.

    This setting controls whether a workflow re-runs for an identity that still matches its trigger condition but whose properties have not changed in the source since the last extraction. It takes effect only when the workflow's Identity newly matches the condition checkbox is cleared. While that checkbox is selected, the setting has no effect, and the workflow follows first-match trigger behavior instead (see ).

    It is a per-workflow trigger setting, chosen in the workflow editor under Run Workflow → Identity properties. Each policy also has a default mode. When you publish the policy, Veza saves that default on every workflow that doesn't set its own mode. After that, each workflow keeps its own value, so changing the policy default later affects only workflows added afterward. Policies created in the Veza UI default to Have changed. When you create a policy through the API, set sync_only_when_source_changes to true for the same default. If you omit it, workflows that don't set their own mode publish as Run Always with a 24-hour throttle. As with the other , the policy default is not editable in Policy Settings.

    When you choose Run 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:

    1. Open the workflow in the policy's workflow editor.

    2. Under Run Workflow → Identity properties, select Have changed or Run Always.

    3. If you selected Run Always, set the throttle interval under Unless an unchanged identity already ran in the last … (default: 24 hours).

    Safety Limits guard against unintended mass changes to identities. They stop a policy when an extraction would change, or is changing, more identities than you expect. There are two kinds of limit:

    Limit
    When it is checked
    What it counts

    Each kind can be set for the policy as a whole, for individual workflows, or both. A policy-level limit counts across every workflow in the policy. A workflow-level limit counts only that workflow.

    Policy-level limits apply to every workflow in the policy. Click Policy Settings on the policy page and go to Execution Guardrails → Safety Limits:

    • Enable Maximum Changes - Identities sets the policy-level Hard Limit (formerly "Safety Limit"). Enable the toggle, then enter the threshold in the number field next to the helper text Select maximum number of identities to process.

    • Enable Maximum Identities - Workflow Run sets the policy-level Predictive Safety Limit. Enable the toggle, then enter the threshold next to the helper text Select maximum number of workflow runs per extraction. The minimum is 1. Although the toggle name says "identities", the threshold counts workflow runs. Available in Veza v2026.9.7 and later.

    Workflow-level limits are part of each workflow's guardrails, described below.

    Each workflow has its own Execution Guardrails section on its Workflow Settings page. To open it, select Workflow Settings from the workflow card's menu on the policy's Workflows tab. Workflow-level guardrails apply only to that workflow, allowing different settings for Joiner, Mover, and Leaver workflows within the same policy. The available controls are:

    • Retry failed workflows: when on, a failed workflow re-attempts on later extractions up to the configured Max retries value. The Max retries field in the UI accepts values from 1 to 50; API callers can configure values up to 1000. When the toggle is off, a workflow that fails on an identity does not re-run for that identity on later extractions, and operators must intervene manually. The corresponding API fields are no_retry_for_failed_workflow and max_retries_for_failed_workflow; see the for the full property table.

    For each extraction, Veza checks the limits in this order:

    1. Policy-level Predictive Safety Limit. If the predicted workflow runs across all workflows exceed it, every workflow's tasks for the extraction are blocked, and the workflow-level predictive checks are skipped.

    2. Workflow-level Predictive Safety Limits. Each workflow is checked on its own. A workflow over its limit has all of its tasks blocked. The other workflows' tasks run normally.

    3. Hard Limits, as tasks run. Before each task starts, and again while it runs, Veza checks the policy-level Hard Limit and then that workflow's own Hard Limit. When the policy-level count is reached, every remaining task in the policy is blocked, whichever workflow it belongs to. When a workflow-level count is reached, only that workflow's remaining tasks are blocked. A task blocked partway through keeps its progress, and continues from that point if you run it.

    Whichever limit is reached:

    • The blocked tasks wait on the page until an administrator runs or abandons them.

    • The whole policy stops processing extractions. This applies to a workflow-level limit too. Later extractions are skipped for every workflow in the policy, not queued, until an administrator resumes processing. Skipped extractions are not replayed, but their changes are not lost. When processing resumes, the next extraction compares the current source data with the identities Veza stored before the limit was reached, so identities that changed, appeared, or were removed in the meantime are detected. Veza sees only the net result: an attribute that changed and then changed back counts as unchanged. If the source has not changed since the most recent skipped extraction, the changes are detected on the next extraction in which the source data changes.

    • Veza records a SAFETY_LIMIT_REACHED

    The Blocked Tasks page lists the tasks a safety limit held back. For a task, or a selection of tasks, you can:

    • Run the blocked tasks (manually approve execution)

    • Abandon the blocked tasks (discard without executing)

    To restart the policy, click Resume Processing Extractions, then Confirm and Resume. Any tasks still blocked are run, and the policy processes extractions again. To discard the remaining tasks instead, abandon them before you resume.

    Identity Validation evaluates each identity against before workflows run, and halts the extraction when too many identities fail. It is a threshold control for the run as a whole, not a per-identity filter:

    • While the invalid count stays within the configured tolerance, identities marked invalid are still saved and still processed. Validation records them; it does not exclude them. The default tolerance is 0, so a single invalid identity stops the extraction.

    • Once the invalid count exceeds the tolerance, the entire extraction stops before any identities are saved, and the policy does not process further 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:

    1. Open the policy, click Policy Settings, and go to Execution Guardrails.

    2. Under Identity Validation, toggle Enable Identity Validation on.

    3. In Valid Identity Filter, enter a SCIM filter expression that all valid identities must match. Identities that do not match are marked invalid.

    Filter semantics: An identity is marked invalid if it matches Invalid Identity Filter OR fails to match Valid Identity Filter. If only one filter is configured, only that filter is evaluated.

    A filter that cannot be evaluated for an identity counts as not matching, so for Valid Identity Filter the identity is marked invalid. A filter that cannot be parsed at all causes the extraction to fail. Veza does not check filter syntax when the policy is saved, so test filter expressions first.

    Example filters:

    | Require an email and a first name | email ne null and (first_name ne null or beeline.first_name ne null) | | Exclude identities tagged as test accounts | Set Invalid Identity Filter to tags co "test_account" |

    Filters use the standard Veza SCIM filter syntax — see for the operator reference.

    The name should indicate the source of identity that the policy applies to

  • Select a Primary Identity Source using the arrows to display a list of available data source integrations.

    • The selected identity source will trigger workflows in the policy

    • For the identity source to appear in the menu list, the integration must have Lifecycle Management enabled and be available as a source of identity (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 Additional Identity Sources to add more data sources and correlating attributes.

    • Click Add Source.

    • Select a source in the Search Identity Sources picker.

    • Under Correlating Attributes, select an attribute in the Attribute in primary source column.

    • Select the matching attribute in the Attribute in additional source column.

    • Click Add to add more pairs of correlating attributes.

    • The Only enrich existing identities option controls identity creation:

      • Enabled: Only adds data to existing identities from the Primary Identity Source. Does not create new LCM identities.

      • Disabled: Creates new LCM identities when users exist in the Additional Identity Source but not in the Primary Identity Source.

    • Whether an extraction from this source runs workflows is set per workflow, not on the source. See the Extraction is processed from clause in .

  • Click Create. The policy is automatically set to the Initial state.

  • Choose the identity and policy to test workflows.
  • Select one or more attributes to sync. You can modify attributes to simulate potential changes.

  • Click Show Results.

  • Review the results:

    • Check the Workflows Run section to see which workflows were triggered.

    • Check the Actions Run section to see all job requests that would be generated (e.g., edits to user attributes, adding/removing access profiles).

    • Check the Messages section for evaluation messages.

  • Location transfers

  • Role modifications

  • Test Edge Cases: Use Dry Run to test unusual scenarios or edge cases that might not occur frequently in your environment.

    A Dry Run executes the workflow logic end-to-end, making no external changes. It evaluates conditions, decides which actions would run, and logs the decisions and payloads. That makes it ideal for probing unusual or risky situations without touching real accounts or entitlements. Here are some edge case examples:

  • 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 if this action fails enabled, or the parent condition has Continue if any action fails enabled.

  • Dry Run - In test mode

    Create Draft
    button is enabled.
  • 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.

  • for production
  • 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 Provisioning Activity approximately 30 minutes after extraction completes.

  • Click the three dots icon ⋮ in the rightmost column to expand the Actions menu

    • Dry Run - Perform Dry Run, Perform Bulk Dry Run, and See Bulk Dry Run History.

    • Versions - See Version History, Discard Draft (when a draft exists), and Compare Versions.

    • Policy - Enable or Disable the policy, or Delete it.

  • Click a policy's row to open it. The policy page shows the Last Policy Run and Policy Versions panels. Open the draft version to create a workflow, transformer, property, password complexity rule, or transformer function. When a policy has more than one version, the Policy Versions panel also shows Compare Versions.

  • page, and it is included in the total task count. When the run creates no tasks, the step reads
    Completed - No tasks to execute
    . During a policy's initial run, the step explains that workflows run only after every source of identity has extracted successfully.
    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).
    Enable Workflow
    toggle to set whether the workflow starts enabled.
  • In Priority, select one of:

    • Not set

    • Low

    • Normal

    • Medium

    • High

    • Critical

    The levels dictate the order in which workflow tasks run. Higher-priority tasks are processed first. A fairness algorithm prevents lower-priority workflow tasks from being starved.

  • Optionally, configure Execution Guardrails (see Workflow-level guardrails), then click Next.

  • In the workflow editor, click the Trigger box to open the trigger panel. Until a condition is set, the box reads Set Trigger Condition.

  • Under Run Workflow, set the clauses that decide when the workflow runs for an identity:

    • Extraction is processed from: select the identity sources whose extractions run this workflow. At least one source is required. Clear a source to update identity attributes from it without running this workflow, for example when an additional source only supplies manager information.

    • Identity matches this condition: build the trigger condition string. Once a condition has been set, another conditional string can follow.

      You can also draft the condition string with Access AI. Click Create with AI next to the condition field to open a chat thread that suggests a value scoped to this policy and workflow. See .

    • Identity newly matches the condition:

      • Selected: The workflow runs only when the trigger condition is initially met, and on every subsequent transition from "not met" to "met."

      • Cleared: The workflow runs on every extraction where the condition is true, regardless of its previous status.

    • Identity properties: select Have changed or Run Always. See for the difference. Under Have changed, choose which changes count:

      • Any property: a change to any of the identity's properties.

      • Specific properties: a change to one or more of the properties selected in Trigger Properties. For more precise control (such as triggering only when two specific properties change together), use sys_attr_changed__<property> attributes directly in the trigger condition string instead. See

  • (Optional) Under Workflow Schedule, click Add Date Formatter.

    • Click the Formatter field to display a dropdown menu of operator functions, the conditional expression function, and attributes.

    • Click the Then Apply field to display a dropdown menu of operator functions. The Then Apply field combines a series of attribute formatters with the pipe (|) character to run the value of an attribute in sequence. The output of one formatter becomes the input of the following formatter.

  • (Optional) In Minimum Delay Before Running, set the delay. This option prevents actions from executing immediately when a trigger condition is met. The purpose of such a delay is usually to allow for propagation or to prevent repeated rapid changes that trigger unintended cycles.

  • Click Save.

  • In the New Transformer window, enter a transformer name and description.
  • Click the Integration field to display a dropdown menu of integrations of a target system.

  • Click the Entity Type field to display target entity types based on the integration that was previously selected.

  • In Attributes, click Add Attribute.

  • In Unique Identifier, click the Destination Attribute field to display a list of attributes.

  • Click the Formatter field to display a dropdown menu of operator functions, the Conditional Express function, and attributes.

  • Click the Then Apply field to display a dropdown menu of operator functions. The Then Apply field combines a series of attribute formatters with the pipe (|) character, which runs the value of an attribute in sequential order. The output of one formatter becomes the input of the following formatter.

  • Optionally, click Add Attribute to add more attributes and repeat the attribute steps.

  • For a unique attribute, the Fallback Formatter option appears. Click Add Fallback to provide an alternative formatter when a conflict occurs if the primary formatter generates a value that is already in use.

  • Optionally, select Set for new and existing users to keep the target entity up-to-date with values from the source of truth. The default, Set for new users only, sets the value only when the entity is created.

  • Click Save.

  • Drag and drop a CSV file or navigate to a CSV file to upload. The CSV file must be 10MB or less.

  • After uploading the file, you can preview it.

  • Click Save.

  • field to display a dropdown menu of attributes.
  • Select one or more attributes for your property.

  • Click Save.

  • window, enter a name and the length of the password (default is 6).
  • Turn on the toggles for the character types every generated password must include:

    • Require at least 1 lowercase character

    • Require at least 1 uppercase character

    • Require at least 1 numeric character

    • Require at least 1 special character

    Note: At least one of the lowercase, uppercase, or numeric toggles must be on.

  • In the Disallow characters field, enter one or more characters that are not allowed in the password.

  • Click Save.

  • Be tailored per integration or scenario using custom configurations.

    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.
  • Click the Function Expression field to display a dropdown menu of operator functions.

  • Click Save.

  • Select the matching attribute in the Attribute in additional source column. Note: The Only enrich existing identities option:

    • Enabled: Only enriches existing identities from the Primary Identity Source. Does not create new identities.

    • Disabled: Creates new LCM identities for users found in the Additional Identity Source but not in the Primary Identity Source.

  • (Optional) Use the Duplicate identity resolution section of the source's card to consolidate multiple records for the same person within this source. Each source carries its own independent rule. See Duplicate Resolution Rules.

  • Create Identity
  • Sync Identity

  • Add Relationship

  • Remove Relationship

  • Create Email

  • Change Password

  • Delete Identity

  • Disable Identity

  • 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

  • Invalid Identities Detected

  • Invalid Identity

  • Identity Metadata Edit

  • Rotate Key

  • Remove Direct Access

  • Identity Deleted From Sources

  • The Manage Relationships action emits Add Relationship and Remove Relationship events.

  • Under Send a notification if:, choose Changes were made successfully, The action failed, or both.

  • Select a Veza Action: Select Veza Action for a webhook, or Select Recipient (Veza Action) for an email. 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.

  • Save the workflow.
    Block changes when safety limit exceeded (the per-workflow Hard Limit): the same reactive Hard Limit, counting only this workflow's identity changes. The workflow-level toggle is worded differently from the policy-level one. The accompanying number field shows the helper text Max identities affected per extraction.
  • Block workflow run when predicted changes exceed limit (the per-workflow Predictive Safety Limit): blocks this workflow before execution begins if the number of workflow runs predicted for it exceeds the configured threshold. The accompanying number field shows the helper text Max identities per workflow run, but the threshold counts workflow runs, not identities. Use it to stop unintended mass processing when upstream attribute changes in a Source of Identity would trigger a large batch of Joiner, Mover, or Leaver runs.

  • event. Its message says which limit was reached, and names the workflow for a workflow-level limit.
    In Invalid Identity Filter, enter a SCIM filter expression that explicitly identifies invalid identities. Identities matching this filter are marked invalid even if they also match the valid filter.
  • 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.

  • Force Save My Changes

    Saves your copy of the draft's workflows, replacing the current draft.

    Discard My Changes

    Closes the editor without saving and returns to the policy version, which shows the latest saved draft.

    location_code,state_code,state,city
    MN001,MN,Minnesota,Minneapolis
    CA001,CA,California,Los Angeles
    TX001,TX,Texas,Houston
    TX002,TX,Texas,Austin

    Option (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.

    Run Always

    Also re-runs matching identities whose properties have not changed, subject to a per-identity throttle (below).

    Predictive Safety Limit

    Before any workflow runs for an extraction

    Workflow runs predicted for the extraction

    Hard Limit

    Before each workflow task starts, and again while it runs

    Goal

    Filter

    Add a Lifecycle Management Policy

    Simulation Dry Run on Policy

    How Dry Run Works

    Starting a Dry Run

    Dry Run does not test integration connectivity. Issues like API timeouts, authentication failures, or LDAP attribute mapping errors will not be detected during simulation.

    Workflow execution behavior

    Execution order

    Trigger behavior

    SCIM condition limitations

    Policy Version

    Policy State versus Workflow Versioning State

    Policy Draft Mode

    Migrating policies between environments

    Migration script availability: The policy migration script and lookup table files are provided by Veza support. Contact support.veza.com to request the migration toolkit for your deployment.

    When to use migration scripts

    Environment setup (one-time)

    Migration procedure

    Extraction scheduling and policy control

    Extraction schedules

    Workflow parallelism

    Policy pause behavior

    Enabling and Monitoring Lifecycle Management Policies

    A policy can be enabled without any workflows configured. This allows the Identities table to begin populating from the connected identity source immediately, which is useful for validating identity data before building out provisioning workflows.

    Publishing or updating a policy does not automatically trigger an extraction. To apply policy changes immediately, manually trigger an extraction from the Integrations page.

    Policy run details

    Add Workflows to Policies

    Example Workflows

    Create a Workflow

    Force Save My Changes overwrites the draft with your version. The other user's changes are lost.

    Common workflow patterns

    Create a Transformer

    Create a Lookup Table

    Create Properties

    Create Password Complexity Rules

    Create Transformer Functions

    Policy Settings

    Making changes in the Policy Settings page will impact all versions (Draft, Published, and Retired) of the policy.

    **Policy JSON Viewer**: When enabled, a "Show Raw JSON" button appears in policy header actions to export complete policy configurations for debugging and technical support. See [LCM FAQ](lcm-faq.md) for details.

    Details

    Primary Identity Source

    You can add multiple Primary Identity Sources if they are the same type of integration. If a different type of integration is required, use the Additional Identity Source.

    Additional Identity Sources

    Notifications

    Identity Syncing Option

    The throttle is not a separate timer and does not trigger runs on its own. Veza evaluates it during the normal extraction cycle (see Workflow execution behavior) — a shorter interval lets each unchanged identity re-run more often, but it does not schedule additional extractions.

    What counts as a "change": Under Have changed, a workflow runs for an identity in two cases:

    1. One of the identity's attributes changed in the authoritative source since the last extraction.

    2. The identity newly matches the workflow's trigger condition (for example, a status attribute changed and the identity now matches an employed-only workflow that did not previously apply to it).

    A successful workflow run does not repeat for the same identity on subsequent extractions unless attributes change. A failed workflow can retry automatically based on the workflow's Retry failed workflows setting (see ).

    Safety Limits

    Configure safety limits

    Workflow-level guardrails

    Policy-level and workflow-level limits are independent. A workflow uses only its own guardrail values. It does not fall back to the policy's values, and the policy-level limits are checked separately, in addition to each workflow's own. Retry is configured only per workflow.

    When a safety limit is reached

    Example: the Leaver workflow reaches its own limit. Leaver's tasks from that extraction are blocked. Joiner and Mover tasks from the same extraction still run. From then on, the policy skips later extractions for all three workflows until the blocked tasks are resolved and processing is resumed. To stop every workflow as soon as the limit is reached, set the limit at the policy level instead.

    Parallel execution and Hard Limits: When a policy processes tasks in parallel, the total number of completed changes may slightly exceed the configured Hard Limit. This is because multiple tasks that are already in progress can complete before the system detects that the threshold has been reached. The amount of overshoot depends on the number of tasks allowed to run at the same time. Once the overshoot is detected, all remaining tasks are blocked for manual review.

    To enforce the Hard Limit exactly with no overshoot, set the parallel task count to 1. This ensures each task completes before the next one begins, at the cost of longer processing times.

    Blocked Tasks

    Identity Validation

    Duplicate Resolution Rules
    Trigger Conditions Reference
    Trigger Conditions Reference
    How to customize intervals
    Advanced scheduling
    Provisioning Activity
    Trigger Conditions Reference
    Attribute Mapping
    Relative Date Conditions with WHEN()
    Transformer Reference
    Lookup Table Transformers
    Set the date format and time zone
    Duplicate Resolution Rules
    Create a Workflow
    Notifications Templates
    Trigger behavior
    workflow-level guardrails
    LCM FAQ
    Blocked Tasks
    SCIM filter expressions
    Trigger Conditions Reference
    Lifecycle Management joiner workflow showing user creation, attribute sync, and account provisioning steps
    Lifecycle Management leaver workflow showing user deactivation, account disabling, and access removal steps

    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.

    Identity changes the extraction has made so far

    . 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
    .
  • Used properties: a change to at least one property the workflow actually uses. These are the properties referenced by the trigger condition, enabled conditions, and state-changing actions, plus any you add in or these properties changed.

  • 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.

    Create a Workflow
    Identity Syncing Option
    Workflow-level guardrails
    Create with AI for Lifecycle Management
    System Attributes
    LCM FAQ

    Lifecycle Management FAQ

    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.

    Overview

    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.

    Learning more

    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:

    • Managing Identities

    Dry Run Testing

    Can I test policy changes before making them live?

    Yes, dry run simulations let you safely preview policy changes before deployment. Dry run evaluates workflow logic and shows what actions would occur without making actual changes to target systems. You can test a single identity or run bulk dry runs against multiple identities with filtering options.

    For step-by-step instructions, see .

    What does a dry run test?

    Dry run evaluates the selected identity against all workflows in a policy and shows:

    • Matched workflows: Which workflows triggered and why

    • Planned actions: What provisioning or deprovisioning would occur, including full action configuration details

    • Access profiles: Which access profiles would be assigned or removed

    Dry run does not test integration connectivity or validate that actions would succeed. It only evaluates whether workflow conditions are met.

    Policy Configuration

    What happens when an action fails in a workflow?

    When an action fails, the entire workflow retries on the next policy run—not just the failed action. All actions (including previously successful ones) re-execute unless configured with "Skip if action has already been run".

    Workflow retry is configured per workflow under Execution Guardrails. Workflows created in the UI start with retry turned off. A policy-level value set through the API is applied, when the policy is published, to workflows that do not set their own. See Workflow-level guardrails.

    Property
    Description
    Default

    Workflow retry is one of three separate behaviors, on very different timescales. The other two are covered under How many times does Veza retry a failed provisioning action? in .

    What is the "Skip if action has already been run" option?

    This safety mechanism prevents the same action from executing multiple times for the same identity, even if the workflow re-triggers. LCM tracks successful completions per identity and skips the action if already completed.

    Enable for one-time actions:

    • Create Email, Welcome notifications, Initial Password Setup, One-time provisioning

    Disable for repeatable actions:

    • Sync Identity, Manage Relationships, Deprovision Identity

    How do I enable a new lifecycle management policy?

    Creating a policy involves configuring your source(s) of identity, workflows, and actions to automate lifecycle events:

    1. Create Policy: Go to Lifecycle Management > Policies > Create Policy

    2. Configure Source: Select your HR system or IDP as the data source

    3. Add Workflows: Define triggers for Joiner, Mover, and Leaver scenarios

    4. Configure Actions: Set up provisioning, deprovisioning, and access assignments

    5. Test and Activate:

      • Run dry-runs to test the policy configuration

      • Click Publish to save the policy (it will be in Initial state)

      • On the

    How do I temporarily disable workflows or actions?

    You can pause or disable specific workflows and actions within a policy for safer testing and gradual rollouts, without deleting or modifying the underlying configuration. Disabled workflows and actions are skipped during policy execution, and the policy editor displays them with a "Disabled" tag.

    Disabled workflows are still evaluated during Dry Run simulations by default, so you can test workflow logic before enabling it in production.

    For step-by-step instructions, see .

    What is the Continuous Sync option, and why should I use it?

    Continuous Sync keeps a provisioned user's source attributes automatically updated in target systems after initial provisioning, rather than syncing only once at creation time.

    Why use Continuous Sync:

    • Keeps downstream systems current - Attribute changes (title, manager, department) propagate automatically

    • Reduces drift - Avoids stale or inconsistent values that impact compliance

    • Supports policy logic - Updated attributes can trigger dynamic policy conditions

    Configuration overview:

    Continuous Sync requires configuration at multiple levels:

    1. Action level: Turn off Update only on create or reactivate on Sync Identities actions

    2. Attribute level: Select "Set for new and existing users" for attributes that should stay synchronized

    Why are secondary sources of identity optional if an admin can add multiple primary sources?

    Secondary sources of identity are not redundant, despite the availability of multiple primary sources. They serve fundamentally different purposes:

    Primary Sources of Identity (SOI):

    • Must all be of the same entity type (e.g., all Worker entities from Workday).

    • Create the core identity records that drive lifecycle management workflows.

    • All primary sources are treated as authoritative for identity creation.

    • Changes in any primary source trigger lifecycle workflows.

    Secondary Sources of Identity:

    • Can be of different entity types than the primary source (e.g., HRIS Employee records enriching Workday Workers).

    • Primarily used for enrichment rather than identity creation.

    • Support two distinct operational modes via the only_enrich_existing flag:

    Secondary sources of identity provide flexibility in scenarios that require:

    Data Enrichment from Non-Identity Sources: Organizations may need data from systems that shouldn't be authoritative for the identity lifecycle. Secondary sources support scenarios where core identities originate from HR (primary), and additional attributes come from departmental systems (secondary). Not all employees may exist in all systems. For instance:

    • HRIS system (primary) defines who exists in the organization.

    • A secondary system provides office location or manager metadata.

    • The secondary system shouldn't create/delete identities but should enrich them.

    Cross-System Correlation: Secondary sources create attribute mappings to link records across systems using custom correlation logic. This supports multiple matching strategies:

    • Exact match on identifier (e.g., employee_id = worker_id)

    • Email-based correlation

    • Composite key matching (multiple attributes)

    • Custom correlation expressions

      For example, correlating employee_id

    Do trigger properties stop a workflow from running even when the Identity Syncing Option is set to Always?

    Yes. Trigger properties (configured with Specific properties under Identity properties → Have changed, or with sys_attr_changed__<property> checks in the trigger condition) gate a workflow so it runs only when at least one of those properties changes in the source since the previous extraction. This change check is evaluated before the workflow's Identity Syncing Option (Have changed / Run Always), so it applies even when that option is Run Always.

    A trigger condition becoming true is not by itself a property change. With a time-based condition such as hire_date <= TODAY, the day the current date catches up to an unchanged hire_date changes no property value, so a workflow gated on trigger properties does not fire on that day. New identities are the exception: every property on a new identity is treated as changed, so joiner workflows still run.

    If you need a workflow to run whenever its condition first becomes true, regardless of attribute changes, do not configure trigger properties on it. See .

    Access Profiles

    What are Access Profiles, and how do they work with LCM?

    Access Profiles are collections of entitlements (groups, roles, or permissions) that can be automatically assigned to users based on their attributes. They serve two key functions:

    • Birthright Access: Automatically assigned through policy workflows during joiner/mover/leaver events via the Manage Relationships action

    • Just-in-Time (JIT) Access: Available for request through Access Requests, with provisioning managed by LCM policy

    Access Profile Types (Business Role, Entitlement, Application, etc.) determine behavior and can be configured hierarchically for fine-grained access control.

    Safety and Limits

    What safety mechanisms prevent unintended mass changes?

    Lifecycle Management provides two independent safety limit mechanisms that can be used individually or together for layered protection:

    Hard Limit (formerly "Safety Limit") — A reactive mechanism that halts processing during execution after the configured number of identity changes has been reached. When triggered, no further identity changes are processed for the current policy run.

    • Configured with max_identities_affected_count

    • Enabled with enable_change_limit

    Predictive Safety Limit — A proactive mechanism that blocks all changes before execution begins if the system predicts the number of workflow runs will exceed configured thresholds. This prevents unintended mass processing when upstream attribute changes in a Source of Identity would trigger unnecessary Joiner, Mover, or Leaver workflows.

    • Configured with max_workflow_runs_count

    • Enabled with enable_predictive_change_limit

    Safety limits can be configured at both the policy level and individual workflow level for granular control.

    For example, if you have 1,000 users in your organization:

    • A Hard Limit of 100 identities will halt processing after 100 identity changes have been executed

    • A Predictive Safety Limit of 200 workflow runs will block the entire policy run before it starts if more than 200 workflow executions are predicted

    In both cases, a warning notification is sent, and manual intervention is required before processing can continue.

    Parallel Execution and Paused Tasks

    When parallel workflow processing is enabled, paused tasks (waiting for approval, delays, etc.) free up running slots, allowing other tasks to start. This can create scenarios where many paused tasks bypass the safety limit check when they resume.

    To mitigate this, configure the max_paused_slots setting to limit how many paused tasks can free up running slots:

    • First N paused tasks: Free up slots (allowing new tasks to start)

    • Additional paused tasks: Remain counted as "running" (preventing new tasks from starting)

    This setting has no UI control. Configure it through the parallel execution settings API. See .

    Recovery Options

    When a Predictive Safety Limit triggers:

    • Navigate to the Blocked Tasks page to review what would have changed

    • Run blocked tasks individually or in bulk to manually approve execution

    • Abandon blocked tasks to discard them without executing

    • Resume processing after acknowledging the warning

    When a Hard Limit triggers:

    • Review the warning details in the policy event log

    • Run dry-runs to understand the impact on affected identities

    • If changes are expected (e.g., bulk onboarding):

      • Temporarily increase limits via API

    How do I configure parallel execution settings?

    Set concurrency limits on the Performance tab of the Lifecycle Management Settings page, which requires the Admin role. The Concurrency section sets three limits:

    • Workflow tasks (workflows): how many triggered workflows run in parallel across all policies in the tenant. Each task runs one identity through its policy workflow.

    • Access request fulfillments (access_requests): how many approved requests apply their access changes in parallel across the tenant.

    • Provisioning jobs (jobs): how many actions Veza sends to connected applications in parallel. This limit applies to each Insight Point or agent manager separately. Keep it at or above the other two values, or provisioning jobs become the bottleneck.

    The minimum for each limit is 1. Each field shows the environment-level ceiling as Max, which is 1 unless Veza Support has raised it. When a saved value is above the ceiling, the field also shows the Effective value, which is the ceiling.

    The Non-blocking pauses toggle, off by default, lets a task that reaches a pause step release its slot until the pause ends, so other tasks can run in the meantime.

    Why does the Hard Limit get exceeded when running tasks in parallel?

    When a policy runs with parallel execution enabled, the Hard Limit may be exceeded by a small amount. This happens because multiple tasks that are already running can complete before the system detects that the threshold has been reached. Once the overshoot is detected, all remaining tasks are halted and blocked for manual review.

    The amount of overshoot is proportional to the number of tasks allowed to run at the same time. For example, if parallel execution allows 10 concurrent tasks and the Hard Limit is set to 5, up to approximately 10 changes may complete before the remaining tasks are blocked.

    This is expected behavior. The Hard Limit still acts as a safeguard by halting all remaining tasks once the overshoot is detected.

    To enforce the Hard Limit with no overshoot, set Workflow tasks to 1 on the Performance tab of the Lifecycle Management Settings page. Each task then finishes and reports back before the next one begins, so the count is accurate at every step. The tradeoff is that tasks take longer to complete.

    Notifications

    When should I use policy-level notifications versus action-level notifications?

    Lifecycle Management supports notifications at two levels with different capabilities:

    Feature
    Policy-Level
    Action-Level

    Choosing the right level:

    • Use policy-level for user-facing notifications requiring entity context (usernames, emails, relationship details). These support dynamic recipients and rich placeholders like {{ENTITY_NAME}} and {{LOGIN_NAME}}.

    • Use action-level for operational monitoring where you only need confirmation that an action completed, without entity-specific details.

    For configuration details, see:

    • - Event-based notifications with entity context

    • - Action-level notification configuration

    • - Placeholders and custom templates

    Access Request Notifications

    Do administrators need to configure notifications for Access Request events?

    Yes, administrators must explicitly configure notifications for Access Request events. Notifications can be configured for six event types (created, action run, completed, failed, state changed, approver assigned), with recipients selected from five categories: Approvers, Creator, Beneficiary, Watchers, or specific email addresses.

    Behavior Change (August 2025): Previously, notifications were automatically sent to all recipient types for all events. The default was removed for better control. Existing customers had settings automatically migrated to match the old behavior.

    Configure notifications through Lifecycle Management > Settings > Access Request Settings > Notifications, or via the Access Request Settings API. Note that there is no "all admins" option—administrators receive notifications only when explicitly configured as approvers, creators, watchers, or listed in other_emails.

    Without notification configuration, users and approvers won't receive alerts about access request activities.

    How do I control or stop Access Request notifications?

    Access Request notifications are sent to five recipient categories: Approvers, Creator, Beneficiary, Watchers, and other_emails (specific addresses). Administrators receive notifications only when explicitly configured in one of these roles—there is no "all admins" setting.

    Common issue: If you're receiving unwanted notifications, you're likely configured as a default approver for Access Requests with to_approvers=true enabled. For customers migrated from pre-August 2025, all recipient types are enabled by default.

    Solutions:

    • Remove your role: Stop being an approver, creator, or watcher for requests

    • Modify settings: Disable specific recipient groups (e.g., to_approvers=false) in Lifecycle Management > Settings > Access Request Settings > Notifications

    • Disable events: Turn off entire event types if not needed

    For programmatic configuration, contact your Customer Success Manager or Veza support.

    Does the notification body support rich text HTML?

    Yes, notification templates fully support HTML and CSS. You can use standard HTML markup, inline styles, images, and links in all Lifecycle Management and Access Request notification templates.

    Key Capabilities

    • Standard HTML tags (<html>, <body>, <br>, <div>, <p>, etc.)

    • CSS styling (inline or embedded)

    • Images (embedded attachments or external URLs)

    • Links and formatting

    • Custom branding and layouts

    Template Management

    • Templates are currently managed via the Notification Templates API

    • All built-in templates use HTML structure

    • Support for small image attachments (under 64kb, base64-encoded)

    • External image linking for high-resolution content

    Data Processing and Extraction

    Does Lifecycle Management perform a full sync or a delta sync?

    These are two separate questions, and separating them is usually what resolves the confusion.

    How the integration collects data from the source is a property of each integration. Most integrations perform a complete collection on every run. Collecting only changed records, which Veza calls incremental extraction, is the exception. See How much each run collects.

    What Lifecycle Management does with that data is the same for every source of identity. After each extraction, Lifecycle Management compares the incoming identities against the identities it stored on the previous run, attribute by attribute, and classifies each one as new, updated, unchanged, or deleted. Those counts appear in the Analyze Identities step of the policy run details.

    So Lifecycle Management always evaluates the complete set of identities and reports the differences it finds. An extraction in which every identity has a changed department is the same kind of run as one in which four managers changed, with a different result.

    Which attributes are ignored when detecting identity changes?

    Some attribute values move on their own without anything about the identity changing. If Lifecycle Management compared them, most identities would be marked as updated on most extractions, and workflows configured to run on change would fire constantly.

    Two kinds of attribute are excluded from change detection:

    • Activity and record timestamps from the source: last_login_at, last_logon, last_successful_login_at, last_non_interactive_login_at, password_last_changed_at, last_updated_at, last_pushed_at, created_at, and sys_updated_on.

    • Attributes Veza computes itself, including the system attributes that flag whether an identity is new, is a mover, or has duplicates, along with the per-attribute change flags.

    Excluding an attribute from change detection does not remove it from the identity. The value is still stored, still visible on the identity, and still usable in trigger conditions and transformers. It only stops that attribute from causing the identity to count as changed.

    When does LCM evaluate identities for CSV/OAA data sources?

    LCM processes identities from CSV and OAA-based data sources only when specific events occur, unlike native integrations that can pull data on-demand.

    Trigger Events for Identity Processing

    For CSV and OAA data sources, extraction and identity evaluation occur when:

    1. New Data Push - A new CSV file is uploaded or an OAA payload is pushed

    2. Manual Extraction - An extraction is started from Integrations > All Data Sources > Start Extraction

    3. Enrichment Rule Save - Saving an enrichment rule re-extracts every data source that matches the rule's integrations. See

    4. Re-processing the latest extraction - On a policy stopped by a safety limit, the policy API can re-process the most recent extraction. This re-runs the same stored extraction snapshot from the beginning, and can be told to disregard the change limit

    Key Behaviors

    • No Automatic Refresh: CSV/OAA sources don't automatically fetch new data - they only process what was last pushed

    • Re-extraction Uses Same Data: If extraction is triggered without a new push, it re-processes the same payload

    • Policy Changes Apply at the Next Extraction: Publishing or updating a policy does not extract anything by itself. A published change takes effect the next time the data source is extracted, so start an extraction manually to apply it sooner. See

    CSV-Specific Details

    • CSV files are converted to OAA payloads upon upload

    • The original CSV is not stored; only the OAA transformation is retained

    • Re-extraction processes the stored OAA payload, not the original CSV

    Common scenarios when working with CSV Uploads:

    Daily CSV Upload:

    • New file uploaded → Extraction triggered → Identities processed

    • Workflows evaluate identities based on each workflow's Identity properties mode (Have changed by default)

    No New Upload for 7 Days:

    • No extraction occurs automatically

    • Existing data is NOT re-evaluated unless one of these happens:

      • An extraction is triggered manually

      • An enrichment rule is saved

    Policy Published or Updated:

    • The change is stored and applies at the next extraction, not on save

    • At that extraction, all identities are re-evaluated against the new configuration

    • Can trigger workflows even without data changes

    Important Considerations

    What happens when an extraction takes longer than the scheduled interval?

    Veza has built-in guardrails to prevent overlapping extraction jobs for the same data source. A new extraction job is enqueued only if there is no pending or in-progress job for that data source.

    Job Scheduling Behavior

    The interval is measured from the completion of one extraction to the start of the next, not from one start to the next. A long-running extraction therefore pushes the following one out rather than causing a fixed schedule to slip:

    1. A data source becomes eligible for extraction once its configured interval has elapsed since the previous extraction finished

    2. While an extraction is pending or in progress, no second extraction is enqueued for that data source

    3. Time that passes during a long extraction does not accumulate—missed time is dropped, not queued up for later execution

    For example, supposing a 1-hour extraction interval, where an extraction starts at 2:00 AM but takes 4 hours and 30 minutes to complete:

    • 2:00 AM - Extraction job starts

    • 6:30 AM - Extraction completes, and the 1-hour interval begins counting from here

    • 7:30 AM - The data source becomes eligible again, and the next extraction is enqueued

    Because each interval restarts at completion, the effective cycle is the extraction's duration plus the configured interval, and the start time drifts later with each cycle. Veza evaluates eligibility on a recurring sweep rather than at an exact moment, so an extraction may begin a few minutes after the data source becomes eligible.

    This behavior applies to all interval-based extraction schedules and is not specific to any particular integration or API. It is intended to prevent system resource exhaustion from simultaneous extractions.

    Note that each data source is evaluated independently, and extractions for different data sources can run concurrently. Manual extraction triggers will also be skipped if an extraction is already running for that data source

    CSV Upload and Transformations

    Can I transform CSV data during upload for LCM?

    Yes, Veza supports data transformations when uploading CSV files for HRIS and application data sources. This allows you to manipulate and format data during the upload process without preprocessing.

    Supported Transformations

    Transformations can be applied to CSV columns during mapping configuration:

    • String Operations: Concatenation, splitting, case conversion

    • Data Formatting: Date formatting, number formatting

    • Conditional Logic: If/then conditions based on column values

    • Template Mappings: Create complex attribute values from multiple columns

    Use Cases

    1. Combine Multiple Columns: Create full names from separate name columns

    2. Extract Data: Gather domains from email address values

    3. Format Dates: Convert date formats to match target system requirements

    4. Apply Business Logic: Set department codes based on location values

    Example Transformations

    Concatenate columns:

    Extract email domain:

    Pad employee ID with zeros:

    Important notes:

    • Conditional logic is not supported: CSV transformations do not support IF statements or conditional expressions

    • CSV headers are automatically converted to lowercase, with underscores (e.g., "First Name" becomes "first_name")

    • Use {{column_name}} syntax to reference CSV columns in attribute transformations within a Lifecycle Management Policy.

    Technical Implementation Note

    When you upload a CSV file:

    1. The CSV is immediately converted to OAA (Open Authorization API) format

    2. Only the OAA payload is stored, not the original CSV

    3. Any re-extraction uses this stored OAA payload

    4. This ensures consistent data processing across all extraction cycles


    Integrations

    Does Veza support custom Active Directory attributes and moving users between organizational units (OU)?

    Yes, Lifecycle Management fully supports both custom Active Directory attributes and moving users between organizational units.

    Custom Attributes: You can synchronize custom AD attributes (like hrdivisionID, cost center, or other organizational data) from your source of identity. First, add custom properties in your AD integration configuration (in the Custom Properties step of the integration wizard), then map them in your LCM policy's Sync Identity action using attribute transformers. After enabling custom attributes for the integration, they can be set for new and existing users just as standard AD attributes.

    Moving Between OUs: You can move users between organizational units by modifying the user's distinguishedName attribute in a Sync Identity action. For example, use CN={{login_name}},OU=Disabled Users,DC=company,DC=com to move terminated employees to a disabled users OU, or dynamically construct paths like CN={{login_name}},OU={{department}},OU=Users,DC=company,DC=com for department-based placement. This is useful for mover and leaver scenarios where users need to be relocated based on employment status or organizational changes.

    For details on configuring LCM integrations, including setup instructions, extraction requirements, and supported capabilities, see Lifecycle Management Integrations overview.

    What is the difference between sources of identity and target applications in Veza Lifecycle Management?

    There are two different types of integrations supported by Lifecycle Management:

    • Source of Identity (SOI): These are authoritative systems that provide definitive information about user identities and their status within an organization. Common examples include Human Resource Information Systems (HRIS), corporate directories, and Identity Providers (IdPs). While Veza typically does not require write permissions to these sources, some can also serve as provisioning targets and support write-back of newly created user attributes, such as an email address.

    • Target Applications: These are the applications, platforms, and systems where Veza can programmatically provision and deprovision user access. This includes a wide range of systems from cloud infrastructure (AWS, Azure) and databases (Snowflake, MySQL) to SaaS applications (Salesforce, Atlassian Cloud).

    Do target applications have special integration requirements?

    Veza provides comprehensive coverage for target applications through a multi-faceted approach:

    • Native Integrations: Veza offers native, full CRUD-based provisioning and deprovisioning for numerous applications and platforms, including IdPs, directories, cloud platforms, business and productivity applications, databases, developer platforms, and more. These integrations typically provide deeper control over entitlement management and support user lifecycle actions (onboarding/offboarding) beyond basic account creation.

    • SCIM Support: Lifecycle Management supports any application that supports SCIM provisioning standards as target applications. You can enable Lifecycle Management for compatible targets using the generic

    • Open Authorization API (OAA): Custom Application Templates and custom REST API actions enable provisioning and deprovisioning for the long tail of custom, legacy, and homegrown applications.

    Any non-SCIM application that offers a suitable interface for user provisioning and deprovisioning can be supported. Customers, partners, or Veza can easily develop integrations with custom applications.

    What Source of Identity (SOI) systems are supported?

    Veza LCM supports a variety of Source of Identity systems to serve as authoritative sources for user identity information.

    Built-in SOI Systems include:

    • Active Directory - Microsoft directory service

    • ADP Workforce Now - Cloud-based HR and payroll platform

    • Azure AD - Microsoft cloud identity service

    • Beeline - Shift-based workforce management system

    • Coupa CCW - Cloud-based business spend management platform

    • Custom IDP - Generic identity provider integration for custom authentication systems

    • Custom HRIS (OAA) - Custom HR systems using Open Authorization API (OAA) templates

    • Database HRIS - HR data read from a SQL database

    • HiBob - Modern HR platform for businesses

    • Ivanti Neurons HR - HR platform for onboarding/offboarding and self-service

    • LDAP - Generic LDAP directory

    • Okta - Cloud-based identity and access management service

    • Oracle HCM - Human Capital Management cloud solution

    • ServiceNow - IT service management platform

    • UKG Pro - HR platform, through its HRIS integration

    • Workday - Cloud-based human capital management platform

    CSV Upload and Open Authorization API templates provide an extensible framework for adding custom identity providers or HRIS platforms.

    • Custom OAA Integration - Any system can be configured as an SOI through the Open Authorization API

    • Custom Principal - Support for non-traditional identity sources

    What SCIM attributes does Veza support?

    Veza supports SCIM 2.0 attributes for both read-only data extraction and Lifecycle Management synchronization. The specific attributes available depend on whether you're extracting data for the Access Graph or synchronizing user/group information through LCM.

    Core User Attributes

    For LCM Synchronization, Veza supports the standard SCIM user attributes including:

    • Identity & Authentication: userName (required), id, externalId, active

    • Contact Information: emails, phoneNumbers, addresses, ims

    • Personal Information: displayName, givenName, familyName, middleName, nickName

    • Professional Information: title, userType, locale, timezone, preferredLanguage

    For Read-Only Extraction, all SCIM core attributes are captured, including additional metadata such as profileUrl, photos, createdAt, and lastModified.

    Veza supports standard SCIM group attributes including displayName, id, externalId, groupType, description, and members for both extraction and LCM operations.

    Enterprise Extension Support: Veza can synchronize Enterprise Extension attributes including department, division, employeeNumber, costCenter, organization, and manager for both read-only extraction and LCM.

    Custom Extensions: Veza automatically discovers and extracts all custom vendor-specific SCIM extension attributes for read-only purposes (they appear in the Access Graph). You can synchronize Custom vendor extensions when Extension Schema Discovery is enabled, by referencing the normalized attribute name when constructing a transformer for Lifecycle Management or Access Requests.

    Which SOI systems support email writeback?

    Email writeback capability allows LCM to update the Source of Identity with newly created email addresses during provisioning workflows.

    Systems Supporting Email Writeback

    Currently, only a limited subset of integrations support the Write Back Email action:

    • Workday

    • Oracle HCM

    • HiBob

    • OAA Custom HRIS templates that declare email write-back

    How Email Writeback Works

    1. LCM creates an email account in the target system (for example, Exchange or Azure)

    2. The newly created email address is written back to the user's record in the SOI

    3. This ensures the SOI remains the authoritative source with current email information

    The Write Back Email action requires an upstream action that produces the address. Separately, a action can target an identity source directly and set a writable attribute to any mapped value, which is how you write an email back when no mailbox is created in the workflow. Writable attributes vary by integration.

    What target systems are supported natively and via SCIM?

    Veza LCM supports provisioning across target systems through native integrations and SCIM protocol compatibility.

    Supported Categories

    Native Integrations (Full lifecycle support):

    • Identity Providers: Okta, Azure AD, Active Directory, AWS SSO

    • Collaboration: Google Workspace, GitHub, Exchange

    • Business Apps: Salesforce, ServiceNow, Workday, SAP ECC

    • Data Platforms: Snowflake, Veza Platform

    SCIM 2.0 Support:

    • Generic SCIM (any compliant system)

    • Includes Atlassian Cloud, Oracle Fusion Cloud, and SwiftConnect

    Advanced Configuration

    What optional features can be enabled for LCM?

    Lifecycle Management includes core workflow capabilities, with additional features available depending on your configuration needs. Some features that were previously gated are now available by default, while others require configuration or enablement.

    Capability

    What It Enables

    Are password reset and access review actions available by default?

    Yes, the Reset Password and Create Access Review workflow actions are now generally available as standard LCM functionality. These action types appear as available options when configuring workflow actions in LCM policies.

    Additionally, Secondary Sources of Identity are also now generally available, allowing you to configure secondary identity sources in policies without requiring special enablement.

    These features were previously in Early Access but are now standard functionality available to all tenants.

    How does Veza determine the active state and other attributes when an identity has both primary and secondary sources?

    When a policy identity has both primary and secondary sources, Veza determines which source's attributes to display in the Identities table—including the identity's active state—based on the is_active field from each source. The is_active field typically represents employment or account status (e.g., an active employee in Workday, an active contractor in a secondary system).

    Default behavior:

    • Always displays the primary source attributes if a primary source exists

    • Only displays secondary source attributes if no primary source exists

    Enhanced behavior (Early Access):

    Primary Source Status
    Secondary Source Status
    Displayed Attributes Source

    This prioritization ensures the Identities table reflects the most current source of truth, which is particularly useful in scenarios where:

    • A user's primary identity becomes inactive (e.g., employee terminated in Workday, is_active=false)

    • The secondary identity source remains active (e.g., contractor account still active in secondary system, is_active=true)

    • You need visibility into which system currently maintains active identity information

    Example scenario: An employee terminates from their full-time position (primary Workday identity becomes is_active=false) but continues as a contractor (secondary source remains is_active=true). With enhanced behavior enabled, the Identities table displays attributes from the contractor system, reflecting their current active status.

    Lifecycle Management Troubleshooting

    How do I tell whether an issue comes from source data, sync timing, policy configuration, or the target system?

    The policy run details separate these causes. Each policy run reports three execution steps in order, and each corresponds to a different class of problem.

    • Analyze Identities points to source data or sync timing: identity counts are not what you expect, or the run predates the change you are looking for.

    • Evaluate Workflows points to policy configuration: identities arrived correctly, but trigger conditions did not select them.

    • Execute Workflows points to the target system or a safety limit: tasks ran and the target rejected the change, or Veza held the work back.

    Work through the steps in order. An unexpected result in Analyze Identities makes everything below it unreliable.

    Before investigating the target system, check whether the work was held back rather than attempted. Execute Workflows reports tasks blocked by a safety limit, per workflow as well as for the run. A run status of Stopped means the run halted early: a safety limit blocked tasks, identity validation blocked processing, or identity detection or workflow filtering failed. In those cases the target system was not contacted for the affected identities.

    For target-system failures, open , filter the Integration Jobs tab to State = Errored, and read the error message the target returned.

    How many times does Veza retry a failed provisioning action?

    Three separate behaviors are sometimes described as retries. They operate on different timescales.

    • Consistency polling (not configurable): after creating, updating, or deprovisioning an account, or changing its relationships, Veza polls the target for up to about 100 seconds until the change is visible. These are reads, not repeated writes. A delete is the exception: Veza resends it until it succeeds or the attempts run out. Active Directory and SAP ECC do not use this polling.

    • Job timeout (not configurable): a provisioning job that does not complete within 15 minutes is recorded as errored. A job that an Insight Point has already picked up can still complete at the target after the timeout.

    • Workflow retry (configurable per workflow): a failed workflow re-attempts on later extractions, up to the configured maximum.

    Because workflow retry happens on later extractions, retries are spaced at least one extraction apart rather than in rapid succession. See for the retry settings.

    Can a retried workflow create duplicate accounts in the target system?

    Before creating an account, Veza looks for an existing one: first by the entity ID it recorded for that identity on a previous sync, and otherwise by the unique identifier attributes configured for the integration. Veza creates an account only when that lookup returns nothing. When an attribute has alternative values and another account already holds the first value, Veza records a conflict and tries the next alternative value.

    A workflow that fails and retries repeatedly therefore does not produce an account per attempt.

    This protection depends on the existing account being discoverable when the next attempt runs:

    • Confirm that unique identifier attributes are configured for each provisioning target.

    • If a create succeeds at the target but Veza does not receive the result, for example when the job times out, Veza records an error. The next attempt's lookup is what prevents a duplicate, so the new account must be findable by then.

    The Apps tab on the identity's detail page shows the target accounts Veza has mapped to that identity.

    Why are workflows not running on a policy with multiple sources of identity?

    When a policy first starts, it waits until every configured source of identity, primary and secondary, has extracted. It then saves identities without running workflows until the most recent extraction of every source has finished successfully, and workflows start on the following extraction. See Policy run details.

    If workflows have never run on a new multi-source policy, check the last extraction state of every source, including secondary sources. The policy run details show each source separately. The gate applies only once: after workflows have started, a failed extraction from one source does not hold them.

    How can I export or view the complete JSON configuration of a policy?

    The Show Raw JSON optional feature allows you to view and export the complete JSON representation of a Lifecycle Management policy for debugging and troubleshooting purposes.

    Accessing Raw JSON

    To view the raw JSON configuration:

    1. Go to Lifecycle Management > Policies

    2. Select a policy to view its details

    3. Click Show Raw JSON in the policy header actions (if enabled for your tenant)

    4. The complete policy configuration displays in a modal window

    5. Use the Copy JSON button to copy the configuration to your clipboard

    What's Included

    The raw JSON export includes the complete policy structure:

    • Policy metadata (name, description, state, version information)

    • Workflow configurations and trigger conditions

    • Action definitions and parameters

    • Transformer mappings and attribute configurations

    The raw JSON feature is useful for providing complete policy configurations when working with support teams, and understanding the underlying policy structure. Use this option for creating backups of complex policy configurations and debugging complex policy behaviors.

    For more information, see in the Policies documentation.

    What roles can access Lifecycle Management and Access Profiles?

    Access to Lifecycle Management and Access Profiles is managed through Veza's role-based permission system. User permissions can vary based on their assigned roles and team membership, enabling separation of duties and security controls across the platform.

    Only Administrator roles have full management capabilities for LCM policies and Access Profiles. All other roles provide various levels of read-only access, with some specialized roles offering additional functionality like integration management or review assignment.

    Role Categories and Access Levels

    Veza roles fall into two availability tiers that determine their LCM access capabilities. Generally Available roles can be assigned without additional configuration, while Early Access roles require enablement by Veza support before assignment.

    Understanding Team-Based Access Control

    Team assignments determine the scope of data and integrations that users can access within their assigned roles. The Root team provides unrestricted access to all integrated data providers, while custom teams limit access to specific team-assigned integrations.

    Root Team Access grants users visibility into all LCM policies across every integrated provider, the ability to create Access Reviews and manage system-wide configuration, and access to administrative roles that require platform-wide permissions. This team is essential for users who need comprehensive oversight of lifecycle management operations.

    Non-Root Team Access restricts users to viewing only LCM policies relevant to integrations within their team's scope. These users cannot create Access Reviews or access system-wide administrative features, but they can effectively manage policies and profiles within their designated integration boundaries. Non-root teams are recommended for departmental teams or application-specific access control scenarios.

    Multi-Team Membership allows users to belong to multiple teams simultaneously, with potentially different roles in each team. Users can switch their "active team" context to access different sets of policies, profiles, and data based on each team's integration scope. This supports organizational structures where users need varied access levels across different systems.

    Automated Role Assignment Through SSO

    Organizations using Single Sign-On can streamline user management by automatically assigning Veza roles based on Identity Provider (IdP) group membership. This integration uses SAML/OIDC claims to map IdP groups to specific Veza team and role combinations using the format Team SSO Alias:role name (where Team SSO Alias and role name are placeholders—do not include curly braces).

    For example, the following IdP group-to-role mappings are valid:

    • Root:admin → assigns the "admin" role in the "Root" team

    • Engineering Team:operator → assigns the "operator" role in the "Engineering Team"

    • Finance:viewer → assigns the "viewer" role in the "Finance" team

    Single IdP groups can map to multiple team/role combinations, and administrators can configure default fallback assignments for users without specific group mappings.

    This approach reduces manual user management overhead while ensuring consistent role assignments based on organizational structure. For SSO configuration guidance, see .

    Implementation Considerations

    When planning role assignments, consider that policy and Access Profile management requires Administrator privileges, which are restricted to Root team members. The Veza interface automatically adjusts to user permissions—non-administrator users won't see create, edit, or delete options for resources they cannot modify.

    All permissions are enforced consistently across both the web interface and API endpoints, ensuring security regardless of access method. Organizations should carefully plan team structures and role assignments to balance operational efficiency with security requirements, particularly when implementing SSO-based automated role assignment.

    Why isn't my workflow triggering for certain users?

    Several factors can prevent workflows from triggering. Here are some recommended diagnostic steps:

    1. Attempt a Dry Run Simulation

      • View details for the specific identity in question

      • Review the messages field for workflow evaluation details

      • Check which conditions passed/failed

    2. Check for Common Issues

      • Condition Mismatch: Identity attributes don't match workflow conditions

      • Policy State: Policy might be in PAUSED or PENDING state

    3. Validate Identity Attributes

      • Verify the identity has the expected attribute values

      • Ensure attribute mappings are configured correctly

      • Check for data quality issues in the source system

    Policy States

    Policies can be in the following states:

    • INITIAL - Newly created, not yet running

    • RUNNING - Active and processing identities

    • DRY_RUN - Testing mode without making changes

    • PAUSED - Temporarily stopped

    Policies
    Attribute Transformers
    Integrations
    Policies
    page, click
    ⋮
    on the policy's row and select
    Enable
    to activate the policy (
    Running
    state)
    Enrichment mode (only_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.

  • from an HRIS system with a
    worker_id
    in Workday, or matching users across systems based on email addresses.

    Process with disregard_change_limit=true or disregard_predictive_change_limit=true parameter

  • Reset limits after processing

  • If changes are unexpected:

    • Check source system for data quality issues

    • Review recent policy configuration changes

    • Validate workflow trigger conditions

  • The latest extraction is re-processed through the policy API on a policy stopped by a safety limit

    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

    {{FirstName}} {{LastName}}
    SPLIT(Email, "@")[1]
    LEFT_PAD({{employee_id}}, "0", 6)

    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

    For step-by-step instructions, see Test policies with dry run.

    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.

    Key behaviors:

    • Only successful completions mark an action as "run"—failed actions continue to retry

    • Condition-based skips don't affect state (action runs when conditions become true)

    • Clear action history via API to force re-execution

    For detailed step-by-step instructions, see Lifecycle Management Policies

    For complete configuration details, recommended settings, and best practices, see Attribute Synchronization.

    For complete documentation including configuration, profile types, ownership, and best practices, see Access Profiles and Access Profile Types.

    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.

    You can also set these three limits through the parallel execution settings API. The API is the only way to set max_paused_slots, which has no UI control. For the API reference, configuration examples, and an explanation of max_paused_slots behavior, see Parallel Execution Settings API.

    The {{LOGIN_PASSWORD}} placeholder is only available for CHANGE_PASSWORD and RESET_PASSWORD events, not for identity creation events.

    For complete setup instructions, HTML examples, default templates, placeholder reference, and detailed formatting guidance, see Notification Templates for Lifecycle Management

    Unexpected Re-processing: If workflows unexpectedly re-trigger for all users without a new CSV upload, check these in order:

    • The latest extraction was re-processed through the policy API on a policy stopped by a safety limit. This re-runs the same stored extraction snapshot from the beginning, and can be told to disregard the change limit, which makes it a likely source of a large unexpected batch

    • An enrichment rule was saved. This re-extracts every matching data source with change detection bypassed, so every identity appears changed

    • An extraction was started manually from the Integrations page

    • A workflow has Identity properties set to Run Always, which re-evaluates matching identities on each extraction, subject to a per-identity throttle. See

    Editing a policy is not one of these. A policy edit on its own extracts nothing.

    "Have changed" mode: With a workflow's Identity properties set to Have changed, only identities with changed attributes or newly matching trigger conditions have workflows executed, even during re-extraction.

    If you notice that extractions are consistently taking longer than your scheduled interval, consider adjusting the schedule frequency to accommodate typical extraction durations. Monitor extraction times in the integration activity logs to determine optimal scheduling.

    Transformations are applied during the data extraction process and don't modify your original CSV file. The transformed values are what LCM uses for identity processing and provisioning.

    CSV transformations have different capabilities than full LCM transformers - they support basic string operations and functions but not conditional logic or complex expressions.

    For configuration details, supported attributes, and setup instructions, see [Active Directory Lifecycle Management](integrations/active-directory.md).

    For integration setup for each target system, see the LCM Integrations Guide

    Group Attributes

    Extension Attributes

    For the complete attribute reference with data types, requirements, and LCM capabilities, see the SCIM Lifecycle Management integration guide.

    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.

    For detailed configuration instructions, see the integration-specific documentation in the LCM Integrations.

    The entire Veza application catalog can potentially be LCM-enabled. Contact your Customer Success Manager to discuss enabling specific applications.

    For all validated integrations and their capabilities, see LCM Integrations.

    Features marked "Available by default" are standard LCM functionality. "Early Access" features may require Veza support to enable. Contact your Customer Success Manager to discuss configuration options.

    Early Access: Enhanced identity source prioritization may require Veza support to enable. Contact your Customer Success Manager for availability.

    This feature may require enablement for your tenant. Contact your Customer Success Manager if the "Show Raw JSON" button does not appear in your policy header actions.

    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.

    For role descriptions, team management guidance, and SSO integration details, see User Roles and Permissions, Team Management, and User and Team Management APIs.

    The Dry Run messages will explicitly state why each workflow did or didn't match.

    Lifecycle Management Troubleshooting
    System Attributes
    Parallel Execution Settings
    Policy Notifications
    Send Notification Action
    Notification Templates
    Enrichment
    Extraction scheduling and policy control
    SCIM Integration
    Sync Identities
    Provisioning Activity
    Workflow-level guardrails
    Policy Settings
    Role Mapping for Single Sign-On
    Test policies with dry run
    Disable workflows and actions

    Secondary source

    Full access: Create, edit, delete policies and workflows

    Identity syncing option

    Custom Application with SCIM (OAA)

    Enable SCIM-based provisioning for custom applications with Open Authorization API

    Overview

    Veza can automate user provisioning and de-provisioning for any application that uses the Open Authorization API (OAA) for data gathering and authorization modeling, and exposes SCIM-compliant endpoints for user and group management.

    This enables organizations to:

    • Use your application's existing SCIM endpoints for automated provisioning operations

    • Model complex authorization structures using OAA's flexible templates (applications, resources, permissions, custom properties) for Access Graph visibility, Access Reviews, and other Veza features.

    • Gather authorization metadata using a variety of methods (custom connectors, APIs, manual JSON payloads, CSV files)

    Action Type
    Supported
    Description
    1. Administrative access in Veza to configure the integration

    2. An existing integration in Veza with at least one successful extraction

    3. Your custom application must expose SCIM 2.0-compliant endpoints; see below

    4. SCIM connection details for the custom application (URL, authentication credentials)

    To enable the integration:

    1. In Veza, go to the Integrations overview

    2. Search for your custom OAA application integration

    3. Check the box to Enable usage for Provisioning

    To verify the configuration:

    1. Open Lifecycle Management > Integrations

    2. Search for the integration and click to view details

    3. In the Properties sidebar on the right (not the Properties tab), verify that Provisioning Support shows Enabled

    There are several potential ways to integrate a custom application for automated lifecycle management and access requests:

    1. 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.

    Aspect
    External OAA with SCIM Write-Back
    Built-In SCIM Connector

    This document describes how to enable External SCIM for an Open Authorization API integration, and supported actions.

    Data Gathering (OAA):

    You will need to design and build a custom integration to publish information about the application to the Veza Access Graph:

    • The payload can include local users, groups, permissions, resources, and complex authorization relationships

    • Data can be gathered from any source: APIs, databases, configuration files, etc.

    See the rest of the Open Authorization API documentation for examples and best practices when designing and deploying custom integrations.

    Lifecycle Management (SCIM):

    You can enable the SCIM connection at the custom provider level:

    • Setting provisioning: true and external_lifecycle_management_type: SCIM for the custom provider enables Veza to use your application's SCIM endpoints for provisioning

    • Provide SCIM connection information and credentials (configuration_json)

    • Veza maps lifecycle actions to SCIM operations (POST /Users

    Important: When configuring a custom application for SCIM integration, the OAA payload structure (Application template) and SCIM configuration serve different purposes:

    • The OAA Payload (push_application() or API push) defines local users, groups, permissions, and resources used for visibility and authorization modeling in Veza, and can be updated independently.

    • The SCIM Configuration (configuration_json) for the custom provider defines how to connect to SCIM endpoints (including authentication, URL, and endpoint paths), and is used only for lifecycle management and access request operations.

    Both must be consistent (describe and contain the same users and groups), but are configured separately.

    Your application must expose SCIM 2.0 compliant endpoints with the following operations:

    User Management:

    • GET /Users - List and filter users

    • GET /Users?filter=userName eq "{username}" - Query users by userName

    • POST /Users - Create new users

    Group Management:

    • GET /Groups - List groups

    • GET /Groups/{id} - Retrieve specific group by ID

    • PATCH /Groups/{id} - Update group membership

    Note: If the Users and Groups APIs are not at the standard /Users and /Groups paths, 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

    Field
    Required
    Description

    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.

    Configuration Key
    Required
    Description
    Example Value

    * 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 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:

    Veza Attribute (in Policy)
    SCIM Property
    Type
    Required
    Description

    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:

    1. Query for existing user:

    2. Update the user:

    Remove access when a user leaves the organization or changes roles. The user account is deactivated, but data is preserved.

    SCIM Operation:

    Deprovision sets active=false, which disables login but preserves the user record.

    Permanently remove a user account.

    SCIM Operation:

    Grant a user access via group membership.

    SCIM Operations:

    1. Retrieve group details:

    2. Add user to group:

    Revoke a user's access by removing group membership.

    SCIM Operation:

    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.

  • ,
    PATCH /Users/{id}
    , etc.)

    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)

  • DELETE /Groups/{id} - Delete group (optional)

    Sync Identities

    ✅

    Create new users or update existing user attributes in the target application

    Manage Relationships

    ✅

    Extraction Method

    You build the OAA push payload directly

    Auto-discovery via SCIM endpoints

    Authorization Modeling

    Full OAA Application support (roles, permissions, resources)

    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\"}"
      }'

    name

    Yes

    Display name for the Custom Provider in Veza

    custom_template

    Yes

    scim_url

    Yes

    Base URL for SCIM API (without /Users or /Groups path)

    ""

    {
      "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!
    )

    user_name

    userName

    String

    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
    }
    GET /Users?filter=userName eq "jane.doe"
    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"}
      ]
    }
    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}
    GET /Groups/{groupId}
    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}"}]
        }
      ]
    }
    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}"}]
        }
      ]
    }

    Supported Actions

    Enabling Lifecycle Management for Custom Applications (OAA SCIM)

    Prerequisites

    Configuration Steps

    Lifecycle Management and Access Requests with Open Authorization API

    How It Works

    Required SCIM 2.0 Endpoints

    Authentication

    Optional: Extension Attributes

    Configuration

    Create Custom Provider with External SCIM

    Push OAA Payload

    Entity Types and Identity Mapping

    Attribute Synchronization

    Mapping OAA to SCIM

    Extension Attributes

    Provisioning Operations

    Sync Identities (Create User)

    Sync Identities (Update User)

    Deprovision Identity

    Delete Identity

    Manage Relationships (Add User to Group)

    Manage Relationships (Remove User from Group)

    OAA custom application
    Required SCIM 2.0 Endpoints
    Getting Started Guide

    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

    https://api.myapp.com/scim/v2