Gestion des contacts dans KlickTipp via un agent IA Telegram
Ceci est unCRM, AI Chatbotworkflow d'automatisation du domainecontenant 47 nœuds.Utilise principalement des nœuds comme Set, Switch, Telegram, Agent, TelegramTrigger. viaTelegrambotetGPT-4oagentgestionKlickTipp联系人
- •Token Bot Telegram
- •Clé API OpenAI
Nœuds utilisés (47)
Catégorie
{
"id": "de1Bmx0unOb4OzvK",
"meta": {
"instanceId": "95b3ab5a70ab1c8c1906357a367f1b236ef12a1409406fd992f60255f0f95f85",
"templateCredsSetupCompleted": true
},
"name": "Manage contacts in KlickTipp via Telegram AI Agent",
"tags": [],
"nodes": [
{
"id": "9989921d-2df3-40fe-9f0a-090e637763d8",
"name": "À la réception d'un message chat",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"position": [
1400,
-500
],
"webhookId": "97bfbff2-3629-4262-8669-29888c42ae23",
"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": [
2240,
-620
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o",
"cachedResultName": "gpt-4o"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "ai4Z3wkDckKxBl1U",
"name": "(Mykhailo) OpenAi account"
}
},
"typeVersion": 1.2
},
{
"id": "5b7ea68f-8a51-4413-af04-3cca7f1ca86f",
"name": "Note adhésive4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2200,
-960
],
"parameters": {
"color": 7,
"width": 600,
"height": 460,
"content": "## 2. Connect any Agent with a KlickTipp tools"
},
"typeVersion": 1
},
{
"id": "92ab0e41-049b-43ac-8f39-e5b02e7562e7",
"name": "Mémoire simple",
"type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
"position": [
2420,
-620
],
"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": "Note adhésive",
"type": "n8n-nodes-base.stickyNote",
"position": [
740,
-960
],
"parameters": {
"width": 580,
"height": 2040,
"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- “Tell me something about the contact with email address X”\n- “Tag all contacts from region Y”\n- “Send campaign Z to customers in area A”\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": "Lister les contacts",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2420,
-200
],
"parameters": {
"resource": "subscriber",
"descriptionType": "manual",
"toolDescription": "List all contacts"
},
"credentials": {
"klickTippApi": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "35250ba6-bad1-4926-98ff-007e2f60ed21",
"name": "Obtenir un contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2740,
-200
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "8aebefc8-34b7-4f66-b773-772ccf3deebb",
"name": "Obtenir l'ID du contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2900,
-200
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "8ff3ff81-0476-49d1-9627-840e12e50761",
"name": "Lister les contacts étiquetés",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2900,
-40
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "f4177135-1a7e-4245-8931-0ac75465756f",
"name": "Lister les étiquettes",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3320,
-220
],
"parameters": {
"descriptionType": "manual",
"toolDescription": "Lists the IDs and names of all tags."
},
"credentials": {
"klickTippApi": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "8e59d336-79ad-4f6e-8256-f44ab9e2ea27",
"name": "Mettre à jour le contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2420,
-20
],
"parameters": {
"email": "={{ $fromAI(\"email\", \"The contact's email address.\", \"string\", \"\") }}",
"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": "fieldPrivatePhone",
"fieldValue": "={{ $fromAI(\"fieldPrivatePhone\", \"Contact’s private phone in international format starting with '00' (e.g., 00491631737743)\", \"string\", \"\") }}"
},
{
"fieldId": "fieldMobilePhone",
"fieldValue": "={{ $fromAI(\"fieldMobilePhone\", \"Contact’s mobile 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": "fieldWebsite",
"fieldValue": "={{ $fromAI(\"fieldWebsite\", \"Contact’s website URL\", \"string\", \"\") }}"
},
{
"fieldId": "fieldBirthday",
"fieldValue": "={{ $fromAI(\"fieldBirthday\", \"Contact’s 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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "6463b625-e410-48cd-97e1-88b0d97b32ea",
"name": "Supprimer le contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2580,
-20
],
"parameters": {
"resource": "subscriber",
"operation": "delete",
"subscriberId": "={{ $fromAI(\"contactId\", \"The contact's ID. Required\", \"string\", \"\") }}",
"descriptionType": "manual",
"toolDescription": "Deletes a contact."
},
"credentials": {
"klickTippApi": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "9fbb16a9-6e96-4e75-a1a5-c096fddc1951",
"name": "Désabonner le contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2740,
-40
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "3c620b1b-55e5-40b4-b371-10dde8c1cefa",
"name": "Créer une étiquette",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3440,
-220
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "c451d3cb-6323-432c-a98b-8a8c10d8d386",
"name": "Obtenir une étiquette",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3560,
-220
],
"parameters": {
"tagId": "={{ $fromAI(\"tagId\", \"The tag ID. Required\", \"number\", \"\") }}",
"operation": "get",
"descriptionType": "manual",
"toolDescription": "Returns the name and description of a tag."
},
"credentials": {
"klickTippApi": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "46150de8-a733-4d60-ae45-2019913fce9c",
"name": "Supprimer une étiquette",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3680,
-220
],
"parameters": {
"tagId": "={{ $fromAI(\"tagId\", \"The tag ID. Required\", \"number\", \"\") }}",
"operation": "delete",
"descriptionType": "manual",
"toolDescription": "Deletes a tag."
},
"credentials": {
"klickTippApi": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "4aac4674-be12-4126-9bbd-8bc570c296af",
"name": "Mettre à jour une étiquette",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3800,
-220
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "7477e0b7-ace7-42f7-8cb8-8ed997592d85",
"name": "Lister les processus d'opt-in",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
1380,
-220
],
"parameters": {
"resource": "opt-in",
"descriptionType": "manual",
"toolDescription": "Lists the IDs and names of all opt-in processes."
},
"credentials": {
"klickTippApi": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "43bda647-d273-4768-a429-0a8abff9bec0",
"name": "Obtenir un processus d'opt-in",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
1540,
-220
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "88414a45-3d7e-41db-8845-1a31f163ab87",
"name": "Lister les champs de données",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
1740,
-200
],
"parameters": {
"resource": "field",
"descriptionType": "manual",
"toolDescription": "Lists the IDs and names of all data fields."
},
"credentials": {
"klickTippApi": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "98642fcd-bb96-4883-856b-7affb03ddffd",
"name": "Obtenir un champ de données",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
1880,
-200
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "004e895c-361b-464d-b258-889363d369bb",
"name": "Retirer l'étiquette d'un contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2080,
-200
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "15134ced-fb09-47f2-a818-4885d62ab47b",
"name": "Étiqueter un contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2220,
-200
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "79a23888-f41f-4a9c-a045-cefcf7abfb15",
"name": "Note adhésive2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1360,
-300
],
"parameters": {
"color": 7,
"width": 300,
"height": 240,
"content": "## Opt-in Processes\n"
},
"typeVersion": 1
},
{
"id": "155a5b36-8de4-4f74-bf00-37bc62b0c081",
"name": "Note adhésive3",
"type": "n8n-nodes-base.stickyNote",
"position": [
3280,
-300
],
"parameters": {
"color": 7,
"width": 620,
"height": 220,
"content": "## Tag Operations\n"
},
"typeVersion": 1
},
{
"id": "ecd5521a-899e-4010-b3a8-d4ff6b701f8a",
"name": "Obtenir l'URL de redirection",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
3100,
-220
],
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "093cb61d-f110-4920-a2cb-b9b4c6681060",
"name": "Note adhésive6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1700,
-300
],
"parameters": {
"color": 7,
"width": 300,
"height": 240,
"content": "## Data Fields\n"
},
"typeVersion": 1
},
{
"id": "18244673-ef94-4d9c-9a7b-f1d4ff460812",
"name": "Note adhésive7",
"type": "n8n-nodes-base.stickyNote",
"position": [
2040,
-300
],
"parameters": {
"color": 7,
"width": 300,
"height": 240,
"content": "## Contact Tagging\n"
},
"typeVersion": 1
},
{
"id": "a37cbe4b-7ad2-483c-be0e-ca52b67753b3",
"name": "Note adhésive8",
"type": "n8n-nodes-base.stickyNote",
"position": [
3040,
-300
],
"parameters": {
"color": 7,
"width": 200,
"height": 220,
"content": "## Redirects\n"
},
"typeVersion": 1
},
{
"id": "58544d4b-8c6b-4cc1-b767-228e55fecca6",
"name": "Ajouter ou mettre à jour un contact",
"type": "n8n-nodes-klicktipp.klicktippTool",
"position": [
2580,
-200
],
"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(\n \"fieldBirthday\",\n \"Unix seconds for the contact’s birthday — supply **only** when the user explicitly asks to set a birthday (keywords: birthday / birth date / set birthday). Otherwise leave undefined.\",\n \"number\",\n undefined\n) ?? undefined }}"
},
{
"fieldId": "fieldLeadValue",
"fieldValue": "={{ $fromAI(\"fieldLeadValue\", \"Estimated lead value as a number\", \"number\", \"\") }}"
},
{
"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": {
"id": "NTht3frPxvENgu0k",
"name": "Mykhaylo's KlickTipp"
}
},
"typeVersion": 2
},
{
"id": "b0775e10-e8ed-4fed-bc11-c5674f36ccd4",
"name": "Note adhésive1",
"type": "n8n-nodes-base.stickyNote",
"position": [
2380,
-300
],
"parameters": {
"color": 7,
"width": 640,
"height": 420,
"content": "## Contact Management"
},
"typeVersion": 1
},
{
"id": "d3537987-67eb-45bd-8100-0c39635bf112",
"name": "Timestamp vers date",
"type": "@n8n/n8n-nodes-langchain.toolCode",
"onError": "continueRegularOutput",
"position": [
3980,
-220
],
"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‐seconds timestamp to a UTC date string."
},
"typeVersion": 1.2,
"alwaysOutputData": false
},
{
"id": "61919f98-d3bc-463d-ac83-c9cefc8113a5",
"name": "Note adhésive5",
"type": "n8n-nodes-base.stickyNote",
"position": [
3920,
-300
],
"parameters": {
"color": 7,
"width": 400,
"height": 220,
"content": "## Additional Tools"
},
"typeVersion": 1
},
{
"id": "15729f44-2d72-42a1-9255-b100c685d8af",
"name": "Date vers timestamp",
"type": "@n8n/n8n-nodes-langchain.toolCode",
"position": [
4160,
-220
],
"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": [
1400,
-840
],
"webhookId": "31751764-cf74-40df-8199-e373b665dddb",
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"credentials": {
"telegramApi": {
"id": "ZCMqFgXRWNGVFhmQ",
"name": "KlickTipp Telegram bot"
}
},
"typeVersion": 1.2
},
{
"id": "43e27fbf-5dd2-490a-af4d-4db8559fc499",
"name": "Télécharger le fichier vocal",
"type": "n8n-nodes-base.telegram",
"position": [
1860,
-920
],
"webhookId": "c1094130-ae1a-4063-8cbf-2cbd07be1bdd",
"parameters": {
"fileId": "={{ $('Telegram Trigger').item.json.message.voice.file_id }}",
"resource": "file"
},
"credentials": {
"telegramApi": {
"id": "ZCMqFgXRWNGVFhmQ",
"name": "KlickTipp Telegram bot"
}
},
"typeVersion": 1.2
},
{
"id": "e5a8bd05-e780-46b3-802a-23272a2e4bea",
"name": "Transcrire l'audio",
"type": "@n8n/n8n-nodes-langchain.openAi",
"position": [
2020,
-920
],
"parameters": {
"options": {},
"resource": "audio",
"operation": "transcribe",
"binaryPropertyName": "=data"
},
"credentials": {
"openAiApi": {
"id": "ai4Z3wkDckKxBl1U",
"name": "(Mykhailo) OpenAi account"
}
},
"typeVersion": 1.8
},
{
"id": "2c4490d8-0df0-46df-a833-b166058057b4",
"name": "Telegram",
"type": "n8n-nodes-base.telegram",
"position": [
3080,
-940
],
"webhookId": "f27ecff7-80d3-40c6-abeb-40dd199fc044",
"parameters": {
"text": "={{ $json.output }}",
"chatId": "={{ $('Telegram Trigger').item.json.message.from.id }}",
"additionalFields": {
"appendAttribution": false
}
},
"credentials": {
"telegramApi": {
"id": "ZCMqFgXRWNGVFhmQ",
"name": "KlickTipp Telegram bot"
}
},
"typeVersion": 1.2
},
{
"id": "24fed1b4-e71c-4a4a-a9eb-f6150776ee8d",
"name": "Aucune opération, ne rien faire",
"type": "n8n-nodes-base.noOp",
"position": [
3080,
-740
],
"parameters": {},
"typeVersion": 1
},
{
"id": "348c9850-4a12-4f03-a09a-5d46bcde4ef2",
"name": "Note adhésive9",
"type": "n8n-nodes-base.stickyNote",
"position": [
1360,
-960
],
"parameters": {
"color": 7,
"width": 820,
"height": 380,
"content": "## 1. Message from the Telegram bot\n"
},
"typeVersion": 1
},
{
"id": "c5a1203d-c011-4ecf-bc11-615e390f58c5",
"name": "Note adhésive10",
"type": "n8n-nodes-base.stickyNote",
"position": [
1360,
-560
],
"parameters": {
"color": 7,
"width": 820,
"height": 220,
"content": "## 1. Message from the n8n chat\n"
},
"typeVersion": 1
},
{
"id": "0479362b-ca2c-4aa9-ad53-721e91950df5",
"name": "Note adhésive11",
"type": "n8n-nodes-base.stickyNote",
"position": [
2820,
-960
],
"parameters": {
"color": 7,
"width": 460,
"height": 460,
"content": "## 3. Output"
},
"typeVersion": 1
},
{
"id": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"name": "Agent KlickTipp",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
2400,
-860
],
"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 → 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\" → AI responds in English\n - User: \"zeige alle kontakte\" → AI responds in German with \"Du\"\n - User: \"show all tags\" → 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 → 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\" → Create with email, smsNumber=\"\"\n - User: \"add contact 00491234567890\" → Create with SMS, email=\"\"\n - User: \"add new contact 00380961987651\" → Create with smsNumber=\"00380961987651\", email=\"\"\n - User: \"create contact john@doe.com +491234567890\" → Create with both email and SMS\n - User: \"add john@doe.com with tag Customer\" → 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) → contact\n2. If contact.listid exists → getOptInProcess(contact.listid) → optInData\n - If optInData.name empty → set \"Predefined double opt-in process\"\n3. **ALWAYS check contact.tags** → for each tagId in contact.tags:\n - Call getTag(tagId) → 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 → readableBirthday = result\n - If error or returns 'N/A' → 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** → If \"create/add\" + number pattern (00, +, or digits) → Create with SMS (Playbook 6)\n2. **Exact email present** → 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\") → Playbook 4\n b. Add-tags request → Playbook 3\n4. **Numeric limit or date filter** → Show contacts with filter (Playbook 1)\n5. **Default** → Show all contacts (Playbook 1)\n\n## PLAYBOOKS\n\n### Playbook 1: Show contacts (all/limited/filtered)\n1. listContacts() → 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\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() → 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() → map names to tagIds[]\n2. For each tagId → listTaggedContacts(tagId)\n3. Apply filters/limits\n4. Apply CONTACT-LIST LIMIT\n5. For each remaining contact → enrichContact(contactId) → 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": "Définir le texte du chat n8n",
"type": "n8n-nodes-base.set",
"position": [
1600,
-500
],
"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": "Définir le texte de Telegram",
"type": "n8n-nodes-base.set",
"position": [
1860,
-740
],
"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": "Vérifier le type de message",
"type": "n8n-nodes-base.switch",
"position": [
1600,
-840
],
"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": "Vérifier la source",
"type": "n8n-nodes-base.switch",
"position": [
2840,
-860
],
"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
}
],
"active": true,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "773c3b4d-9eb6-4abb-9dbc-0c9328d8591a",
"connections": {
"c451d3cb-6323-432c-a98b-8a8c10d8d386": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"f4177135-1a7e-4245-8931-0ac75465756f": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"3c620b1b-55e5-40b4-b371-10dde8c1cefa": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"46150de8-a733-4d60-ae45-2019913fce9c": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"4aac4674-be12-4126-9bbd-8bc570c296af": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"35250ba6-bad1-4926-98ff-007e2f60ed21": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"15134ced-fb09-47f2-a818-4885d62ab47b": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"20256111-b1fe-44c3-a2f9-ed1525b9e84b": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"92ab0e41-049b-43ac-8f39-e5b02e7562e7": {
"ai_memory": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_memory",
"index": 0
}
]
]
},
"004e895c-361b-464d-b258-889363d369bb": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"6463b625-e410-48cd-97e1-88b0d97b32ea": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"8aebefc8-34b7-4f66-b773-772ccf3deebb": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"98642fcd-bb96-4883-856b-7affb03ddffd": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"8e59d336-79ad-4f6e-8256-f44ab9e2ea27": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"63ba982b-6c63-4af8-b1c3-135ed49a721e": {
"main": [
[
{
"node": "7633d54b-5675-42ad-95ca-9c13c47c44a0",
"type": "main",
"index": 0
}
]
]
},
"7633d54b-5675-42ad-95ca-9c13c47c44a0": {
"main": [
[
{
"node": "2c4490d8-0df0-46df-a833-b166058057b4",
"type": "main",
"index": 0
}
],
[
{
"node": "24fed1b4-e71c-4a4a-a9eb-f6150776ee8d",
"type": "main",
"index": 0
}
]
]
},
"ecd5521a-899e-4010-b3a8-d4ff6b701f8a": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"88414a45-3d7e-41db-8845-1a31f163ab87": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"017aaa9a-0315-4e58-aa95-b853b132a68d": {
"main": [
[
{
"node": "e0340f07-3c1f-427b-8b4d-c6e1ab28cf9f",
"type": "main",
"index": 0
}
]
]
},
"e5a8bd05-e780-46b3-802a-23272a2e4bea": {
"main": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "main",
"index": 0
}
]
]
},
"15729f44-2d72-42a1-9255-b100c685d8af": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"25d78214-6214-489f-ab3f-c7113b813838": {
"ai_languageModel": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"d3537987-67eb-45bd-8100-0c39635bf112": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"43bda647-d273-4768-a429-0a8abff9bec0": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"43e27fbf-5dd2-490a-af4d-4db8559fc499": {
"main": [
[
{
"node": "e5a8bd05-e780-46b3-802a-23272a2e4bea",
"type": "main",
"index": 0
}
]
]
},
"9fbb16a9-6e96-4e75-a1a5-c096fddc1951": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"8ff3ff81-0476-49d1-9627-840e12e50761": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"58544d4b-8c6b-4cc1-b767-228e55fecca6": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"7477e0b7-ace7-42f7-8cb8-8ed997592d85": {
"ai_tool": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "ai_tool",
"index": 0
}
]
]
},
"e0340f07-3c1f-427b-8b4d-c6e1ab28cf9f": {
"main": [
[
{
"node": "43e27fbf-5dd2-490a-af4d-4db8559fc499",
"type": "main",
"index": 0
}
],
[
{
"node": "7081bd79-6837-4f2d-b1f2-f74840a46ac8",
"type": "main",
"index": 0
}
]
]
},
"7081bd79-6837-4f2d-b1f2-f74840a46ac8": {
"main": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "main",
"index": 0
}
]
]
},
"8df2a333-e451-46a9-b429-36bb5fa66c95": {
"main": [
[
{
"node": "63ba982b-6c63-4af8-b1c3-135ed49a721e",
"type": "main",
"index": 0
}
]
]
},
"9989921d-2df3-40fe-9f0a-090e637763d8": {
"main": [
[
{
"node": "8df2a333-e451-46a9-b429-36bb5fa66c95",
"type": "main",
"index": 0
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Avancé - CRM, Chatbot IA
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
KlickTipp
@KlickTippReach more people. 100% GDPR compliant. Quickly create automated email campaigns, SMS and marketing automations. Market your knowledge independently of Google & Co., sell lucrative products and activate your customers.
Partager ce workflow