{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["integrationSummary"]},"type":"markdown"},"seo":{"title":"Manage large sets of Tags","description":"Official KlickTipp API documentation. Learn how to authenticate, integrate external systems, and build reliable automations using the KlickTipp API.","lang":"en-US","siteUrl":"https://developers.klicktipp.com","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"IntegrationSummary","attributes":{"contract":{"purpose":"Show how to reuse tag-management templates to resolve tag names, clean up outdated prefixed tags, and apply the final tag state to KlickTipp contacts.","requiredEndpoints":["GET /tag.json","POST /tag.json","POST /subscriber/tag.json","POST /subscriber/untag.json"],"decisionRules":["Use these templates when an external system is the source of truth for the desired tag or segment state.","Use a stable prefix namespace so outdated integration-managed tags can be identified and removed safely."],"failureHandling":["Validate incoming tag names, prefixes, and contact identifiers before applying tag updates.","Treat repeated resolve, add, and remove operations as idempotent so duplicate runs do not corrupt the final state."],"knownLimits":["These templates simplify tag orchestration but still depend on correct source-system naming and prefix strategy.","The templates help manage tag state, but they do not replace broader sync design in the parent workflow."],"relatedDocs":[{"label":"Building Robust Integrations with the Management API","href":"/guides/management-api"},{"label":"CRM Integration","href":"/guides/crm-integration"},{"label":"Error Handling and Validation","href":"/guides/error-handling"}]}},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"manage-large-sets-of-tags","__idx":0},"children":["Manage large sets of Tags"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This guide is aimed at integrators who want to manage large tag sets in KlickTipp without building complex router logic in every workflow."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["KlickTipp integrations often need to:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Create tags dynamically from segment names from a source system such as a CRM, payment tool, or form tool."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Keep only the currently relevant prefixed tags."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Add and remove tags on contacts based on the final desired state."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To make that easier, KlickTipp provides three reusable tag-management template types. Each template type is available for both Make and n8n."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"when-to-use-these-templates","__idx":1},"children":["When to Use These Templates"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use these templates when your integration receives tag or segment information from a CRM, payment tool, form tool, or another external system and you want to:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reuse the same tag logic across multiple parent workflows."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Keep tag naming consistent with prefixes such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Zoho | "]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Pipedrive | "]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Remove outdated prefixed tags automatically."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Update contact tags by name instead of hardcoding tag IDs."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["These templates are especially useful when segmentation changes often and an external system should remain the source of truth for the current tag state."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"recommended-tag-management-flow","__idx":2},"children":["Recommended Tag-Management Flow"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["In many integrations, the three template types are used together:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolve and create the desired tag names."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Find which existing prefixed tags should be removed."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Update the contact by adding the desired tags and removing the outdated tags."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This gives you a predictable final tag state instead of accumulating stale source-system tags over time."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"template-1-resolve-and-create-tags-from-names","__idx":3},"children":["Template 1: Resolve and Create Tags from Names"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use this template when your parent workflow receives tag names such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Qualified"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Newsletter"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Webinar"]}," and you want KlickTipp-ready tag names, optionally under a prefix such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Zoho | "]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"what-it-does","__idx":4},"children":["What It Does"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This template:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Accepts an array of tag names."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optionally prepends a namespace prefix."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Loads the existing KlickTipp tag list."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reuses matching tags that already exist."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Creates missing tags automatically."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Returns a unified array of resolved tag names."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is the \"get or create tags\" building block for dynamic segmentation."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"inputs","__idx":5},"children":["Inputs"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tagNames[]"]},": array of base tag names"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["prefix"]},": optional string such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Zoho | "]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Pipedrive | "]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"output","__idx":6},"children":["Output"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tags[]"]},": resolved final tag names, including the prefix if one is used"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"typical-use-cases","__idx":7},"children":["Typical Use Cases"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Creating segment tags dynamically."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Preparing tags for downstream contact-tagging steps."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Enforcing consistent prefix-based naming across integrations."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"public-templates","__idx":8},"children":["Public Templates"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Make: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://www.make.com/en/integration/18392-get-or-create-tags-in-klicktipp-from-an-array-of-tag-names?templatePublicId=18392"},"children":["Resolve and create KlickTipp tags from names with optional prefixes"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["n8n: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://n8n.io/workflows/13699-resolve-and-create-klicktipp-tags-from-names-with-optional-prefixes/"},"children":["Resolve and create KlickTipp tags from names with optional prefixes"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"how-to-test","__idx":9},"children":["How to Test"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Pass a test array such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[\"Qualified\", \"Support\"]"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Optionally pass a prefix such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Zoho | "]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm the workflow returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tags[]"]}," with the expected final tag names."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm missing tags are created in KlickTipp and existing tags are reused."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"template-2-find-tags-to-remove-by-prefix","__idx":10},"children":["Template 2: Find Tags to Remove by Prefix"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use this template when your integration already knows which prefixed tags should remain on the contact and you need to calculate which outdated prefixed tags should be removed."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"what-it-does-1","__idx":11},"children":["What It Does"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This template:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Accepts the managed prefix scope."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Accepts the list of tag names that should remain assigned."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Loads existing KlickTipp tags in the same prefix namespace."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Compares the current prefixed tags with the desired prefixed tags."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Returns the outdated tag names that should be removed."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This template calculates the cleanup list only. It does not remove tags by itself."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"inputs-1","__idx":12},"children":["Inputs"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["prefix"]},": the managed prefix scope, for example ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Zoho | "]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["setTags[]"]},": the base tag names that should remain assigned"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"output-1","__idx":13},"children":["Output"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tagNamesToRemove[]"]},": prefixed tag names that should be unassigned"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"typical-use-cases-1","__idx":14},"children":["Typical Use Cases"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Cleaning up old stage, product, status, or segment tags from a source system."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Removing outdated list or segment tags inside one namespace."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Calculating the removal list before calling the contact-tagging template."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"public-templates-1","__idx":15},"children":["Public Templates"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Make: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://www.make.com/en/integration/18327-identify-irrelevant-tags-by-prefix-for-klicktipp-contacts?templatePublicId=18327"},"children":["Find KlickTipp tags to remove by prefix"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["n8n: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://n8n.io/workflows/13664-find-klicktipp-tags-to-remove-by-prefix/"},"children":["Find KlickTipp tags to remove by prefix"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"how-to-test-1","__idx":16},"children":["How to Test"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use a prefix such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Zoho | "]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Pass a keep list such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[\"Webinar\", \"Newsletter\"]"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm that only outdated tags inside the same prefix scope are returned."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm that tags outside the managed namespace are not included."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"template-3-update-contact-tags-by-tag-names","__idx":17},"children":["Template 3: Update Contact Tags by Tag Names"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use this template when you already know which tags should be added and which tags should be removed for one contact."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"what-it-does-2","__idx":18},"children":["What It Does"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This template:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Accepts a contact email."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Accepts one array of tag names to add."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Accepts one array of tag names to remove."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Loads the KlickTipp tag list."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolves tag names to tag IDs."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Tags and untags the contact accordingly."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This is the final execution step that applies the desired tag changes to the contact."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"inputs-2","__idx":19},"children":["Inputs"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["email"]},": the target contact email"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tagNamesToAdd[]"]},": final tag names to add"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["tagNamesToRemove[]"]},": final tag names to remove"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"output-2","__idx":20},"children":["Output"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Successful completion of the tag update flow"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"important-note","__idx":21},"children":["Important Note"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This template expects valid tag names. If your source system may produce tags that do not yet exist in KlickTipp, first call the \"Resolve and Create Tags from Names\" template and then pass its output into this template."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"typical-use-cases-2","__idx":22},"children":["Typical Use Cases"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Applying source-system-driven add/remove changes to one contact."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reusing one standard contact-tagging sub-flow across many parent automations."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Keeping parent workflows simple by avoiding manual tag-ID resolution."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"public-templates-2","__idx":23},"children":["Public Templates"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Make: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://www.make.com/en/integration/17965-empty-integration?templatePublicId=18586"},"children":["Update KlickTipp contact tags by tag names"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["n8n: ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://n8n.io/workflows/13663-update-klicktipp-contact-tags-by-tag-names/"},"children":["Update KlickTipp contact tags by tag names"]}]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"how-to-test-2","__idx":24},"children":["How to Test"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use a real test contact that already exists in KlickTipp."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Pass a small add list such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[\"Zoho | Qualified\"]"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Pass a small remove list such as ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["[\"Zoho | Old Stage\"]"]},"."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Confirm the contact ends with the expected final tag state."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"suggested-parent-workflow-pattern","__idx":25},"children":["Suggested Parent-Workflow Pattern"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For many integrations, the most robust parent-workflow pattern is:"]},{"$$mdtype":"Tag","name":"ol","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Receive the current segment values from the source system."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Normalize them into base tag names."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Call the resolve/create template to build the final namespaced tags."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Call the find-to-remove template to calculate outdated prefixed tags."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Call the contact-tagging template to add current tags and remove outdated ones."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This pattern helps you avoid:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["duplicated router logic"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["hardcoded tag IDs"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["stale prefixed tags"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["inconsistent tag naming across workflows"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"prefix-strategy","__idx":26},"children":["Prefix Strategy"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use a stable prefix for every managed tag namespace."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Examples:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Zoho | "]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Pipedrive | "]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Salesforce | "]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["GoHighLevel | "]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This makes it much easier to:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["keep one source system's tags separate from another source system's tags"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["remove outdated tags safely inside the correct scope"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["understand where a tag came from during troubleshooting"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"make-and-n8n-differences","__idx":27},"children":["Make and n8n Differences"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The three logical templates are the same across both automation platforms, but the way you call them differs:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In Make, they are typically used as sub-scenarios called from a parent scenario."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["In n8n, they are typically used as sub-workflows called from a parent workflow."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the platform version that matches your integration stack. The tag-management logic stays the same."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"best-practices","__idx":28},"children":["Best Practices"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Use prefixes for all integration-managed tags."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Let the connected source system remain the source of truth for the desired segment state."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Reuse the templates instead of rebuilding tag logic in every workflow."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Resolve or create tags before trying to assign them to contacts."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Calculate the removal list before untagging contacts."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Test with both existing and newly created tags."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Verify the final contact tag state in KlickTipp after each test run."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"summary","__idx":29},"children":["Summary"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The tag-management templates give you a reusable building block set for dynamic segmentation in KlickTipp."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use the resolve/create template to prepare the desired tag names, the find-to-remove template to identify outdated prefixed tags, and the contact-tagging template to apply the final add/remove changes to the contact."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Together, these templates make large integration-managed tag sets easier to manage, easier to maintain, and safer to scale across Make and n8n automations."]}]},"headings":[{"value":"Manage large sets of Tags","id":"manage-large-sets-of-tags","depth":1},{"value":"When to Use These Templates","id":"when-to-use-these-templates","depth":2},{"value":"Recommended Tag-Management Flow","id":"recommended-tag-management-flow","depth":2},{"value":"Template 1: Resolve and Create Tags from Names","id":"template-1-resolve-and-create-tags-from-names","depth":2},{"value":"What It Does","id":"what-it-does","depth":3},{"value":"Inputs","id":"inputs","depth":3},{"value":"Output","id":"output","depth":3},{"value":"Typical Use Cases","id":"typical-use-cases","depth":3},{"value":"Public Templates","id":"public-templates","depth":3},{"value":"How to Test","id":"how-to-test","depth":3},{"value":"Template 2: Find Tags to Remove by Prefix","id":"template-2-find-tags-to-remove-by-prefix","depth":2},{"value":"What It Does","id":"what-it-does-1","depth":3},{"value":"Inputs","id":"inputs-1","depth":3},{"value":"Output","id":"output-1","depth":3},{"value":"Typical Use Cases","id":"typical-use-cases-1","depth":3},{"value":"Public Templates","id":"public-templates-1","depth":3},{"value":"How to Test","id":"how-to-test-1","depth":3},{"value":"Template 3: Update Contact Tags by Tag Names","id":"template-3-update-contact-tags-by-tag-names","depth":2},{"value":"What It Does","id":"what-it-does-2","depth":3},{"value":"Inputs","id":"inputs-2","depth":3},{"value":"Output","id":"output-2","depth":3},{"value":"Important Note","id":"important-note","depth":3},{"value":"Typical Use Cases","id":"typical-use-cases-2","depth":3},{"value":"Public Templates","id":"public-templates-2","depth":3},{"value":"How to Test","id":"how-to-test-2","depth":3},{"value":"Suggested Parent-Workflow Pattern","id":"suggested-parent-workflow-pattern","depth":2},{"value":"Prefix Strategy","id":"prefix-strategy","depth":2},{"value":"Make and n8n Differences","id":"make-and-n8n-differences","depth":2},{"value":"Best Practices","id":"best-practices","depth":2},{"value":"Summary","id":"summary","depth":2}],"frontmatter":{"title":"Manage large sets of Tags","contract":{"purpose":"Show how to reuse tag-management templates to resolve tag names, clean up outdated prefixed tags, and apply the final tag state to KlickTipp contacts.","requiredEndpoints":["GET /tag.json","POST /tag.json","POST /subscriber/tag.json","POST /subscriber/untag.json"],"decisionRules":["Use these templates when an external system is the source of truth for the desired tag or segment state.","Use a stable prefix namespace so outdated integration-managed tags can be identified and removed safely."],"failureHandling":["Validate incoming tag names, prefixes, and contact identifiers before applying tag updates.","Treat repeated resolve, add, and remove operations as idempotent so duplicate runs do not corrupt the final state."],"knownLimits":["These templates simplify tag orchestration but still depend on correct source-system naming and prefix strategy.","The templates help manage tag state, but they do not replace broader sync design in the parent workflow."],"relatedDocs":[{"label":"Building Robust Integrations with the Management API","href":"/guides/management-api"},{"label":"CRM Integration","href":"/guides/crm-integration"},{"label":"Error Handling and Validation","href":"/guides/error-handling"}]},"seo":{"title":"Manage large sets of Tags"}},"lastModified":"2026-07-21T15:49:41.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/tag-management-templates","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}