Leichter Helpdesk mit Telegram- und Postgres-Datenbank-Tracking
Dies ist ein Content Creation, Multimodal AI-Bereich Automatisierungsworkflow mit 45 Nodes. Hauptsächlich werden If, Code, Switch, Postgres, Telegram und andere Nodes verwendet. Leichter Helpdesk basierend auf Telegram-Tracking und Postgres-Datenbank
- •PostgreSQL-Datenbankverbindungsdaten
- •Telegram Bot Token
Verwendete Nodes (45)
Kategorie
{
"meta": {
"instanceId": "9c8d0d4640139c59e2bc183c0a14df0fbc0573cb91e494f5db8144fe78fe28ca",
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "0d7bebe5-8f7c-48d1-805a-927919fd842e",
"name": "01 Telegram Trigger: Eingang + Status",
"type": "n8n-nodes-base.telegramTrigger",
"notes": "Listens for Telegram bot messages. Routes commands like /start, /new, /status, /update, /list into the Switch node.",
"position": [
-352,
-48
],
"webhookId": "ce5e4331-643e-4f6f-b465-96e93b097863",
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"notesInFlow": true,
"typeVersion": 1.2
},
{
"id": "096e115e-a27c-486e-93ce-40c23bce1b3d",
"name": "02 Switch: Nach Befehl routen",
"type": "n8n-nodes-base.switch",
"notes": "Splits incoming commands into different branches. Output keys = command names (/new, /status, etc.). Fallback = Invalid Command.",
"position": [
-96,
-80
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "/start",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "ce357ab4-c67e-4bf7-b791-9f90b568aa28",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"message\"][\"text\"].split(\" \")[0].toLowerCase() }}",
"rightValue": "/start"
}
]
},
"renameOutput": true
},
{
"outputKey": "/status",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "5c875ce6-1a63-42bc-b828-426e56fedd7d",
"operator": {
"type": "string",
"operation": "startsWith"
},
"leftValue": "={{ $json[\"message\"][\"text\"].split(\" \")[0].toLowerCase() }}",
"rightValue": "/status"
}
]
},
"renameOutput": true
},
{
"outputKey": "/new",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "db0d9d53-1fa2-4b95-b4ed-026ea97ac21f",
"operator": {
"type": "string",
"operation": "startsWith"
},
"leftValue": "={{ $json[\"message\"][\"text\"].split(\" \")[0].toLowerCase() }}",
"rightValue": "/new"
}
]
},
"renameOutput": true
},
{
"outputKey": "/update",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "54b2e9fb-1cd5-4634-a7e9-d29c936d0f9d",
"operator": {
"type": "string",
"operation": "startsWith"
},
"leftValue": "={{ $json[\"message\"][\"text\"].split(\" \")[0].toLowerCase() }}",
"rightValue": "/update"
}
]
},
"renameOutput": true
},
{
"outputKey": "/list",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "1c4a4f1b-1f99-4a5d-93d3-48887d112dc2",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"message\"][\"text\"].split(\" \")[0].toLowerCase() }}",
"rightValue": "/list"
}
]
},
"renameOutput": true
}
]
},
"options": {
"fallbackOutput": "extra"
}
},
"notesInFlow": true,
"typeVersion": 3.2
},
{
"id": "7cdd210c-6bba-4f38-86af-a15b3e6417ff",
"name": "03a FN: Normalisieren + Hashen",
"type": "n8n-nodes-base.code",
"notes": "Parses ticket info from freeform Telegram text (Name, Email, Phone, Subject, Description). Generates correlation ID (UUID) and dedupe key (SHA-256 hash of email+subject).",
"position": [
208,
-160
],
"parameters": {
"language": "python",
"pythonCode": "import re\nimport hashlib\nimport uuid\n\n# Get the first incoming item\nitem = items[0]\n\n# Correct path to Telegram text\ntext = item[\"json\"].get(\"message\", {}).get(\"text\", \"\")\n\n# Defaults\nparsed = {\n \"requester_name\": \"Unknown\",\n \"requester_email\": \"unknown@example.com\",\n \"requester_phone\": \"N/A\",\n \"subject\": \"No subject\",\n \"description\": \"No description\",\n \"source\": \"telegram\",\n \"priority\": \"normal\",\n \"status\": \"new\", # added here instead of in query\n \"external_id\": None\n}\n\n# Regex patterns\npatterns = {\n \"requester_name\": r\"Name:\\s*(.+)\",\n \"requester_email\": r\"Email:\\s*(\\S+)\",\n \"requester_phone\": r\"Phone:\\s*(.+)\",\n \"subject\": r\"Subject:\\s*(.+)\",\n \"description\": r\"Description:\\s*(.+)\"\n}\n\nfor key, pattern in patterns.items():\n match = re.search(pattern, text, re.IGNORECASE | re.MULTILINE)\n if match:\n parsed[key] = match.group(1).strip()\n\n# Correlation ID\nparsed[\"correlation_id\"] = str(uuid.uuid4())\n\n# Build dedupe key\ndedupe_source = f\"{parsed['requester_email']}|{parsed['subject']}\"\nparsed[\"dedupe_key\"] = hashlib.sha256(dedupe_source.encode()).hexdigest()\n\n# External ID from Telegram chat\nchat_id = item[\"json\"].get(\"message\", {}).get(\"chat\", {}).get(\"id\")\nparsed[\"external_id\"] = str(chat_id) if chat_id else \"N/A\"\n\n# Output in correct n8n format\nreturn [{\"json\": parsed}]\n"
},
"typeVersion": 2
},
{
"id": "1c6e1fe9-f919-4614-a0e4-9c7a875ce7d0",
"name": "04a DB: Ticket upserten",
"type": "n8n-nodes-base.postgres",
"notes": "Executes stored Postgres function upsert_ticket. Inserts or updates a ticket record with parsed fields. Requires function to exist in DB. \ncorrelation_id, source, external_id, requester_*, subject, description, status, priority, dedupe_key\nOutput: ticket ID and correlation ID",
"position": [
528,
-160
],
"parameters": {
"query": "SELECT id, correlation_id, chat_id\nFROM upsert_ticket(\n $1::uuid,\n $2::text,\n $3::text,\n $4::text,\n $5::text,\n $6::text,\n $7::text,\n $8::text,\n $9::text,\n $10::text,\n $11::text,\n $12::text\n);\n",
"options": {
"queryReplacement": "={{$json.correlation_id}}\n\n{{$json.source}}\n\n{{$json.external_id}}\n\n{{$json.requester_name}}\n\n{{$json.requester_email}}\n\n{{$json.requester_phone}}\n\n{{$json.subject}}\n\n{{$json.description}}\n\n{{$json.status}}\n\n{{$json.priority}}\n\n{{$json.dedupe_key}}\n\n{{ $json.external_id }}",
"replaceEmptyStrings": true
},
"operation": "executeQuery"
},
"credentials": {
"postgres": {
"id": "DeyLRt5YrGqjUrds",
"name": "Postgres account"
}
},
"notesInFlow": true,
"typeVersion": 2.6
},
{
"id": "4f742ec0-aca7-4f7b-923c-4b02babef11b",
"name": "05a Telegram Bestätigung",
"type": "n8n-nodes-base.telegram",
"notes": "Sends user-facing messages back to Telegram. Content depends on workflow branch (acknowledgment, errors, updates).",
"position": [
880,
-160
],
"webhookId": "f2d3d095-31e4-4972-9047-5a6350672e43",
"parameters": {
"text": "=Ticket received ✅\nCorrelation ID: <code>{{ $json.correlation_id }}</code>\nSave this ID to check status later.\n",
"chatId": "={{ $('01 Telegram Trigger: Intake + Status').item.json.message.from.id }}",
"additionalFields": {
"parse_mode": "HTML",
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "ad13dc98-c69f-4d97-801d-2076f77897f4",
"name": "03b FN: Statusbefehl parsen",
"type": "n8n-nodes-base.code",
"position": [
192,
-592
],
"parameters": {
"language": "python",
"pythonCode": "import re\n\nout_items = []\n\nfor item in items:\n text = item[\"json\"].get(\"message\", {}).get(\"text\", \"\").strip()\n parts = text.split(maxsplit=1)\n\n if len(parts) == 2:\n correlation_id = parts[1].strip()\n # quick regex UUID check\n if not re.match(r'^[0-9a-fA-F-]{36}$', correlation_id):\n correlation_id = None\n else:\n correlation_id = None\n\n out_items.append({\n \"json\": {\n \"correlation_id\": correlation_id,\n \"chat_id\": item[\"json\"][\"message\"][\"chat\"][\"id\"]\n }\n })\n\nreturn out_items\n"
},
"typeVersion": 2
},
{
"id": "0892a7ae-2f00-4f66-89f1-05ed68d941be",
"name": "04b DB: Ticketstatus abrufen",
"type": "n8n-nodes-base.postgres",
"notes": "Fetches ticket info by correlation ID. Returns subject, status, timestamps. Handles missing tickets through the downstream IF node.",
"position": [
976,
-960
],
"parameters": {
"query": "SELECT subject, status, created_at, updated_at, chat_id\nFROM tickets\nWHERE correlation_id = $1::uuid;\n",
"options": {
"queryReplacement": "={{$json.correlation_id}}"
},
"operation": "executeQuery"
},
"credentials": {
"postgres": {
"id": "DeyLRt5YrGqjUrds",
"name": "Postgres account"
}
},
"notesInFlow": true,
"retryOnFail": true,
"typeVersion": 2.6,
"alwaysOutputData": true
},
{
"id": "b2248f84-10dc-464c-a611-6e4b924932c9",
"name": "05b Telegram: Statusantwort",
"type": "n8n-nodes-base.telegram",
"position": [
2352,
-512
],
"webhookId": "bae8bec4-4af5-4bf9-bba6-218b8bd5b0f8",
"parameters": {
"text": "=✅ Ticket ID: {{ $json.chat_id }}\n📄 Ticket: {{ $json.subject }}\n📌 Status: {{ $json.status }}\n🕒 Created: {{ new Date($json.created_at).toLocaleString(\"en-GB\", { dateStyle: \"medium\", timeStyle: \"short\" }) }}\n🔄 Last Updated: {{ new Date($json.updated_at).toLocaleString(\"en-GB\", { dateStyle: \"medium\", timeStyle: \"short\" }) }}\n\n",
"chatId": "={{ $('02 Switch: Route by Command').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "cf87371a-3909-434e-88b3-42f6a4b80194",
"name": "03b1 IF: Hat Korrelations-ID",
"type": "n8n-nodes-base.if",
"position": [
656,
-944
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "3a901b12-fe84-4f01-993a-185a2753eb0e",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.correlation_id }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "cbae7eab-6cb1-46f6-a2ea-58f0a5115929",
"name": "05b Telegram: Statusantwort (Fehler)",
"type": "n8n-nodes-base.telegram",
"notes": "Sends user-facing messages back to Telegram. Content depends on workflow branch (acknowledgment, errors, updates).",
"position": [
976,
-688
],
"webhookId": "4095be65-c09f-4d65-8800-8f8d9e5b46a4",
"parameters": {
"text": "=❌ Please provide a correlation ID.\nFormat: /status correlation_id\n",
"chatId": "={{$json.chat_id}}",
"additionalFields": {
"parse_mode": "HTML",
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "997d1d5f-ad28-4a2f-90f6-bdcc4c3e02fb",
"name": "Telegram: Ungültiger Befehl",
"type": "n8n-nodes-base.telegram",
"position": [
192,
736
],
"webhookId": "84089957-fe6b-432b-8828-ccd7930ce954",
"parameters": {
"text": "=⚠️ I didn’t understand that request.\nTry /new or /status <ID>.",
"chatId": "={{ $json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "aef8342f-17b0-45f5-b8ae-823b50ab5ccf",
"name": "03c FN: Update-Befehl parsen",
"type": "n8n-nodes-base.code",
"position": [
512,
160
],
"parameters": {
"language": "python",
"pythonCode": "import re\n\nout_items = []\n\nfor item in items:\n text = item[\"json\"].get(\"message\", {}).get(\"text\", \"\").strip()\n parts = text.split(maxsplit=2)\n\n if len(parts) == 3:\n correlation_id, new_status = parts[1], parts[2].lower()\n if not re.match(r'^[0-9a-fA-F-]{36}$', correlation_id):\n correlation_id = None\n else:\n correlation_id, new_status = None, None\n\n out_items.append({\n \"json\": {\n \"correlation_id\": correlation_id,\n \"new_status\": new_status,\n \"chat_id\": item[\"json\"][\"message\"][\"chat\"][\"id\"]\n }\n })\n\nreturn out_items\n"
},
"typeVersion": 2
},
{
"id": "def5eb31-46b0-4db1-92d0-40dedbb62e4e",
"name": "03c1 IF: Hat Korrelations-ID",
"type": "n8n-nodes-base.if",
"position": [
1216,
-64
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "49a8e0db-73d3-4615-add4-c21fe8eb2fb4",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.correlation_id }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "8167b85a-e6b9-4b6e-a26b-88f2760bd0f9",
"name": "Eine Textnachricht senden",
"type": "n8n-nodes-base.telegram",
"position": [
1552,
224
],
"webhookId": "168df2e1-e83a-4ba9-b679-072bd8f51df8",
"parameters": {
"text": "=❌ Invalid or missing correlation ID. Format: /update <ID> <status>.",
"chatId": "={{ $('01 Telegram Trigger: Intake + Status').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "9acad108-3f50-414c-8b64-a69fc3f6c344",
"name": "03c2 IF: Gültiger Status",
"type": "n8n-nodes-base.if",
"position": [
1568,
-80
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "or",
"conditions": [
{
"id": "9ee9632a-361a-4cd3-a842-8e839ae84c2d",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"new_status\"] }}",
"rightValue": "new"
},
{
"id": "5e821125-60f9-45ce-b803-f50a5a3b0776",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"new_status\"] }}",
"rightValue": "in_progress"
},
{
"id": "8205c0d2-293f-43bc-aaec-2200f801b851",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"new_status\"] }}",
"rightValue": "resolved"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "25588539-1ec7-46c8-8835-51baa7b35ba9",
"name": "05c Telegram: Ungültiger Status",
"type": "n8n-nodes-base.telegram",
"notes": "Sends user-facing messages back to Telegram. Content depends on workflow branch (acknowledgment, errors, updates).",
"position": [
2352,
400
],
"webhookId": "477de1f0-cea0-4b5e-80e8-283af9452d4a",
"parameters": {
"text": "=⚠️ Invalid status. Allowed values: new, in_progress, resolved.",
"chatId": "={{ $('01 Telegram Trigger: Intake + Status').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "681309cf-a699-435c-8896-1a00c35c3bc6",
"name": "04c DB: Ticketstatus aktualisieren",
"type": "n8n-nodes-base.postgres",
"notes": "Updates ticket status by correlation ID. Also inserts audit row and notifies ticket owner. Requires tickets table and audit schema.",
"position": [
2304,
128
],
"parameters": {
"query": "UPDATE tickets\nSET status = $2, updated_at = NOW()\nWHERE correlation_id = $1::uuid\nRETURNING id, status, updated_at, correlation_id;\n",
"options": {
"queryReplacement": "={{$json.correlation_id}},{{$json.new_status}}"
},
"operation": "executeQuery"
},
"credentials": {
"postgres": {
"id": "DeyLRt5YrGqjUrds",
"name": "Postgres account"
}
},
"notesInFlow": true,
"typeVersion": 2.6
},
{
"id": "74e0d370-d999-43b6-8628-1fe48602c875",
"name": "03c0 IF: Ist Operator",
"type": "n8n-nodes-base.if",
"position": [
816,
160
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "02a8b086-3e20-4576-a746-9e0bde67aba4",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"chat_id\"] }}",
"rightValue": "YOUR_OPERATOR_ID"
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "6d4e5147-1b94-42b7-b727-9478c56496ab",
"name": "05c0 Telegram: Unautorisierter Update-Versuch",
"type": "n8n-nodes-base.telegram",
"position": [
1232,
352
],
"webhookId": "c0905e30-f115-4e85-9b24-ab26e3954ad3",
"parameters": {
"text": "=❌ You don’t have permission to update tickets.",
"chatId": "={{ $('01 Telegram Trigger: Intake + Status').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "680d87b3-88ff-48b8-833c-b5b322e86bf5",
"name": "04c1 DB: Ticketbesitzer abrufen",
"type": "n8n-nodes-base.postgres",
"position": [
2816,
128
],
"parameters": {
"query": "SELECT chat_id, correlation_id, status, subject\nFROM tickets\nWHERE correlation_id = $1::uuid;",
"options": {
"queryReplacement": "={{ $('04c DB: Update Ticket Status').item.json.correlation_id }}"
},
"operation": "executeQuery"
},
"credentials": {
"postgres": {
"id": "DeyLRt5YrGqjUrds",
"name": "Postgres account"
}
},
"typeVersion": 2.6
},
{
"id": "0d248692-2d2f-4f83-8372-62dc3f119400",
"name": "04b1 IF: Ticket gehört Benutzer",
"type": "n8n-nodes-base.if",
"position": [
1984,
-496
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "19a37b2c-e9ae-4a6c-9e6d-47f3fa7e5e69",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"chat_id\"] }}",
"rightValue": "={{ $('01 Telegram Trigger: Intake + Status').item.json.message.chat.id }}"
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "c3ac8c89-8578-4415-90f6-ed2e8eed787a",
"name": "05b1 Telegram: Unautorisierte Statusprüfung",
"type": "n8n-nodes-base.telegram",
"position": [
2368,
-224
],
"webhookId": "0fa252cb-177d-4e95-8456-34753477d976",
"parameters": {
"text": "=❌ You do not have access to this ticket.\nOnly the ticket creator can view its status.",
"chatId": "={{ $('02 Switch: Route by Command').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "9acff907-71f9-464b-b575-95238009bc69",
"name": "04c1a IF: Gelöst oder In Bearbeitung",
"type": "n8n-nodes-base.if",
"position": [
3168,
32
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "115bb477-3dfa-4d9b-8e4b-cd2ef15439e1",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json[\"status\"] }}",
"rightValue": "resolved"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "1e6afb7d-537a-4aea-8762-d2c75c42d2f0",
"name": "05c1a Telegram: Lösung benachrichtigen",
"type": "n8n-nodes-base.telegram",
"notes": "Sends user-facing messages back to Telegram. Content depends on workflow branch (acknowledgment, errors, updates).",
"position": [
3536,
-80
],
"webhookId": "834b2795-7e52-4264-b787-7280bf60de36",
"parameters": {
"text": "=🎉 Good news! Your ticket ({{ $json.correlation_id }}) has been resolved. \nYou can check details anytime with: \n/status {{ $json.correlation_id }}",
"chatId": "={{ $json.chat_id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"retryOnFail": true,
"typeVersion": 1.2
},
{
"id": "99688c3d-8bd7-4b8c-9861-23fb3d322581",
"name": "05c1b Telegram: In Bearbeitung benachrichtigen",
"type": "n8n-nodes-base.telegram",
"notes": "Sends user-facing messages back to Telegram. Content depends on workflow branch (acknowledgment, errors, updates).",
"position": [
3536,
160
],
"webhookId": "560dda9b-b8e5-4e5b-9705-4d6ed17ce50d",
"parameters": {
"text": "=🔄 Your ticket ({{ $json.correlation_id }}) is now being worked on. \nWe’ll notify you once it’s resolved.",
"chatId": "={{ $json.chat_id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"retryOnFail": true,
"typeVersion": 1.2
},
{
"id": "b54c2084-2bfd-40c0-b07c-8c7d9b35362f",
"name": "05c Telegram: Update-Bestätigung",
"type": "n8n-nodes-base.telegram",
"notes": "Sends user-facing messages back to Telegram. Content depends on workflow branch (acknowledgment, errors, updates).",
"position": [
3088,
320
],
"webhookId": "2e047d36-651f-4c1e-9970-8adf7029c70c",
"parameters": {
"text": "=✅ <b>Ticket {{ $json.correlation_id }}</b> updated!\n📌 <b>New Status:</b> {{ $json[\"status\"] }}\n⏰ <b>Updated At:</b> {{ new Date($(\"04c DB: Update Ticket Status\").item.json.updated_at).toLocaleString() }}\n",
"chatId": "={{ $('01 Telegram Trigger: Intake + Status').item.json.message.from.id }}",
"additionalFields": {
"parse_mode": "HTML",
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"retryOnFail": true,
"typeVersion": 1.2
},
{
"id": "f8c20998-f5c0-4223-afaa-4760712aa2d1",
"name": "04b0 IF: DB-Abfrage fehlgeschlagen?",
"type": "n8n-nodes-base.if",
"position": [
1728,
-736
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "f367a262-4b55-40ad-a0ef-711ac9ebfa10",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ !!$json.error }}",
"rightValue": "true"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "6fa0c0d8-1975-47c9-bb28-82bc528d8c1b",
"name": "05b0 Telegram: Status-DB-Fehler",
"type": "n8n-nodes-base.telegram",
"position": [
2352,
-752
],
"webhookId": "96e6b1fa-9500-4e81-8433-ec87963af06b",
"parameters": {
"text": "=❌ Sorry, I couldn’t fetch your ticket right now. Please try again in a minute.",
"chatId": "={{ $('02 Switch: Route by Command').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "dda44929-b58d-42a8-9f89-307489323c97",
"name": "05c0 IF: Operator-Antwort fehlgeschlagen?",
"type": "n8n-nodes-base.if",
"position": [
3408,
320
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "4a912629-cc2e-43b0-9ee1-cda03feda4b0",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ !!$json.error }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "2e6fde8d-6bb7-421c-8fbd-dc10d672be2b",
"name": "Telegram: Admin-Alarm — Operator-Antwort fehlgeschlagen",
"type": "n8n-nodes-base.telegram",
"position": [
3712,
304
],
"webhookId": "8ae7a0d4-71f7-4717-ad1b-a1355c4cd4ae",
"parameters": {
"text": "=⚠️ Operator reply could not be delivered. \nTicket: {{ $('04c DB: Update Ticket Status').item.json.correlation_id }} \nStatus: {{ $('04c DB: Update Ticket Status').item.json.status }} \nOperator: {{ $('01 Telegram Trigger: Intake + Status').item.json.message.from.id }}",
"chatId": "={{ $('01 Telegram Trigger: Intake + Status').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "068e4ac0-c802-4bb7-a0fa-4d81c4169936",
"name": "Benachrichtigung fehlgeschlagen?",
"type": "n8n-nodes-base.if",
"position": [
4000,
32
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "4eb644e5-1340-492e-96e7-66198d2d72ad",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ !!$json.error }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "73c0c8b5-2385-495e-b341-a0e95faae5f0",
"name": "Eine SQL Abfrage ausführen",
"type": "n8n-nodes-base.postgres",
"position": [
4320,
16
],
"parameters": {
"query": "INSERT INTO workflow_errors\n (workflow_id, workflow_name, execution_id, last_node_executed, error_message, json_payload)\nVALUES\n ($1, $2, $3, $4, $5, $6::jsonb);",
"options": {
"queryReplacement": "={{ $workflow.id }},{{ $workflow.name }},{{ $execution.id }},NotifyUser,{{ $json.error?.message || 'unknown' }},{{ JSON.stringify($json) }}"
},
"operation": "executeQuery"
},
"credentials": {
"postgres": {
"id": "DeyLRt5YrGqjUrds",
"name": "Postgres account"
}
},
"typeVersion": 2.6
},
{
"id": "0f0761c5-6a16-4fcc-94b3-9a8a37ff047b",
"name": "04c2 DB: Audit-Zeile einfügen",
"type": "n8n-nodes-base.postgres",
"position": [
2560,
128
],
"parameters": {
"query": "INSERT INTO ticket_audit\n (ticket_id, correlation_id, action, new_status, actor_chat_id)\nVALUES\n ($1, $2, 'update', $3, $4);\n",
"options": {
"queryReplacement": "={{ $json.id }},\n{{ $json.correlation_id }},\n{{ $json.status }},\n{{ $('01 Telegram Trigger: Intake + Status').item.json.message.from.id }}"
},
"operation": "executeQuery"
},
"credentials": {
"postgres": {
"id": "DeyLRt5YrGqjUrds",
"name": "Postgres account"
}
},
"typeVersion": 2.6
},
{
"id": "ff81de50-249c-49fe-a014-78e703b0e005",
"name": "04b1 IF: Kein Ticket gefunden",
"type": "n8n-nodes-base.if",
"position": [
1328,
-960
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "1a87141a-6e78-4222-9523-00795be95f6f",
"operator": {
"type": "string",
"operation": "empty",
"singleValue": true
},
"leftValue": "={{ $json[\"subject\"] }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "657b78f7-82d6-4dfa-8514-63d99899d91c",
"name": "Eine Textnachricht senden1",
"type": "n8n-nodes-base.telegram",
"position": [
1712,
-976
],
"webhookId": "cc28681b-50ca-45f5-a024-bef21cb8ae36",
"parameters": {
"text": "=❌ No ticket found with that ID.\nDouble-check your ID or create a new ticket with /new",
"chatId": "={{ $('02 Switch: Route by Command').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "427c8ad1-e42f-4454-b54d-513df32d111f",
"name": "03b IF: Hat gültiges Korrelations-ID-Format",
"type": "n8n-nodes-base.if",
"position": [
496,
-592
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "0bfef915-ea45-4b6d-bf12-8999b67b8044",
"operator": {
"type": "string",
"operation": "regex"
},
"leftValue": "={{$json.correlation_id}}",
"rightValue": "=^[0-9a-fA-F-]{36}$"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "77001b07-a1e4-4e9c-b015-e3626b10f43a",
"name": "Eine Textnachricht senden2",
"type": "n8n-nodes-base.telegram",
"position": [
880,
-400
],
"webhookId": "2291928b-6bdc-4071-84f6-f8d84484198e",
"parameters": {
"text": "=⚠️ Invalid ticket ID format. Please provide a valid correlation ID (UUID).",
"chatId": "={{$json.chat_id}}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "1bc21cd7-0689-43d3-8cda-cb5a153526f4",
"name": "Willkommensnachricht",
"type": "n8n-nodes-base.telegram",
"position": [
160,
-992
],
"webhookId": "b7ac58ed-e8d7-48e8-b9a1-3a52e1376b2c",
"parameters": {
"text": "=👋 <b>Welcome to the Support Bot</b> \n\nYou can create and manage tickets right here: \n\n• <b>/new</b> — Open a new support ticket \n• <b>/update <ID> <status></b> — Update your ticket’s status \n• <b>/status <ID></b> — Check the current status of a ticket \n\n💡 Save your <b>Ticket ID</b> when you create one — you’ll need it for updates. ✅\n",
"chatId": "={{ $json.message.from.id }}",
"additionalFields": {
"parse_mode": "HTML",
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "c5a5954e-ec31-40f0-87fe-4ef507a081e3",
"name": "Eine Textnachricht senden3",
"type": "n8n-nodes-base.telegram",
"position": [
1216,
944
],
"webhookId": "42cc248a-3229-49e4-a21a-2c2ed5059a49",
"parameters": {
"text": "=❌ <b>You are not authorized to use this command.</b>",
"chatId": "={{ $json.message.from.id }}",
"additionalFields": {
"parse_mode": "HTML",
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "4f391512-66b6-4239-a7ee-fba38a6ec273",
"name": "Admin prüfen",
"type": "n8n-nodes-base.if",
"position": [
704,
544
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "ce4f2418-7a43-44b5-845e-8abf8d0108b2",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{$json[\"message\"][\"from\"][\"id\"]}}",
"rightValue": "YOUR_ADMIN_ID"
}
]
},
"looseTypeValidation": true
},
"typeVersion": 2.2
},
{
"id": "f80cf5ce-d6eb-4795-9dc2-577442c05f72",
"name": "DB: Tickets auflisten",
"type": "n8n-nodes-base.postgres",
"position": [
1216,
672
],
"parameters": {
"query": "SELECT correlation_id, subject, status, created_at\nFROM tickets\nORDER BY created_at DESC\nLIMIT 10;",
"options": {},
"operation": "executeQuery"
},
"credentials": {
"postgres": {
"id": "DeyLRt5YrGqjUrds",
"name": "Postgres account"
}
},
"typeVersion": 2.6
},
{
"id": "4e2e1d2d-de49-4850-9a4a-e63ff069891e",
"name": "Eine Textnachricht senden4",
"type": "n8n-nodes-base.telegram",
"position": [
1632,
672
],
"webhookId": "93444267-52aa-4b71-bb7a-ade43f15f6ad",
"parameters": {
"text": "={{ $json.text }}",
"chatId": "={{ $json.chat_id }}",
"additionalFields": {
"parse_mode": "HTML",
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "PEoTj5wxpFTeQVpI",
"name": "Ticket Intake"
}
},
"typeVersion": 1.2
},
{
"id": "51eb9b7c-f7cb-4ce4-abb2-d482ccb0850b",
"name": "Code in JavaScript",
"type": "n8n-nodes-base.code",
"position": [
1424,
672
],
"parameters": {
"jsCode": "const tickets = items;\n\nlet message = \"📋 <b>Latest Tickets</b>\\n\\n\";\n\ntickets.forEach((row, i) => {\n message += `${i+1}. <b>ID:</b> ${row.json.correlation_id}\\n`;\n message += ` <b>Status:</b> ${row.json.status}\\n`;\n message += ` <i>${row.json.subject || \"No subject\"}</i>\\n`;\n message += ` Created: ${row.json.created_at}\\n\\n`;\n});\n\n// pull original chat_id from the trigger\nconst chatId = $(\"01 Telegram Trigger: Intake + Status\").item.json.message.from.id;\n\nreturn [{ json: { text: message, chat_id: chatId } }];\n"
},
"typeVersion": 2
},
{
"id": "8baac22d-8d39-4516-85e0-610b1c03346e",
"name": "Haftnotiz",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1904,
-368
],
"parameters": {
"color": 5,
"width": 736,
"height": 1104,
"content": "# 🛠 Setup Requirements\n\n---\n\n## 1️⃣ Database Tables\n- **tickets** \n `(id, correlation_id, chat_id, requester_name, requester_email, requester_phone, subject, description, status, priority, dedupe_key, created_at, updated_at)`\n\n- **ticket_audit** \n `(ticket_id, correlation_id, action, new_status, actor_chat_id, created_at)`\n\n- **workflow_errors** \n `(workflow_id, workflow_name, execution_id, last_node_executed, error_message, json_payload, created_at)`\n\n---\n\n## 2️⃣ Stored Function: `upsert_ticket`\n- Purpose: insert **or** update tickets. \n- **Inputs:** \n `correlation_id, source, external_id, requester_name, requester_email, requester_phone, subject, description, status, priority, dedupe_key, external_id` \n- **Returns:** \n `ticket_id, correlation_id, chat_id`\n\n---\n\n## 3️⃣ Credentials\n- Add **Postgres** credentials in n8n (must match your DB). \n- Add **Telegram Bot** credentials in n8n. \n\n---\n\n## 4️⃣ Placeholders to Replace\n- `YOUR_ADMIN_ID` → replace with your own Telegram ID (for admin-only commands like /list). \n- `YOUR_OPERATOR_ID` → replace with the operator’s Telegram ID (for /update permissions). \n\n👉 Use [@userinfobot](https://t.me/userinfobot) in Telegram to find your ID.\n"
},
"typeVersion": 1
},
{
"id": "e72863ee-979a-46c4-90dd-98572aa027d3",
"name": "Haftnotiz1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1120,
-368
],
"parameters": {
"width": 688,
"height": 1104,
"content": "# 📌 Function: upsert_ticket\n\n### Purpose → Insert or update a support ticket in the tickets table.\n### Returns → id, correlation_id, chat_id.\n\n### 🧩 SQL Template\n-- Create or replace the upsert_ticket function\nCREATE OR REPLACE FUNCTION upsert_ticket(\n p_correlation_id UUID,\n p_source TEXT,\n p_external_id TEXT,\n p_requester_name TEXT,\n p_requester_email TEXT,\n p_requester_phone TEXT,\n p_subject TEXT,\n p_description TEXT,\n p_status TEXT,\n p_priority TEXT,\n p_dedupe_key TEXT,\n p_chat_id TEXT\n)\nRETURNS TABLE (\n id BIGINT,\n correlation_id UUID,\n chat_id TEXT\n) AS $$\nBEGIN\n INSERT INTO tickets (\n correlation_id, source, external_id,\n requester_name, requester_email, requester_phone,\n subject, description, status, priority, dedupe_key, chat_id,\n created_at, updated_at\n )\n VALUES (\n p_correlation_id, p_source, p_external_id,\n p_requester_name, p_requester_email, p_requester_phone,\n p_subject, p_description, p_status, p_priority, p_dedupe_key, p_chat_id,\n NOW(), NOW()\n )\n ON CONFLICT (correlation_id)\n DO UPDATE SET\n requester_name = EXCLUDED.requester_name,\n requester_email = EXCLUDED.requester_email,\n requester_phone = EXCLUDED.requester_phone,\n subject = EXCLUDED.subject,\n description = EXCLUDED.description,\n status = EXCLUDED.status,\n priority = EXCLUDED.priority,\n dedupe_key = EXCLUDED.dedupe_key,\n updated_at = NOW()\n RETURNING tickets.id, tickets.correlation_id, tickets.chat_id;\nEND;\n$$ LANGUAGE plpgsql;\n"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"4f391512-66b6-4239-a7ee-fba38a6ec273": {
"main": [
[
{
"node": "f80cf5ce-d6eb-4795-9dc2-577442c05f72",
"type": "main",
"index": 0
}
],
[
{
"node": "c5a5954e-ec31-40f0-87fe-4ef507a081e3",
"type": "main",
"index": 0
}
]
]
},
"068e4ac0-c802-4bb7-a0fa-4d81c4169936": {
"main": [
[
{
"node": "73c0c8b5-2385-495e-b341-a0e95faae5f0",
"type": "main",
"index": 0
}
]
]
},
"f80cf5ce-d6eb-4795-9dc2-577442c05f72": {
"main": [
[
{
"node": "51eb9b7c-f7cb-4ce4-abb2-d482ccb0850b",
"type": "main",
"index": 0
}
]
]
},
"51eb9b7c-f7cb-4ce4-abb2-d482ccb0850b": {
"main": [
[
{
"node": "4e2e1d2d-de49-4850-9a4a-e63ff069891e",
"type": "main",
"index": 0
}
]
]
},
"74e0d370-d999-43b6-8628-1fe48602c875": {
"main": [
[
{
"node": "def5eb31-46b0-4db1-92d0-40dedbb62e4e",
"type": "main",
"index": 0
}
],
[
{
"node": "6d4e5147-1b94-42b7-b727-9478c56496ab",
"type": "main",
"index": 0
}
]
]
},
"c5a5954e-ec31-40f0-87fe-4ef507a081e3": {
"main": [
[]
]
},
"9acad108-3f50-414c-8b64-a69fc3f6c344": {
"main": [
[
{
"node": "681309cf-a699-435c-8896-1a00c35c3bc6",
"type": "main",
"index": 0
}
],
[
{
"node": "25588539-1ec7-46c8-8835-51baa7b35ba9",
"type": "main",
"index": 0
}
]
]
},
"1c6e1fe9-f919-4614-a0e4-9c7a875ce7d0": {
"main": [
[
{
"node": "4f742ec0-aca7-4f7b-923c-4b02babef11b",
"type": "main",
"index": 0
}
]
]
},
"7cdd210c-6bba-4f38-86af-a15b3e6417ff": {
"main": [
[
{
"node": "1c6e1fe9-f919-4614-a0e4-9c7a875ce7d0",
"type": "main",
"index": 0
}
]
]
},
"ff81de50-249c-49fe-a014-78e703b0e005": {
"main": [
[
{
"node": "657b78f7-82d6-4dfa-8514-63d99899d91c",
"type": "main",
"index": 0
}
],
[
{
"node": "f8c20998-f5c0-4223-afaa-4760712aa2d1",
"type": "main",
"index": 0
}
]
]
},
"0892a7ae-2f00-4f66-89f1-05ed68d941be": {
"main": [
[
{
"node": "ff81de50-249c-49fe-a014-78e703b0e005",
"type": "main",
"index": 0
}
]
]
},
"680d87b3-88ff-48b8-833c-b5b322e86bf5": {
"main": [
[
{
"node": "9acff907-71f9-464b-b575-95238009bc69",
"type": "main",
"index": 0
},
{
"node": "b54c2084-2bfd-40c0-b07c-8c7d9b35362f",
"type": "main",
"index": 0
}
]
]
},
"0f0761c5-6a16-4fcc-94b3-9a8a37ff047b": {
"main": [
[
{
"node": "680d87b3-88ff-48b8-833c-b5b322e86bf5",
"type": "main",
"index": 0
}
]
]
},
"f8c20998-f5c0-4223-afaa-4760712aa2d1": {
"main": [
[
{
"node": "6fa0c0d8-1975-47c9-bb28-82bc528d8c1b",
"type": "main",
"index": 0
}
],
[
{
"node": "0d248692-2d2f-4f83-8372-62dc3f119400",
"type": "main",
"index": 0
}
]
]
},
"096e115e-a27c-486e-93ce-40c23bce1b3d": {
"main": [
[
{
"node": "1bc21cd7-0689-43d3-8cda-cb5a153526f4",
"type": "main",
"index": 0
}
],
[
{
"node": "ad13dc98-c69f-4d97-801d-2076f77897f4",
"type": "main",
"index": 0
}
],
[
{
"node": "7cdd210c-6bba-4f38-86af-a15b3e6417ff",
"type": "main",
"index": 0
}
],
[
{
"node": "aef8342f-17b0-45f5-b8ae-823b50ab5ccf",
"type": "main",
"index": 0
}
],
[
{
"node": "4f391512-66b6-4239-a7ee-fba38a6ec273",
"type": "main",
"index": 0
}
],
[
{
"node": "997d1d5f-ad28-4a2f-90f6-bdcc4c3e02fb",
"type": "main",
"index": 0
}
]
]
},
"cf87371a-3909-434e-88b3-42f6a4b80194": {
"main": [
[
{
"node": "0892a7ae-2f00-4f66-89f1-05ed68d941be",
"type": "main",
"index": 0
}
],
[
{
"node": "cbae7eab-6cb1-46f6-a2ea-58f0a5115929",
"type": "main",
"index": 0
}
]
]
},
"def5eb31-46b0-4db1-92d0-40dedbb62e4e": {
"main": [
[
{
"node": "9acad108-3f50-414c-8b64-a69fc3f6c344",
"type": "main",
"index": 0
}
],
[
{
"node": "8167b85a-e6b9-4b6e-a26b-88f2760bd0f9",
"type": "main",
"index": 0
}
]
]
},
"ad13dc98-c69f-4d97-801d-2076f77897f4": {
"main": [
[
{
"node": "427c8ad1-e42f-4454-b54d-513df32d111f",
"type": "main",
"index": 0
}
]
]
},
"aef8342f-17b0-45f5-b8ae-823b50ab5ccf": {
"main": [
[
{
"node": "74e0d370-d999-43b6-8628-1fe48602c875",
"type": "main",
"index": 0
}
]
]
},
"681309cf-a699-435c-8896-1a00c35c3bc6": {
"main": [
[
{
"node": "0f0761c5-6a16-4fcc-94b3-9a8a37ff047b",
"type": "main",
"index": 0
}
]
]
},
"0d248692-2d2f-4f83-8372-62dc3f119400": {
"main": [
[
{
"node": "b2248f84-10dc-464c-a611-6e4b924932c9",
"type": "main",
"index": 0
}
],
[
{
"node": "c3ac8c89-8578-4415-90f6-ed2e8eed787a",
"type": "main",
"index": 0
}
]
]
},
"dda44929-b58d-42a8-9f89-307489323c97": {
"main": [
[
{
"node": "2e6fde8d-6bb7-421c-8fbd-dc10d672be2b",
"type": "main",
"index": 0
}
]
]
},
"1e6afb7d-537a-4aea-8762-d2c75c42d2f0": {
"main": [
[
{
"node": "068e4ac0-c802-4bb7-a0fa-4d81c4169936",
"type": "main",
"index": 0
}
]
]
},
"9acff907-71f9-464b-b575-95238009bc69": {
"main": [
[
{
"node": "1e6afb7d-537a-4aea-8762-d2c75c42d2f0",
"type": "main",
"index": 0
}
],
[
{
"node": "99688c3d-8bd7-4b8c-9861-23fb3d322581",
"type": "main",
"index": 0
}
]
]
},
"b54c2084-2bfd-40c0-b07c-8c7d9b35362f": {
"main": [
[
{
"node": "dda44929-b58d-42a8-9f89-307489323c97",
"type": "main",
"index": 0
}
]
]
},
"99688c3d-8bd7-4b8c-9861-23fb3d322581": {
"main": [
[
{
"node": "068e4ac0-c802-4bb7-a0fa-4d81c4169936",
"type": "main",
"index": 0
}
]
]
},
"0d7bebe5-8f7c-48d1-805a-927919fd842e": {
"main": [
[
{
"node": "096e115e-a27c-486e-93ce-40c23bce1b3d",
"type": "main",
"index": 0
}
]
]
},
"427c8ad1-e42f-4454-b54d-513df32d111f": {
"main": [
[
{
"node": "cf87371a-3909-434e-88b3-42f6a4b80194",
"type": "main",
"index": 0
}
],
[
{
"node": "77001b07-a1e4-4e9c-b015-e3626b10f43a",
"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 - Content-Erstellung, Multimodales KI
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
Mohammad
@mohammad-1378Automation consultant specializing in n8n workflows that save businesses time and reduce costs. Experienced in designing ticketing systems, email parsers, and integrations with Postgres, Telegram, and APIs. I publish workflows to help teams streamline operations and build internal efficiency.
Diesen Workflow teilen