{ "id": "KKCfXEpBjjhp1LC8", "meta": { "instanceId": "workflow-7e613cc8", "versionId": "1.0.0", "createdAt": "2025-09-29T07:07:54.076705", "updatedAt": "2025-09-29T07:07:54.076711", "owner": "n8n-user", "license": "MIT", "category": "automation", "status": "active", "priority": "high", "environment": "production" }, "name": "Entra User to Zammad User Sync", "tags": [ "automation", "n8n", "production-ready", "excellent", "optimized" ], "nodes": [ { "id": "0007443e-b0d4-4f98-a613-3ec7c2842aa3", "name": "When clicking ‘Test workflow’", "type": "n8n-nodes-base.manualTrigger", "position": [ -2140, 140 ], "parameters": {}, "typeVersion": 1, "notes": "This manualTrigger node performs automated tasks as part of the workflow." }, { "id": "2b285a4f-7e39-411b-88b9-cb55c5cf62e3", "name": "Note1", "type": "n8n-nodes-base.stickyNote", "position": [ -1700, 380 ], "parameters": { "width": 1635.910561370123, "height": 329.7269624573379, "content": "## Select Entra Users in a named Entra Group that should be synced to Zammad\n\n\n\n" }, "typeVersion": 1, "notes": "This stickyNote node performs automated tasks as part of the workflow." }, { "id": "929e529e-a4a3-4663-b9dc-e2300a860fed", "name": "Get Groups from Entra", "type": "n8n-nodes-base.httpRequest", "position": [ -1660, 480 ], "parameters": { "url": "{{ $env.WEBHOOK_URL }}", "options": {}, "authentication": "{{ $credentials.predefinedCredentialType }}", "nodeCredentialType": "YOUR_CREDENTIAL_HERE" }, "credentials": { "microsoftOAuth2Api": { "id": "U2E5p3lreqSi8v1N", "name": "ms365test.zammad.org" }, "microsoftGraphSecurityOAuth2Api": { "id": "b09tqOxzkl0P8UQD", "name": "ms365test.zammad.org" } }, "typeVersion": 4.2, "notes": "This httpRequest node performs automated tasks as part of the workflow." }, { "id": "3390b2ed-6070-429c-bc1a-f0ab324117c7", "name": "Remove outer Array", "type": "n8n-nodes-base.splitOut", "position": [ -1400, 480 ], "parameters": { "options": {}, "fieldToSplitOut": "value" }, "typeVersion": 1, "notes": "This splitOut node performs automated tasks as part of the workflow." }, { "id": "b0e9531a-7fc0-4de0-8ec5-4be476b18a26", "name": "Select Entra Zammad default Group", "type": "n8n-nodes-base.if", "notes": "Please enter the Entra group name of users to be synchronized.", "position": [ -1120, 480 ], "parameters": { "options": {}, "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "2dbb2484-2424-4095-a5a2-76ab4e3aaae8", "operator": { "name": "filter.operator.equals", "type": "string", "operation": "equals" }, "leftValue": "={{ $json.displayName }}", "rightValue": "ENTRA" } ] } }, "notesInFlow": true, "typeVersion": 2.2 }, { "id": "1be2a745-aea3-46ec-ab84-be2e39358b95", "name": "Remove outer Array from Entra User", "type": "n8n-nodes-base.splitOut", "position": [ -700, 460 ], "parameters": { "options": {}, "fieldToSplitOut": "value" }, "typeVersion": 1, "notes": "This splitOut node performs automated tasks as part of the workflow." }, { "id": "3b1fc962-7546-4bad-b637-e018649a0652", "name": "Zammad Univeral User Object", "type": "n8n-nodes-base.set", "position": [ -240, 440 ], "parameters": { "values": { "number": [ { "name": "entra_key", "value": "={{ $json.id }}" } ], "string": [ { "name": "email", "value": "={{ $json.userPrincipalName }}" }, { "name": "lastname", "value": "={{ $json.surname }}" }, { "name": "firstname", "value": "={{ $json.givenName }}" }, { "name": "mobile", "value": "={{ $json.mobilePhone }}" }, { "name": "phone", "value": "={{ $json.businessPhones[0] }}" }, {}, {} ] }, "options": {}, "keepOnlySet": true }, "typeVersion": 1, "notes": "This set node performs automated tasks as part of the workflow." }, { "id": "9e36e6a9-cf56-4548-a1af-b1e33dbc61dd", "name": "Get Zammad Users", "type": "n8n-nodes-base.zammad", "position": [ -1020, 140 ], "parameters": { "filters": {}, "operation": "getAll", "returnAll": true }, "credentials": { "zammadTokenAuthApi": { "id": "fj5GuzcJuNLQeMxz", "name": "Zammad Token Auth account" } }, "typeVersion": 1, "notes": "This zammad node performs automated tasks as part of the workflow." }, { "id": "c9a342b1-b5f2-4d31-9737-15f145dc7318", "name": "Merge", "type": "n8n-nodes-base.merge", "position": [ 240, 140 ], "parameters": { "mode": "combine", "options": {}, "fieldsToMatchString": "email" }, "typeVersion": 3, "notes": "This merge node performs automated tasks as part of the workflow." }, { "id": "a04ebfea-e5fe-4903-841a-8ef29d75ff1a", "name": "Get Members of the default group", "type": "n8n-nodes-base.httpRequest", "position": [ -880, 460 ], "parameters": { "url": "{{ $env.BASE_URL }}", "options": {}, "authentication": "{{ $credentials.predefinedCredentialType }}", "nodeCredentialType": "YOUR_CREDENTIAL_HERE" }, "credentials": { "microsoftOAuth2Api": { "id": "U2E5p3lreqSi8v1N", "name": "ms365test.zammad.org" }, "microsoftGraphSecurityOAuth2Api": { "id": "b09tqOxzkl0P8UQD", "name": "ms365test.zammad.org" } }, "typeVersion": 4.2, "notes": "This httpRequest node performs automated tasks as part of the workflow." }, { "id": "2e68992e-3080-41fd-9aae-c44dc60dc3b0", "name": "Find new Zammad Users", "type": "n8n-nodes-base.compareDatasets", "position": [ 240, 460 ], "parameters": { "options": {}, "mergeByFields": { "values": [ { "field1": "email", "field2": "email" } ] } }, "typeVersion": 2.3, "notes": "This compareDatasets node performs automated tasks as part of the workflow." }, { "id": "86dc2c72-d54a-40a9-a64b-fc0bde9a2387", "name": "Update Zammad User", "type": "n8n-nodes-base.zammad", "position": [ 560, 140 ], "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": "user" } ] } } }, "credentials": { "zammadTokenAuthApi": { "id": "fj5GuzcJuNLQeMxz", "name": "Zammad Token Auth account" } }, "typeVersion": 1, "notes": "This zammad node performs automated tasks as part of the workflow." }, { "id": "bc883c6d-ec53-4854-824a-bd76b28077d2", "name": "Create Zammad User", "type": "n8n-nodes-base.zammad", "position": [ 580, 540 ], "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": "user" } ] } } }, "credentials": { "zammadTokenAuthApi": { "id": "fj5GuzcJuNLQeMxz", "name": "Zammad Token Auth account" } }, "typeVersion": 1, "notes": "This zammad node performs automated tasks as part of the workflow." }, { "id": "3b57e278-e755-407c-b261-7fe76ce82bb5", "name": "Deactivate Zammad User", "type": "n8n-nodes-base.zammad", "position": [ 600, 840 ], "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 }}" } ] } } }, "credentials": { "zammadTokenAuthApi": { "id": "fj5GuzcJuNLQeMxz", "name": "Zammad Token Auth account" } }, "typeVersion": 1, "notes": "This zammad node performs automated tasks as part of the workflow." }, { "id": "cdaf8b51-9b4c-4ad0-b8f0-c6921849ed4c", "name": "Find removed Users", "type": "n8n-nodes-base.compareDatasets", "position": [ 240, 880 ], "parameters": { "options": {}, "resolve": "preferInput1", "mergeByFields": { "values": [ { "field1": "entra_key", "field2": "entra_key" } ] } }, "typeVersion": 2.3, "notes": "This compareDatasets node performs automated tasks as part of the workflow." }, { "id": "9b37b75e-d694-441e-b5a5-8abeccbf4ed7", "name": "If Node", "type": "n8n-nodes-base.if", "position": [ -500, 460 ], "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, "notes": "This if node performs automated tasks as part of the workflow." }, { "id": "13ac19a6-6689-4e75-86d4-02ec1c0c64cd", "name": "Select only active Users and entra_obect_type=\"user\"", "type": "n8n-nodes-base.if", "position": [ -220, 140 ], "parameters": { "options": {}, "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "1c9ca19d-18e3-470e-84cd-593794613c59", "operator": { "name": "filter.operator.equals", "type": "string", "operation": "equals" }, "leftValue": "={{ $json.entra_object_type }}", "rightValue": "user" }, { "id": "9187eea8-48ec-4488-9bc9-45235ff88114", "operator": { "type": "boolean", "operation": "true", "singleValue": true }, "leftValue": "={{ $json.active }}", "rightValue": "" } ] } }, "typeVersion": 2.2, "notes": "This if node performs automated tasks as part of the workflow." } ], "active": false, "pinData": {}, "settings": { "executionOrder": "v1", "saveManualExecutions": true, "callerPolicy": "workflowsFromSameOwner", "errorWorkflow": null, "timezone": "UTC", "executionTimeout": 3600, "maxExecutions": 1000, "retryOnFail": true, "retryCount": 3, "retryDelay": 1000 }, "versionId": "b726c830-9d26-4289-8f66-485850762df7", "connections": { "929e529e-a4a3-4663-b9dc-e2300a860fed": { "main": [ [ { "node": "error-handler-929e529e-a4a3-4663-b9dc-e2300a860fed", "type": "main", "index": 0 } ], [ { "node": "error-handler-929e529e-a4a3-4663-b9dc-e2300a860fed-4023c508", "type": "main", "index": 0 } ], [ { "node": "error-handler-929e529e-a4a3-4663-b9dc-e2300a860fed-8eb1b1b2", "type": "main", "index": 0 } ], [ { "node": "error-handler-929e529e-a4a3-4663-b9dc-e2300a860fed-a8bd2921", "type": "main", "index": 0 } ], [ { "node": "error-handler-929e529e-a4a3-4663-b9dc-e2300a860fed-82076218", "type": "main", "index": 0 } ], [ { "node": "error-handler-929e529e-a4a3-4663-b9dc-e2300a860fed-57271d58", "type": "main", "index": 0 } ], [ { "node": "error-handler-929e529e-a4a3-4663-b9dc-e2300a860fed-af8061cc", "type": "main", "index": 0 } ], [ { "node": "error-handler-929e529e-a4a3-4663-b9dc-e2300a860fed-dd2f9042", "type": "main", "index": 0 } ], [ { "node": "error-handler-929e529e-a4a3-4663-b9dc-e2300a860fed-2383c7f8", "type": "main", "index": 0 } ] ] }, "a04ebfea-e5fe-4903-841a-8ef29d75ff1a": { "main": [ [ { "node": "error-handler-a04ebfea-e5fe-4903-841a-8ef29d75ff1a", "type": "main", "index": 0 } ], [ { "node": "error-handler-a04ebfea-e5fe-4903-841a-8ef29d75ff1a-d0419b1e", "type": "main", "index": 0 } ], [ { "node": "error-handler-a04ebfea-e5fe-4903-841a-8ef29d75ff1a-0107aab8", "type": "main", "index": 0 } ], [ { "node": "error-handler-a04ebfea-e5fe-4903-841a-8ef29d75ff1a-8be70749", "type": "main", "index": 0 } ], [ { "node": "error-handler-a04ebfea-e5fe-4903-841a-8ef29d75ff1a-c30da4d2", "type": "main", "index": 0 } ], [ { "node": "error-handler-a04ebfea-e5fe-4903-841a-8ef29d75ff1a-97749440", "type": "main", "index": 0 } ], [ { "node": "error-handler-a04ebfea-e5fe-4903-841a-8ef29d75ff1a-cabf7e9f", "type": "main", "index": 0 } ], [ { "node": "error-handler-a04ebfea-e5fe-4903-841a-8ef29d75ff1a-5ca9b6af", "type": "main", "index": 0 } ], [ { "node": "error-handler-a04ebfea-e5fe-4903-841a-8ef29d75ff1a-123617b5", "type": "main", "index": 0 } ] ] } }, "description": "Automated workflow: Entra User to Zammad User Sync. This workflow integrates 10 different services: stickyNote, httpRequest, splitOut, merge, set. It contains 21 nodes and follows best practices for error handling and security.", "notes": "Excellent quality workflow: Entra User to Zammad User Sync. This workflow has been optimized for production use with comprehensive error handling, security, and documentation." }