This workflow corresponds to n8n.io template #13699 — we link there as the canonical source.
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": "FwFNryEizRyr8yD78weNi",
"name": "KlickTipp tag manager: resolve & create tags from names",
"tags": [
{
"id": "15wrq9sti6wyqr6J",
"name": "TEMPLATE",
"createdAt": "2025-01-08T16:34:30.163Z",
"updatedAt": "2025-01-08T16:34:30.163Z"
}
],
"nodes": [
{
"id": "5ff44d1d-7c6a-4640-ba43-c63dc98d9fff",
"name": "Find tags to create",
"type": "n8n-nodes-base.merge",
"position": [
1376,
16
],
"parameters": {
"mode": "combine",
"options": {},
"joinMode": "keepNonMatches",
"outputDataFrom": "input2",
"fieldsToMatchString": "value"
},
"typeVersion": 3.2
},
{
"id": "68a331a6-8f0f-476a-aa78-efaf65359299",
"name": "Find existing tags",
"type": "n8n-nodes-base.merge",
"position": [
1376,
-240
],
"parameters": {
"mode": "combine",
"options": {},
"fieldsToMatchString": "value"
},
"typeVersion": 3.2
},
{
"id": "269436e9-555f-42b4-b711-586f4b8385de",
"name": "Combine existing & new tags",
"type": "n8n-nodes-base.merge",
"position": [
1952,
-112
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "571cce04-1614-463c-89dc-63dbccbfac11",
"name": "Split tagNames into items",
"type": "n8n-nodes-base.splitOut",
"position": [
896,
32
],
"parameters": {
"options": {},
"fieldToSplitOut": "tagNames"
},
"typeVersion": 1
},
{
"id": "54bb5dc4-cdb1-4c0d-8c06-df4718723a34",
"name": "Map tagNames -> value",
"type": "n8n-nodes-base.set",
"position": [
1120,
32
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "3ba2a4e9-9fbd-4fe4-bc84-3f6cb3a2ff03",
"name": "value",
"type": "string",
"value": "={{ (() => {\n const prefix = ($('Input: Prefix + tag names').item.json.prefix || '').trim();\n const tag = String($json.tagNames || '').trim();\n\n if (!prefix) return tag;\n return prefix.endsWith(' ') ? prefix + tag : prefix + ' ' + tag;\n})() }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "421aaab3-ab30-45c8-a4f4-2a0d0774127d",
"name": "Get tag list",
"type": "n8n-nodes-klicktipp.klicktipp",
"position": [
1120,
-256
],
"parameters": {},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "7199dbaf-540e-43fd-a0e1-a4dd7744b18f",
"name": "Create new tag",
"type": "n8n-nodes-klicktipp.klicktipp",
"position": [
1536,
16
],
"parameters": {
"name": "={{ $json.value }}",
"operation": "create"
},
"credentials": {
"klickTippApi": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "64adf912-f8b2-468d-bbab-ad70498d9e2b",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1888,
-304
],
"parameters": {
"color": 7,
"width": 688,
"height": 496,
"content": "## 3. Combine & return tag names"
},
"typeVersion": 1
},
{
"id": "20eafcae-ad5a-4fc0-93c9-681f6743b5ba",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
-48
],
"parameters": {
"color": 7,
"width": 576,
"height": 240,
"content": "## 2.2. Detect and create missing tags"
},
"typeVersion": 1
},
{
"id": "f58ddfa3-dfd6-4365-8b05-56680fea612b",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
-304
],
"parameters": {
"color": 7,
"width": 576,
"height": 240,
"content": "## 2.1. Resolve existing tags"
},
"typeVersion": 1
},
{
"id": "42c51ab0-531e-4f81-a809-f6c8ca141836",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
-304
],
"parameters": {
"color": 7,
"width": 416,
"height": 496,
"content": "## 1. Preparation"
},
"typeVersion": 1
},
{
"id": "c6b20033-4dc3-4e5e-bf89-2fb56d68aadc",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
624,
-304
],
"parameters": {
"color": 7,
"width": 224,
"height": 496,
"content": "## Input"
},
"typeVersion": 1
},
{
"id": "001bc699-3406-486a-a231-35b3b14f24ad",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
-304
],
"parameters": {
"width": 656,
"height": 1712,
"content": "## Introduction\n\nThis workflow receives an array of tag names, optionally applies a **prefix** to all tags, checks which tags already exist in KlickTipp, creates the missing ones, and returns a unified array of **resolved tag names**. This allows you to reuse the same **get or create tags** logic across multiple automations without duplicating tag-handling logic.\n\nIt\u2019s especially useful when tags are namespaced by a tool or source (for example, `Zoho | Webinar`) and you want to enforce consistent tagging conventions across different workflows.\n\n\n---\n\n## How it works\n\n- Accepts input:\n - `tagNames[]` \u2014 array of base tag names\n - `prefix` \u2014 optional string applied to all tag names\n- Splits `tagNames[]` into individual items and builds the **final tag name**:\n - If `prefix` is provided \u2192 `<prefix><tagName>` (e.g. `Zoho | Webinar`)\n - If `prefix` is empty \u2192 `<tagName>` (e.g. `Webinar`)\n- Loads the existing KlickTipp tags and matches them by name.\n- Creates tags that do not yet exist.\n- Combines existing and newly created tags.\n- Returns a single aggregated array of **resolved tag names**, without duplicates.\n\n---\n\n## Setup Instructions\n\n### 1) Credentials\n- Configure your **KlickTipp** credentials in the KlickTipp nodes.\n\n### 2) How to call this sub-workflow\n\nFrom a parent workflow, use an **Execute Sub-workflow** node and pass:\n\nWithout prefix \n```\n{ \n \"tagNames\": [\"Webinar\", \"Newsletter] \n}\n```\n\nWith prefix\n```\n{ \n \"prefix\": \"Zoho | \", \n \"tagNames\": [\"Webinar\", \"Newsletter\"] \n}\n```\n\nResulting tag names resolved or created in KlickTipp:\n- Zoho | Webinar\n- Zoho | Newsletter\n\n---\n\n\n## Output\n\nReturns a unified array of tag names:\n\n```\n{ \n \"tags\": [\"Zoho | Webinar\", \"Zoho | Newsletter\"] \n}\n```\n---\n\n## Testing\n\n- Test with a mix of existing and new tag names.\n- Confirm new tags appear in KlickTipp when missing.\n- Verify that the output contains all expected tag names, without duplicates.\n- If a prefix is used, ensure tags are resolved or created under the correct namespace (for example, `Zoho | \u2026`).\n- Reuse the returned `tags[]` in downstream workflows (for example, for filtering, comparison, or further tagging logic)."
},
"typeVersion": 1
},
{
"id": "8693e9c6-0bbf-4203-8051-dd38d1045be5",
"name": "Aggregate tag names",
"type": "n8n-nodes-base.aggregate",
"position": [
2400,
-112
],
"parameters": {
"options": {},
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "tags"
}
]
}
},
"typeVersion": 1
},
{
"id": "5038d685-95aa-490f-9456-3bdb2c71d926",
"name": "Extract tag name",
"type": "n8n-nodes-base.set",
"position": [
2176,
-112
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "961d528c-cdd7-42ad-9a19-0e6733bad8f8",
"name": "tags",
"type": "string",
"value": "={{ $json.value }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "d3f50840-6808-49d5-9137-1939588d2501",
"name": "Input: Prefix + tag names",
"type": "n8n-nodes-base.executeWorkflowTrigger",
"position": [
688,
-112
],
"parameters": {
"inputSource": "jsonExample",
"jsonExample": "{\n \"prefix\": \"Zoho |\",\n \"tagNames\": [\"Webinar\", \"Newsletter\", \"Lead\"]\n}"
},
"typeVersion": 1.1
},
{
"id": "29eacbff-861d-4095-b7c7-991d089a0c04",
"name": "Set the created tag",
"type": "n8n-nodes-base.set",
"position": [
1712,
16
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "87abf48e-9a92-4682-8198-aa383163a1ff",
"name": "id",
"type": "string",
"value": "={{ $json.id }}"
},
{
"id": "19e57860-580a-4580-aecb-f2f9a592a1bc",
"name": "value",
"type": "string",
"value": "={{ $('Find tags to create').item.json.value }}"
}
]
}
},
"typeVersion": 3.4
}
],
"active": true,
"settings": {
"availableInMCP": false,
"executionOrder": "v1"
},
"versionId": "1b2cb96e-d942-4461-82b8-d5f0211ecf38",
"connections": {
"Get tag list": {
"main": [
[
{
"node": "Find existing tags",
"type": "main",
"index": 0
},
{
"node": "Find tags to create",
"type": "main",
"index": 0
}
]
]
},
"Create new tag": {
"main": [
[
{
"node": "Set the created tag",
"type": "main",
"index": 0
}
]
]
},
"Extract tag name": {
"main": [
[
{
"node": "Aggregate tag names",
"type": "main",
"index": 0
}
]
]
},
"Find existing tags": {
"main": [
[
{
"node": "Combine existing & new tags",
"type": "main",
"index": 0
}
]
]
},
"Find tags to create": {
"main": [
[
{
"node": "Create new tag",
"type": "main",
"index": 0
}
]
]
},
"Set the created tag": {
"main": [
[
{
"node": "Combine existing & new tags",
"type": "main",
"index": 1
}
]
]
},
"Map tagNames -> value": {
"main": [
[
{
"node": "Find existing tags",
"type": "main",
"index": 1
},
{
"node": "Find tags to create",
"type": "main",
"index": 1
}
]
]
},
"Input: Prefix + tag names": {
"main": [
[
{
"node": "Get tag list",
"type": "main",
"index": 0
},
{
"node": "Split tagNames into items",
"type": "main",
"index": 0
}
]
]
},
"Split tagNames into items": {
"main": [
[
{
"node": "Map tagNames -> value",
"type": "main",
"index": 0
}
]
]
},
"Combine existing & new tags": {
"main": [
[
{
"node": "Extract tag name",
"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.
klickTippApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow uses KlickTipp community nodes, available for self-hosted n8n instances only.
Source: https://n8n.io/workflows/13699/ — 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 workflow uses KlickTipp community nodes, available for self-hosted n8n instances only.
Agendamiento. Uses n8n-nodes-evolution-api, redis, dataTable, executeWorkflowTrigger. Event-driven trigger; 60 nodes.
Prevent concurrent workflow runs using Redis. Uses executeWorkflowTrigger, manualTrigger, stickyNote, executeWorkflow. Event-driven trigger; 43 nodes.
This workflow sets a small "lock" value in Redis so that only one copy of a long job can run at the same time. If another trigger fires while the job is still busy, the workflow sees the lock, stops e
Reputation Engine — Site Refresh. Uses httpRequest, executeWorkflowTrigger. Event-driven trigger; 35 nodes.