Skip to content
← All projects

Project 6

Okta SCIM Provisioning

OktaSCIM 2.0Zendesk

Architecture

Architecture diagram of Okta SCIM Provisioning: an Okta app assignment or update triggers Okta's built-in Zendesk connector (create, update, deactivate), which provisions a Zendesk account automatically, with a flagged limitation that email updates are read-only via provisioning.

Overview

What was built

Automated the same provisioning and deprovisioning lifecycle as the Zendesk SCIM project, this time between Okta and Zendesk, using Okta's pre-built Zendesk connector rather than a direct SCIM endpoint, since Zendesk does not have full native SCIM support. Account creation, attribute updates, and deactivation all work through that connector.

A few standard operations, most notably email updates, are read-only on the Zendesk side regardless of which identity provider is driving them, which turned into the most substantial investigation in this project.

Why

Why it matters

This is the same business case as the Entra ID version of this integration, provisioning is what makes identity lifecycle management actually scale, just with a different identity provider and therefore a genuinely different set of constraints and failure modes to work through.

Real environments run more than one identity provider, and the specific limitations of whichever SaaS application sits on the other end do not change based on which IdP is driving it. That is exactly what showed up here.

How it works

The walkthrough

Step 1 of 3

Enable the connector

Enabled API integration on the Zendesk app in Okta, generated a Zendesk API token, and turned on the three lifecycle actions that matter: create users, update attributes, and deactivate users, with password sync explicitly disabled since SSO handles authentication, not local Zendesk passwords.

Okta provisioning features enabled for create, update, and deactivate user lifecycle actions
Lifecycle actions enabled in Okta: create, update, and deactivate.

Step 2 of 3

Provision and deprovision a real test cycle

Assigned a test user to the app in Okta and watched the account appear in Zendesk automatically within seconds, no manual account creation. Unassigning that same user suspended their Zendesk account automatically rather than deleting it, preserving their history while cutting off access.

Zendesk team members list showing a user account auto-created by Okta provisioning
A user account auto-created in Zendesk within seconds of assignment in Okta.

Step 3 of 3

Investigate the email update behavior

Updated a test user's email in Okta to check whether the change would sync to their existing Zendesk account. It did not. Zendesk created an entirely new account instead, which triggered a deeper investigation into why.

Okta user profile showing an email attribute change used to test provisioning sync behavior
The email change in Okta that triggered the investigation below.

What went wrong

Honest account

The email update behavior was worth taking seriously rather than working around quickly. Zendesk treats email as the primary identifier for an account, so changing it in Okta looks to Zendesk like a brand new identity, not an update to an existing one.

I tried four separate approaches to fix it: mapping a stable external ID field to Okta's login attribute (it resolves to the same email value in a trial org, so it did not help), using Okta's Profile Editor to discover additional mappable attributes and attempting to use Okta's permanent internal user ID instead (not available as a mappable field in a trial-tier org), trying a different login-based expression through the Profile Editor (same result, tied to email), and finally attempting to map the email field directly, which Zendesk flatly rejected as read only.

That last result was the answer. Email is read-only in Zendesk through provisioning, a hard platform restriction, not a configuration mistake on Okta's side. In a production tenant, Okta's actual immutable user ID would be available for mapping and would solve this cleanly. In a trial org, it is not. The correct process either way is to update a changed email directly on the existing Zendesk account rather than relying on provisioning to carry the change through, and that holds regardless of which identity provider sits upstream of Zendesk.

What I learned

Takeaways

Four failed attempts at the same problem is not wasted time if each one rules something out for a specific, documented reason. What looks like an Okta misconfiguration at first can turn out to be a hard limitation on the receiving application's side instead, and the way to tell the difference is to keep narrowing down the cause systematically rather than assuming the first plausible explanation is the right one.

This investigation also confirmed that a licensing tier, trial versus production, can quietly remove the exact field you need to solve a problem, which is worth checking early rather than after several failed attempts.