AutomationFlowsAI & RAG › Scrape Google Maps Leads with Gpt-4 and Assign Them in Notion via Telegram

Scrape Google Maps Leads with Gpt-4 and Assign Them in Notion via Telegram

ByVadim Mubi @mubivadim on n8n.io

Meet your automated Lead Gen Specialist. This workflow streamlines cold outreach by scraping local businesses, qualifying them with AI, and delivering them to your sales team instantly via an interactive Telegram bot.

Event trigger★★★★☆ complexityAI-powered26 nodesHTTP RequestNotionOpenAITelegramTelegram Trigger
AI & RAG Trigger: Event Nodes: 26 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the HTTP Request → Notion 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": "Vxy7gxVH05xRH2S2",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "My workflow 8",
  "tags": [],
  "nodes": [
    {
      "id": "85765140-57f9-4f87-9ee8-bd1e9e822f77",
      "name": "Sticky Note 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3792,
        -592
      ],
      "parameters": {
        "color": 7,
        "width": 863,
        "height": 331,
        "content": "## Step 1: Fetch & Prepare Data\nWe define the search query and fetch fresh leads from Google Maps via Outscraper. Then we normalize the data (clean phone numbers, extract top reviews) to make it ready for the CRM."
      },
      "typeVersion": 1
    },
    {
      "id": "12501ec6-3a17-430f-90f2-48288c757026",
      "name": "Sticky Note 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2880,
        -768
      ],
      "parameters": {
        "color": 7,
        "width": 1144,
        "height": 549,
        "content": "## Step 2: CRM Check & AI Analysis\nBefore spending money on AI, we check Notion to ensure this lead doesn't exist yet. If it's new, GPT-4 analyzes the reviews to generate a personalized \"Icebreaker\" pitch."
      },
      "typeVersion": 1
    },
    {
      "id": "6166bb8d-4fe6-43ad-a356-ec155f54cfeb",
      "name": "Sticky Note 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1728,
        -624
      ],
      "parameters": {
        "color": 7,
        "width": 811,
        "height": 412,
        "content": "## Step 3: Save to Notion & Alert Telegram\nWe save the enriched lead into the \"Active Deals\" database and format a beautiful HTML card for the Telegram sales group."
      },
      "typeVersion": 1
    },
    {
      "id": "a074c39f-7f94-49ef-9267-709dd2cdb6e9",
      "name": "Sticky Note 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2336,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 1391,
        "height": 511,
        "content": "## Step 4: Handle Button Clicks (Assignment)\nWhen an agent clicks \"\u26a1\ufe0f Take Lead\" in Telegram:\n1. We identify the agent by their Telegram ID.\n2. We assign the lead to them in Notion.\n3. We update the chat message to show who took it."
      },
      "typeVersion": 1
    },
    {
      "id": "f96a3d09-7a29-40aa-943e-819510566098",
      "name": "Main Sticky",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4336,
        -672
      ],
      "parameters": {
        "width": 473,
        "height": 751,
        "content": "# AI Sales Coach System (Lead Gen)\nThis workflow automates the cold outreach process. It scrapes local businesses from Google Maps, duplicate-checks them against your CRM, generates personalized AI icebreakers based on reviews, and sends lead cards to a Telegram group where agents can \"Claim\" them instantly.\n\n## How it works\n1. **Scrape:** Fetches leads via Outscraper based on your query.\n2. **Qualify:** Checks Notion to ensure the lead is new.\n3. **Analyze:** GPT-4 analyzes reviews to write a sales pitch.\n4. **Notify:** Sends a lead card to Telegram with a \"Take Lead\" button.\n5. **Assign:** When clicked, it assigns the agent in Notion and updates the chat.\n\n## Setup steps\n1. **Notion:** Duplicate the companion template (link in description). Connect your Notion account and select the \"Active Deals\" and \"Agents\" databases in the relevant nodes.\n2. **Outscraper:** Get a free API key and add it to the `CONFIGURATION` node.\n3. **Telegram:** Create a bot via @BotFather, add it to your group, and get the Chat ID.\n4. **OpenAI:** Add your API key for the AI analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "51ff95b9-3f35-48bf-b01f-c62f0edf8b91",
      "name": "Manual Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -3744,
        -464
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "98199f1c-e103-4840-975a-bb7181ed5f36",
      "name": "\ud83d\udcdd CONFIGURATION",
      "type": "n8n-nodes-base.set",
      "position": [
        -3520,
        -464
      ],
      "parameters": {
        "values": {
          "number": [
            {
              "name": "LIMIT_RESULTS",
              "value": 5
            }
          ],
          "string": [
            {
              "name": "SEARCH_QUERY",
              "value": "Restaurants in Tbilisi"
            },
            {
              "name": "OUTSCRAPER_API_KEY"
            },
            {
              "name": "TELEGRAM_CHAT_ID"
            },
            {
              "name": "AI_TONE",
              "value": "Expert, concise. You help the manager find a problem and offer a specific solution."
            },
            {
              "name": "MY_SERVICES",
              "value": "1. Interactive QR Menu: Guest orders themselves. 2. Notification System: Waiters get calls on watches."
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 2
    },
    {
      "id": "6b4dca8f-967a-4369-baa7-674f1f51722f",
      "name": "1. Fetch Google Maps Data",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -3280,
        -464
      ],
      "parameters": {
        "url": "https://api.app.outscraper.com/maps/search-v2",
        "options": {},
        "sendQuery": true,
        "sendHeaders": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "query",
              "value": "={{ $json.SEARCH_QUERY }}"
            },
            {
              "name": "limit",
              "value": "={{ $json.LIMIT_RESULTS }}"
            },
            {
              "name": "drop_duplicates",
              "value": "true"
            },
            {
              "name": "async",
              "value": "false"
            },
            {
              "name": "reviewsLimit",
              "value": "1"
            },
            {
              "name": "reviewsSort",
              "value": "most_relevant"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "X-API-KEY",
              "value": "={{ $json.OUTSCRAPER_API_KEY }}"
            }
          ]
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "be7feb25-3cc0-46c7-b45f-2104f021709c",
      "name": "2. Clean & Normalize",
      "type": "n8n-nodes-base.code",
      "position": [
        -3072,
        -464
      ],
      "parameters": {
        "jsCode": "// --- SETTINGS ---\nconst MAX_REVIEWS = 50000;\n// ------------------\n\nconst newItems = [];\nconst cleanPhone = (p) => p ? p.replace(/[^0-9]/g, '') : '';\n\nconst processEntry = (entry) => {\n  if (!entry || typeof entry !== 'object') return;\n\n  // Normalize fields\n  entry.website = (entry.site || entry.website || '').trim();\n  if (entry.website === '') entry.website = null;\n  \n  entry.email = (entry.email || '').trim();\n  if (entry.email === '') entry.email = null;\n\n  entry.name = (entry.name || 'Unnamed Lead').trim();\n  entry.reviews = entry.reviews || 0;\n  entry.clean_phone = cleanPhone(entry.phone);\n\n  // EXTRACT RELEVANT REVIEWS\n  let reviewsList = [];\n  if (Array.isArray(entry.reviews_data)) {\n    reviewsList = entry.reviews_data\n        .filter(r => r.review_text && r.review_text.length > 5)\n        .map(r => `(${r.review_rating}\u2605) \"${r.review_text}\"`)\n        .slice(0, 10);\n  }\n  \n  entry.reviews_context = reviewsList.length > 0 \n    ? reviewsList.join('\\n') \n    : 'No text reviews.';\n\n  const isNew = entry.reviews < MAX_REVIEWS;\n  if (isNew) {\n    newItems.push({ json: entry });\n  }\n};\n\nfor (const item of items) {\n  let data = item.json.data || item.json;\n  if (Array.isArray(data)) {\n    if (Array.isArray(data[0])) data = data.flat();\n    data.forEach(processEntry);\n  } else if (typeof data === 'object') {\n    Object.keys(data).forEach(key => {\n      const val = data[key];\n      if (val && typeof val === 'object' && (val.name || val.place_id)) {\n        processEntry(val);\n      }\n    });\n  }\n}\n\nreturn newItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "fce9b11b-cb1b-4062-873d-4899239d6714",
      "name": "\ud83d\udd04 Loop Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -2848,
        -464
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "3275b832-536e-47b3-ae8f-5433a7168b2c",
      "name": "\ud83d\udd0e Search Duplicate",
      "type": "n8n-nodes-base.notion",
      "position": [
        -2624,
        -432
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "key": "Phone|phone_number",
              "condition": "equals",
              "phoneNumberValue": "={{ $json.clean_phone }}"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Active Deals (CRM)"
        },
        "filterType": "manual"
      },
      "typeVersion": 2.2,
      "alwaysOutputData": true
    },
    {
      "id": "b9d1b41a-08be-4ba5-a166-28ab11f55d83",
      "name": "\ud83d\udee1\ufe0f Restore Data",
      "type": "n8n-nodes-base.merge",
      "position": [
        -2432,
        -640
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3
    },
    {
      "id": "b14870a2-ce22-4c02-aad4-bccb82935585",
      "name": "Found?",
      "type": "n8n-nodes-base.if",
      "position": [
        -2192,
        -464
      ],
      "parameters": {
        "conditions": {
          "boolean": [
            {
              "value1": "={{ !!$json.id }}",
              "value2": true
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c05c1d7e-5d8c-4cbc-965b-4c5625af7a77",
      "name": "\ud83d\udeab Duplicate / Skip",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -1968,
        -656
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "72eff68c-dce6-4e00-b40a-e4284d1ad8c1",
      "name": "\ud83e\udd16 AI Icebreaker",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -1984,
        -352
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "content": "==CONFIGURED TONE:\n{{ $('\ud83d\udcdd CONFIGURATION').first().json.AI_TONE }}\n\nCOMPANY SERVICES:\n{{ $('\ud83d\udcdd CONFIGURATION').first().json.MY_SERVICES }}\n\nLEAD INFO:\nName: {{ $json.name }}\nCity: {{ $json.city }}\nRating: {{ $json.rating }} ({{ $json.reviews }} reviews)\n\nREVIEWS CONTEXT (Complaints/Praises):\n{{ $json.reviews_context }}\n\nTASK:\nAnalyze the lead and select the ONE BEST service to pitch based on their situation.\n\nOUTPUT FORMAT:\nWrite a short sales argument for the manager.\nStructure: \"[Context/Problem] -> [Specific Solution]\"."
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "683f1ee4-4cd5-468d-9972-2bf1ecfd0161",
      "name": "\ud83d\udd17 Merge Final",
      "type": "n8n-nodes-base.merge",
      "position": [
        -1648,
        -464
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3
    },
    {
      "id": "636d058b-ebda-4929-af6f-822a0117dba5",
      "name": "\ud83d\udcbe Create New Lead",
      "type": "n8n-nodes-base.notion",
      "position": [
        -1456,
        -464
      ],
      "parameters": {
        "title": "={{ $json.name }}",
        "options": {},
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Active Deals (CRM)"
        },
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Company Name|title",
              "title": "={{ $json.name }}"
            },
            {
              "key": "Phone|phone_number",
              "phoneValue": "={{ $json.clean_phone }}"
            },
            {
              "key": "Email|email",
              "emailValue": "={{ $json.email }}"
            },
            {
              "key": "Website / Social|url",
              "urlValue": "={{ $json.website }}"
            },
            {
              "key": "Address|rich_text",
              "textContent": "={{ $json.full_address || '' }}"
            },
            {
              "key": "Lead ID|rich_text",
              "textContent": "={{ $json.place_id || '' }}"
            },
            {
              "key": "Lead Source|select",
              "selectValue": "Cold Outreach"
            },
            {
              "key": "Pipeline Stage|status",
              "statusValue": "Cold Outreach"
            },
            {
              "key": "Icebreaker|rich_text",
              "textContent": "={{ $json.message.content }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "08e8c676-189f-4540-ab1b-a5ba616c6341",
      "name": "\ud83c\udfa8 Prepare Message",
      "type": "n8n-nodes-base.code",
      "position": [
        -1264,
        -464
      ],
      "parameters": {
        "jsCode": "// 1. RANDOMIZER\nconst intros = [\n  \"\ud83d\udd25 <b>New Lead!</b>\",\n  \"\ud83d\ude80 <b>Who wants this one?</b>\",\n  \"\ud83d\udc40 <b>Interesting case.</b>\",\n  \"\u26a1\ufe0f <b>Potential partner.</b>\"\n];\nconst randomIntro = intros[Math.floor(Math.random() * intros.length)];\n\n// 2. DATA\nconst sourceData = $('\ud83d\udd17 Merge Final').item.json;\nconst notionId = $('\ud83d\udcbe Create New Lead').item.json.id;\nconst notionUrl = $('\ud83d\udcbe Create New Lead').item.json.url;\n\n// ESCAPE\nconst escape = (str) => str ? str.toString().replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;') : '';\n\n// 3. MESSAGE BUILD\nconst message = `\n${randomIntro}\n\n\ud83d\udccd ${sourceData.city} | \ud83c\udfe2 <b>${escape(sourceData.name)}</b>\n\u2b50\ufe0f <b>${sourceData.rating}</b> (${sourceData.reviews} reviews)\n\n\ud83c\udfaf <b>Strategy:</b>\n<i>${escape(sourceData.message.content)}</i>\n\n\ud83d\udcde <code>${sourceData.clean_phone}</code>\n\ud83c\udf10 <a href=\"${sourceData.website}\">Site</a> | \ud83d\uddfa <a href=\"${sourceData.link || sourceData.location_link}\">Maps</a>\n\n\ud83d\udc47 <b>Action:</b>\n<a href=\"${notionUrl}\">\ud83d\udcc2 Open in CRM</a>\n`;\n\nreturn {\n  json: {\n    telegram_message: message,\n    lead_id: notionId\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "cffb9d6a-258d-4c97-bff7-460d345e4be0",
      "name": "\ud83d\udce2 Notify Team",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -1088,
        -368
      ],
      "parameters": {
        "text": "={{ $json.telegram_message }}",
        "chatId": "={{ $('\ud83d\udcdd CONFIGURATION').first().json.TELEGRAM_CHAT_ID }}",
        "replyMarkup": "inlineKeyboard",
        "inlineKeyboard": {
          "rows": [
            {
              "row": {
                "buttons": [
                  {
                    "text": "\u26a1\ufe0f Take Lead",
                    "additionalFields": {
                      "callback_data": "={{ \"take_lead_\" + $json.lead_id }}"
                    }
                  }
                ]
              }
            }
          ]
        },
        "additionalFields": {
          "parse_mode": "HTML",
          "appendAttribution": false
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "921d380f-5305-445a-8143-88cadbae74cd",
      "name": "Telegram Callback",
      "type": "n8n-nodes-base.telegramTrigger",
      "position": [
        -2224,
        64
      ],
      "parameters": {
        "updates": [
          "callback_query"
        ],
        "additionalFields": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "3b69a6e5-5d78-4308-b4b1-35d454cf282a",
      "name": "\ud83d\udd75\ufe0f\u200d\u2642\ufe0f Find Agent",
      "type": "n8n-nodes-base.notion",
      "position": [
        -2000,
        64
      ],
      "parameters": {
        "simple": false,
        "filters": {
          "conditions": [
            {
              "key": "Telegram ID|number",
              "condition": "equals",
              "numberValue": "={{ parseInt($json.from?.id || $json.callback_query?.from?.id) }}"
            }
          ]
        },
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "returnAll": true,
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Agents Configuration"
        },
        "filterType": "manual"
      },
      "typeVersion": 2.2
    },
    {
      "id": "78f2877f-3a12-4ece-815f-73612440af19",
      "name": "Agent Exists?",
      "type": "n8n-nodes-base.if",
      "position": [
        -1776,
        64
      ],
      "parameters": {
        "conditions": {
          "boolean": [
            {
              "value1": "={{ ($json.properties['Notion User']?.people?.length || 0) > 0 }}",
              "value2": true
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d056c8a7-212a-4cba-a8a4-ce7c179999a7",
      "name": "\ud83d\udcdd Assign Lead",
      "type": "n8n-nodes-base.notion",
      "position": [
        -1520,
        -64
      ],
      "parameters": {
        "pageId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Telegram Callback').item.json.callback_query.data.replace('take_lead_', '') }}"
        },
        "options": {},
        "resource": "databasePage",
        "operation": "update",
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Assigned Manager|people",
              "peopleValue": "={{ \n  ($('\ud83d\udd75\ufe0f\u200d\u2642\ufe0f Find Agent').item.json.properties['Notion User'].people || [])\n  .map(u => u.id) \n}}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "df28b9a0-f165-415e-a386-51ae916cb2ef",
      "name": "\u2705 Update Chat",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -1296,
        -64
      ],
      "parameters": {
        "text": "={{ $('Telegram Callback').item.json.message.text }}\n\u2705 <b>Taken by:</b> {{ $('\ud83d\udd75\ufe0f\u200d\u2642\ufe0f Find Agent').item.json.properties['Name'].title[0].plain_text }}",
        "chatId": "={{ $('Telegram Callback').item.json.callback_query.message.chat.id }}",
        "messageId": "={{ $('Telegram Callback').item.json.callback_query.message.message_id }}",
        "operation": "editMessageText",
        "additionalFields": {
          "parse_mode": "HTML"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7b8de588-d6b6-4695-82a3-dae98d66ab01",
      "name": "\ud83d\udd14 Show Toast",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -1072,
        -64
      ],
      "parameters": {
        "operation": "answerCallbackQuery"
      },
      "typeVersion": 1.2
    },
    {
      "id": "4e5f21f6-f248-444e-bddc-a9a57267a5de",
      "name": "\u274c Error Toast",
      "type": "n8n-nodes-base.telegram",
      "position": [
        -1520,
        192
      ],
      "parameters": {
        "operation": "answerCallbackQuery"
      },
      "typeVersion": 1.2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "3551620f-e5da-4cfe-94e5-7232d62af6ad",
  "connections": {
    "Found?": {
      "main": [
        [
          {
            "node": "\ud83d\udeab Duplicate / Skip",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\ud83e\udd16 AI Icebreaker",
            "type": "main",
            "index": 0
          },
          {
            "node": "\ud83d\udd17 Merge Final",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Agent Exists?": {
      "main": [
        [
          {
            "node": "\ud83d\udcdd Assign Lead",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\u274c Error Toast",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual Trigger": {
      "main": [
        [
          {
            "node": "\ud83d\udcdd CONFIGURATION",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2705 Update Chat": {
      "main": [
        [
          {
            "node": "\ud83d\udd14 Show Toast",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd04 Loop Items": {
      "main": [
        [],
        [
          {
            "node": "\ud83d\udd0e Search Duplicate",
            "type": "main",
            "index": 0
          },
          {
            "node": "\ud83d\udee1\ufe0f Restore Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcdd Assign Lead": {
      "main": [
        [
          {
            "node": "\u2705 Update Chat",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce2 Notify Team": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Loop Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd17 Merge Final": {
      "main": [
        [
          {
            "node": "\ud83d\udcbe Create New Lead",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram Callback": {
      "main": [
        [
          {
            "node": "\ud83d\udd75\ufe0f\u200d\u2642\ufe0f Find Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcdd CONFIGURATION": {
      "main": [
        [
          {
            "node": "1. Fetch Google Maps Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83e\udd16 AI Icebreaker": {
      "main": [
        [
          {
            "node": "\ud83d\udd17 Merge Final",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2. Clean & Normalize": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Loop Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83c\udfa8 Prepare Message": {
      "main": [
        [
          {
            "node": "\ud83d\udce2 Notify Team",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcbe Create New Lead": {
      "main": [
        [
          {
            "node": "\ud83c\udfa8 Prepare Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udee1\ufe0f Restore Data": {
      "main": [
        [
          {
            "node": "Found?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd0e Search Duplicate": {
      "main": [
        [
          {
            "node": "\ud83d\udee1\ufe0f Restore Data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "\ud83d\udeab Duplicate / Skip": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Loop Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1. Fetch Google Maps Data": {
      "main": [
        [
          {
            "node": "2. Clean & Normalize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd75\ufe0f\u200d\u2642\ufe0f Find Agent": {
      "main": [
        [
          {
            "node": "Agent Exists?",
            "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

Meet your automated Lead Gen Specialist. This workflow streamlines cold outreach by scraping local businesses, qualifying them with AI, and delivering them to your sales team instantly via an interactive Telegram bot.

Source: https://n8n.io/workflows/12632/ — 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

An advanced automated trading bot that implements ICT (Inner Circle Trader) methodology and Smart Money Concepts for cryptocurrency trading. This workflow combines AI-powered market analysis with auto

HTTP Request, OpenAI, Notion +2
AI & RAG

This n8n template automates the transformation of raw meeting notes into structured tasks and documents using GPT (or another model) , syncing them to Notion and TickTick via a Telegram bot. Automate

Item Lists, Telegram Trigger, N8N Nodes Ticktick +4
AI & RAG

Ask questions like “How much did I spend on food last month?” and get instant answers from your financial data — directly in Telegram.

Telegram Trigger, OpenAI, Google Sheets +2
AI & RAG

Build a Telegram bot that helps users find AliExpress products using natural language requests. The bot uses OpenAI to optimize search queries, Decodo to scrape product listings, and AI analysis to se

Telegram Trigger, OpenAI, Telegram +3
AI & RAG

Voice Note -> Veo 3 AD. Uses telegramTrigger, telegram, openAi, httpRequest. Event-driven trigger; 49 nodes.

Telegram Trigger, Telegram, OpenAI +3