Skip to content
← All projects

Project 5

Zendesk SCIM Provisioning

SCIM 2.0Entra IDProvisioning

Architecture

Architecture diagram of Zendesk SCIM Provisioning: an Entra ID app assignment change triggers SCIM provisioning (API token auth and attribute mapping), which creates a Zendesk account as End-user by default or suspends it, preserving ticket history, on removal.

Overview

What was built

Automated user provisioning and deprovisioning between Microsoft Entra ID and Zendesk, so a user assigned to the Zendesk app in Entra gets created automatically in Zendesk, and a user removed from that assignment gets suspended automatically. This extends the Enterprise SSO project from authentication into full account lifecycle management.

Why

Why it matters

SSO answers whether someone can prove who they are. It does not answer whether their account should exist in the first place. Without automated provisioning, every new hire needs a manual account created in every application they use, and every departure risks leaving an active account behind that nobody remembers to disable.

That gap between someone's actual employment status and what access still exists for them is exactly the kind of thing an access review is supposed to catch after the fact. Automating provisioning closes it before it becomes a finding.

How it works

The walkthrough

Step 1 of 3

Connect Entra to Zendesk

Generated an API token in Zendesk tied to a specific admin account, then configured Entra's provisioning connector to Zendesk using that token, with the admin username matching the account that generated it exactly.

Zendesk API token creation screen in Admin Center
Generating the API token that Entra ID uses to provision accounts in Zendesk.

Step 2 of 3

Map attributes and provision a test user

Confirmed the default attribute mappings (userPrincipalName to username, mail to the work email field, accountEnabled to active) and created a test user in Entra to provision through. Assigning a user in Entra's Zendesk app pushed them into Zendesk automatically as an End-user by default, with an option to assign the Agent role directly during that assignment step instead.

Microsoft Entra ID attribute mapping configuration for the Zendesk provisioning connector
Attribute mappings connecting Entra ID fields to their Zendesk equivalents.

Step 3 of 3

Verify deprovisioning

Removed the test user's assignment from the Zendesk app in Entra and ran on-demand provisioning. The account moved to suspended in Zendesk automatically, not deleted, which preserves ticket history and audit trail while still cutting off access.

Microsoft Entra ID provisioning logs showing a successful deprovisioning event
Provisioning logs confirming the account was suspended, not deleted, on deprovisioning.

What went wrong

Honest account

Hit three real issues in this build. First, an invalid credentials error using a different Zendesk admin email than the one that actually generated the API token, since the token is tied to that specific account, not to admin access in general. Second, the attribute schema download came back blank the first time, which turned out to require at least one custom field to exist in Zendesk before the schema would populate, fixed by adding a Department field and re-running it. Third, a test user got skipped during provisioning with an unprocessable entry error because they had no valid email attribute, fixed by adding a real email address to the account before re-running the sync.

What I learned

Takeaways

Provisioning connectors are less forgiving about data quality than SSO is. SSO just needs a user to authenticate. Provisioning needs a complete, valid profile before it will create anything, which means the usual identity hygiene problems, missing emails, accounts with no department set, surface immediately instead of staying invisible.

The default behavior of provisioning everyone as a Zendesk End-user, not an Agent, unless explicitly assigned otherwise is also worth remembering. It is a sensible default, least privilege by default, but easy to miss if you are only checking that an account exists and not what role it landed with.