This workflow corresponds to n8n.io template #5747 — we link there as the canonical source.
This workflow follows the Agent → Chat Trigger recipe pattern — see all workflows that pair these two integrations.
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": "de1Bmx0unOb4OzvK",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Manage KlickTipp Contacts via Telegram Bot with GPT-5 mini Agent",
"tags": [
{
"id": "15wrq9sti6wyqr6J",
"name": "TEMPLATE",
"createdAt": "2025-01-08T16:34:30.163Z",
"updatedAt": "2025-01-08T16:34:30.163Z"
}
],
"nodes": [
{
"id": "9989921d-2df3-40fe-9f0a-090e637763d8",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
1680,
-512
],
"parameters": {
"mode": "webhook",
"public": true,
"options": {},
"authentication": "n8nUserAuth"
},
"typeVersion": 1.1
},
{
"id": "25d78214-6214-489f-ab3f-c7113b813838",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
2560,
-496
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-5-mini",
"cachedResultName": "gpt-5-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "5b7ea68f-8a51-4413-af04-3cca7f1ca86f",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2512,
-976
],
"parameters": {
"color": 7,
"width": 600,
"height": 636,
"content": "## 2. Connect any Agent with a KlickTipp tools"
},
"typeVersion": 1
},
{
"id": "92ab0e41-049b-43ac-8f39-e5b02e7562e7",
"name": "Simple Memory",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
2736,
-496
],
"parameters": {
"sessionKey": "={{ $('Telegram Trigger').isExecuted ? $('Telegram Trigger').item.json.message.from.id : $('When chat message received').item.json.sessionId }}",
"sessionIdType": "customKey"
},
"typeVersion": 1.3
},
{
"id": "0069ee54-c56f-4e45-ab66-8f02bb3b312b",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1040,
-976
],
"parameters": {
"width": 580,
"height": 2056,
"content": "Community Node Disclaimer: As this workflow relies on a community node, it is limited to self-hosted environments.\n\n### How It Works\n\n**AI Agent and KlickTipp Tools Integration via Telegram:**\nThis component connects a large language model (LLM), such as Claude or OpenAI, to the KlickTipp contact management platform through Telegram messaging. The AI Agent interprets natural language queries received from Telegram and dynamically maps them to KlickTipp API operations, enabling intuitive and automated contact handling through a familiar messaging interface.\n\n### Key Features\n\n**Telegram & LLM Interaction Setup:**\n- Captures messages received via Telegram bot as an alternative to the chat message node.\n- Maintains conversation state using a memory buffer tied to Telegram chat IDs.\n- Interprets user input using an LLM (Claude or OpenAI).\n- Routes interpreted commands to specific KlickTipp tools based on detected intent.\n- Sends responses back to Telegram users with operation results.\n\n\n**KlickTipp Integration:**\nComplete set of KlickTipp API endpoints included:\n- **Contact Management:** Add, update, get, list, delete, and unsubscribe contacts.\n- **Contact Tagging:** Tag, untag, list tagged contacts.\n- **Tag Operations:** Create, get, update, delete, list tags.\n- **Opt-In Processes:** List and retrieve opt-in process details.\n- **Data Fields:** List and get custom data fields.\n- **Redirects:** Retrieve redirect URLs.\n\n\n**Use Cases Supported:**\n- Query contact information via email or name through Telegram messages.\n- Identify and segment contacts by city, region, or behavior via Telegram commands.\n- Create or update contacts from data provided in Telegram messages.\n- Dynamically apply or remove tags to initiate campaigns through Telegram bot interactions.\n- Automate targeted outreach based on contact attributes using Telegram as the control interface.\n\n### Setup Instructions\n\n**Install and Configure Nodes:**\n- Set up a Telegram bot using [BotFather](https://core.telegram.org/bots#6-botfather) and obtain the bot token.\n- Configure the Telegram Trigger node in n8n with your bot token.\n- Configure the LLM model (e.g., OpenAI or Claude) and memory node if used.\n- Connect all required KlickTipp nodes and authenticate using valid API credentials.\n- Activate the workflow.\n\n\n**Define Tagging and Field Mapping:**\n- Identify which fields and tags are relevant to your use cases.\n- Ensure necessary tags and custom fields are already created in KlickTipp.\n\n\n**Workflow Logic:**\n1. **Trigger via Telegram:** A message is received by the Telegram bot and passed to the AI Agent.\n2. **Query Handling via LLM Agent:** AI interprets the natural language input and determines the action.\n3. **Contact Search & Segmentation:** Searches contacts using identifiers (email, address) or criteria.\n4. **Data Operations:** Retrieves, updates, or manages contact and tag data based on interpreted command.\n5. **Campaign Preparation:** Applies tags or sends campaign triggers depending on query results.\n6. **Response via Telegram:** Sends formatted results back to the Telegram user.\n\n\n**Benefits:**\n- **Mobile-First Interface:** Users can manage KlickTipp contacts directly from Telegram on any device.\n- **AI-Powered Automation:** Reduces manual contact search and tagging efforts through intelligent processing.\n- **Scalable Integration:** Built-in support for full range of KlickTipp operations allows diverse use-case handling.\n- **Data Consistency:** Ensures structured data flows between Telegram, AI, and KlickTipp, minimizing errors.\n\n\n**Testing and Deployment:**\nUse defined Telegram messages such as:\n- \u201cTell me something about the contact with email address X\u201d\n- \u201cTag all contacts from region Y\u201d\n- \u201cSend campaign Z to customers in area A\u201d\n\n\nValidate expected actions in KlickTipp after message execution and confirm responses in Telegram.\n\n\n**Notes:**\n- **Customization:** Adjust tag logic, AI prompts, and contact field mappings based on project needs.\n- **Extensibility:** The template can be expanded with further logic for Google Sheets input or campaign feedback loops"
},
"typeVersion": 1
},
{
"id": "20256111-b1fe-44c3-a2f9-ed1525b9e84b",
"name": "List Contacts",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2672,
-192
],
"parameters": {
"resource": "subscriber",
"descriptionType": "manual",
"toolDescription": "List all contacts"
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "35250ba6-bad1-4926-98ff-007e2f60ed21",
"name": "Get Contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2928,
-192
],
"parameters": {
"resource": "subscriber",
"operation": "get",
"subscriberId": "={{ $fromAI(\"contactId\", \"The contact's ID. Required\", \"number\", \"\") }}",
"descriptionType": "manual",
"toolDescription": "Returns the complete data of a contact."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "8aebefc8-34b7-4f66-b773-772ccf3deebb",
"name": "Get Contact ID",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3184,
-192
],
"parameters": {
"email": "={{ $fromAI(\"email\", \"The contact's email address.\", \"string\", \"\") }}",
"resource": "subscriber",
"operation": "search",
"descriptionType": "manual",
"toolDescription": "Returns the contact ID for an email address."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "8ff3ff81-0476-49d1-9627-840e12e50761",
"name": "List Tagged Contacts",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3456,
-192
],
"parameters": {
"tagId": "={{ $fromAI(\"tagId\", \"The tag ID. Required\", \"number\", \"\") }}",
"resource": "subscriber",
"operation": "tagged",
"descriptionType": "manual",
"toolDescription": "Lists the IDs and tagging timestamps of all tagged contacts."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "f4177135-1a7e-4245-8931-0ac75465756f",
"name": "List Tags",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3984,
-192
],
"parameters": {
"descriptionType": "manual",
"toolDescription": "Lists the IDs and names of all tags."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "8e59d336-79ad-4f6e-8256-f44ab9e2ea27",
"name": "Update Contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2800,
-192
],
"parameters": {
"email": "={{ $fromAI(\"email\", \"The contact's email address.\", \"string\", \"\") }}",
"fields": {
"dataFields": [
{
"fieldId": "fieldFirstName",
"fieldValue": "={{ $fromAI(\"fieldFirstName\", \"Contact\u2019s first name.\", \"string\", \"\") }}"
},
{
"fieldId": "fieldLastName",
"fieldValue": "={{ $fromAI(\"fieldLastName\", \"Contact\u2019s last name.\", \"string\", \"\") }}"
},
{
"fieldId": "fieldCompanyName",
"fieldValue": "={{ $fromAI(\"fieldCompany\", \"Contact\u2019s company name.\", \"string\", \"\") }}"
},
{
"fieldId": "fieldStreet1",
"fieldValue": "={{ $fromAI(\"fieldAddress1\", \"Contact\u2019s primary street address\", \"string\", \"\") }}"
},
{
"fieldId": "fieldStreet2",
"fieldValue": "={{ $fromAI(\"fieldAddress2\", \"Contact\u2019s secondary street address\", \"string\", \"\") }}"
},
{
"fieldId": "fieldCity",
"fieldValue": "={{ $fromAI(\"fieldCity\", \"Contact\u2019s city\", \"string\", \"\") }}"
},
{
"fieldId": "fieldState",
"fieldValue": "={{ $fromAI(\"fieldState\", \"Contact\u2019s state or region\", \"string\", \"\") }}"
},
{
"fieldId": "fieldZip",
"fieldValue": "={{ $fromAI(\"fieldZip\", \"Contact\u2019s ZIP or postal code\", \"string\", \"\") }}"
},
{
"fieldId": "fieldCountry",
"fieldValue": "={{ $fromAI(\"fieldCountry\", \"Contact\u2019s country\", \"string\", \"\") }}"
},
{
"fieldId": "fieldPrivatePhone",
"fieldValue": "={{ $fromAI(\"fieldPrivatePhone\", \"Contact\u2019s private phone in international format starting with '00' (e.g., 00491631737743)\", \"string\", \"\") }}"
},
{
"fieldId": "fieldMobilePhone",
"fieldValue": "={{ $fromAI(\"fieldMobilePhone\", \"Contact\u2019s mobile phone in international format starting with '00' (e.g., 00491631737743)\", \"string\", \"\") }}"
},
{
"fieldId": "fieldFax",
"fieldValue": "={{ $fromAI(\"fieldFax\", \"Contact\u2019s fax number in international format starting with '00' (e.g., 0049301234567)\", \"string\", \"\") }}"
},
{
"fieldId": "fieldWebsite",
"fieldValue": "={{ $fromAI(\"fieldWebsite\", \"Contact\u2019s website URL\", \"string\", \"\") }}"
},
{
"fieldId": "fieldBirthday",
"fieldValue": "={{ $fromAI(\"fieldBirthday\", \"Contact\u2019s birthday as Unix seconds.\", \"number\", \"\") }}"
},
{
"fieldId": "fieldLeadValue",
"fieldValue": "={{ $fromAI(\"fieldLeadValue\", \"Estimated lead value as a number\", \"number\", \"\") }}"
}
]
},
"resource": "subscriber",
"operation": "update",
"smsNumber": "={{ $fromAI(\"smsNumber\", \"The contact's SMS number.\", \"string\", \"\") }}",
"subscriberId": "={{ $fromAI(\"contactId\", \"The contact's ID. Required\", \"number\", \"\") }}",
"descriptionType": "manual",
"toolDescription": "Updates a contact by contact ID."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "6463b625-e410-48cd-97e1-88b0d97b32ea",
"name": "Delete Contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3056,
-192
],
"parameters": {
"resource": "subscriber",
"operation": "delete",
"subscriberId": "={{ $fromAI(\"contactId\", \"The contact's ID. Required\", \"string\", \"\") }}",
"descriptionType": "manual",
"toolDescription": "Deletes a contact."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "9fbb16a9-6e96-4e75-a1a5-c096fddc1951",
"name": "Unsubscribe Contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3312,
-192
],
"parameters": {
"email": "={{ $fromAI(\"email\", \"The contact's email address. Required\", \"string\", \"\") }}",
"resource": "subscriber",
"operation": "unsubscribe",
"descriptionType": "manual",
"toolDescription": "Unsubscribes a contact, preventing further communication."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "3c620b1b-55e5-40b4-b371-10dde8c1cefa",
"name": "Create Tag",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
4112,
-192
],
"parameters": {
"name": "={{ $fromAI(\"tagName\", \"The tag name. Required\", \"string\", \"\") }}",
"operation": "create",
"description": "={{ $fromAI(\"tagDescription\", \"The tag description\", \"string\", \"\") }}",
"descriptionType": "manual",
"toolDescription": "Creates a new manual tag."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "c451d3cb-6323-432c-a98b-8a8c10d8d386",
"name": "Get Tag",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
4240,
-192
],
"parameters": {
"tagId": "={{ $fromAI(\"tagId\", \"The tag ID. Required\", \"number\", \"\") }}",
"operation": "get",
"descriptionType": "manual",
"toolDescription": "Returns the name and description of a tag."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "46150de8-a733-4d60-ae45-2019913fce9c",
"name": "Delete Tag",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
4368,
-192
],
"parameters": {
"tagId": "={{ $fromAI(\"tagId\", \"The tag ID. Required\", \"number\", \"\") }}",
"operation": "delete",
"descriptionType": "manual",
"toolDescription": "Deletes a tag."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "4aac4674-be12-4126-9bbd-8bc570c296af",
"name": "Update Tag",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
4496,
-192
],
"parameters": {
"name": "={{ $fromAI(\"tagName\", \"The tag name\", \"string\", \"\") }}",
"tagId": "={{ $fromAI(\"tagId\", \"The tag ID. Required\", \"number\", \"\") }}",
"operation": "update",
"description": "={{ $fromAI(\"tagDescription\", \"The tag description\", \"string\", \"\") }}",
"descriptionType": "manual",
"toolDescription": "Updates a tag."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "7477e0b7-ace7-42f7-8cb8-8ed997592d85",
"name": "List Opt-in Processes",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
1664,
-192
],
"parameters": {
"resource": "opt-in",
"descriptionType": "manual",
"toolDescription": "Lists the IDs and names of all opt-in processes."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "43bda647-d273-4768-a429-0a8abff9bec0",
"name": "Get Opt-in Process",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
1792,
-192
],
"parameters": {
"listId": "={{ $fromAI(\"optInId\", \"The opt-in process ID. Required\", \"number\", \"\") }}",
"resource": "opt-in",
"operation": "get",
"descriptionType": "manual",
"toolDescription": "Returns the complete data of an opt-in process."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "88414a45-3d7e-41db-8845-1a31f163ab87",
"name": "List Data Fields",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2000,
-192
],
"parameters": {
"resource": "field",
"descriptionType": "manual",
"toolDescription": "Lists the IDs and names of all data fields."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "98642fcd-bb96-4883-856b-7affb03ddffd",
"name": "Get Data Field",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2128,
-192
],
"parameters": {
"resource": "field",
"operation": "get",
"apiFieldId": "={{ $fromAI(\"fieldId\", \"The data field ID. Required\", \"string\", \"\") }}",
"descriptionType": "manual",
"toolDescription": "Gets the ID and the name of a data field."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "004e895c-361b-464d-b258-889363d369bb",
"name": "Untag Contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2336,
-192
],
"parameters": {
"email": "={{ $fromAI(\"email\", \"The contact's email address. Required\", \"string\", \"\") }}",
"tagId": "={{ $fromAI(\"tagId\", \"The tag ID. Required\", \"number\", \"\") }}",
"resource": "contact-tagging",
"operation": "untag",
"descriptionType": "manual",
"toolDescription": "Removes a tag from a contact."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "15134ced-fb09-47f2-a818-4885d62ab47b",
"name": "Tag Contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2480,
-192
],
"parameters": {
"email": "={{ $fromAI(\"email\", \"The contact's email address. Required\", \"string\", \"\") }}",
"tagId": "={{ $fromAI(\"tagIds\", 'All the tag IDs in brackets. For example: [12042204,12054769,12071604]', \"json\") }}",
"resource": "contact-tagging",
"descriptionType": "manual",
"toolDescription": "Adds one or more tags to a contact.\nYou can pass a single tag or a list of tags to apply multiple tags in one call."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "79a23888-f41f-4a9c-a045-cefcf7abfb15",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1632,
-320
],
"parameters": {
"color": 7,
"width": 300,
"height": 288,
"content": "## Opt-in Processes\n"
},
"typeVersion": 1
},
{
"id": "155a5b36-8de4-4f74-bf00-37bc62b0c081",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
3952,
-320
],
"parameters": {
"color": 7,
"width": 668,
"height": 288,
"content": "## Tag Operations\n"
},
"typeVersion": 1
},
{
"id": "ecd5521a-899e-4010-b3a8-d4ff6b701f8a",
"name": "Get Redirect URL",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3792,
-192
],
"parameters": {
"email": "={{ $fromAI(\"email\", \"The contact's email address.\", \"string\", \"\") }}",
"listId": "={{ $fromAI(\"optInId\", \"The opt-in process ID.\", \"number\", \"\") }}",
"resource": "opt-in",
"operation": "getRedirect",
"descriptionType": "manual",
"toolDescription": "Gets the redirection URL for a specific opt-in process."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "093cb61d-f110-4920-a2cb-b9b4c6681060",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1952,
-320
],
"parameters": {
"color": 7,
"width": 300,
"height": 288,
"content": "## Data Fields\n"
},
"typeVersion": 1
},
{
"id": "18244673-ef94-4d9c-9a7b-f1d4ff460812",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
2272,
-320
],
"parameters": {
"color": 7,
"width": 332,
"height": 288,
"content": "## Contact Tagging\n"
},
"typeVersion": 1
},
{
"id": "a37cbe4b-7ad2-483c-be0e-ca52b67753b3",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
3744,
-320
],
"parameters": {
"color": 7,
"width": 184,
"height": 288,
"content": "## Redirects\n"
},
"typeVersion": 1
},
{
"id": "b0775e10-e8ed-4fed-bc11-c5674f36ccd4",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
2624,
-320
],
"parameters": {
"color": 7,
"width": 1104,
"height": 292,
"content": "## Contact Management"
},
"typeVersion": 1
},
{
"id": "d3537987-67eb-45bd-8100-0c39635bf112",
"name": "Timestamp to date",
"type": "@n8n/n8n-nodes-langchain.toolCode",
"onError": "continueRegularOutput",
"position": [
4704,
-192
],
"parameters": {
"jsCode": "const raw = query;\n\nif (!raw) {\n return 'N/A';\n}\n\nif (raw === '') {\n return 'N/A';\n}\n\nconst secs = Number(raw);\nconst isTimestamp = Number.isFinite(secs) && /^[+-]?\\d{8,13}$/.test(String(raw));\n\nif (!isTimestamp) {\n return 'N/A';\n}\n\nconst ms = secs * 1000;\n\nconst formatted = DateTime\n .fromMillis(ms, { zone: 'UTC' })\n .setZone('Europe/Berlin')\n .toFormat('dd.MM.yyyy HH:mm:ss ZZZ');\n\nreturn String(formatted);",
"description": "Call this tool to convert an incoming Unix\u2010seconds timestamp to a UTC date string."
},
"typeVersion": 1.2,
"alwaysOutputData": false
},
{
"id": "61919f98-d3bc-463d-ac83-c9cefc8113a5",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
4640,
-320
],
"parameters": {
"color": 7,
"width": 368,
"height": 288,
"content": "## Additional Tools"
},
"typeVersion": 1
},
{
"id": "15729f44-2d72-42a1-9255-b100c685d8af",
"name": "Date to timestamp",
"type": "@n8n/n8n-nodes-langchain.toolCode",
"position": [
4864,
-192
],
"parameters": {
"jsCode": "const raw = query || 'N/A';\n\nconst formats = [\n 'd.LL.yyyy HH:mm:ss',\n 'd.LL.yyyy', \n 'd LLLL yyyy HH:mm:ss',\n 'd LLLL yyyy', \n 'd LLL yyyy',\n 'yyyy-MM-dd',\n 'LLLL d, yyyy',\n 'd-M-yyyy',\n];\n\nlet dt = null;\nfor (const fmt of formats) {\n dt = DateTime.fromFormat(raw, fmt, {\n zone : 'Europe/Berlin',\n locale: 'en',\n });\n if (dt.isValid) break;\n}\n\nif (!dt?.isValid) {\n dt = DateTime.fromISO(raw, { zone: 'Europe/Berlin' });\n}\n\nif (!dt?.isValid) {\n dt = DateTime.fromSQL?.(raw, { zone: 'Europe/Berlin' });\n}\n\nif (!dt?.isValid) {\n return 'N/A';\n}\n\nconst timestamp = Math.floor(dt.toUTC().toSeconds());\n\nreturn timestamp;",
"description": "Call this tool to converts a human-readable date string (e.g. 05.05.2025 01:00:00) into a Unix timestamp in seconds.\nPass the date through the parameter `query` as a string."
},
"typeVersion": 1.2,
"alwaysOutputData": true
},
{
"id": "017aaa9a-0315-4e58-aa95-b853b132a68d",
"name": "Telegram Trigger",
"type": "n8n-nodes-base.telegramTrigger",
"position": [
1680,
-848
],
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "43e27fbf-5dd2-490a-af4d-4db8559fc499",
"name": "Download voice file",
"type": "n8n-nodes-base.telegram",
"position": [
2128,
-944
],
"parameters": {
"fileId": "={{ $('Telegram Trigger').item.json.message.voice.file_id }}",
"resource": "file",
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "e5a8bd05-e780-46b3-802a-23272a2e4bea",
"name": "Transcribe audio",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
2352,
-944
],
"parameters": {
"options": {},
"resource": "audio",
"operation": "transcribe",
"binaryPropertyName": "=data"
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.8
},
{
"id": "2c4490d8-0df0-46df-a833-b166058057b4",
"name": "Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
3424,
-944
],
"parameters": {
"text": "={{ $json.output }}",
"chatId": "={{ $('Telegram Trigger').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "24fed1b4-e71c-4a4a-a9eb-f6150776ee8d",
"name": "No Operation, do nothing",
"type": "n8n-nodes-base.noOp",
"position": [
3424,
-512
],
"parameters": {},
"typeVersion": 1
},
{
"id": "348c9850-4a12-4f03-a09a-5d46bcde4ef2",
"name": "Sticky Note9",
"type": "n8n-nodes-base.stickyNote",
"position": [
1632,
-976
],
"parameters": {
"color": 7,
"width": 868,
"height": 380,
"content": "## 1. Message from the Telegram bot\n"
},
"typeVersion": 1
},
{
"id": "c5a1203d-c011-4ecf-bc11-615e390f58c5",
"name": "Sticky Note10",
"type": "n8n-nodes-base.stickyNote",
"position": [
1632,
-576
],
"parameters": {
"color": 7,
"width": 868,
"height": 236,
"content": "## 1. Message from the n8n chat\n"
},
"typeVersion": 1
},
{
"id": "0479362b-ca2c-4aa9-ad53-721e91950df5",
"name": "Sticky Note11",
"type": "n8n-nodes-base.stickyNote",
"position": [
3120,
-976
],
"parameters": {
"color": 7,
"width": 476,
"height": 636,
"content": "## 3. Output"
},
"typeVersion": 1
},
{
"id": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"name": "KlickTipp Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2736,
-736
],
"parameters": {
"text": "={{ $json.text }}",
"options": {
"systemMessage": "=You are the KlickTipp AI Agent integrated with n8n, helping users manage their KlickTipp data through secure API tools.\n\n## CORE IDENTITY\n- **Role**: AI assistant for KlickTipp contact, tag, list, field, and opt-in/out management\n- **Communication**: Friendly, knowledgeable, AI-first approach\n- **Scope**: ONLY KlickTipp-related tasks. For other requests:\n - Programming/debugging: \"I'm specialized in KlickTipp management. For coding help, please use a general AI assistant.\"\n - Off-topic questions: \"I can only help with KlickTipp contacts, tags, and related features.\"\n - KlickTipp technical issues: Refer to KlickTipp Support: https://www.klicktipp.com/de/support/\n\n## LANGUAGE PROTOCOL\n1. **Check EVERY user message** for language \u2192 set as currentLang\n2. **Always respond in the language of the LAST user message**\n3. If detection unclear, maintain previous language (don't ask)\n4. Detection patterns:\n - German indicators: \"Hallo\", \"zeige\", \"bitte\", \"kannst du\", \"alle\", \"erstelle\", \"ja\", \"nein\", \"kontakt\", \"kontakte\"\n - English indicators: \"show\", \"please\", \"can you\", \"hello\", \"create\", \"all\", \"yes\", \"no\", \"contact\", \"contacts\"\n - Ambiguous single words: check context or maintain previous language\n - Email addresses and names: language-neutral, maintain previous language\n5. **Dynamic switching**: User can switch languages anytime by using clear indicators\n6. **German language rules**:\n - Use informal \"Du\" (not \"Sie\")\n - Capitalize all forms of \"Du\" pronouns: Du, Dir, Dich, Dein, Deine, Deinem, Deinen, Deiner, Deines\n - Example: \"Ich helfe Dir gerne mit Deinen Kontakten\"\n7. **Example flow**:\n - User: \"Create new contact\" \u2192 AI responds in English\n - User: \"zeige alle kontakte\" \u2192 AI responds in German with \"Du\"\n - User: \"show all tags\" \u2192 AI responds in English\n\n## OPERATIONAL PRINCIPLES\n1. **Customer Obsession** - User success is your mission\n2. **Understand First** - Seek clarity before acting\n3. **AI First** - Use AI for smarter, faster solutions\n4. **Make It Work, Then Make It Good** - Build iteratively\n5. **Focus on Impact** - Prioritize what truly matters\n6. **Build Trust** - Be transparent and dependable\n7. **Own Mistakes** - Accept responsibility and offer solutions\n8. **Dream Big, Stay Grounded** - Think boldly, execute realistically\n\n## CRITICAL EXECUTION RULES\n1. **ALWAYS CALL TOOLS** - Never display data not fetched in current turn\n2. **NEVER INVENT DATA** - Output only what tools return\n3. **FOLLOW RESPONSE FORMAT EXACTLY** - No skipped sections or extra headings\n\n## WORKFLOW\n1. Think and plan silently (do not reveal plan to user)\n2. Ignore cached data; treat every request as fresh\n3. Execute planned tool calls precisely\n4. Use mandated CONTACT-RESPONSE FORMAT\n5. If unclear - STOP and ask user (never guess)\n\n## DATA CREATION GUIDELINES\nWhen creating contacts:\n- **Required**: Either email OR smsNumber OR both (at least one must be provided)\n- **Phone number detection**: Numbers starting with 00, +, or containing only digits \u2192 treat as smsNumber\n- **NEVER ASK for any information** - create immediately with provided data\n- **DO NOT mention** optional fields, defaults, or missing information\n- If only email provided: set smsNumber = \"\"\n- If only SMS provided: set email = \"\"\n- If both provided: use both values as given\n- For other optional parameters: only include if user explicitly mentions them\n- Auto-select defaults silently: first opt-in process and first tag if not specified\n- Only ask user if multiple matches for ambiguous names\n- **Example responses**:\n - User: \"create contact email@example.com\" \u2192 Create with email, smsNumber=\"\"\n - User: \"add contact 00491234567890\" \u2192 Create with SMS, email=\"\"\n - User: \"add new contact 00380961987651\" \u2192 Create with smsNumber=\"00380961987651\", email=\"\"\n - User: \"create contact john@doe.com +491234567890\" \u2192 Create with both email and SMS\n - User: \"add john@doe.com with tag Customer\" \u2192 Create with email and tag\n - NEVER say: \"I'll need some basic information\" or \"any additional information?\"\n\n## CONTACT ENRICHMENT SUB-ROUTINE\n**MANDATORY for displaying any contact - enrichContact(contactId):**\n1. getContactById(contactId) \u2192 contact\n2. If contact.listid exists \u2192 getOptInProcess(contact.listid) \u2192 optInData\n - If optInData.name empty \u2192 set \"Predefined double opt-in process\"\n3. **ALWAYS check contact.tags** \u2192 for each tagId in contact.tags:\n - Call getTag(tagId) \u2192 tagData\n - Collect all tag details into tagsDetailed[]\n4. If contact.fieldBirthday exists and is not empty string:\n - Call timestampToDate with parameter: input = contact.fieldBirthday (as string)\n - If successful \u2192 readableBirthday = result\n - If error or returns 'N/A' \u2192 skip birthday field\n5. Build cleanedContact: start with contact, remove optin/listid, add:\n - birthday = readableBirthday (only if successfully converted)\n - optInProcess = optInData || null\n - tags = tagsDetailed[] (MUST include tag names and descriptions)\n6. return cleanedContact\n\n## RESPONSE LIMITS\n- **Message Size**: If reply > 3900 characters, send: \"I found **[count]** contacts, which is more than can be sent via Telegram in one message. Please give me an email address or a narrower filter if you'd like specific details.\"\n- **Contact List**: If > 10 contacts, show first 5 with message: \"Here are the first 5 of **[total]** contacts I found. If you need details on another contact, please specify the email address or refine your filter.\"\n\n## INTENT ROUTING (Apply in order, first match wins)\n1. **Contact creation with phone number only** \u2192 If \"create/add\" + number pattern (00, +, or digits) \u2192 Create with SMS (Playbook 6)\n2. **Exact email present** \u2192 Show/Tell about email (Playbook 2)\n3. **Tag operations**:\n a. Copy-tags follow-up (if previous message asked \"Would you like me to copy...?\" AND current includes \"copy\") \u2192 Playbook 4\n b. Add-tags request \u2192 Playbook 3\n4. **Numeric limit or date filter** \u2192 Show contacts with filter (Playbook 1)\n5. **Default** \u2192 Show all contacts (Playbook 1)\n\n## PLAYBOOKS\n\n### Playbook 1: Show contacts (all/limited/filtered)\nIMPORTANT: This playbook ALWAYS returns fully enriched contact details, NEVER just IDs.\n1. listContacts() \u2192 get contact IDs\n2. Apply filters/limits as requested\n3. Apply CONTACT-LIST LIMIT (max 5 contacts)\n4. For each remaining contact ID:\n - Call enrichContact(contactId) following the CONTACT ENRICHMENT SUB-ROUTINE\n - This MUST include: getting tags, opt-in process, and formatting birthday\n5. Collect all enriched contacts\n6. Check MESSAGE SIZE GUARD\n7. Display enriched contacts with all details if guard passes\n8. NEVER display just contact IDs - always show full enriched information\n\n\n### Playbook 2: Show/tell about email\n1. getContactIdByEmail(email)\n2. enrichContact(id)\n3. returnContact()\n\n### Playbook 3: Add tag(s) to existing contact\n1. listTags() \u2192 map names to tagIds[]\n2. tagContact(email, tagIds[])\n\n### Playbook 4: Copy tags to contact (follow-up only)\n1. getContactIdByEmail(targetEmail)\n2. tagContact(targetEmail, tagIds[])\n\n### Playbook 5: Create contact from template\n1. Pull sourceContact fields; convert birthday if present\n2. addOrUpdateContact(newEmail, data, optInId)\n3. tagContact(newEmail, filteredTagIds[])\n\n### Playbook 6: Create/add contact with data\n1. **Validate input**: Ensure either email OR smsNumber (or both) is provided\n - If only email: set smsNumber = \"\"\n - If only smsNumber: set email = \"\"\n - If both provided: use both values\n - If neither provided: STOP and say \"Please provide either an email address or SMS number\"\n2. Convert birthday to timestamp if present\n3. Map opt-in/tag names to IDs if given (use first as default if not specified)\n4. addOrUpdateContact(email, smsNumber, data, optInId)\n5. If email provided and tags specified: tagContact(email, tagIds[])\n\n### Playbook 7: Show contacts with specific tag(s)\n1. listTags() \u2192 map names to tagIds[]\n2. For each tagId \u2192 listTaggedContacts(tagId)\n3. Apply filters/limits\n4. Apply CONTACT-LIST LIMIT\n5. For each remaining contact \u2192 enrichContact(contactId) \u2192 collect enriched contacts\n6. Check MESSAGE SIZE GUARD\n7. returnContacts() if guard passes\n\n## FINAL RULE\nIf uncertain at any point - STOP, ask the user or call a lookup tool. NEVER guess."
},
"promptType": "define"
},
"typeVersion": 1.9,
"alwaysOutputData": true
},
{
"id": "8df2a333-e451-46a9-b429-36bb5fa66c95",
"name": "Set text from the n8n chat",
"type": "n8n-nodes-base.set",
"position": [
2352,
-512
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "8f30ef73-38a6-47e6-8948-aa93a235aac8",
"name": "text",
"type": "string",
"value": "={{ $json.chatInput }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "7081bd79-6837-4f2d-b1f2-f74840a46ac8",
"name": "Set text from Telegram",
"type": "n8n-nodes-base.set",
"position": [
2352,
-752
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "54e79aad-6145-4a36-bfc2-d0d380998edb",
"name": "text",
"type": "string",
"value": "={{ $json.message.text }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e0340f07-3c1f-427b-8b4d-c6e1ab28cf9f",
"name": "Check the message type",
"type": "n8n-nodes-base.switch",
"position": [
1904,
-848
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "Is voice message?",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "31e900d3-c974-4d23-8fd6-18522272e840",
"operator": {
"type": "object",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $('Telegram Trigger').item.json.message.voice }}",
"rightValue": ""
}
]
},
"renameOutput": true
},
{
"outputKey": "Is text message?",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "0106af1b-bb61-431b-ab76-32f656b8b116",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $('Telegram Trigger').item.json.message.text }}",
"rightValue": ""
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "7633d54b-5675-42ad-95ca-9c13c47c44a0",
"name": "Check the source",
"type": "n8n-nodes-base.switch",
"position": [
3200,
-736
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "Is Telegram",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "c95e7336-fd11-4156-a4ef-8d25018e4517",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $('Telegram Trigger').isExecuted }}",
"rightValue": ""
}
]
},
"renameOutput": true
},
{
"outputKey": "Is n8n chat",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "11a17ee9-6810-4f57-aea4-c7d0c13c29f0",
"operator": {
"type": "boolean",
"operation": "false",
"singleValue": true
},
"leftValue": "={{ $('Telegram Trigger').isExecuted }}",
"rightValue": ""
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "1714cac9-abd2-4ae0-8219-f00cea32a69d",
"name": "Add or Update Contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3600,
-192
],
"parameters": {
"email": "={{ $fromAI(\"email\", \"The contact's email address. Required\", \"string\", \"\") }}",
"tagId": "={{ $fromAI(\"tagId\", \"The tag ID.\", \"number\", 0) }}",
"fields": {
"dataFields": [
{
"fieldId": "fieldFirstName",
"fieldValue": "={{ $fromAI(\"fieldFirstName\", \"Contact's first name.\", \"string\", \"\") }}"
},
{
"fieldId": "fieldLastName",
"fieldValue": "={{ $fromAI(\"fieldLastName\", \"Contact's last name.\", \"string\", \"\") }}"
},
{
"fieldId": "fieldCompanyName",
"fieldValue": "={{ $fromAI(\"fieldCompany\", \"Contact's company name.\", \"string\", \"\") }}"
},
{
"fieldId": "fieldStreet1",
"fieldValue": "={{ $fromAI(\"fieldAddress1\", \"Contact's primary street address\", \"string\", \"\") }}"
},
{
"fieldId": "fieldStreet2",
"fieldValue": "={{ $fromAI(\"fieldAddress2\", \"Contact's secondary street address\", \"string\", \"\") }}"
},
{
"fieldId": "fieldCity",
"fieldValue": "={{ $fromAI(\"fieldCity\", \"Contact's city\", \"string\", \"\") }}"
},
{
"fieldId": "fieldState",
"fieldValue": "={{ $fromAI(\"fieldState\", \"Contact's state or region\", \"string\", \"\") }}"
},
{
"fieldId": "fieldZip",
"fieldValue": "={{ $fromAI(\"fieldZip\", \"Contact's ZIP or postal code\", \"string\", \"\") }}"
},
{
"fieldId": "fieldCountry",
"fieldValue": "={{ $fromAI(\"fieldCountry\", \"Contact's country\", \"string\", \"\") }}"
},
{
"fieldId": "fieldMobilePhone",
"fieldValue": "={{ $fromAI(\"fieldMobilePhone\", \"Contact's mobile phone in international format starting with '00' (e.g., 00491631737743)\", \"string\", \"\") }}"
},
{
"fieldId": "fieldPrivatePhone",
"fieldValue": "={{ $fromAI(\"fieldPrivatePhone\", \"Contact's private phone in international format starting with '00' (e.g., 00491631737743)\", \"string\", \"\") }}"
},
{
"fieldId": "fieldFax",
"fieldValue": "={{ $fromAI(\"fieldFax\", \"Contact's fax number in international format starting with '00' (e.g., 0049301234567)\", \"string\", \"\") }}"
},
{
"fieldId": "fieldBirthday",
"fieldValue": "={{ $fromAI('fieldBirthday', `Unix seconds for the contact's birthday \u2014 supply **only** when the user explicitly asks to set a birthday (keywords: birthday / birth date / set birthday).`, \"number\", 0) }}"
},
{
"fieldId": "fieldLeadValue",
"fieldValue": "={{ $fromAI(\"fieldLeadValue\", \"Estimated lead value as a number\", \"number\", 0) }}"
},
{
"fieldId": "fieldWebsite",
"fieldValue": "={{ $fromAI(\"fieldWebsite\", \"Contact's website URL\", \"string\", \"\") }}"
}
]
},
"listId": "={{ $fromAI(\"optInId\", \"The opt-in process ID.\", \"number\", 0) }}",
"resource": "subscriber",
"operation": "subscribe",
"smsNumber": "={{ $fromAI(\"smsNumber\", \"The contact's SMS number.\", \"string\", \"\") }}",
"descriptionType": "manual",
"toolDescription": "Adds a new contact. If a contact with the same email already exists, it will be updated."
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
}
],
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "c5149699-b78a-417e-acc6-fb5cf7645e78",
"connections": {
"Get Tag": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"List Tags": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Create Tag": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Delete Tag": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Update Tag": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get Contact": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Tag Contact": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"List Contacts": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Simple Memory": {
"ai_memory": [
[
{
"node": "KlickTipp Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Untag Contact": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Delete Contact": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get Contact ID": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get Data Field": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Update Contact": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"KlickTipp Agent": {
"main": [
[
{
"node": "Check the source",
"type": "main",
"index": 0
}
]
]
},
"Check the source": {
"main": [
[
{
"node": "Telegram",
"type": "main",
"index": 0
}
],
[
{
"node": "No Operation, do nothing",
"type": "main",
"index": 0
}
]
]
},
"Get Redirect URL": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"List Data Fields": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Telegram Trigger": {
"main": [
[
{
"node": "Check the message type",
"type": "main",
"index": 0
}
]
]
},
"Transcribe audio": {
"main": [
[
{
"node": "KlickTipp Agent",
"type": "main",
"index": 0
}
]
]
},
"Date to timestamp": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "KlickTipp Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Timestamp to date": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Get Opt-in Process": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Download voice file": {
"main": [
[
{
"node": "Transcribe audio",
"type": "main",
"index": 0
}
]
]
},
"Unsubscribe Contact": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"List Tagged Contacts": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Add or Update Contact": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"List Opt-in Processes": {
"ai_tool": [
[
{
"node": "KlickTipp Agent",
"type": "ai_tool",
"index": 0
}
]
]
},
"Check the message type": {
"main": [
[
{
"node": "Download voice file",
"type": "main",
"index": 0
}
],
[
{
"node": "Set text from Telegram",
"type": "main",
"index": 0
}
]
]
},
"Set text from Telegram": {
"main": [
[
{
"node": "KlickTipp Agent",
"type": "main",
"index": 0
}
]
]
},
"Set text from the n8n chat": {
"main": [
[
{
"node": "KlickTipp Agent",
"type": "main",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "Set text from the n8n chat",
"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.
klickTippApiopenAiApitelegramApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Community Node Disclaimer: This workflow uses KlickTipp community nodes.
Source: https://n8n.io/workflows/5747/ — 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.
This n8n workflow is designed for Shopify store owners and e-commerce managers who want to automate their store operations through an intelligent AI assistant. The workflow creates a conversational in
This project is an automation workflow that generates a personalized resume and cover letter for each job listing. Generates an HTML resume from your data. Hosts it live on GitHub Pages. Converts it t
Telegram Splitout. Uses chatTrigger, lmChatOpenAi, outputParserStructured, telegram. Chat trigger; 23 nodes.
This workflow is ideal for individuals focused on nutrition tracking, meal planning, or diet optimization—whether you’re a health-conscious individual, fitness coach, or developer working on a healtht
Summarize YouTube Videos & Chat About Content with GPT-4o-mini via Telegram. Uses splitOut, lmChatOpenAi, chainLlm, summarize. Chat trigger; 22 nodes.