{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "17b4422b-47fc-4d28-9906-762cb3f71049",
      "name": "Listen to new Instagram comments",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -304,
        0
      ],
      "parameters": {
        "path": "7dc782c9-e042-4b43-9b59-f0b7705d8cc8",
        "options": {},
        "responseMode": "responseNode"
      },
      "typeVersion": 2.1
    },
    {
      "id": "2152d1c1-f620-4478-bb57-94c42743cbaa",
      "name": "Check first validation",
      "type": "n8n-nodes-base.switch",
      "notes": "This node checks whether there is a first validation challenge that needs to be responded to.",
      "position": [
        -96,
        0
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Initial Webhook verification",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "d6bafaef-109a-46b8-8053-86a3e3ed04fa",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $json.query['hub.verify_token'] }}",
                    "rightValue": "KlickTipp"
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Processing branch after setup",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "7c17fb98-6811-49b7-b423-59c329f222d1",
                    "operator": {
                      "name": "filter.operator.equals",
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "notesInFlow": true,
      "typeVersion": 3.2
    },
    {
      "id": "5c2c6595-0057-4921-abc8-ef1d57ebc8bf",
      "name": "Challenge to validate",
      "type": "n8n-nodes-base.respondToWebhook",
      "notes": "This node responds to the webhook when you setup the subscription inside the meta app and sends back the value for the challenge.",
      "position": [
        128,
        -144
      ],
      "parameters": {
        "options": {},
        "respondWith": "text",
        "responseBody": "={{ $json.query['hub.challenge'] }}"
      },
      "notesInFlow": true,
      "typeVersion": 1.4
    },
    {
      "id": "07b31569-056b-4ac1-afdf-fde4bf07bf82",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -400,
        -272
      ],
      "parameters": {
        "color": 7,
        "width": 704,
        "height": 544,
        "content": "## 1. Data reception\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e843796f-20d8-4f56-9d84-7ade490a0c5f",
      "name": "DM form to user",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "This node sends out a DM to a user in Instagram in order to prompt a form submission.",
      "position": [
        624,
        0
      ],
      "parameters": {
        "url": "https://graph.instagram.com/v21.0/me/messages",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "message",
              "value": "={\"text\":\"Hallo {{ $json.body.entry[0].changes[0].value.from.username }} \ud83d\udc4b*, danke f\u00fcr deinen Kommentar! \ud83c\udf89  Damit wir dir dein kostenloses Freebie zuschicken k\u00f6nnen, musst Du Dich einmal kurz \u00fcber folgendes Formular einmal eintragen:\\n\\nhttps://form.jotform.com/252682338805059?instagram_username={{ $json.body.entry[0].changes[0].value.from.username }}\\n\\nMit der Angabe erkl\u00e4rst du dich einverstanden, dass wir dich per E-Mail zu Werbezwecken kontaktieren d\u00fcrfen (z. B. Tipps, Angebote und Infos rund um [Thema]).  \\nDeine Daten behandeln wir nat\u00fcrlich vertraulich und du kannst dich jederzeit \u00fcber einen Link in der E-Mail abmelden.\"}"
            },
            {
              "name": "recipient",
              "value": "={\"id\":\"{{ $json.body.entry[0].changes[0].value.from.id }}\"}"
            }
          ]
        },
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.2
    },
    {
      "id": "e0217fec-a444-4c64-8ab4-93b7ef90fa6d",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        320,
        -272
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 544,
        "content": "## 2. Validate and send message"
      },
      "typeVersion": 1
    },
    {
      "id": "85cc1544-caf3-4e47-b01c-9f282d0b8a8d",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        80,
        304
      ],
      "parameters": {
        "width": 1072,
        "height": 1360,
        "content": "## **Community Node Disclaimer**\nThis workflow uses **KlickTipp community nodes**, available for **self-hosted n8n instances only**.\n\n---\n\n## **Who\u2019s it for**\nMarketing teams, agencies, and content creators who want to **turn Instagram post comments into automated conversations** \u2014 capturing leads, sending personalized DMs, and enriching contacts in **KlickTipp** without manual work.\n\n---\n\n## **How it works**\nThis workflow automates engagement between **Instagram users** and your **marketing funnel**.  \nIt listens for **new Instagram comments**, validates the **Meta webhook**, and sends **personalized DMs** with form links. The workflow then stores and syncs user data for tagging and enrichment in KlickTipp.  \n\nWhen a new comment appears, it:\n\n- Validates the webhook setup via the Meta `hub.challenge`  \n- Captures the commenter\u2019s username and ID  \n- Sends a personalized DM with a form link for lead capture  \n- Stores the data in **Google Sheets** for tracking  \n- Updates or tags the contact in **KlickTipp**  \n\nThe result: every Instagram comment turns into a structured, tagged lead for your marketing automation.\n\n---\n\n## **How to set up**\nConnect accounts for **Meta (Instagram)**, **Google Sheets**, and **KlickTipp**.  \nSet up your **Meta App webhook** for Instagram comments, using your workflow\u2019s webhook URL and verify token (e.g., `KlickTipp`).  \nCreate a Google Sheet as a matching table with the columns:  \n- `Instagram username`  \n- `Instagram ID`  \nAuthenticate KlickTipp with API credentials and ensure your subscriber fields are configured.  \nTest by commenting on a connected Instagram post to trigger the workflow.  \n\n\ud83d\udca1 **Pro Tip:** Customize the DM to include your brand\u2019s tone and lead form link for higher engagement.\n\n---\n\n## **Requirements**\n- Meta (Instagram) Business Account  \n- Facebook Graph API with `pages_messaging` permission  \n- Google Sheets OAuth connection  \n- KlickTipp account with API access  \n\n---\n\n## **How to customize**\n- Replace the default form link with your own **JotForm** or landing page URL.  \n- Adjust DM content to fit your tone and campaign messaging.  \n- Add logic to send different DMs based on comment keywords.  \n- Integrate with **KlickTipp tags** for automatic segmentation.  \n- Expand the workflow to handle **repeat commenters** or trigger follow-ups.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7c5ffb38-938a-4067-9a88-54a8ba021905",
      "name": "Does comment contain keyword?",
      "type": "n8n-nodes-base.if",
      "notes": "This node checks if the comment included the intended keyword.",
      "position": [
        384,
        16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "bf80e26f-bfe8-4c1f-8fad-1ef649e458a9",
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.body.entry[0].changes[0].value.text }}",
              "rightValue": "keyword"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 2.2
    },
    {
      "id": "7d26c483-faf2-4f09-af42-497aadb35ef4",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        816,
        -272
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 544,
        "content": "## 3. Save data"
      },
      "typeVersion": 1
    },
    {
      "id": "6f5b0980-f3b6-42e0-9b25-a4475656d2a2",
      "name": "Look for entry in matching table",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "This node checks if there is an entry in the matching table for this username.",
      "position": [
        864,
        0
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $('Listen to new Instagram comments').item.json.body.entry[0].changes[0].value.from.username }}",
              "lookupColumn": "Instagram username"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ou94mTx0gHHdHKr6UQ3Kf01VyIKCNXdlUMhKykTD1Cs/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/1Ou94mTx0gHHdHKr6UQ3Kf01VyIKCNXdlUMhKykTD1Cs/edit?gid=0#gid=0"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.7
    },
    {
      "id": "a0ff0eac-81ee-45de-9a42-a287af2b2161",
      "name": "Does entry exist?",
      "type": "n8n-nodes-base.if",
      "notes": "This node checks whether the entry already exists in the matching table.",
      "position": [
        1056,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "21c3a512-9c5e-4b69-9747-b071c3a0f93d",
              "operator": {
                "type": "number",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.row_number }}",
              "rightValue": ""
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 2.2
    },
    {
      "id": "184ab01a-d072-41cb-88d2-72147b41539a",
      "name": "Add entry to matching table",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "This node adds an entry to the matching table.",
      "position": [
        1280,
        96
      ],
      "parameters": {
        "columns": {
          "value": {
            "Instagram username": "={{ $('Listen to new Instagram comments').item.json.body.entry[0].changes[0].value.from.username }}",
            "Instagram ID comment payload": "={{ $('Listen to new Instagram comments').item.json.body.entry[0].changes[0].value.from.id }}"
          },
          "schema": [
            {
              "id": "Instagram username",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Instagram username",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Instagram ID comment payload",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Instagram ID comment payload",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1Ou94mTx0gHHdHKr6UQ3Kf01VyIKCNXdlUMhKykTD1Cs/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/1Ou94mTx0gHHdHKr6UQ3Kf01VyIKCNXdlUMhKykTD1Cs/edit?gid=0#gid=0"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.7
    }
  ],
  "connections": {
    "DM form to user": {
      "main": [
        [
          {
            "node": "Look for entry in matching table",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Does entry exist?": {
      "main": [
        [],
        [
          {
            "node": "Add entry to matching table",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Challenge to validate": {
      "main": [
        []
      ]
    },
    "Check first validation": {
      "main": [
        [
          {
            "node": "Challenge to validate",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Does comment contain keyword?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Does comment contain keyword?": {
      "main": [
        [
          {
            "node": "DM form to user",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Listen to new Instagram comments": {
      "main": [
        [
          {
            "node": "Check first validation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Look for entry in matching table": {
      "main": [
        [
          {
            "node": "Does entry exist?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}