AutomationFlowsAI & RAG › Scrape Google Maps by Area & Generate Outreach Messages for Lead Generation

Scrape Google Maps by Area & Generate Outreach Messages for Lead Generation

BySolomon @solomon on n8n.io

It uses the Bright Data community node and Bright Data MCP for scraping and AI message generation. Form Submission

Event trigger★★★★★ complexityAI-powered38 nodesForm TriggerPostgresMcp Client ToolChain LlmHTTP Request@Brightdata/N8N Nodes BrightdataGoogle Gemini ChatAgent
AI & RAG Trigger: Event Nodes: 38 Complexity: ★★★★★ AI nodes: yes Added:

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

This workflow follows the Agent → Chainllm 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": "50f8bf9b-b49a-4caf-816c-0a19f2c42d8a",
      "name": "Wait5",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1584,
        640
      ],
      "parameters": {
        "amount": 60
      },
      "typeVersion": 1.1
    },
    {
      "id": "fb7673ef-58ef-47a7-a6ab-59a96c600113",
      "name": "Count1",
      "type": "n8n-nodes-base.set",
      "position": [
        -2064,
        384
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "ef3259b8-3818-4584-ad70-72ea81dafda2",
              "name": "count",
              "type": "number",
              "value": 0
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0bf29afc-517a-4df0-a8a5-3db4f228fb43",
      "name": "Count Increment1",
      "type": "n8n-nodes-base.set",
      "position": [
        -1408,
        640
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "d05a51e9-98b5-4f27-a9bc-a7a2a7a16c8d",
              "name": "=count",
              "type": "number",
              "value": "={{ $('No Operation, do nothing4').last().json.count + 1}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "26054f12-cd84-409d-ace8-8e974d4ad3cf",
      "name": "No Operation, do nothing4",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -1840,
        384
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "40669acb-1761-4296-8eb4-579660d1dac3",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -2736,
        384
      ],
      "parameters": {
        "options": {
          "buttonLabel": "Scrape",
          "appendAttribution": false,
          "respondWithOptions": {
            "values": {
              "formSubmittedText": "Scraping started \ud83d\udd0e"
            }
          }
        },
        "formTitle": "Maps Extractor",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Location URL",
              "placeholder": "https://www.google.com.br/maps/@-27.0969036,-52.6273034,14z?hl=pt-BR&entry=ttu&g_ep=EgoyMDI1MDcwOS4wIKXMDSoASAFQAw%3D%3D",
              "requiredField": true
            },
            {
              "fieldLabel": "Keyword Search",
              "placeholder": "Restaurant",
              "requiredField": true
            },
            {
              "fieldLabel": "Country",
              "placeholder": "US",
              "requiredField": true
            },
            {
              "fieldLabel": "My company's segment",
              "placeholder": "Marketing Agency",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Use this form to scrape businesses from Google Maps, based on a starting location.\n\nMake sure to copy the URL from your browser address bar. DO NOT use the Share feature in Google Maps."
      },
      "typeVersion": 2.2
    },
    {
      "id": "259bf7c0-e7fe-40d4-99b5-2b14c81f425c",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        880,
        384
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "d9ebef8c-b67e-48b6-8c9e-1de9365f7783",
      "name": "Create Table",
      "type": "n8n-nodes-base.postgres",
      "position": [
        -2448,
        -96
      ],
      "parameters": {
        "query": "CREATE TABLE business_scraping_result (\n    place_id text PRIMARY KEY,\n    page_summary TEXT,\n    name TEXT,\n    category TEXT,\n    address TEXT,\n    description TEXT,\n    google_url TEXT,\n    website TEXT,\n    phone_number TEXT,\n    reviews_count INTEGER,\n    rating NUMERIC(2,1),\n    services_provided TEXT[],\n    top_reviews JSONB,\n    sales_helper TEXT\n);\n",
        "options": {},
        "operation": "executeQuery"
      },
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.6
    },
    {
      "id": "92750861-c9e6-49e3-ac95-a795873f6333",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "disabled": true,
      "position": [
        -2720,
        -96
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f2026d33-7f29-4626-963f-411990cd4afc",
      "name": "scrape_as_markdown",
      "type": "@n8n/n8n-nodes-langchain.mcpClientTool",
      "position": [
        496,
        208
      ],
      "parameters": {
        "include": "selected",
        "endpointUrl": "=https://mcp.brightdata.com/mcp?token=YOUR_BRIGHT_DATA_TOKEN",
        "includeTools": [
          "scrape_as_markdown"
        ],
        "serverTransport": "httpStreamable"
      },
      "typeVersion": 1.1
    },
    {
      "id": "e8c95bf2-2bcf-451d-a465-1e1d8e91b584",
      "name": "Request finished",
      "type": "n8n-nodes-base.if",
      "position": [
        -1424,
        384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "ea3eb544-5ee9-49b4-85b2-3af89684ed61",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "=running"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "01576305-68c7-4617-b144-e8d6d53c231c",
      "name": "Reached retry limit",
      "type": "n8n-nodes-base.if",
      "position": [
        -1824,
        640
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "f118e0f7-8+1234567890-f0f31b4cdfd6",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $('No Operation, do nothing4').last().json.count }}",
              "rightValue": 10
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "85ffc9bb-fce9-4fe9-af75-937bf3c78773",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2096,
        272
      ],
      "parameters": {
        "color": 7,
        "width": 848,
        "height": 592,
        "content": "## Retry logic\nRetries until the extraction is ready or until the retry limit is reached"
      },
      "typeVersion": 1
    },
    {
      "id": "b71ae4f9-184d-4bd1-994a-adc04f2783f5",
      "name": "Message Generator",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1088,
        384
      ],
      "parameters": {
        "text": "={{ JSON.stringify($json) }}",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "=You are a business development assistant helping an entrepreneur prepare for a cold call to a business lead.\n\nTake into account that my company segment is: {{ $('On form submission').first().json['My company\\'s segment'] }}\n\n# TASK\nYou will receive structured data about a business, including basic info, services, reviews, and contact details.\n\nYour job is to generate:\n1. A short cold call opening message the entrepreneur can use to start the conversation.\n2. A list of supportive talking points or insights the entrepreneur can use during the call to sound informed and build rapport.\n\n# OUTPUT STRUCTURE\n1. Opening Message (Spoken Script):\n- 2\u20134 sentences.\n- Friendly, confident, respectful tone.\n- Show that the caller is familiar with the business.\n- Mention something specific (e.g. high rating, food quality, atmosphere, community praise).\n- Introduce the caller\u2019s intention (e.g. connect, collaborate, learn more).\n\n2. Call Support Notes (Bullet List):\n- Provide 3\u20135 relevant talking points about the business based on reviews, services, and offerings.\n- Suggest areas the entrepreneur can mention or ask about (e.g. \u201cYour place seems popular with tourists and locals alike \u2014 how do you approach that balance?\u201d)\n- Avoid quoting reviews verbatim \u2014 instead, summarize sentiment or praise.\n\n# INSTRUCTIONS\n- Generate a personalized cold call opening message\n- Generate a list of insightful, natural talking points to help the entrepreneur carry the conversation confidently\n\n# GUIDELINES\n- Output only the results, without any intro or outro text."
            }
          ]
        },
        "promptType": "define"
      },
      "executeOnce": false,
      "typeVersion": 1.7
    },
    {
      "id": "9859f00a-697b-4053-97d4-0b9995fcbc7a",
      "name": "Company website exists",
      "type": "n8n-nodes-base.if",
      "position": [
        16,
        384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "48807393-7b5c-4403-9d00-7dff6d9b1a5b",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json?.company?.open_website }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a347e372-2f66-4420-a242-6a78805dda6c",
      "name": "Organize data",
      "type": "n8n-nodes-base.set",
      "position": [
        -688,
        384
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e695fad7-d55c-4d88-8ce8-f7940f0bb902",
              "name": "place_id",
              "type": "string",
              "value": "={{ $json.place_id }}"
            },
            {
              "id": "5ec77d22-6cae-49a2-9bad-16a542f0929c",
              "name": "=company.google_url",
              "type": "string",
              "value": "={{ $json.url }}"
            },
            {
              "id": "d318da82-27c7-431c-9fe0-dfd1819436e1",
              "name": "company.name",
              "type": "string",
              "value": "={{ $json.name }}"
            },
            {
              "id": "6b040b65-255c-4f3a-9bb8-e40eda983106",
              "name": "company.category",
              "type": "string",
              "value": "={{ $json.category }}"
            },
            {
              "id": "13ebb481-c965-4c2e-aa4f-da4a5a5f9de2",
              "name": "company.address",
              "type": "string",
              "value": "={{ $json.address }}"
            },
            {
              "id": "eeebdad8-ca95-4b94-a7d1-f9a260b91844",
              "name": "company.description",
              "type": "string",
              "value": "={{ $json.description }}"
            },
            {
              "id": "f4d61c24-1dea-48c8-b0c5-b34db06f434a",
              "name": "company.reviews_count",
              "type": "number",
              "value": "={{ $json.reviews_count }}"
            },
            {
              "id": "06cc04a8-dc98-4deb-aaa9-8d3258cefc31",
              "name": "company.rating",
              "type": "number",
              "value": "={{ $json.rating }}"
            },
            {
              "id": "5db1cdc7-e02f-4aa0-8a63-fac3b404ba5f",
              "name": "company.services_provided",
              "type": "array",
              "value": "={{ $json.services_provided }}"
            },
            {
              "id": "0d22b017-0cc9-4e04-9b1e-1cb15474f56c",
              "name": "company.open_website",
              "type": "string",
              "value": "={{ $json.open_website }}"
            },
            {
              "id": "2abb740f-0dcf-4d1b-96a9-408013eb76fe",
              "name": "company.phone_number",
              "type": "string",
              "value": "={{ $json.phone_number }}"
            },
            {
              "id": "11b1a2e5-c226-4585-a2cc-42d08918dcd8",
              "name": "company.top_reviews",
              "type": "array",
              "value": "={{ $json.top_reviews }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "33646f79-938a-4664-8db0-300b084555e9",
      "name": "Set Limit",
      "type": "n8n-nodes-base.limit",
      "position": [
        -464,
        384
      ],
      "parameters": {
        "maxItems": 15
      },
      "typeVersion": 1
    },
    {
      "id": "73d9e7c7-f169-44f7-9d1e-3cca73b836bd",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        352
      ],
      "parameters": {
        "color": 3,
        "width": 192,
        "height": 80,
        "content": "### \u261d\ufe0f Bright Data MCP\nPlace your token here"
      },
      "typeVersion": 1
    },
    {
      "id": "3b641cc7-1b9b-44a5-8d7c-e4f0a92d722d",
      "name": "Bright Data | Request data",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -2304,
        384
      ],
      "parameters": {
        "url": "https://api.brightdata.com/datasets/v3/trigger",
        "method": "POST",
        "options": {},
        "jsonBody": "=[\n  {\n    \"country\": \"{{ $json.Country }}\",\n    \"zoom_level\": \"14\",\n    \"keyword\": \"{{ $json['Keyword Search'] }}\",\n    \"lat\": \"{{ $json.latitude }}\",\n    \"long\": {{ $json.longitude.toNumber() }}\n  }\n]",
        "sendBody": true,
        "sendQuery": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "dataset_id",
              "value": "gd_m8ebnr0q2qlklc02fz"
            },
            {
              "name": "include_errors",
              "value": "true"
            },
            {
              "name": "type",
              "value": "discover_new"
            },
            {
              "name": "discover_by",
              "value": "location"
            }
          ]
        },
        "nodeCredentialType": "brightdataApi"
      },
      "credentials": {
        "brightdataApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "0b1c5b72-e2b8-47f6-a4a8-c1c8079fe1d7",
      "name": "Set Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        640,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "aacc7f04-f2db-4dbd-8089-21a11ce5eaa4",
              "name": "summary",
              "type": "string",
              "value": "={{ $json.output }}"
            },
            {
              "id": "9011fbcc-142b-4366-ad43-5462b4d1a4c1",
              "name": "company",
              "type": "object",
              "value": "={{ $('Set Limit').item.json.company }}"
            },
            {
              "id": "84077369-7220-47d3-b072-72e7f976b20a",
              "name": "place_id",
              "type": "string",
              "value": "={{ $('Set Limit').item.json.place_id }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "18b73983-a302-47a8-8713-23769d72caad",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2768,
        -336
      ],
      "parameters": {
        "color": 4,
        "width": 528,
        "height": 432,
        "content": "## Run this to create your Supabase table"
      },
      "typeVersion": 1
    },
    {
      "id": "3652dcbb-195a-49bd-8cfd-9135fc9f5c5f",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2384,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 336,
        "content": "The `zoom_level` controls the radius of your search. A lower zoom means a higher radius.\n\nThe `dataset_id` refers to the [Google Maps scraper](https://brightdata.com/cp/scrapers/api/gd_m8ebnr0q2qlklc02fz/location/) from BrightData"
      },
      "typeVersion": 1
    },
    {
      "id": "138123ad-ccbf-44b5-a880-16048feabaa4",
      "name": "Extract latitude and logitude from URL",
      "type": "n8n-nodes-base.set",
      "position": [
        -2528,
        384
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "3210b179-d62e-458a-a265-c8ecdb21423f",
              "name": "latitude",
              "type": "string",
              "value": "={{ $json['Location URL'].match(/@(-?\\d+\\.\\d+),(-?\\d+\\.\\d+)/)[1] }}"
            },
            {
              "id": "b2c0c095-08a1-434e-86cd-a68901666d1a",
              "name": "longitude",
              "type": "string",
              "value": "={{ $json['Location URL'].match(/@(-?\\d+\\.\\d+),(-?\\d+\\.\\d+)/)[2] }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "20692ebd-54d3-466f-8fc3-4680ae6c6649",
      "name": "Check status of data extraction",
      "type": "@brightdata/n8n-nodes-brightdata.brightData",
      "position": [
        -1632,
        384
      ],
      "parameters": {
        "resource": "webScrapper",
        "operation": "monitorProgressSnapshot",
        "snapshot_id": "={{ $('Bright Data | Request data').item.json.snapshot_id }}",
        "requestOptions": {}
      },
      "credentials": {
        "brightdataApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4ad46e5e-fd26-479f-82fe-9e9eadc6f726",
      "name": "Download the snapshot content",
      "type": "@brightdata/n8n-nodes-brightdata.brightData",
      "position": [
        -1168,
        384
      ],
      "parameters": {
        "resource": "webScrapper",
        "operation": "downloadSnapshot",
        "snapshot_id": "={{ $('Bright Data | Request data').item.json.snapshot_id }}",
        "requestOptions": {}
      },
      "credentials": {
        "brightdataApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "cb24cd2f-6573-4ca4-932e-e3facbd99e63",
      "name": "Snapshot finished building",
      "type": "n8n-nodes-base.if",
      "position": [
        -928,
        384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "7095f725-e308-44a2-884b-23f64a38b5cf",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "building"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "29293465-3a93-4594-9351-8d753414092c",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        -912,
        592
      ],
      "parameters": {
        "amount": 10
      },
      "typeVersion": 1.1
    },
    {
      "id": "49295de7-384b-4ded-80d3-be6d82d624db",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -528,
        304
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 224,
        "content": "Limit the amount of items to save in your database, if you'd like."
      },
      "typeVersion": 1
    },
    {
      "id": "2b0580c3-098b-4cbb-8df0-a202fab50c76",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1088,
        592
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.5-pro"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0d412f34-8db8-444a-8b4e-3ef535f7bf66",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -240,
        384
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "38e7f499-1212-413f-9654-b5a784b4b428",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -288,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 288,
        "content": "A loop is used here to ensure that even if an error occurs with one of the items, all previous items will still be saved in the database."
      },
      "typeVersion": 1
    },
    {
      "id": "f96bfc5e-9d97-4941-84c3-02803bfafbe5",
      "name": "Scrape & Summarize",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        272,
        0
      ],
      "parameters": {
        "text": "=Use the tool 'scrape_as_markdown' with the url:\n{{ $json.company.open_website }}",
        "options": {
          "systemMessage": "=You are a web-scraping AI agent equipped with the tool 'scrape_as_markdown'.\n\n# TASK\nScrape the homepage of the provided website and generate a structured summary of the company based on the main content.\n\n## OBJECTIVES\n1. Scrape.\n2. Extract only the core content of the page.\n3. Identify key information:\n   - Company mission or vision\n   - Products or services offered\n   - Target audience or market\n   - Key messaging, branding, or positioning\n   - Any highlighted achievements, updates, or announcements\n\n## CONSTRAINTS\n- Prioritize meaningful textual content over visuals or layout elements.\n- Ensure clarity and neutrality in the summary.\n\n# OUTPUT REQUIREMENTS\nReturn a summary of 300-500 words in the following format:\n[Company Name]:\n\n[Summary of company in 300-500 words, clearly structured and written in neutral, informative language.]"
        },
        "promptType": "define"
      },
      "executeOnce": false,
      "typeVersion": 2.2
    },
    {
      "id": "ba12786e-24b4-4262-a7f8-e883cf3d2367",
      "name": "Supabase | Upsert row",
      "type": "n8n-nodes-base.postgres",
      "position": [
        1456,
        384
      ],
      "parameters": {
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "business_scraping_result",
          "cachedResultName": "business_scraping_result"
        },
        "schema": {
          "__rl": true,
          "mode": "list",
          "value": "public"
        },
        "columns": {
          "value": {
            "name": "={{ $('Merge').item.json.company.name }}",
            "rating": "={{ $('Merge').item.json.company.rating }}",
            "address": "={{ $('Merge').item.json.company.address }}",
            "website": "={{ $('Merge').item.json.company.open_website }}",
            "category": "={{ $('Merge').item.json.company.category }}",
            "place_id": "={{ $('Merge').item.json.place_id }}",
            "google_url": "={{ $('Merge').item.json.company.google_url }}",
            "description": "={{ $('Merge').item.json.company.description }}",
            "top_reviews": "={{ { \"reviews\": $('Merge').item.json.company.top_reviews } }}",
            "page_summary": "={{ $('Merge').item.json.summary }}",
            "phone_number": "={{ $('Merge').item.json.company.phone_number }}",
            "sales_helper": "={{ $json.text }}",
            "reviews_count": "={{ $('Merge').item.json.company.reviews_count }}",
            "services_provided": "={{ $('Merge').item.json.company.services_provided }}"
          },
          "schema": [
            {
              "id": "place_id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": true,
              "displayName": "place_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "page_summary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "page_summary",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "name",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "category",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "category",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "address",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "address",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "description",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "google_url",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "google_url",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "website",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "website",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "phone_number",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "phone_number",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "reviews_count",
              "type": "number",
              "display": true,
              "required": false,
              "displayName": "reviews_count",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "rating",
              "type": "number",
              "display": true,
              "required": false,
              "displayName": "rating",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "services_provided",
              "type": "array",
              "display": true,
              "required": false,
              "displayName": "services_provided",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "top_reviews",
              "type": "object",
              "display": true,
              "required": false,
              "displayName": "top_reviews",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            },
            {
              "id": "sales_helper",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "sales_helper",
              "defaultMatch": false,
              "canBeUsedToMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "place_id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "upsert"
      },
      "credentials": {
        "postgres": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.6
    },
    {
      "id": "eec559ce-5a6b-4ef5-9571-4501b0aead51",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1376,
        224
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 320,
        "content": "To connect to Supabase using Postgres credentials, just click the `Connect` button in Supabase header and use the `Transaction pooler` parameters.\n\n[Official documentation](https://supabase.com/docs/guides/database/connecting-to-postgres)"
      },
      "typeVersion": 1
    },
    {
      "id": "2e2c2538-d0f9-4b99-8416-01fa05155707",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2544,
        -256
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 320,
        "content": "To connect to Supabase using Postgres credentials, just click the `Connect` button in Supabase header and use the `Transaction pooler` parameters.\n\n[Official documentation](https://supabase.com/docs/guides/database/connecting-to-postgres)"
      },
      "typeVersion": 1
    },
    {
      "id": "2afe13ea-056e-4cf6-89cf-004185d14da9",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3216,
        -336
      ],
      "parameters": {
        "width": 416,
        "height": 848,
        "content": "### This n8n workflow automates lead extraction from Google Maps, enriches data with AI, and stores results for cold outreach.\n\nIt uses the [Bright Data](https://brightdata.com/) community node and Bright Data MCP for scraping and AI message generation.\n\n### **How it works**\n1. **Form Submission**\n    \n    User provides Google Maps starting location, keyword and country.\n    \n2. **Bright Data Scraping**\n    \n    [Bright Data](https://brightdata.com/) community node triggers a Maps scraping job, monitors progress, and downloads results.\n    \n3. **AI Message Generation**\n    \n    Uses Bright Data MCP with LLMs to create a personalized cold call script and talking points for each lead.\n    \n4. **Database Storage**\n    \n    Enriched leads and scripts are upserted to Supabase.\n    \n\n### **How to use**\nSet up all the credentials, create your Postgres table and submit the form. The rest happens automatically.\n\n### **Requirements**\n- LLM account (OpenAI, Gemini\u2026) for API usage.\n- [Bright Data](https://brightdata.com/) account for API and MCP usage.\n- Supabase account (or other Postgres database) to store information."
      },
      "typeVersion": 1
    },
    {
      "id": "ff9438ac-9290-491f-b057-b201aa5cc2b0",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1680,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 660,
        "height": 664,
        "content": "# Author\n![Solomon](https://gravatar.com/avatar/79aa147f090807fe0f618fb47a1de932669e385bb0c84bf3a7f891ae7d174256?r=pg&d=retro&size=200)\n### Solomon\n\ud83c\udf93 AI & Automation Educator - Follow me on [LinkedIn](https://www.linkedin.com/in/guisalomao/)\n\nFor business inquiries:\n- automations.solomon@gmail.com\n- [Telegram](https://t.me/salomaoguilherme)\n- [LinkedIn](https://www.linkedin.com/in/guisalomao/)\n\n\n### Check out my other templates\n### \ud83d\udc49 https://n8n.io/creators/solomon/\n"
      },
      "typeVersion": 1
    },
    {
      "id": "17b4edba-7e3b-4e15-99b9-d8a2744e4e41",
      "name": "Sticky Note16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1696,
        448
      ],
      "parameters": {
        "color": 4,
        "width": 620,
        "height": 80,
        "content": "### \ud83d\udca1 **Want to learn advanced n8n skills and earn money building workflows?**\n\u200e \u200e \u200e \u200e \u200e \u200e \u200e \u200eCheck out [Scrapes Academy](https://www.skool.com/scrapes/about?ref=21f10ad99f4d46ba9b8aaea8c9f58c34)"
      },
      "typeVersion": 1
    },
    {
      "id": "e1b4b9c1-4abb-493c-b744-7729cf105337",
      "name": "gpt-5-mini",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        272,
        208
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-5-mini",
          "cachedResultName": "gpt-5-mini"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    }
  ],
  "connections": {
    "Wait": {
      "main": [
        [
          {
            "node": "Download the snapshot content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Message Generator",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait5": {
      "main": [
        [
          {
            "node": "Count Increment1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Count1": {
      "main": [
        [
          {
            "node": "No Operation, do nothing4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Limit": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Fields": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "gpt-5-mini": {
      "ai_languageModel": [
        [
          {
            "node": "Scrape & Summarize",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Organize data": {
      "main": [
        [
          {
            "node": "Set Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Company website exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Count Increment1": {
      "main": [
        [
          {
            "node": "No Operation, do nothing4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Request finished": {
      "main": [
        [
          {
            "node": "Download the snapshot content",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Reached retry limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Message Generator": {
      "main": [
        [
          {
            "node": "Supabase | Upsert row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Extract latitude and logitude from URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape & Summarize": {
      "main": [
        [
          {
            "node": "Set Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "scrape_as_markdown": {
      "ai_tool": [
        [
          {
            "node": "Scrape & Summarize",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Reached retry limit": {
      "main": [
        [],
        [
          {
            "node": "Wait5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase | Upsert row": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Company website exists": {
      "main": [
        [
          {
            "node": "Scrape & Summarize",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Message Generator",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "No Operation, do nothing4": {
      "main": [
        [
          {
            "node": "Check status of data extraction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Bright Data | Request data": {
      "main": [
        [
          {
            "node": "Count1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Snapshot finished building": {
      "main": [
        [
          {
            "node": "Organize data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download the snapshot content": {
      "main": [
        [
          {
            "node": "Snapshot finished building",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check status of data extraction": {
      "main": [
        [
          {
            "node": "Request finished",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Create Table",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract latitude and logitude from URL": {
      "main": [
        [
          {
            "node": "Bright Data | Request data",
            "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

It uses the Bright Data community node and Bright Data MCP for scraping and AI message generation. Form Submission

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

This template attempts to replicate OpenAI's DeepResearch feature which, at time of writing, is only available to their pro subscribers.

Output Parser Structured, OpenAI Chat, Form Trigger +8
AI & RAG

My workflow 53. Uses formTrigger, httpRequest, lmChatOpenAi, form. Event-driven trigger; 74 nodes.

Form Trigger, HTTP Request, OpenAI Chat +15
AI & RAG

Episode 23: UGC with nanobanana. Uses lmChatOpenAi, lmChatOllama, lmChatDeepSeek, lmChatOpenRouter. Event-driven trigger; 74 nodes.

OpenAI Chat, Ollama Chat, Lm Chat Deep Seek +12
AI & RAG

secretaria. Uses postgres, n8n-nodes-evolution-api, openAi, httpRequest. Webhook trigger; 71 nodes.

Postgres, N8N Nodes Evolution Api, OpenAI +12
AI & RAG

Transform your salon/service business with this streamlined WhatsApp automation system featuring Claude integration, zero-setup database management, and intelligent conversation handling. Claude MCP I

WhatsApp Trigger, WhatsApp, Redis +11