Guide for implementing automated user lifecycle management across Workday, Okta, and Active Directory
A well-designed identity Lifecycle Management solution automates the provisioning, synchronization of attributes and metadata, and deprovisioning of user accounts across your application and systems ecosystem.
This guide demonstrates how to implement a worker (employees and contractors) Lifecycle Management solution using Workday as the source of identity with downstream user account provisioning and synchronization platforms of Okta and Active Directory (AD). This represents a common enterprise architecture where worker records originate in an HR system and are provisioned to identity and access management systems, while maintaining a seamless, secure, and compliant user lifecycle process.
The following diagram shows the complete identity provisioning and synchronization architecture from Workday, a human capital management platform, to Okta and Active Directory, which are identity management systems:
The "Joiner Mover Leaver" (JML) process is a framework for managing users' employment lifecycle access within an organization. Provisioning access begins with onboarding new employees (Joiners), then managing internal transitions (Movers), and finally offboarding departing employees (Leavers).
Lifecycle Management is based on the JML paradigm, where Workday is the authoritative source of identity, which is monitored for the status of the worker based on attributes in their record to determine whether the user is a joiner, mover, or leaver.
The joiner, mover, leaver (JML) process flows through the systems as follows:
Before starting this implementation, ensure you have:
Completed at least one successful extraction for each integration
Note: An extraction is the metadata ingestion process that pulls identity and permission data from target systems into Veza, enabling it to act across access policies, governance, and provisioning workflows.
Administrative access to Veza to create Lifecycle Management policies
First, create Access Profiles that define which application entitlements a group of users will be assigned:
Go to Lifecycle Management > Access Profiles
Click Create Access Profile
Configure a profile for each department or role:
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
Create additional profiles as needed based on your organizational structure.
Next, create a Lifecycle Management policy using Workday as the source of identity:
Navigate to Lifecycle Management > Policies
Click Create Policy
Configure the policy:
Name: Workday Employee Lifecycle
Source of Identity: Workday
Data Source: Your Workday integration
Entity Type: Workday Worker
Click Create Policy to save the basic configuration
Now add a workflow for new employee onboarding:
Edit your Workday Employee Lifecycle policy
Click Add Workflow
Configure the workflow:
Workflow Name: Active Employee
Condition: is_active eq true AND hire_date eq "2025-08-04T00:00:00"
This condition is triggered when, in Workday, the employee is active and a defined hiring date is "2025-08-04T00:00:00". Therefore, any active employee hired on or after the specified date is considered a joiner.
Continuous Sync: Enabled Continuous Sync is enabled, allowing updates to a user's source attributes—such as email, department, manager, or role—to be automatically synchronized to the target application on an ongoing basis after the user is provisioned.
Add actions to the workflow as detailed in the Configuration Reference section.
Add a workflow for handling employee role changes:
Edit your Workday Employee Lifecycle policy
Click Add Workflow
Configure the workflow:
Workflow Name: Mover Workflow - Regional Sales Manager
Condition: is_active eq true AND first_name eq “Sarah” AND last_name eq “Johnson” AND position eq “Regional Sales Manager”
Continuous Sync: Enabled
Add actions similar to the Joiner workflow, but ensure Remove Existing Relationships is enabled in the Manage Relationships actions to update group memberships when departments change When a user’s role changes (mover), you often need to revoke existing entitlements—like group memberships, role assignments, and permission set grants—not just avoid adding new ones. Enabling Remove Existing Relationships ensures that previously granted relationships are actively removed to prevent privilege creep or orphaned access.
Finally, add a workflow for employee termination:
Edit your Workday Employee Lifecycle policy
Click Add Workflow
Configure the workflow:
Workflow Name: Employee Termination
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
After configuring your workflows for joiners, movers, and leavers, you can test your policy using Simulated Dry Runs to check the expected actions when executed.
Another approach to test your policy is to create draft versions. You can make changes to your policy as an iterative draft until you are satisfied with the results. You can then publish the final version and enable it.
As a final verification, make modifications to the Workday application to test your policy's expected performance. Ensure that the downstream applications, Okta and Active Directory, are correct with the modifications.
Select Workday Employee Lifecycle policy.
Click the overflow menu (three dots icon) at the top of the page.
Select Perform Dry Run.
In the Identity field, select an employee name from the dropdown menu.
The Dry Run takes seconds to execute. Click Show results.
Ensure that Okta and Active Directory contain the correct identity information for the employee.
Select Workday Employee Lifecycle policy.
Click Create Draft.
Select Edit Workflow.
Modify any workflow in your policy.
Click Save Workflow. The workflow is now a draft version.
Continue to iterate on changes to the workflow until it is ready.
Click Publish when the policy performs satisfactorily.
Click Settings at the top of the page.
Click Policy Settings.
Enable the Enable Policy Draft Mode radio button.
In the Policy page, select your policy and click Actions.
In the Actions menu, select Start.
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).
In the Policy page, select your policy, Workday Employee Lifecycle policy.
Select Policy Settings.
Scroll down to Advanced Settings.
Under Identity Syncing, enable Sync on changes only or Always sync.
Synchronizes employee records to Okta user accounts, creating and updating user profiles with mapped worker attributes from Workday.
Configuration:
Description: Synchronizes identities to Okta
Target: OktaUser
Create Allowed: Yes
Continuous Sync: Yes
{username}@sigmacorpx.com
Yes
first_name
{first_name}
Yes
last_name
{last_name}
Yes
country_code
{work_location}
Yes
login
{username}@sigmacorpx.com
No
Common transformer
All Employees
Assigns "All Okta Employee Access" profile
Does not remove existing relationships
US Developers
Condition: wd_location eq "US" and department eq "developer"
Assigns developer-specific access profiles
Does not remove existing relationships
Creates and updates on-premises Active Directory accounts with location-specific group assignments and standardized naming conventions for different employee categories.
Configuration:
Description: Synchronizes identities to Active Directory
Target: ActiveDirectoryUser
Create Allowed: Yes
Continuous Sync: 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.
user_principal_name
{username}@evergreentrucks.com
Yes
{username}@evergreentrucks.com
Yes
display_name
{display_full_name}
Yes
given_name
{first_name}
Yes
sur_name
{last_name}
Yes
country_code
{work_location}
Yes
job_title
{job_title}
Yes
primary_group_dn
CN=Domain Users,CN=Users,DC=evergreentrucks,DC=local
Yes
account_name
{display_full_name}
No
Common transformer
US Location
Condition: work_location eq "US"
Assigns US Groups
Removes existing relationships
Executive Group
Condition: employee_group eq "Executive"
Assigns the Executive Employee group
Removes existing relationships
China Location
Condition: work_location eq "China"
Assigns China Groups
Removes existing relationships
Defines the procedures for safely removing access when employees leave the organization, including specific handling for each identity provider.
Handles employee offboarding in Okta by disabling accounts while preserving access history and configurations.
Configuration:
Description: Disables identities in Okta
Target: OktaUser
Remove Relationships: No
Deprovisioning Method: Disabled
Logout User: No
Remove Personal Devices: No
Controls the offboarding process for on-premises Active Directory, including moving accounts to a terminated user's organizational unit.
Configuration:
Description: Disables identities in Active Directory
Target: ActiveDirectoryUser
Remove Relationships: No
Deprovisioning Method: Disabled
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
No
Below are more detailed examples of joiner, mover, and leaver scenarios that you can implement using Veza's Lifecycle Management.
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}
To handle edge cases where standard attribute formatting is not effective, use Identity Override Attributes to define special exceptions. For example:
Contractors vs. Employees: Use different username formats based on employment type
Username Conflicts: Configure fallback formatters for handling duplicate usernames
Location-Specific Naming: Apply different naming conventions based on location or region
Ensure your email addresses remain consistent by configuring email write-back to Workday:
In your Joiner workflow, after the Sync Identities actions, add:
Add Action > Create Email
Configure for your email system
Then add:
Add Action > Write Back Email
Integration: Your Workday integration
Entity Type: Workday Worker
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:
# 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"
Monitor your lifecycle management workflows using the Activity Log:
Navigate to Lifecycle Management > Activity Log
Filter by policy name to see all actions for your Workday policy
Look for failed actions and investigate error messages
Use the activity details to verify that transformations are working correctly
If usernames are already taken in target systems:
Configure Fallback Formatters 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