The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "ikxQzs58WxtUjbuE",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Entra Contacts to Zammad User Sync",
"tags": [],
"nodes": [
{
"id": "5cf615cd-d555-4efa-bde4-5e1e2bda0c71",
"name": "When clicking \u2018Test workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-2120,
160
],
"parameters": {},
"typeVersion": 1
},
{
"id": "334e380c-ce6b-48c6-be2a-e688cd52ef14",
"name": "Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1700,
380
],
"parameters": {
"width": 1635.910561370123,
"height": 329.7269624573379,
"content": "## Select Entra Contacts that should be synced to Zammad\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "39b9ace7-97ba-4202-9c7a-752f67c6a60b",
"name": "Zammad Univeral User Object",
"type": "n8n-nodes-base.set",
"position": [
-500,
500
],
"parameters": {
"values": {
"number": [
{
"name": "entra_key",
"value": "={{ $json.id }}"
}
],
"string": [
{
"name": "email",
"value": "={{ $json.mail }}"
},
{
"name": "lastname",
"value": "={{ $json.surname }}"
},
{
"name": "firstname",
"value": "={{ $json.givenName }}"
},
{
"name": "mobile",
"value": "={{ $json.phones[1].number }}"
},
{
"name": "phone",
"value": "={{ $json.phones[2].number }}"
}
]
},
"options": {},
"keepOnlySet": true
},
"typeVersion": 1
},
{
"id": "df5b4173-e1bd-49ce-9827-1b51a5e98da0",
"name": "Get Zammad Users",
"type": "n8n-nodes-base.zammad",
"position": [
-1000,
160
],
"parameters": {
"filters": {},
"operation": "getAll",
"returnAll": true
},
"credentials": {
"zammadTokenAuthApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "7f1d3b74-48dd-4245-9f17-286bcc552047",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
200,
180
],
"parameters": {
"mode": "combine",
"options": {},
"fieldsToMatchString": "email"
},
"typeVersion": 3
},
{
"id": "c98c849e-8b0c-45b0-9b05-6b648bf9329c",
"name": "Find new Zammad Users",
"type": "n8n-nodes-base.compareDatasets",
"position": [
200,
460
],
"parameters": {
"options": {},
"mergeByFields": {
"values": [
{
"field1": "email",
"field2": "email"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "079437ca-a379-48ba-a4e5-52b87454adba",
"name": "Update Zammad User",
"type": "n8n-nodes-base.zammad",
"position": [
560,
180
],
"parameters": {
"id": "={{ $json.id }}",
"operation": "update",
"updateFields": {
"phone": "={{ $json.phone }}",
"mobile": "={{ $json.mobile }}",
"lastname": "={{ $json.lastname }}",
"firstname": "={{ $json.firstname }}",
"customFieldsUi": {
"customFieldPairs": [
{
"name": "entra_key",
"value": "={{ $json.entra_key }}"
},
{
"name": "entra_object_type",
"value": "contact"
}
]
}
}
},
"credentials": {
"zammadTokenAuthApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "34140616-c9c2-4899-a6a8-dc6e89a87c5c",
"name": "Create Zammad User",
"type": "n8n-nodes-base.zammad",
"position": [
580,
480
],
"parameters": {
"lastname": "={{ $json.lastname }}",
"firstname": "={{ $json.firstname }}",
"additionalFields": {
"email": "={{ $json.email }}",
"phone": "={{ $json.phone }}",
"mobile": "={{ $json.mobile }}",
"customFieldsUi": {
"customFieldPairs": [
{
"name": "entra_key",
"value": "={{ $json.entra_key }}"
},
{
"name": "entra_object_type",
"value": "contact"
}
]
}
}
},
"credentials": {
"zammadTokenAuthApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "6c8ef4d9-7bb2-4090-a0cf-411269f766aa",
"name": "Deactivate Zammad User",
"type": "n8n-nodes-base.zammad",
"position": [
600,
860
],
"parameters": {
"id": "={{ $json.id }}",
"operation": "update",
"updateFields": {
"phone": "={{ $json.phone }}",
"active": false,
"mobile": "={{ $json.mobile }}",
"lastname": "={{ $json.lastname }}",
"firstname": "={{ $json.firstname }}",
"customFieldsUi": {
"customFieldPairs": [
{
"name": "entra_key",
"value": "={{ $json.entra_key }}"
},
{
"name": "entra_object_type",
"value": "contact"
}
]
}
}
},
"credentials": {
"zammadTokenAuthApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e3db9840-666a-42d3-9466-70e970a57f29",
"name": "Find removed Users",
"type": "n8n-nodes-base.compareDatasets",
"position": [
200,
880
],
"parameters": {
"options": {},
"resolve": "preferInput1",
"mergeByFields": {
"values": [
{
"field1": "entra_key",
"field2": "entra_key"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "6100fd80-8d9c-44ed-bfc1-6d39794c5405",
"name": "Get Contacts from Entra",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1600,
500
],
"parameters": {
"url": "https://graph.microsoft.com/v1.0/contacts",
"options": {},
"authentication": "predefinedCredentialType",
"nodeCredentialType": "microsoftOAuth2Api"
},
"credentials": {
"microsoftOAuth2Api": {
"name": "<your credential>"
},
"microsoftGraphSecurityOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "27e598a5-39a5-408b-a8ab-bf0ada9a6870",
"name": "Entra Contacts",
"type": "n8n-nodes-base.splitOut",
"position": [
-1220,
500
],
"parameters": {
"options": {},
"fieldToSplitOut": "value"
},
"typeVersion": 1
},
{
"id": "ac38d73e-7a71-4b7d-913e-abc96236b124",
"name": "Filter contacts if needed",
"type": "n8n-nodes-base.if",
"position": [
-840,
500
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "15da9b4f-46fa-4e9b-bd33-40ae79b88cd5",
"operator": {
"type": "object",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "28d3faf9-7cf4-4470-941b-abada3de3b9c",
"name": "Filter if needed",
"type": "n8n-nodes-base.if",
"position": [
-400,
160
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "5b258616-66b2-4378-8215-5dce8edd19b3",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.entra_object_type }}",
"rightValue": "contact"
},
{
"id": "0d569bde-d384-48d0-a208-aa707752d6e5",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.active }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "55f3ac0f-d15e-4643-a1ca-26f4ade7bb14",
"connections": {
"Merge": {
"main": [
[
{
"node": "Update Zammad User",
"type": "main",
"index": 0
}
]
]
},
"Entra Contacts": {
"main": [
[
{
"node": "Filter contacts if needed",
"type": "main",
"index": 0
}
]
]
},
"Filter if needed": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
},
{
"node": "Find new Zammad Users",
"type": "main",
"index": 0
},
{
"node": "Find removed Users",
"type": "main",
"index": 0
}
]
]
},
"Get Zammad Users": {
"main": [
[
{
"node": "Filter if needed",
"type": "main",
"index": 0
}
]
]
},
"Find removed Users": {
"main": [
[
{
"node": "Deactivate Zammad User",
"type": "main",
"index": 0
}
]
]
},
"Find new Zammad Users": {
"main": [
[],
[],
[],
[
{
"node": "Create Zammad User",
"type": "main",
"index": 0
}
]
]
},
"Get Contacts from Entra": {
"main": [
[
{
"node": "Entra Contacts",
"type": "main",
"index": 0
}
]
]
},
"Filter contacts if needed": {
"main": [
[
{
"node": "Zammad Univeral User Object",
"type": "main",
"index": 0
}
]
]
},
"Zammad Univeral User Object": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
},
{
"node": "Find new Zammad Users",
"type": "main",
"index": 1
},
{
"node": "Find removed Users",
"type": "main",
"index": 1
}
]
]
},
"When clicking \u2018Test workflow\u2019": {
"main": [
[
{
"node": "Get Zammad Users",
"type": "main",
"index": 0
},
{
"node": "Get Contacts from Entra",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
microsoftGraphSecurityOAuth2ApimicrosoftOAuth2ApizammadTokenAuthApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
Keep your Zammad support tickets aligned effortlessly with your Entra contacts by automatically syncing new or updated user details, ensuring your team always has accurate customer information without manual data entry. This workflow suits support managers or IT admins handling customer interactions in Zammad who rely on Entra for contact management, saving hours on repetitive updates. The key step involves comparing datasets from both systems via HTTP requests to Zammad, identifying discrepancies, and then creating or updating users seamlessly.
Use this workflow when you need real-time or scheduled synchronisation between Entra contacts and Zammad users, particularly for growing teams where contact lists expand frequently. Avoid it for one-off imports or if your volume exceeds thousands of records daily, as it may require scaling with n8n's scheduling features. Common variations include adding filters for specific contact groups or integrating email notifications for sync failures.
About this workflow
Entra Contacts to Zammad User Sync. Uses manualTrigger, stickyNote, zammad, compareDatasets. Event-driven trigger; 14 nodes.
Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Entra User to Zammad User Sync. Uses manualTrigger, stickyNote, httpRequest, splitOut. Event-driven trigger; 17 nodes.
Reagendamiento_v2. Uses executeWorkflowTrigger, redis, httpRequest, n8n-nodes-evolution-api. Event-driven trigger; 89 nodes.
This workflow acts as a junior finance research analyst for a UK boutique M&A or corporate finance team. It listens for Slack messages, classifies the request, gathers company or market data, and prod
Sync your Google Contacts with your Notion database.
Agendamiento_v2. Uses n8n-nodes-evolution-api, redis, httpRequest, executeWorkflowTrigger. Event-driven trigger; 59 nodes.