AutomationFlowsMarketing & Ads › Convert Instagram Comments to Leads with Klicktipp & Custom Dms

Convert Instagram Comments to Leads with Klicktipp & Custom Dms

ByKlickTipp @KlickTipp on n8n.io

This workflow uses KlickTipp community nodes, available for self-hosted n8n instances only.

Webhook trigger★★★★☆ complexity12 nodesHTTP RequestGoogle Sheets
Marketing & Ads Trigger: Webhook Nodes: 12 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #9947 — we link there as the canonical source.

This workflow follows the Google Sheets → HTTP Request 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
{
  "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
          }
        ]
      ]
    }
  }
}

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.

Pro

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/9947/ — original creator credit. Request a take-down →

More Marketing & Ads workflows → · Browse all categories →

Related workflows

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

Marketing & Ads

Automatically qualify, score, and route inbound B2B leads using GPT-4o-mini — no manual review needed.

HTTP Request, Slack, Gmail +1
Marketing & Ads

This n8n workflow automates the process of finding ecommerce seller leads, enriching them with product and business details, discovering company websites, and extracting contact information such as em

Google Sheets, N8N Nodes Mrscraper, HTTP Request
Marketing & Ads

This template is for B2B sales teams, SDRs, growth marketers, and founders who maintain a spreadsheet of prospects and need verified contact details -- emails and mobile numbers -- without manual rese

Google Sheets, HTTP Request
Marketing & Ads

This workflow finds local businesses from Google Maps and automatically enriches them with emails, social profiles, AI summaries, and personalized outreach messages — all saved to Google Sheets. Searc

HTTP Request, Google Sheets
Marketing & Ads

This workflow leverages n8n to perform automated Google Maps API queries and manage data efficiently in Google Sheets. It's designed to extract specific location data based on a given list of ZIP code

Execute Workflow Trigger, Stop And Error, HTTP Request +1