AutomationFlowsWeb Scraping › Generate Verified Local Leads From Google Maps with Apify and Google Sheets

Generate Verified Local Leads From Google Maps with Apify and Google Sheets

BySanthej Kallada @santhejkallada on n8n.io

This workflow uses Apify to scrape Google Maps business leads, verify their emails with a live SMTP check, and append only safe-to-send contacts to a Google Sheets spreadsheet. Starts when you manually run the workflow. Calls the Apify Google Maps Lead Finder actor to search…

Event trigger★★★★☆ complexity16 nodesHTTP RequestGoogle Sheets
Web Scraping Trigger: Event Nodes: 16 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #16280 — 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
{
  "id": "010G8vMju7kUHf0z",
  "name": "Automated Lead-Gen \u2014 Google Maps \u2192 Enriched Emails \u2192 Sheet",
  "tags": [],
  "nodes": [
    {
      "id": "5f6e0c54-1b4a-4b97-a81c-a784f8ac3ad6",
      "name": "When you click Test",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -512,
        240
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "ef05ba67-6aec-496c-b304-d3b2863fa404",
      "name": "Run Google Maps Lead Finder",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -128,
        240
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/acts/santhej~google-maps-lead-finder/run-sync-get-dataset-items",
        "method": "POST",
        "options": {
          "timeout": 300000
        },
        "jsonBody": "{\n  \"queries\": [\"dentists in Austin TX\"],\n  \"resultsDepth\": 10,\n  \"enrichEmails\": true,\n  \"maxEmailsPerDomain\": 2,\n  \"locationCode\": \"2840\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "retryOnFail": true,
      "typeVersion": 4.4
    },
    {
      "id": "6da9b038-c6cb-4b85-b1ad-970976723427",
      "name": "Keep leads with a verified email",
      "type": "n8n-nodes-base.filter",
      "position": [
        240,
        240
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c1",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.primary_email }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "f6b6edc1-8683-4bde-8d8d-eb1db26fd832",
      "name": "Append lead to Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1632,
        224
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "business",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "business",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "category",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "category",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "address",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "phone",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "phone",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "website",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "website",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "domain",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "domain",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "primary_email",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "primary_email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "primary_email_status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "primary_email_status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "primary_email_confidence",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "primary_email_confidence",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email_count",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "email_count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "rating",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "rating",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "reviews_count",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "reviews_count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "query",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "query",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "price_level",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "price_level",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "work_hours",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "work_hours",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "emails",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "emails",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "decision_makers",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "decision_makers",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "TaskifyLabs Leads"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/1HikW0JmOSaVCVYMi164UpuL4x_nbo8bqW0mfsmmvYgE/edit"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "4f77c6b4-44fd-40c0-8f33-72da3c502ed9",
      "name": "\ud83d\udcd8 Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -544,
        -160
      ],
      "parameters": {
        "color": 4,
        "width": 1460,
        "height": 260,
        "content": "# \ud83d\uddfa\ufe0f Automated Local Lead-Gen \u2014 Google Maps \u2192 VERIFIED Emails \u2192 Sheet\n## Scrapes local businesses \u2192 **live-SMTP verifies every email so nothing bounces** \u2192 writes only safe-to-send leads to your Sheet.\n### Flow:  \u2460 Trigger \u2192 \u2461 Scrape + enrich \u2192 \u2462 Has email? \u2192 \u2463 Verify (SMTP) \u2192 \u2464 Merge \u2192 \u2465 Keep safe-to-send \u2192 \u2466 Sheet\n### _Free workflow by Santhej Kallada \u00b7 n8n Automation_"
      },
      "typeVersion": 1
    },
    {
      "id": "dc9918b9-1d09-4050-a6da-25ef2cf1d5ad",
      "name": "\u2461 Apify \u2014 scrape + enrich",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -544,
        416
      ],
      "parameters": {
        "color": 7,
        "width": 626,
        "height": 364,
        "content": "## \u2461 Scrape + enrich (Apify)\n### One HTTP request runs the **Google Maps B2B Lead Finder**.\n### \ud83d\udd11 Credential: Apify **Header Auth** \u2014 see the \ud83d\udd11 Setup box below\n### Edit the JSON body:\n### \u2022 `queries` \u2192 niche + city\n### \u2022 `resultsDepth` \u2192 10\u2013100\n### \u2022 `enrichEmails` \u2192 `true`\n### \ud83d\udcb2 ~1\u00a2 / lead \u00b7 Apify gives **$5 free** (~first 400 free)\n**\ud83d\udd17 apify.com/santhej/google-maps-lead-finder?fpr=p2qvcj**"
      },
      "typeVersion": 1
    },
    {
      "id": "ede0e1de-8238-47f6-98fb-c99f53f1f11f",
      "name": "\u2462 Filter note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        112,
        416
      ],
      "parameters": {
        "color": 7,
        "width": 412,
        "height": 332,
        "content": "## \u2462 Has an email?\n### Quick pre-check \u2014 only pass leads that **actually have a `primary_email`**, so we don't waste a verification on blanks."
      },
      "typeVersion": 1
    },
    {
      "id": "74266366-fb76-4748-a54a-0a86ec09a254",
      "name": "\u2463 Sheet note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1728,
        416
      ],
      "parameters": {
        "color": 7,
        "width": 430,
        "height": 304,
        "content": "## \u2466 Append to your Google Sheet\n### Only clean, **verified** leads land here \u2014 business, phone, website, email + **status & score**.\n### \ud83d\udd11 Credential: **Google Sheets OAuth2** \u2192 Sign in with Google\n### \ud83d\udc49 Open this node, pick **your own** spreadsheet + tab.\n### \u23f0 Swap Manual Trigger \u2192 Schedule for daily auto-runs."
      },
      "typeVersion": 1
    },
    {
      "id": "af40ee07-bf9a-49ff-ad1b-aab3d25cffb8",
      "name": "\ud83d\ude80 Hire me \u2014 TaskifyLabs",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -528,
        1200
      ],
      "parameters": {
        "color": 3,
        "width": 960,
        "height": 300,
        "content": "# \ud83d\ude80 Don't want to build it? I'll set it up for you.\n## I build custom **n8n + Apify** automations for agencies & local businesses \u2014 lead-gen, cold outreach, reporting. Done-for-you.\n### **Who buys this:** real-estate agents \u00b7 marketing agencies \u00b7 B2B sales teams \u00b7 local service businesses\n### **Typical pricing:** setup **$500\u20131,500** \u00b7 managed lead lists **$300\u2013800/mo**\n## \ud83d\udc49 Hire me: taskifylabs.com/services/sales-automation\n### \ud83d\udce7 santhej@taskifylabs.com    \u25b6 YouTube: Santhej Kallada \u00b7 n8n Automation"
      },
      "typeVersion": 1
    },
    {
      "id": "489e1c0c-5f72-4fe8-a561-f92208eb943b",
      "name": "Verify Emails",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        608,
        128
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/acts/santhej~email-verifier/run-sync-get-dataset-items",
        "method": "POST",
        "options": {
          "timeout": 120000
        },
        "jsonBody": "={\n  \"emails\": [\"{{ $json.primary_email }}\"],\n  \"mode\": \"power\",\n  \"deduplicate\": false\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "retryOnFail": true,
      "typeVersion": 4.4
    },
    {
      "id": "c3da5151-dee0-4499-aeec-cde8fdc47766",
      "name": "Merge lead + verification",
      "type": "n8n-nodes-base.merge",
      "position": [
        992,
        224
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "abf513f4-e9c8-4e99-bb9a-ebabb2a1fb0a",
      "name": "Keep only safe-to-send",
      "type": "n8n-nodes-base.filter",
      "position": [
        1312,
        224
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "safe1",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.is_safe_to_send }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "780bef22-a59f-438b-9bbd-93f0391773e0",
      "name": "\u2463 Verify note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        416
      ],
      "parameters": {
        "color": 7,
        "width": 396,
        "height": 328,
        "content": "## \u2463 Verify every email (Email Verifier)\n### Google Maps emails are scraped and **often bounce**.\n### Runs a **live SMTP check** \u2014 deliverable? catch-all? disposable? role? spam-trap?\n### Returns `is_safe_to_send`, `status`, `score`.\n### \ud83d\udd11 Uses the **same Apify Header Auth** credential as \u2461\n### \ud83d\udcb2 ~$0.0018 / email (power mode)\n**\ud83d\udd17 apify.com/santhej/email-verifier?fpr=p2qvcj**"
      },
      "typeVersion": 1
    },
    {
      "id": "54c4f871-5941-484b-b9ca-91e4962881d3",
      "name": "\u2464 Merge note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        416
      ],
      "parameters": {
        "color": 7,
        "width": 330,
        "height": 300,
        "content": "## \u2464 Merge\n### Stitches each verification result back onto its lead (business, phone, website\u2026) **by position**."
      },
      "typeVersion": 1
    },
    {
      "id": "562f228a-511c-46d1-96f9-d9ff0a5e51fe",
      "name": "\u2465 Safe-to-send note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1344,
        416
      ],
      "parameters": {
        "color": 3,
        "width": 350,
        "height": 300,
        "content": "## \u2465 Keep only safe-to-send \u2705\n### **This is what stops bounces.**\n### Drops anything not `is_safe_to_send` \u2014 undeliverable, catch-all, disposable.\n### Stricter? Also drop `is_role_account`, or keep only `status = valid`."
      },
      "typeVersion": 1
    },
    {
      "id": "0ff8a020-7324-4fc9-85d6-8728145707ac",
      "name": "\ud83d\udd11 Setup credentials",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -528,
        864
      ],
      "parameters": {
        "color": 2,
        "width": 960,
        "height": 300,
        "content": "# \ud83d\udd11 Setup \u2014 add these 2 credentials BEFORE you run\n## 1\ufe0f\u20e3 Apify (Header Auth) \u2014 used by BOTH \u2461 Scrape and \u2463 Verify\n### \u2022 Apify \u2192 Settings \u2192 API & Integrations \u2192 copy your **Personal API token**\n### \u2022 On the HTTP node \u2192 Credential \u2192 **Create New \u2192 \u201cHeader Auth\u201d**\n### \u2022 Name: `Authorization`   \u00b7   Value: `Bearer YOUR_APIFY_TOKEN`   \u2192  Save, then select it on **both** \u2461 and \u2463\n## 2\ufe0f\u20e3 Google Sheets (OAuth2) \u2014 used by \u2466 Append to Google Sheet\n### \u2022 On the Sheets node \u2192 Credential \u2192 **Create New \u2192 \u201cGoogle Sheets OAuth2\u201d** \u2192 **Sign in with Google** \u2192 allow access \u2192 pick your sheet"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "dca92d12-1054-4b46-a4ae-483521533580",
  "connections": {
    "Verify Emails": {
      "main": [
        [
          {
            "node": "Merge lead + verification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When you click Test": {
      "main": [
        [
          {
            "node": "Run Google Maps Lead Finder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Keep only safe-to-send": {
      "main": [
        [
          {
            "node": "Append lead to Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge lead + verification": {
      "main": [
        [
          {
            "node": "Keep only safe-to-send",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run Google Maps Lead Finder": {
      "main": [
        [
          {
            "node": "Keep leads with a verified email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Keep leads with a verified email": {
      "main": [
        [
          {
            "node": "Verify Emails",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge lead + verification",
            "type": "main",
            "index": 1
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow uses Apify to scrape Google Maps business leads, verify their emails with a live SMTP check, and append only safe-to-send contacts to a Google Sheets spreadsheet. Starts when you manually run the workflow. Calls the Apify Google Maps Lead Finder actor to search…

Source: https://n8n.io/workflows/16280/ — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

Automate LinkedIn lead generation by scraping comments from targeted posts and enriching profiles with detailed data

Form Trigger, HTTP Request, Google Sheets
Web Scraping

This automated n8n workflow scrapes job listings from Upwork using Apify, processes and cleans the data, and generates daily email reports with job summaries. The system uses Google Sheets for data st

Google Sheets, HTTP Request, Gmail
Web Scraping

Transform LinkedIn profile URLs into comprehensive enriched lead profiles, quickly and automatically.

HTTP Request, Google Sheets
Web Scraping

Transform any website into a structured knowledge repository with this intelligent crawler that extracts hyperlinks from the homepage, intelligently filters images and content pages, and aggregates fu

HTTP Request, Google Sheets
Web Scraping

Content creators, researchers, educators, and digital marketers who need to discover high-quality YouTube training videos on specific topics. Perfect for building curated learning resource lists, comp

HTTP Request, Google Sheets