Ereignismanagement-Workflow
Dies ist ein DevOps-Bereich Automatisierungsworkflow mit 23 Nodes. Hauptsächlich werden If, Set, Code, Jira, Merge und andere Nodes verwendet. Automatisierung der Ereignisreaktion durch Jira, Slack, Google Sheets und Drive
- •Slack Bot Token oder Webhook URL
- •Google Drive API-Anmeldedaten
- •Google Sheets API-Anmeldedaten
Verwendete Nodes (23)
Kategorie
{
"id": "J93LxYXb9IHdMR7s",
"meta": {
"instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
"templateCredsSetupCompleted": true
},
"name": "Incident Management Workflow",
"tags": [],
"nodes": [
{
"id": "70b38182-4e4c-4f33-9955-18712a2734ef",
"name": "Bei Klick auf 'Workflow ausführen'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1008,
-48
],
"parameters": {},
"typeVersion": 1
},
{
"id": "c5e9b101-a3bb-4095-9931-10cb47abf60c",
"name": "Notiz",
"type": "n8n-nodes-base.stickyNote",
"position": [
1760,
176
],
"parameters": {
"height": 560,
"content": "## ☁️ Archive Incident Timeline to Drive\n**Action:** Saves incident timeline report to Google Drive for permanent storage.\n\n**Description:**\n- Uploads to designated folder (rename to \"Incident Reports\" in production)\n- Filename includes timestamp for chronological organization\n- Creates audit-compliant documentation trail for compliance requirements\n- Enables easy access during postmortem reviews and RCA sessions\n- Provides shareable links for stakeholder communication\n- Ensures documentation survives even if Jira/Slack history expire"
},
"typeVersion": 1
},
{
"id": "1701890b-1a58-4f8e-8d96-94bb3d717d1d",
"name": "Notiz1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1440,
160
],
"parameters": {
"height": 496,
"content": "## 📄 Convert Timeline to Text File\n**Action:** Transforms incident timeline report into downloadable .txt file.\n\n**Description:**\n- Creates properly formatted text file from timeline string\n- Filename dynamically includes Jira key (e.g., \"Incident-SCRUM-123.txt\")\n- Maintains text formatting with line breaks and separators\n- Prepares document for long-term archival in Google Drive\n- Enables easy sharing with postmortem reviewers and stakeholders"
},
"typeVersion": 1
},
{
"id": "eb3eeb1a-0b12-46d3-8272-47ae01ab3185",
"name": "Notiz2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1120,
144
],
"parameters": {
"height": 608,
"content": "## 📋 Generate Incident Timeline Report\n**Action:** Creates comprehensive incident timeline from Slack message data.\n\n**Description:**\n- Parses Slack message blocks to extract incident details\n- Handles complex rich text formatting to find: Jira key, service, severity, clickable links\n- Generates formatted timeline report with:\n - Incident metadata header\n - Timestamped event log (declaration, investigation, resolution)\n - Placeholder checkboxes for postmortem tracking\n - Reference links to Jira and Slack\n- Outputs structured text ready for archival"
},
"typeVersion": 1
},
{
"id": "1d0f80e7-e631-4054-9159-3c4db04f7d37",
"name": "Notiz3",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
-544
],
"parameters": {
"width": 256,
"height": 464,
"content": "## 📢 Alert On-Call Team in Slack\n**Action:** Posts incident notification to #oncall Slack channel.\n\n**Description:**\n- Delivers formatted alert to dedicated incident response channel\n- Includes: Jira key, service, severity, description, direct link\n- Notifies on-call engineers instantly without email delays\n- Creates permanent channel record for timeline reconstruction\n- Returns Slack message metadata for downstream tracking\n- Can be modified to post to different channels or DMs"
},
"typeVersion": 1
},
{
"id": "0e077e72-3423-4e55-b44d-592152210bdc",
"name": "Notiz4",
"type": "n8n-nodes-base.stickyNote",
"position": [
672,
144
],
"parameters": {
"height": 544,
"content": "## 💬 Format Incident Alert for Slack\n**Action:** Generates rich, formatted Slack message with incident details.\n\n**Description:**\n- Safely extracts data from merged incident and Jira objects\n- Builds professional alert with:\n - Attention-grabbing emoji indicators (🚨)\n - Bold formatting for critical fields\n - Clickable Jira ticket link\n - Automation attribution footer\n- Handles missing data gracefully with fallback values (\"N/A\", \"Unknown\")\n- Returns structured message ready for Slack delivery"
},
"typeVersion": 1
},
{
"id": "1d072007-08da-468c-8588-673d4b714502",
"name": "Notiz5",
"type": "n8n-nodes-base.stickyNote",
"position": [
400,
-640
],
"parameters": {
"height": 528,
"content": "## 🔗 Combine Incident & Jira Data\n**Action:** Merges incident metadata with Jira ticket information.\n\n**Description:**\n- Combines two data streams:\n 1. Incident details from Define Metadata node\n 2. Jira ticket response (key, link, ID)\n- Enables downstream nodes to access both context and Jira reference\n- Critical for building comprehensive Slack notifications with clickable links\n- Uses default merge mode to preserve all fields from both sources"
},
"typeVersion": 1
},
{
"id": "13809897-974f-4371-b18c-fcbc03a4fe4c",
"name": "Notiz6",
"type": "n8n-nodes-base.stickyNote",
"position": [
-528,
240
],
"parameters": {
"height": 480,
"content": "## 🎫 Create Jira Incident Ticket\n**Action:** Automatically creates Jira task in incident management project.\n\n**Description:**\n- Creates ticket with formatted summary: \"[Severity] Service - Description\"\n- Includes detailed description with service, severity, timestamp, and automation source\n- Generates unique Jira key (e.g., SCRUM-123) for tracking\n- Returns ticket metadata (key, link, ID) for downstream notifications\n- Acts as single source of truth for incident tracking"
},
"typeVersion": 1
},
{
"id": "1585af90-5926-46c1-8682-3c3f61682271",
"name": "Notiz7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-848,
128
],
"parameters": {
"height": 480,
"content": "## 🏷️ Define Incident Metadata\n**Action:** Structures incident data with service, severity, and description.\n\n**Description:**\n- Sets standardized attributes: Service (API/Database/Frontend), Severity (High/Medium/Low), Description\n- In production, replace with monitoring webhook data (Datadog, New Relic, PagerDuty)\n- Ensures consistent format across Jira, Slack, and tracking systems\n- Template values customizable per service catalog"
},
"typeVersion": 1
},
{
"id": "ad55acbf-bd89-435c-b2f1-568749a416be",
"name": "Notiz8",
"type": "n8n-nodes-base.stickyNote",
"position": [
1408,
-1024
],
"parameters": {
"height": 608,
"content": "## 📊 Log Incident to Status Tracking Sheet\n**Action:** Records incident details to centralized Google Sheets dashboard.\n\n**Description:**\n- Appends incident record to \"status update\" sheet with:\n - Jira Key (unique identifier)\n - Service (affected system/component)\n - Severity (impact classification)\n - Status (defaults to \"Investigating\")\n - Timestamp (incident creation time)\n- Creates real-time dashboard viewable by entire team\n- Enables historical trend analysis and MTTR calculations\n- Supports executive reporting and SLA monitoring"
},
"typeVersion": 1
},
{
"id": "9b152b91-f8f5-472d-bb7f-115b89417238",
"name": "Vorfall-Metadaten definieren",
"type": "n8n-nodes-base.set",
"position": [
-768,
-48
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "f0e9d84e-9714-4e29-bb86-7e1593284491",
"name": "service",
"type": "string",
"value": "API"
},
{
"id": "52c39d93-bff5-4c9f-a00d-84be94201112",
"name": "severity",
"type": "string",
"value": "High"
},
{
"id": "81d91f46-5028-4b28-a96c-3a595b3847e0",
"name": "description",
"type": "string",
"value": "Response time above 3s"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "492cf3b1-9ad6-4521-b7f5-b5a220174c01",
"name": "Jira-Incident-Ticket erstellen",
"type": "n8n-nodes-base.jira",
"position": [
-448,
80
],
"parameters": {
"project": {
"__rl": true,
"mode": "list",
"value": "10000",
"cachedResultName": "Resource Capacity Demo"
},
"summary": "=[{{ $json[\"severity\"] }}] {{ $json[\"service\"] }} - {{ $json[\"description\"] }}",
"issueType": {
"__rl": true,
"mode": "list",
"value": "10004",
"cachedResultName": "Task"
},
"additionalFields": {
"description": "=Service: {{ $json[\"service\"] }} Severity: {{ $json[\"severity\"] }} Description: {{ $json[\"description\"] }} Created by: n8n Automation Time: {{ $now }}"
}
},
"credentials": {
"jiraSoftwareCloudApi": {
"id": "199LdjjU3PhhL8xb",
"name": "saurabh jira"
}
},
"typeVersion": 1
},
{
"id": "b6953fcb-1d76-4736-96c4-ff69fc4a815b",
"name": "Vorfall- und Jira-Daten zusammenführen",
"type": "n8n-nodes-base.merge",
"position": [
496,
-32
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "203c7131-85a6-4fee-8475-8ef86e7414d4",
"name": "Vorfallalarm für Slack formatieren",
"type": "n8n-nodes-base.code",
"position": [
720,
-32
],
"parameters": {
"jsCode": "// n8n passes input as an array of items\nconst items = $input.all();\n\n// Expecting two objects: [alertData, jiraData]\nconst alertData = items[0].json;\nconst jiraData = items[1].json;\n\n// Merge them safely\nconst jiraKey = jiraData.key || \"N/A\";\nconst jiraLink = jiraData.self || \"N/A\";\nconst service = alertData.service || \"Unknown Service\";\nconst severity = alertData.severity || \"Unknown Severity\";\nconst description = alertData.description || \"No description provided.\";\n\n// Build the Slack message\nconst message = `🚨 *New Incident Created!*\n\n*Jira Key:* ${jiraKey}\n*Service:* ${service}\n*Severity:* ${severity}\n*Description:* ${description}\n\n🔗 [View in Jira](${jiraLink})\n_Automated via n8n Incident Workflow_`;\n\nreturn [\n {\n json: {\n jiraKey,\n jiraLink,\n service,\n severity,\n description,\n message,\n },\n },\n];\n"
},
"typeVersion": 2
},
{
"id": "9ddd6d0a-4d12-4782-bae8-a7a86c75b339",
"name": "Bereitschaftsteam in Slack alarmieren",
"type": "n8n-nodes-base.slack",
"position": [
944,
-32
],
"webhookId": "97b0b4bb-4b13-4b4a-b0e2-f1c1aa70dad8",
"parameters": {
"text": "={{$json[\"message\"]}}\n",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C09LGDSC6GM",
"cachedResultName": "oncall"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"id": "rNqvWj9TfChPVRYY",
"name": "Slack account vivek"
}
},
"typeVersion": 2.3
},
{
"id": "1ddfdaca-339e-4c1c-b556-0642547e605d",
"name": "Vorfall-Zeitachsenbericht generieren",
"type": "n8n-nodes-base.code",
"position": [
1184,
-32
],
"parameters": {
"jsCode": "const input = $input.item.json;\n\n// Extract Slack message text\nconst messageText = input.message?.text || \"No message text found.\";\n\n// Default placeholders\nlet jiraKey = \"Unknown\";\nlet service = \"Unknown\";\nlet severity = \"Unknown\";\nlet description = \"No description provided.\";\nlet jiraLink = \"\";\n\n// Parse from blocks\nif (input.message?.blocks && Array.isArray(input.message.blocks)) {\n const elements = input.message.blocks[0]?.elements[0]?.elements || [];\n\n for (let i = 0; i < elements.length; i++) {\n const el = elements[i];\n const text = (el.text || \"\").trim();\n\n if (text.startsWith(\"SCRUM-\")) jiraKey = text;\n if (text === \"API\") service = text;\n if (text === \"High\" || text === \"Medium\" || text === \"Low\") severity = text;\n if (text.includes(\"Response time\")) description = text;\n if (el.type === \"link\" && el.url.includes(\"atlassian.net\")) jiraLink = el.url;\n }\n}\n\n// Create the report text\nconst report = `\n════════════════════════════════════════════════════════════════\n INCIDENT TIMELINE REPORT\n════════════════════════════════════════════════════════════════\n\nIncident Key: ${jiraKey}\nService: ${service}\nSeverity: ${severity}\nDescription: ${description}\nStart Time: ${new Date().toLocaleString()}\n\n------------------------------------------------------------\nTimeline:\n- [${new Date().toLocaleString()}] Incident declared in Slack\n- [ ] Root cause identified\n- [ ] Fix deployed\n- [ ] Postmortem completed\n------------------------------------------------------------\n\nJira Link: ${jiraLink}\nSlack Channel: #oncall\n\n════════════════════════════════════════════════════════════════\n`;\n\nreturn [{\n json: { jiraKey, service, severity, description, jiraLink, report }\n}];\n"
},
"typeVersion": 2
},
{
"id": "a397d4ed-a764-4a5c-947c-a35846d12bf1",
"name": "Zeitachse in Textdatei konvertieren",
"type": "n8n-nodes-base.convertToFile",
"position": [
1504,
-32
],
"parameters": {
"options": {
"fileName": "=Incident-{{$json[\"jiraKey\"]}}.txt"
},
"operation": "toText",
"sourceProperty": "report"
},
"typeVersion": 1.1
},
{
"id": "89bff2d5-0927-41bf-a959-4f65ace76fa3",
"name": "Vorfall in Status-Tracking-Sheet protokollieren",
"type": "n8n-nodes-base.googleSheets",
"position": [
1488,
-384
],
"parameters": {
"columns": {
"value": {
"Status": "=\"Investigating\"",
"Service": "={{ $json.service }}",
"Jira Key": "={{ $json.jiraKey }}",
"Severity": "={{ $json.severity }}",
"Timestamp": "={{$now}}"
},
"schema": [
{
"id": "Jira Key",
"type": "string",
"display": true,
"required": false,
"displayName": "Jira Key",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Service",
"type": "string",
"display": true,
"required": false,
"displayName": "Service",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Severity",
"type": "string",
"display": true,
"required": false,
"displayName": "Severity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1819778305,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=1819778305",
"cachedResultName": "status update"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
"cachedResultName": "Interviewer Brief Pack "
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "kpPEOLCGn963qpoh",
"name": "automations@techdome.ai"
}
},
"typeVersion": 4.6
},
{
"id": "a73f4bf6-4196-472c-8351-51a19f017f2f",
"name": "Vorfall-Zeitachse in Drive archivieren",
"type": "n8n-nodes-base.googleDrive",
"position": [
1792,
-32
],
"parameters": {
"name": "=Incident-Report-{{ $now.toISOString().replace(/[:]/g, \"-\") }}.txt\n",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "16lOVXsq0xkvJ8sCM7hCFAghQvDOXann7",
"cachedResultUrl": "https://drive.google.com/drive/folders/16lOVXsq0xkvJ8sCM7hCFAghQvDOXann7",
"cachedResultName": "resume store"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"id": "E7nEqUL27GUx1xHa",
"name": "Techdome Account"
}
},
"typeVersion": 3
},
{
"id": "744d9530-fe3e-4620-bbe1-8f38fd44a879",
"name": "Notiz9",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
496
],
"parameters": {
"width": 304,
"height": 416,
"content": "## 📊 Log Jira Creation Failures to Error Sheet\n**Action:** Records Jira ticket creation failures to error tracking spreadsheet.\n\n**Description:**\n- Appends error details to \"error log sheet\" when Jira API fails\n- Captures: authentication errors, rate limiting, invalid configs, network issues\n- Creates queryable database for troubleshooting integration problems\n- Ensures no silent failures—every creation attempt documented\n- Helps identify patterns in API reliability\n- Critical for maintaining incident response SLA"
},
"typeVersion": 1
},
{
"id": "ab12294c-05b5-4143-939a-242f0a432fd5",
"name": "Notiz10",
"type": "n8n-nodes-base.stickyNote",
"position": [
-240,
240
],
"parameters": {
"height": 528,
"content": "## ✅ Validate Jira Ticket Creation Success\n**Action:** Verifies Jira ticket was created successfully before proceeding.\n\n**Description:**\n- Checks if Jira response contains valid ticket key\n- **True Path:** Routes to Merge node for Slack alerts and timeline generation\n- **False Path:** Routes to error logging when creation fails\n- Prevents downstream processing of incomplete/failed responses\n- Catches auth failures, permission issues, API rate limiting\n- Critical quality gate for workflow reliability"
},
"typeVersion": 1
},
{
"id": "dd851020-a962-46ac-89d6-85d873479b32",
"name": "Jira-Ticket-Erstellung validieren",
"type": "n8n-nodes-base.if",
"position": [
-176,
80
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b2ef1047-1b2f-4e10-bd6a-dcab015a7f99",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "=={{ $json[\"key\"] }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "e48b4e31-981b-49fc-a395-fd23827aae5a",
"name": "Jira-Erstellungsfehler in Fehler-Sheet protokollieren",
"type": "n8n-nodes-base.googleSheets",
"position": [
192,
320
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "error_id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "error_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "error",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "error",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"error_id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1338537721,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit#gid=1338537721",
"cachedResultName": "error log sheet"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Uldk_4BxWbdZTDZxFUeohIfeBmGHHqVEl9Ogb0l6R8Y/edit?usp=drivesdk",
"cachedResultName": "Interviewer Brief Pack "
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "kpPEOLCGn963qpoh",
"name": "automations@techdome.ai"
}
},
"typeVersion": 4.6
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "4d3622bd-f789-440f-993f-4573a1734744",
"connections": {
"9b152b91-f8f5-472d-bb7f-115b89417238": {
"main": [
[
{
"node": "b6953fcb-1d76-4736-96c4-ff69fc4a815b",
"type": "main",
"index": 0
},
{
"node": "492cf3b1-9ad6-4521-b7f5-b5a220174c01",
"type": "main",
"index": 0
}
]
]
},
"9ddd6d0a-4d12-4782-bae8-a7a86c75b339": {
"main": [
[
{
"node": "1ddfdaca-339e-4c1c-b556-0642547e605d",
"type": "main",
"index": 0
}
]
]
},
"492cf3b1-9ad6-4521-b7f5-b5a220174c01": {
"main": [
[
{
"node": "dd851020-a962-46ac-89d6-85d873479b32",
"type": "main",
"index": 0
}
]
]
},
"b6953fcb-1d76-4736-96c4-ff69fc4a815b": {
"main": [
[
{
"node": "203c7131-85a6-4fee-8475-8ef86e7414d4",
"type": "main",
"index": 0
}
]
]
},
"a397d4ed-a764-4a5c-947c-a35846d12bf1": {
"main": [
[
{
"node": "a73f4bf6-4196-472c-8351-51a19f017f2f",
"type": "main",
"index": 0
}
]
]
},
"203c7131-85a6-4fee-8475-8ef86e7414d4": {
"main": [
[
{
"node": "9ddd6d0a-4d12-4782-bae8-a7a86c75b339",
"type": "main",
"index": 0
}
]
]
},
"1ddfdaca-339e-4c1c-b556-0642547e605d": {
"main": [
[
{
"node": "a397d4ed-a764-4a5c-947c-a35846d12bf1",
"type": "main",
"index": 0
},
{
"node": "89bff2d5-0927-41bf-a959-4f65ace76fa3",
"type": "main",
"index": 0
}
]
]
},
"70b38182-4e4c-4f33-9955-18712a2734ef": {
"main": [
[
{
"node": "9b152b91-f8f5-472d-bb7f-115b89417238",
"type": "main",
"index": 0
}
]
]
},
"dd851020-a962-46ac-89d6-85d873479b32": {
"main": [
[
{
"node": "b6953fcb-1d76-4736-96c4-ff69fc4a815b",
"type": "main",
"index": 1
}
],
[
{
"node": "e48b4e31-981b-49fc-a395-fd23827aae5a",
"type": "main",
"index": 0
}
]
]
}
}
}Wie verwende ich diesen Workflow?
Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.
Für welche Szenarien ist dieser Workflow geeignet?
Experte - DevOps
Ist es kostenpflichtig?
Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.
Verwandte Workflows
Rahul Joshi
@rahul08Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.
Diesen Workflow teilen