← Back to all posts
IAM 12 min

Building Bulletproof Joiner/Mover/Leaver Automation with Okta Workflows

How I built HRIS-driven identity lifecycle automation at scale — from SCIM provisioning to full session revocation on offboarding. Includes an open-source lab you can run locally.

Most identity lifecycle implementations I’ve inherited share the same problem: they were built for the company’s size two years ago. Here’s how I approach JML automation that actually scales.

The Core Pattern

Every JML system I’ve built follows the same architecture: HRIS as source of truth → Okta Workflows as the orchestration layer → SCIM push to downstream SaaS. The key insight is treating Okta Workflows not as a simple automation tool, but as a proper event-driven pipeline.

At Figma, we integrated Sapling (HRIS) with Okta Workflows to handle the full identity lifecycle. The critical piece most teams miss is the mover workflow — when someone changes roles, you can’t just add new entitlements. You need to diff their current access against what their new role requires, revoke what’s no longer needed, and provision what’s new. This is where group-based RBAC pays for itself.

SCIM Mappings That Don’t Break

The number one failure mode I see: SCIM attribute mappings that assume clean data from HR. Build defensive mappings. Null-check everything. Log every attribute transformation. When your HRIS sends a department change at 2am, you want to know exactly what happened and why.

Offboarding: The Security-Critical Path

Deprovisioning is where most orgs have the biggest gaps. Disabling the Okta account is step one, not the whole job. You need: session revocation across all SSO’d apps, OAuth token invalidation, shared credential rotation triggers, and a verification step that confirms downstream systems actually processed the deprovision. I build a post-deprovision audit check that runs 15 minutes after offboarding to catch any apps that failed to process the SCIM DELETE.

The Metrics That Matter

Track these: time-to-provision (target: <15 min from HRIS event), time-to-deprovision (target: <5 min), provisioning error rate, and orphaned account count. If you can’t measure it, you can’t prove your automation is working.

🔬 See it in action

I built an open-source lab environment that demonstrates everything in this post — HRIS-driven JML automation, SCIM provisioning to mock SaaS apps, RBAC rule resolution, and post-deprovision audit checks. Clone it, run docker compose up, and watch the full lifecycle pipeline process in real time.

OktaSCIMHRISAutomationIdentity Lifecycle
AD

Written by Alex Davenport

alexdavenport.dev