AutomationFlowsAI & RAG › Manage Klicktipp Contact Tags with Gpt-5-mini via Chat Input

Manage Klicktipp Contact Tags with Gpt-5-mini via Chat Input

ByKlickTipp @KlickTipp on n8n.io

This workflow uses an n8n chat trigger, OpenAI (gpt-5-mini), and KlickTipp community nodes to interpret chat instructions and create, apply, or remove tags for an existing KlickTipp contact, returning a structured JSON result. Receives a chat message containing a contact email…

Chat trigger trigger★★★★☆ complexityAI-powered14 nodesChat TriggerOpenAI ChatN8N Nodes KlicktippAgentOutput Parser Structured
AI & RAG Trigger: Chat trigger Nodes: 14 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #16724 — 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 →

Download .json
{
  "id": "ja1B9smgHDnDZASw",
  "name": "Manage KlickTipp Contact Tags with GPT-5-mini AI Agent",
  "tags": [],
  "nodes": [
    {
      "id": "20757384-a4a8-46ef-bfef-2aea3936d1e5",
      "name": "1. Input",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -592,
        -272
      ],
      "parameters": {
        "color": 7,
        "height": 624,
        "content": "## 1. Input"
      },
      "typeVersion": 1
    },
    {
      "id": "1924103e-2afe-4254-a4e8-c66a0242503b",
      "name": "2. Write KlickTipp actions",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -272
      ],
      "parameters": {
        "color": 7,
        "width": 432,
        "height": 624,
        "content": "## 2. Write KlickTipp actions"
      },
      "typeVersion": 1
    },
    {
      "id": "271719aa-bb8a-47d4-9f68-798ad2db62f0",
      "name": "3. Read-only KlickTipp tools",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        48,
        -272
      ],
      "parameters": {
        "color": 7,
        "width": 336,
        "height": 624,
        "content": "## 3. Read-only KlickTipp tools"
      },
      "typeVersion": 1
    },
    {
      "id": "acd1c301-4d4c-4933-b422-3cb4a5641e17",
      "name": "4. AI Orchestration",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -336,
        -272
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 624,
        "content": "## 4. AI Orchestration"
      },
      "typeVersion": 1
    },
    {
      "id": "e7895a8a-9bb1-4893-b191-dd38233f19c6",
      "name": "When chat message received",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "position": [
        -528,
        -48
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.4
    },
    {
      "id": "d30af93e-9ab1-4211-a5a0-f2cc4bf86e3d",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -256,
        128
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-mini",
          "cachedResultName": "gpt-5-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {},
      "typeVersion": 1.3
    },
    {
      "id": "390068cf-1a7d-40e3-a42f-0416cbac5cfc",
      "name": "Create tag in KlickTipp",
      "type": "n8n-nodes-klicktipp.klicktippTool",
      "position": [
        432,
        128
      ],
      "parameters": {
        "name": "={{ $fromAI(\"tagName\", \"The tag name\", \"string\", \"\") }}",
        "operation": "create",
        "description": "={{ $fromAI(\"tagDescription\", \"The tag description\", \"string\", \"\") }}",
        "descriptionType": "manual",
        "toolDescription": "Create tag in KlickTipp"
      },
      "credentials": {},
      "typeVersion": 3
    },
    {
      "id": "1fc7e26d-b73f-4570-9d50-da08f4a9c830",
      "name": "Get contact in KlickTipp",
      "type": "n8n-nodes-klicktipp.klicktippTool",
      "position": [
        96,
        128
      ],
      "parameters": {
        "resource": "subscriber",
        "operation": "get",
        "lookupEmail": "={{ $fromAI(\"email\", \"The contact's email address.\", \"string\", \"\") }}",
        "descriptionType": "manual",
        "toolDescription": "Returns the complete data of a contact."
      },
      "credentials": {},
      "typeVersion": 3
    },
    {
      "id": "7e5924cd-1196-4b36-8dcd-cd3f8bbf985c",
      "name": "Tag contact in KlickTipp",
      "type": "n8n-nodes-klicktipp.klicktippTool",
      "position": [
        560,
        128
      ],
      "parameters": {
        "email": "={{ $fromAI(\"email\", \"The contact's email address.\", \"string\", \"\") }}",
        "tagId": "={{ $fromAI(\"tagIdsToApply\", 'All the tag IDs in brackets. For example: [12042204,12054769,12071604]', \"json\") }}",
        "resource": "contact-tagging",
        "descriptionType": "manual",
        "toolDescription": "Tag contact in KlickTipp"
      },
      "credentials": {},
      "typeVersion": 3
    },
    {
      "id": "8be4a2bf-6a30-493c-8d8b-dfd32c62d4a6",
      "name": "Untag contact in KlickTipp",
      "type": "n8n-nodes-klicktipp.klicktippTool",
      "position": [
        704,
        128
      ],
      "parameters": {
        "email": "={{ $fromAI(\"email\", \"The contact's email address.\", \"string\", \"\") }}",
        "tagId": "={{ $fromAI(\"tagIdToRemove\", \"The tag ID.\", \"number\", \"\") }}",
        "resource": "contact-tagging",
        "operation": "untag",
        "descriptionType": "manual",
        "toolDescription": "Untag contact in KlickTipp"
      },
      "credentials": {},
      "typeVersion": 3
    },
    {
      "id": "e9447a55-6301-4fed-8387-e11484b0b4cb",
      "name": "KlickTipp Tag Manager Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -256,
        -48
      ],
      "parameters": {
        "text": "={{ $json.chatInput }}",
        "options": {
          "maxIterations": 20,
          "systemMessage": "=You are an AI tagging agent for KlickTipp.\n\nYour job is to manage explicitly requested tags for an existing KlickTipp contact.\n\nYou may decide which explicitly requested tags should be created, applied, or removed by using:\n- the contact's current tag IDs\n- the full KlickTipp tag list\n- newly created tag results\n\nAvailable tools:\n- Get contact in KlickTipp\n- List tags in KlickTipp\n- Create tag in KlickTipp\n- Tag contact in KlickTipp\n- Untag contact in KlickTipp\n\nInput may contain:\n- email: contact email address\n- tags: tag names to apply\n- untagTags: tag names to remove\n- context: optional explanation\n\nCRITICAL RULES:\n\n1. Only use tag names explicitly requested by the user in tags or untagTags, or explicitly requested in a natural-language tag command.\n2. Never invent, guess, infer, translate, rename, or add extra tags.\n3. Never create tags from the email address, username, domain, context, contact data, purchases, job titles, plans, roles, examples, descriptions, or commentary.\n4. Never create contacts.\n5. Never delete tags.\n6. Never modify contact fields.\n7. Tag contact in KlickTipp accepts tag IDs only.\n8. Untag contact in KlickTipp accepts tag IDs only.\n9. Never pass tag names to Tag contact in KlickTipp.\n10. Never pass tag names to Untag contact in KlickTipp.\n11. Only create tags that are explicitly requested for applying.\n12. Never create tags requested only for removal.\n13. If a requested apply tag already exists, do not create it. Use the existing tag ID.\n14. If a requested remove tag does not exist, ignore it.\n15. If the contact already has a requested apply tag, do not apply it again.\n16. If the contact does not have a requested remove tag, do not remove it.\n17. Return only JSON. No Markdown. No explanation outside JSON.\n\nACTION SEPARATION RULE:\n\nThe agent must separately classify apply actions and remove actions.\n\nOnly apply/tag/add/assign/set tag commands may populate requestedTagsToApply.\n\nOnly remove/untag/clear/take off/delete tag from contact commands may populate requestedTagsToRemove.\n\nIf the user request contains no explicit apply action, requestedTagsToApply MUST be [].\n\nIf the user request contains no explicit remove action, requestedTagsToRemove MUST be [].\n\nNever call \"Tag contact in KlickTipp\" unless the original user request contains an explicit apply action.\n\nNever call \"Untag contact in KlickTipp\" unless the original user request contains an explicit remove action or remove-all action.\n\nCommentary such as:\n- \"I don't think that tag exists yet\"\n- \"create it if necessary\"\n- \"if needed\"\n- \"probably does not exist\"\n- \"maybe this tag is new\"\n- \"it may already exist\"\n- \"not sure if it exists\"\n\nis not an apply action and must not populate requestedTagsToApply.\nis not a remove action and must not populate requestedTagsToRemove.\n\nTAG MATCHING RULES:\n\n1. Compare requested tag names with existing KlickTipp tags case-insensitively.\n2. Treat extra repeated spaces as equivalent to a single space.\n3. Treat leading and trailing spaces as irrelevant.\n4. Treat \"TAG 1\" and \"tag 1\" as the same tag.\n5. If the List tags response uses \"value\" for tag name, use value.\n6. Prefer exact normalized matches only.\n7. Do not use semantic similarity.\n8. Do not choose a similar-looking tag if the normalized name does not match exactly.\n\nNormalization is defined as: remove all characters that are not a basic Latin letter (A-Z, a-z), a digit (0-9), or a regular ASCII space (U+0020) or common punctuation (hyphen, underscore, dot, comma, slash, at-sign, plus); replace any remaining whitespace-like character with a regular ASCII space; trim leading and trailing spaces; collapse repeated internal spaces to one space; and lowercase the result. This definition applies everywhere \"normalized\" or \"exact normalized match\" is referenced in this prompt.\n\nSPECIAL REMOVE-ALL RULE:\n\nIf the user explicitly asks to remove all tags from a contact, treat this as a valid remove action.\n\nExamples:\n- \"Remove all tags from example@gmail.com\"\n- \"Untag all tags from example@gmail.com\"\n- \"Clear all tags from example@gmail.com\"\n- \"Remove every tag from the contact example@gmail.com\"\n\nFor this special case:\n- requestedTagsToApply = []\n- requestedTagsToRemove = [\"__ALL__\"]\n\nIMPORTANT:\n\n\"Remove all tags\" means remove all tag IDs currently assigned to the contact.\n\nThe source of truth for assigned tags is the contact.tags property returned by \"Get contact in KlickTipp\".\n\nDo not treat \"all\" as a normal tag name unless the user explicitly quotes it as a tag name:\n\"Remove the tag named \\\"all\\\" from example@gmail.com\"\n\nDESCRIPTIVE FACT RULE:\n\nNever treat descriptive statements as tag commands.\n\nInvalid \u2014 no explicit tag action, return error:\n- \"The contact example@gmail.com just bought the Premium Plan and is a CEO.\" \u2192 do not apply \"Premium Plan\" or \"CEO\"\n- \"example@gmail.com is now a VIP customer.\" \u2192 do not apply \"VIP\"\n- \"example@gmail.com upgraded from Trial to Premium Plan.\" \u2192 do not remove \"Trial\" or apply \"Premium Plan\"\n\nValid \u2014 explicit tag action present:\n- \"Tag example@gmail.com as Premium Plan\" \u2192 apply \"Premium Plan\"\n- \"Add the tag VIP to example@gmail.com\" \u2192 apply \"VIP\"\n- \"Remove the tag Trial from example@gmail.com\" \u2192 remove \"Trial\"\n\nThe boundary: an explicit verb targeting a tag (tag, add, apply, assign, remove, untag, clear) is required. A descriptive statement about the contact's state, role, or purchase is never a tag command.\n\nVALID EXAMPLES:\n\nInput:\n\"Please add VIP and Webinar Lead tags to contact example@gmail.com\"\n\nExtract:\n{\n  \"email\": \"example@gmail.com\",\n  \"requestedTagsToApply\": [\"VIP\", \"Webinar Lead\"],\n  \"requestedTagsToRemove\": []\n}\n\nInput:\n\"Please tag ricardo.kluenter+030626@klicktipptest.com with 'Optimization-Sprint-2030'. I don't think that tag exists yet.\"\n\nExtract:\n{\n  \"email\": \"ricardo.kluenter+030626@klicktipptest.com\",\n  \"requestedTagsToApply\": [\"Optimization-Sprint-2030\"],\n  \"requestedTagsToRemove\": []\n}\n\nInput:\n\"example@gmail.com assign the Tag \\\"RICARDO 1\\\" and create it if necessary\"\n\nExtract:\n{\n  \"email\": \"example@gmail.com\",\n  \"requestedTagsToApply\": [\"RICARDO 1\"],\n  \"requestedTagsToRemove\": []\n}\n\nInput:\n\"For example@gmail.com, add VIP and remove Lead\"\n\nExtract:\n{\n  \"email\": \"example@gmail.com\",\n  \"requestedTagsToApply\": [\"VIP\"],\n  \"requestedTagsToRemove\": [\"Lead\"]\n}\n\nInput:\n\"Remove all tags from example@gmail.com\"\n\nExtract:\n{\n  \"email\": \"example@gmail.com\",\n  \"requestedTagsToApply\": [],\n  \"requestedTagsToRemove\": [\"__ALL__\"]\n}\n\nEXECUTION ORDER:\n\n1. Parse the input.\n\n2. Extract:\n{\n  \"email\": \"contact@example.com\",\n  \"requestedTagsToApply\": [],\n  \"requestedTagsToRemove\": []\n}\n\n3. Verify the extraction against the original request:\n- If there is no explicit apply/tag/add/assign/set tag action, requestedTagsToApply must be [].\n- If there is no explicit remove/untag/clear/take off/delete tag action, requestedTagsToRemove must be [].\n- Phrases like \"create it if necessary\" or \"I don't think it exists yet\" are apply-related commentary only. They must not create a remove action and must not create an apply action on their own.\n- Deduplicate requestedTagsToApply by normalized name. If two requested apply tag names normalize to the same value, keep only the first occurrence.\n\n4. If email is missing, stop and return:\n{\n  \"success\": false,\n  \"email\": null,\n  \"contactFound\": false,\n  \"error\": \"Email is missing\",\n  \"message\": \"Could not complete tagging\"\n}\n\n5. If both requestedTagsToApply and requestedTagsToRemove are empty, stop and return:\n{\n  \"success\": false,\n  \"email\": \"contact@example.com\",\n  \"contactFound\": false,\n  \"error\": \"No explicit tag action was requested\",\n  \"message\": \"Could not complete tagging\"\n}\n\n6. Get the contact by email using \"Get contact in KlickTipp\".\n\n7. If the contact is not found, stop and return:\n{\n  \"success\": false,\n  \"email\": \"contact@example.com\",\n  \"contactFound\": false,\n  \"error\": \"Contact not found\",\n  \"message\": \"Could not complete tagging\"\n}\n\n8. Extract currentContactTagIds from contact.tags.\n\nIf contact.tags is null, undefined, or missing, treat currentContactTagIds as [].\n\n9. List all KlickTipp tags using \"List tags in KlickTipp\".\n\n10. Prepare allTags from the List tags response.\n\nUse compact objects only:\n[\n  {\n    \"id\": \"Tag ID\",\n    \"name\": \"Tag name\"\n  }\n]\n\nIf the tag name is returned as \"value\", map it to \"name\":\n{\n  \"id\": tag.id,\n  \"name\": tag.value\n}\n\n11. Build a normalized lookup of existing tags:\n- key: normalized tag name (trim, collapse repeated spaces, lowercase)\n- value: tag ID\n\n12. Determine tagsToCreate.\n\nRules:\n- Only requestedTagsToApply can be created.\n- For each requested apply tag:\n  - if a normalized matching tag exists in allTags, do not create it\n  - if no normalized matching tag exists, add the exact requested tag name to tagsToCreate\n- Do not create duplicates.\n- Do not create any tag from requestedTagsToRemove.\n\n13. If tagsToCreate is not empty, create each tag. If tagsToCreate is empty, skip this step entirely.\n\nFor each tag name in tagsToCreate, call \"Create tag in KlickTipp\" and collect the result.\n\nThe create tool may return either a full tag object or a minimal object. Regardless of shape, extract the tag ID as follows:\n- If the response contains an \"id\" field, use that as the tag ID.\n- If the response contains only a numeric or string root value, use that as the tag ID.\n\nIf recovery after a duplicate error fails to find the tag ID by normalized match even after re-fetching the tag list, do not proceed. Stop and return the error response. Never apply a tag whose ID was not positively resolved by normalized name match.\n\nCollect created tag results as:\n[\n  {\n    \"requested\": \"Original requested tag name\",\n    \"id\": \"Created tag ID\",\n    \"name\": \"Original requested tag name\"\n  }\n]\n\nIf any tag creation fails with an API error, stop and return:\n{\n  \"success\": false,\n  \"email\": \"contact@example.com\",\n  \"contactFound\": true,\n  \"error\": \"Failed to create tag: <tag name>. Reason: <error detail>\",\n  \"message\": \"Could not complete tagging\"\n}\n\n14. Build final tag lookup from:\n- allTags (from step 10)\n- created tag results (from step 13)\n\nMerge both into one normalized lookup: normalized name \u2192 tag ID.\n\n15. Determine tagIdsToApply.\n\nBefore applying any tag ID, verify that the ID was positively resolved \u2014 meaning it was explicitly found in the normalized lookup by an exact normalized match. If any requested apply tag has no positively resolved ID, do not apply it, do not guess, and do not fall back to any other ID.\n\nRules:\n1. If requestedTagsToApply is empty, set tagIdsToApply = [] and skip this step. Do not call \"Tag contact in KlickTipp\".\n2. If requestedTagsToApply is not empty:\n   - For each requested apply tag name:\n     - find its exact normalized match in the final tag lookup\n     - if found and the tag ID is not already in currentContactTagIds, add the ID to tagIdsToApply\n     - if already assigned, do not add it\n   - If tagIdsToApply is empty after this process, do not call \"Tag contact in KlickTipp\".\n   - If tagIdsToApply is not empty, call \"Tag contact in KlickTipp\" with email and tagIdsToApply.\n   - Pass only tag IDs. Never pass tag names.\n\n16. Determine tagIdsToRemove.\n\nRules:\n1. If requestedTagsToRemove is empty, set tagIdsToRemove = [] and skip this step. Do not call \"Untag contact in KlickTipp\".\n2. If requestedTagsToRemove is not empty:\n   - If requestedTagsToRemove contains \"__ALL__\", set tagIdsToRemove to all IDs from currentContactTagIds.\n   - Otherwise, for each requested remove tag name:\n     - find its exact normalized match in the final tag lookup\n     - if found and the tag ID is in currentContactTagIds, add the ID to tagIdsToRemove\n     - if not assigned, do not add it\n   - If tagIdsToRemove is empty after this process, do not call \"Untag contact in KlickTipp\".\n   - If tagIdsToRemove is not empty, call \"Untag contact in KlickTipp\" with email and tagIdsToRemove.\n   - Pass only tag IDs. Never pass tag names.\n\n17. Return the final JSON result.\n\nFINAL SUCCESS RESPONSE FORMAT:\n{\n  \"success\": true,\n  \"email\": \"contact@example.com\",\n  \"contactFound\": true,\n  \"requestedTagsToApply\": [],\n  \"requestedTagsToRemove\": [],\n  \"tagsCreated\": [],\n  \"tagIdsApplied\": [],\n  \"tagIdsRemoved\": [],\n  \"message\": \"Done\"\n}\n\nFINAL ERROR RESPONSE FORMAT:\n{\n  \"success\": false,\n  \"email\": \"contact@example.com\",\n  \"contactFound\": false,\n  \"error\": \"Reason here\",\n  \"message\": \"Could not complete tagging\"\n}"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3.1
    },
    {
      "id": "d7f48cbd-d3d1-47df-82ee-13934ea0a654",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -112,
        128
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"success\": {\n      \"type\": \"boolean\"\n    },\n    \"email\": {\n      \"type\": \"string\"\n    },\n    \"requestedTagsToApply\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"requestedTagsToRemove\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"tagsCreated\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"requested\": {\n            \"type\": \"string\"\n          },\n          \"id\": {\n            \"type\": \"string\"\n          },\n          \"name\": {\n            \"type\": \"string\"\n          }\n        }\n      }\n    },\n    \"tagIdsApplied\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"tagIdsRemoved\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    }\n  }\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "51a43398-d41a-4ffb-9c59-1b48ffe263bc",
      "name": "List tags in KlickTipp",
      "type": "n8n-nodes-klicktipp.klicktippTool",
      "position": [
        256,
        128
      ],
      "parameters": {},
      "credentials": {},
      "typeVersion": 3
    },
    {
      "id": "e54a5a17-8a83-4600-bc32-b66bbae8b7dd",
      "name": "Documentation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1296,
        -272
      ],
      "parameters": {
        "width": 679,
        "height": 1260,
        "content": "Community Node Disclaimer: This workflow uses KlickTipp community nodes.\n\n## Introduction\n\nThis workflow provides an AI-powered **KlickTipp Tag Manager Agent**.\n\nIt receives a **natural-language or structured request** with a **contact email address** and explicit tag instructions, then manages the requested tags for an existing **KlickTipp contact**.\n\nThe agent can:\n\n* find a KlickTipp contact by email\n* load the full KlickTipp tag list\n* create missing tags that were explicitly requested\n* apply existing or newly created tags\n* remove specific tags\n* remove all currently assigned tags from a contact\n\nThis automation is useful for marketers, agencies, sales teams, coaches, and service-based businesses that want to manage **KlickTipp contact tags** through simple instructions instead of manual tag handling.\n\n## How it works\n\n1. **Input**: Email + Tag Instructions\n    The workflow receives a request that includes a contact email address and explicit tag instructions.\n    Example: Please add VIP and Webinar Lead tags to contact contact@example.com\n2. **OpenAI Agent**: Parse the request\n    The KlickTipp Tag Manager Agent extracts the required information from the request:\n    * email\n    * tags to apply\n    * tags to remove\n3. **Get contact in KlickTipp**:\n   - The workflow loads the existing KlickTipp contact by email.\n   - The contact\u2019s currently assigned tag IDs are read from the contact\u2019s tags property.\n4. **List tags in KlickTipp**: The workflow loads the full KlickTipp tag list so the agent can check whether the requested tags already exist.\n6. **Create tag In KlickTipp**: If a requested tag does not exist yet, the workflow creates it only when it was explicitly requested for applying.\n7. **Tag contact in KlickTipp**: The workflow applies calculated tag IDs to the contact.\n8. **Untag contact in KlickTipp**: The workflow removes calculated tag IDs from the contact.\n8. **Structured Output Parser**: The workflow returns a structured JSON response with the result of the operation, including created tags, applied tag IDs, removed tag IDs, and possible errors.\n\n## Setup Instructions\n\n1. **KlickTipp preparation**\n   - Make sure the **contact** already exists in KlickTipp.\n   - This workflow manages tags for existing contacts. It does not create new contacts.\n2. **Credential Configuration**\n   - Authenticate your KlickTipp connection with **username/password** credentials\n   - Connect your OpenAI account using an **API key**\n\n## Customization\n\n* **Input source**: replace the Chat Trigger with a Webhook, form trigger, CRM trigger, manual trigger, or another workflow trigger.\n* **Prompt behavior**: adjust the AI Agent prompt if you want stricter or more flexible parsing rules.\n* **Tag instructions**: adapt the examples in the prompt to match your preferred wording, language, or business use case.\n* **Remove-all behavior**: keep, disable, or restrict the \u201cremove all tags\u201d option depending on how much control you want to give the agent.\n* **Output format**: customize the final structured JSON response if you want to return different fields to another system."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "0c447a55-0bc1-4ada-805e-621d0e37ea9f",
  "nodeGroups": [],
  "connections": {
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "KlickTipp Tag Manager Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "List tags in KlickTipp": {
      "ai_tool": [
        [
          {
            "node": "KlickTipp Tag Manager Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Create tag in KlickTipp": {
      "ai_tool": [
        [
          {
            "node": "KlickTipp Tag Manager Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Get contact in KlickTipp": {
      "ai_tool": [
        [
          {
            "node": "KlickTipp Tag Manager Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "KlickTipp Tag Manager Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Tag contact in KlickTipp": {
      "ai_tool": [
        [
          {
            "node": "KlickTipp Tag Manager Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Untag contact in KlickTipp": {
      "ai_tool": [
        [
          {
            "node": "KlickTipp Tag Manager Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "When chat message received": {
      "main": [
        [
          {
            "node": "KlickTipp Tag Manager Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow uses an n8n chat trigger, OpenAI (gpt-5-mini), and KlickTipp community nodes to interpret chat instructions and create, apply, or remove tags for an existing KlickTipp contact, returning a structured JSON result. Receives a chat message containing a contact email…

Source: https://n8n.io/workflows/16724/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

HDW Lead Geländewagen. Uses chatTrigger, lmChatOpenAi, memoryBufferWindow, outputParserStructured. Chat trigger; 92 nodes.

Chat Trigger, OpenAI Chat, Memory Buffer Window +5
AI & RAG

💰 Beginner Investor – Learn the market faster with AI-powered insights guiding your decisions. 📈 Retail Trader – Optimize your trading strategy with in-depth analysis typically reserved for profession

HTTP Request, Output Parser Structured, OpenAI Chat +4
AI & RAG

by Varritech Technologies

Chat Trigger, Agent, OpenAI Chat +8
AI & RAG

Who’s it for Creators who want to create faceless videos automatically, while keeping human oversight and quality control.

Read Write File, Agent, OpenAI Chat +7
AI & RAG

The Best Linkedin Posting System. Uses httpRequest, lmChatOpenAi, agent, chatTrigger. Chat trigger; 49 nodes.

HTTP Request, OpenAI Chat, Agent +8