Runbooks / Connector Workday

Workday HCM connector

The Workday HCM connector imports workers and supervisory organizations from your Workday tenant via the modern REST API. Phase 1 is read-only — IdentityMesh treats Workday as the source-of-truth for employee master data and projects worker records into the mesh, where they can be joined with downstream identity systems (AD, Entra ID, Okta) by the same join rules that already drive your AD ↔ Entra integration.

Overview

AspectValue
DirectionInbound (Workday → IdentityMesh)
Object typesUser (Workday Workers) + OrgUnit (Supervisory Organizations)
Auth modeOAuth2 client credentials
WatermarklastUpdatedDateTime per object type
Hard-delete signalemploymentStatus == "Terminated"IsDeleted=true
Phase 2 (deferred)Export / write-back, SOAP Worker_Get fallback, Position object type, payRate / sensitive field support, photo + custom field expansion

If you operate Workday as your HRIS and Active Directory or Entra ID as your identity provider, run this connector alongside the AD or Entra connector — they project into the same mesh objects, and the merge is governed by the join rules configured in the Admin UI (typically join on employeeNumber or email).


Prerequisites

Workday tenant setup

  1. Register the integration application in Workday:

    • Open Edit Tenant Setup - Security and enable OAuth 2.0 Clients for Integrations.
    • Run the Register API Client for Integrations task. Provide a friendly name (e.g. IdentityMesh-prod) and select a Workday account that becomes the integration system user (ISU).
    • On completion, Workday returns the Client ID and the one-time Client Secret. Save both immediately — the secret cannot be retrieved later.
  2. Grant the ISU read access to the worker and organization data. Recommended security groups:

    • Worker Data: Public Worker Reports
    • Worker Data: Active and Terminated Workers
    • Organization Data: View Organization

    Avoid blanket System Administrator grants. Document the exact security groups in your change-control system; Workday audits every change to ISU permissions.

  3. Test the OAuth2 token endpoint from a workstation:

    curl -X POST \
      "https://{tenant}.workday.com/ccx/oauth2/{tenant_name}/token" \
      -d "grant_type=client_credentials" \
      -u "<client_id>:<client_secret>"

    A successful response contains an access_token valid for ~30 minutes.

Configure IdentityMesh

  1. Provision the secret via secretscli:

    secretscli set secret://workday/{tenant_name}/clientsecret "<the secret>"
  2. Create the connector via the Admin UI or REST. Sample configJson:

    {
      "TenantHost": "wd5-impl-services1.workday.com",
      "TenantName": "contoso_preview",
      "Realm": "contoso_preview",
      "PageSize": 100,
      "ImportWorkers": true,
      "ImportOrganizations": true,
      "ImportPositions": false,
      "ExternalIdAttribute": "id"
    }

    Realm typically equals TenantName; some Workday tenants distinguish between the two — check with your Workday admin.

  3. Wire the secret reference on the connector’s AuthMaterial: a single ref string of the form secret://workday/{tenant_name}/clientsecret. The auth materializer resolves it at run time.

  4. Add a join rule in the Admin UI mapping Workday.employeeNumbermesh.employeeNumber (or whatever anchor your existing AD / Entra connectors use). This is what joins a Workday worker into an existing mesh object created by the IdP connector.

What gets synced

Worker → User

Workday fieldIdentityMesh attributeNotes
idExternalIdWorkday’s stable WID; default ExternalIdAttribute
workerTypeworkerType”Employee” / “Contingent Worker”
employmentStatusemploymentStatus”Active”, “Terminated”, “On Leave”
derived from aboveaccountEnabledtrue when status is Active
derived from aboveIsDeletedtrue when status is Terminated
firstName / lastName / preferredNamesame
email / workEmailsame
workPhone / mobilePhonesame
employeeNumber / companyEmployeeIdsametypical join key
jobTitle / jobProfile / businessTitlesame
costCenter / costCenterCodesame
companyCode / legalEntitysame
supervisor / managermanagerthe manager’s worker id; mesh-side joins resolve to a User
location / locationCode / country / regionsame
hireDate / terminationDatesameISO 8601 date
lastUpdatedDateTime / lastUpdatedBysamedrives delta sync

payRate and other compensation fields are deliberately excluded in phase 1. Sensitive payroll data lives on a different audit / permission boundary; phase 2 will let operators opt in per attribute.

Supervisory Organization → OrgUnit

Workday fieldIdentityMesh attributeNotes
idExternalId
namename
codecode
parentOrganizationIdparentOrganizationIdbuilds the org hierarchy
managermanagerworker id of the org owner
lastUpdatedDateTimelastUpdatedDateTime

Organization membership is not emitted as a separate GroupMember object type. Each worker carries primaryWorkerSupervisoryOrganization as an attribute, which is sufficient for downstream join rules to project users into the right group / OU. Customers needing flat membership rows should file a phase-2 request.

Watermark and delta behaviour

Watermarks are ISO-8601 lastUpdatedDateTime timestamps stored per object type, encoded as a single JSON string the engine treats opaquely:

{"w": "2026-04-26T08:30:00.000Z", "o": "2026-04-26T08:25:00.000Z"}

(w = workers, o = organizations)

The connector tolerates legacy bare-string watermarks for in-flight upgrades — if it sees a plain ISO timestamp instead of the wrapper, both feeds use that timestamp as their starting point.

Hard-delete gap

Workday does not typically purge worker records — terminated workers retain a Terminated employment status and remain visible in the API indefinitely. The connector maps employmentStatus == "Terminated" to ChangeType.Delete + IsDeleted=true, which is the correct soft-delete signal for downstream provisioning.

If your Workday tenant is configured to purge worker records (rare, but possible for contingent workers), schedule a periodic full sync (set the connector’s Mode = Full on a weekly cadence) to catch hard-deletes. Phase 2 will close this gap via the Workday Audit report API.

Throttling

Workday’s REST API enforces per-tenant rate limits (configurable per Workday environment). The connector handles 429 Too Many Requests responses with Retry-After-aware retry: 3 retries with exponential back-off capped at 30 seconds. Beyond that it surfaces the error to the run history.

If you see frequent 429s in the connector logs, work with Workday Support to raise the integration tenant’s rate limit — IdentityMesh makes one request per page (100 workers per page by default), so even a 100k-worker tenant fits inside the standard 1000 req/hour bucket.

Security model

Phase 2 backlog

The following are out of scope for the phase 1 ship and are documented as follow-ups: