When someone joins, moves or leaves in Sage HR, you want that change reflected in Microsoft Entra ID without anyone touching it by hand. To connect Sage HR to Microsoft Entra ID, Joinly reads each HR change at the source — through the Sage HR REST API — and applies it automatically to the right account. Sage HR stays your source of truth; Joinly is the engine that keeps every action accurate and traceable. (This is Sage HR, the SMB HR app formerly known as CakeHR — not the Salesforce-based Sage People platform.)
Key takeaways
Sage HR stays your source of truth; Joinly applies every joiner, mover and leaver to Entra ID automatically.
Joinly maps Sage HR teams, positions and job categories to the right Entra ID groups and licences — logic that a plain CSV import or a third-party SCIM gateway leaves you to build by hand.
Because Sage HR is modular, Joinly maps only the attributes your subscribed modules actually expose, so the connection doesn’t break when a field isn’t there.
Joinly reads the reporting-to relationship, so the Entra manager attribute stays correct as your Sage HR org chart changes.
Every action is logged for a complete audit trail, aligned with NIS2 and ISO 27001.
Quick facts
Source system | Sage HR (formerly CakeHR) |
Target system | Microsoft Entra ID (formerly Azure AD) |
Connection method | Sage HR REST API → Entra ID |
Supported events | Joiner, mover, leaver (incl. rehire and team / position changes) |
Synced attributes | Name, email / UPN, team, position / job title, job category, manager, start and end date |
Authentication | API key in the X-Auth-Token header (enabled by a Sage HR admin) |
Real-time or batch | Frequent sync, multiple times per day |
Compliance | ISO 27001, NIS2-ready, GDPR (EU data centre) |
How does Joinly sync Sage HR to Microsoft Entra ID?
Joinly reads each HR change in Sage HR through the REST API and applies it to the matching Entra ID account automatically. Sage HR holds the authoritative employee record, so it is the starting point for each identity action.
Joiner. HR completes the hire in Sage HR. Joinly reads the new employee record and determines the role from attributes like team, position and job category. It then creates the account in Entra ID, assigns the right licences and maps the person into the correct groups — timed to the recorded start date.
Mover. When someone changes team, position or manager in Sage HR, Joinly updates their group membership, permissions and licences to match. Access that no longer fits the new position is revoked, so permissions stay aligned with the actual job, and the Entra manager attribute follows the Sage HR org chart.
Leaver. On the end date recorded in Sage HR, Joinly disables the Entra ID account automatically. There are no orphaned accounts left active after someone has left, and unused licences are freed up.
Example: A marketing agency hires a content strategist in Sage HR with a start date next Monday, in the Creative team. Joinly reads the record, waits until the start date, creates the Entra ID account, assigns an Office E3 licence and adds the strategist to the Creative and All-Staff groups. When that person later moves from the Creative team to Client Services, Joinly swaps the groups the same day and updates the manager attribute to their new lead.
What manual user management costs
Without automation, every account starts as a Sage HR notification or a line in a spreadsheet that IT works through by hand. A CSV export from Sage HR or a third-party SCIM gateway can move attributes across, but neither maps teams and positions to groups on its own — so the part that actually decides access still falls to people.
Onboarding delays. New joiners wait for accounts, licences and group access while a request sits in a queue, losing productive days in their first week.
Permissions that don’t keep up (privilege creep). When movers change team or position, old access often stays attached, so people accumulate rights they no longer need.
Forgotten offboarding. Accounts that aren’t disabled on time are both a security and audit risk, and unused licences keep costing money.
Joinly vs. a third-party SCIM gateway or CSV import
There is no Microsoft-published Sage HR provisioning app in the Entra gallery, so the realistic alternatives are a third-party HR-driven connector or a manual CSV import. Both are a fine baseline, but they stop short of the part that actually decides access. Here’s how they compare for a Sage HR-driven setup.
Joinly | SCIM gateway / CSV import | |
|---|---|---|
Source | Reads the Sage HR REST API directly | Reads Sage HR via a gateway or a scheduled export |
Role-to-group mapping | Built in, rule-based on team / position / job category | Manual attribute mappings; no role-to-group out of the box |
Modular attributes | Maps only the fields your subscribed modules expose | Fixed schema; breaks or blanks when a field is absent |
Manager / org chart | Follows the Sage HR reporting-to relationship | Static or manual mapping |
Licence assignment | Driven by role / attributes | Manual or group-based only |
On-premise AD | Yes, own agent plus the native Microsoft agent | Usually cloud-only; separate tooling for AD |
Audit trail | Per-action logging tied to the HR source | Limited |
Watch-outs when connecting Sage HR to Microsoft Entra ID
A few Sage HR-specific details decide whether this connection stays reliable at scale.
Mapping teams and positions to Entra groups. Sage HR’s structure is deliberately flat — teams, positions and job categories rather than a deep hierarchy. Those don’t translate one-to-one to Entra ID groups. Joinly builds explicit mapping rules from team, position and job category to the correct groups and licences, so role drives access rather than manual assignment.
Modular subscription and available fields. Sage HR is a Core HR base with paid add-on modules, so which attributes the API returns depends on what you’ve subscribed to. Joinly maps only the fields that exist on your tenant and applies fallbacks, so a missing module field never breaks the sync.
UPN format with duplicate names. In a smaller organisation it’s still easy for two employees to share a name, and a naive UPN rule produces collisions. Joinly applies custom transformation rules — a suffix, team code or controlled tiebreaker — so every UPN is unique and predictable from day one.
API access and the admin-bound key. Sage HR’s API key is generated by an admin and is invalidated if that admin loses admin rights. Joinly connects with a dedicated, monitored credential and surfaces a connection warning immediately if the key is revoked, so provisioning never silently stops.
Joinly handles each of these by default with custom mapping and transformation.
Always audit-ready
Every account action Joinly performs is logged: who was affected, when it happened, which access changed and which Sage HR change triggered it. For NIS2 that matters directly: access can be traced back to an authorised HR source rather than an ad-hoc request. Joinly is ISO 27001 certified, runs in an EU data centre in Amsterdam, applies least-privilege by default, and is built to meet NIS2 and ISO 27001.
Example case
Picture a marketing agency with around 180 people across three offices, running Sage HR as its people system while IT provisions Microsoft 365 accounts by hand. Every new designer, account manager or strategist starts as a message from HR that someone in IT works through — creating the account, picking licences, adding groups. With freelance-to-permanent conversions and frequent moves between the Creative and Client Services teams, the little jobs never stop, and new joiners often wait until day two for their tools.
Connect Sage HR to Microsoft Entra ID with Joinly and that work disappears. Joinly reads each HR change in Sage HR at the source and acts on it automatically: new hires have their account, Office licence and group access ready on their start date, a move between teams swaps the right groups the same day, the manager attribute follows the org chart, and leavers are disabled on their end date with a 30-day soft-delete grace window.
“We’re not a big company, but the account admin still ate a chunk of every week. Now a new starter is simply ready on day one, a team move just updates their access, and I can show exactly which Sage HR change created every account.” — Head of IT, marketing agency
The outcome this setup is designed for: onboarding drops from days to zero touch, group access stays aligned with the current team, and the team can point to a complete, source-backed audit trail without keeping a spreadsheet.
More than a connector
A standalone Sage HR to Entra ID connection is a good start, but identity rarely stops at one target. Joinly manages the complete chain from joiner to leaver across all your systems, with logging and governance built in. You review the exceptions; Joinly maintains the chain.
Schedule a demo
Installation guide
Follow these steps to connect Sage HR to Microsoft Entra ID with Joinly. The entire cloud setup happens in the platform, with no scripts or local software required.
1. Create your account
Go to platform.joinly.app and create your account.
Note: charges may apply for using the platform after the trial period ends.

Sign up at platform.joinly.app to get started.
2. Connect your Microsoft account
Open platform.joinly.app/settings/provisioning/idp-setup and connect your Microsoft tenant. Select the scopes you need. For provisioning you don’t need any additional scopes.

Connect your Microsoft tenant and pick your scopes.
3. Import your existing accounts from Entra ID
Import all existing accounts from Entra ID at platform.joinly.app/settings/provisioning/entra-import. This gives Joinly a baseline of every account that already exists, so it can match people to their current account instead of creating duplicates.
4. Find the Sage HR integration in the Joinly marketplace
Open the Joinly marketplace and search for the Sage HR integration.
Don’t see your system listed? Get in touch at support@koppelhet.nl and we’ll help you out.

Search the marketplace for the Sage HR integration.
5. Follow the installation wizard
You may be redirected to integrations.joinly.app. Create an account there and enter your Sage HR connection details: your Sage HR subdomain and the API key. Generate the key in Sage HR under Settings → Integrations → API → Enable API access as an admin; Joinly sends it in the X-Auth-Token header. We only ask for the information needed to establish a successful connection with Sage HR. All data is encrypted and stored securely.

Enter your Sage HR subdomain and API key in the wizard.
6. Configure your field mapping
Set up all your field mappings here. Templates support Liquid, so you can build your display name, UPN and other attributes dynamically from Sage HR fields.
Frequently asked questions
How do I map the manager? Reference the employee’s reporting-to relationship in the mapping and Joinly resolves the link to the right manager automatically.
How do I handle a modular field that isn’t there? Provide a fallback in the Liquid template; Joinly uses it when the attribute isn’t exposed by your subscribed modules.
How do I prevent duplicate usernames? Use the
generateUniqueUsernamehelper, which falls back to the next pattern when the first one is already taken:{{ generateUniqueUsername: “{firstName}.{lastName}”, “{initials}.{lastName}” }}

Map Sage HR fields to Entra ID attributes with Liquid templates.
7. Configure the scheduled import
At platform.joinly.app/settings/import-configs, configure how often the import from Sage HR should run.
8. Configure your workflows
Workflows are where Joinly turns each HR change into the right action in Entra ID. Create an onboarding (joiner) and offboarding (leaver) workflow with trigger-based execution, then an Identity updated workflow with a Create/update employee in Entra action so every change in Sage HR flows straight through to Entra ID. Finally, add a threshold workflow with the Entra soft delete action that runs a set period after the end date (for example 30 days) to retire accounts safely.

Create a trigger-based onboarding workflow.

Add the create/update action, then set your matching strategy and field mapping.

Add the Entra soft delete action to retire accounts safely.
## AD on-premise support
Need to provision to an on-premise Active Directory as well? See our dedicated guide on connecting Sage HR to Active Directory, or contact support at support@koppelhet.nl to request setup of the Joinly AD Agent.
Frequently asked questions
Does the Sage HR to Microsoft Entra ID connection work in real time?
It runs as a frequent sync that updates multiple times per day, so changes in Sage HR reach Entra ID quickly without waiting for a nightly batch.
Is this Sage HR or Sage People?
This connection is for Sage HR, the SMB HR product formerly known as CakeHR. Sage People is a separate, Salesforce-based enterprise HCM and is handled by a different integration.
How does Joinly authenticate to Sage HR?
Through the Sage HR REST API using an API key sent in the X-Auth-Token header. An admin enables API access in Sage HR settings to generate the key; Joinly stores it encrypted and connects with a dedicated credential.
Which attributes sync from Sage HR to Entra ID?
Name, email / UPN, team, position / job title, job category, manager and start and end date. Because Sage HR is modular, Joinly maps only the fields your subscribed modules expose and applies fallbacks for the rest.
Do I still need a third-party SCIM gateway or CSV import?
No. Joinly reads the Sage HR API directly and takes over the provisioning, role-to-group mapping and username rules that a gateway or CSV import leaves you to configure by hand, and maintains it as your Sage HR data changes.
Does Joinly also support AD on-premise or hybrid provisioning?
Yes. Joinly has its own AD on-premise agent and also supports the native Microsoft Entra provisioning agent, so you can provision users to your on-premise AD environment as well. See the Sage HR to Active Directory guide.


