What HiBob knows that Entra doesn't
- Department and sub-department
- Job title and job level
- Manager (reporting line)
- Employment type (full-time, part-time, contractor)
- Start date and tenure
- Site/office location
- Cost center
- Custom fields: clearance level, team function, contractor company
The architecture
The sync logic
- Pull all active employee records from HiBob API
- For each employee, look up the corresponding Entra ID user (matched by email or employee ID stored in employeeId attribute)
- Compare the HiBob values against current Entra ID attribute values
- If any value differs, write the update via Graph API
- Log every change with before/after values to a Log Analytics workspace
What gets synced
| HiBob Field | Entra ID Attribute |
|---|---|
| Department | department |
| Job Title | jobTitle |
| Manager | manager (reference) |
| Employment Type | employeeType |
| Office Location | officeLocation |
| Cost Center | extension_attribute_1 |
| Contractor Flag | extension_attribute_2 |
| Clearance Level | extension_attribute_3 |
| Team Function | extension_attribute_4 |
| Contractor Company | extension_attribute_5 |
| Start Date | employeeHireDate |
| Display Name | displayName |
| Preferred Name | (custom) |
| Site | usageLocation |
| Employee ID | employeeId |
| Sub-Department | extension_attribute_6 |
| Job Level | extension_attribute_7 |
| Profile Picture | (via separate process) |
Profile picture sync
Contractor detection and Conditional Access
What breaks
1.5 years of runtime
The pattern generalises to any HRIS. Workday, BambooHR, Personio — if it has an API and you have Entra ID, you can build this sync. The core principle is the same: the HR system is the source of truth for people data. The IdP should be downstream of it, not a separate silo that drifts.