AutomationFlowsWeb Scraping › Scrape Google Maps Leads with Apify and Export Them to CSV

Scrape Google Maps Leads with Apify and Export Them to CSV

ByGiovanni Ruggieri @gioru on n8n.io

This workflow collects a Google Maps search URL and lead filters through an n8n form, uses Apify to scrape matching places (including phone numbers and website emails), then returns a downloadable CSV file of the lead list. Receives a lead request via an n8n form with a Google…

Event trigger★★★★☆ complexity10 nodesForm TriggerHTTP RequestForm
Web Scraping Trigger: Event Nodes: 10 Complexity: ★★★★☆ Added:

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

This workflow follows the Form → Form Trigger 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": "OKG3ynHVz9CaN8TW",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Scrape Google Maps leads (phone + email) from the search URL",
  "tags": [
    {
      "id": "YqsnPBStdCs8UWVd",
      "name": "Template",
      "createdAt": "2024-06-28T16:06:23.898Z",
      "updatedAt": "2024-06-28T16:06:23.898Z"
    }
  ],
  "nodes": [
    {
      "id": "node-form",
      "name": "Lead request (form)",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        0,
        304
      ],
      "parameters": {
        "options": {},
        "formTitle": "Get Local Business Leads",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Google Maps URL",
              "placeholder": "Paste your Google Maps search link",
              "requiredField": true
            },
            {
              "fieldType": "number",
              "fieldLabel": "How many leads",
              "placeholder": "25",
              "requiredField": true
            },
            {
              "fieldType": "dropdown",
              "fieldLabel": "Minimum rating",
              "fieldOptions": {
                "values": [
                  {
                    "option": "Any"
                  },
                  {
                    "option": "3+"
                  },
                  {
                    "option": "3.5+"
                  },
                  {
                    "option": "4+"
                  },
                  {
                    "option": "4.5+"
                  }
                ]
              }
            },
            {
              "fieldType": "dropdown",
              "fieldLabel": "Only businesses with a website",
              "fieldOptions": {
                "values": [
                  {
                    "option": "No"
                  },
                  {
                    "option": "Yes"
                  }
                ]
              }
            },
            {
              "fieldType": "dropdown",
              "fieldLabel": "Skip permanently-closed businesses",
              "fieldOptions": {
                "values": [
                  {
                    "option": "Yes"
                  },
                  {
                    "option": "No"
                  }
                ]
              }
            }
          ]
        },
        "formDescription": "Search on Google Maps in your browser, copy the page URL, and paste it below. You'll get those exact businesses back \u2014 with phone numbers and the email listed on their website. Because it uses your own search link, you can compare the results to what you saw on the map."
      },
      "typeVersion": 2.2
    },
    {
      "id": "node-scrape",
      "name": "Scrape Google Maps (Apify)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        224,
        304
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/acts/compass~crawler-google-places/run-sync-get-dataset-items",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        },
        "jsonBody": "={\n  \"startUrls\": [{ \"url\": \"{{ $json['Google Maps URL'] }}\" }],\n  \"maxCrawledPlacesPerSearch\": {{ $json['How many leads'] }},\n  \"scrapeContacts\": true,\n  \"placeMinimumStars\": \"{{ $json['Minimum rating']==='4.5+' ? 'fourAndHalf' : $json['Minimum rating']==='4+' ? 'four' : $json['Minimum rating']==='3.5+' ? 'threeAndHalf' : $json['Minimum rating']==='3+' ? 'three' : '' }}\",\n  \"website\": \"{{ $json['Only businesses with a website']==='Yes' ? 'withWebsite' : 'allPlaces' }}\",\n  \"skipClosedPlaces\": {{ $json['Skip permanently-closed businesses']==='No' ? false : true }},\n  \"language\": \"en\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "apifyApi"
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        },
        "httpQueryAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "node-build",
      "name": "Build lead list",
      "type": "n8n-nodes-base.set",
      "position": [
        448,
        304
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f1",
              "name": "business",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "f2",
              "name": "category",
              "type": "string",
              "value": "={{ $json.categoryName }}"
            },
            {
              "id": "f3",
              "name": "rating",
              "type": "string",
              "value": "={{ $json.totalScore }}"
            },
            {
              "id": "f4",
              "name": "reviews",
              "type": "string",
              "value": "={{ $json.reviewsCount }}"
            },
            {
              "id": "f5",
              "name": "phone",
              "type": "string",
              "value": "={{ $json.phoneUnformatted || $json.phone }}"
            },
            {
              "id": "f6",
              "name": "website",
              "type": "string",
              "value": "={{ $json.website }}"
            },
            {
              "id": "f7",
              "name": "office_email",
              "type": "string",
              "value": "={{ ($json.emails || [])[0] }}"
            },
            {
              "id": "f8",
              "name": "address",
              "type": "string",
              "value": "={{ $json.address }}"
            },
            {
              "id": "f9",
              "name": "city",
              "type": "string",
              "value": "={{ $json.city }}"
            },
            {
              "id": "f10",
              "name": "country",
              "type": "string",
              "value": "={{ $json.countryCode }}"
            },
            {
              "id": "f11",
              "name": "maps_url",
              "type": "string",
              "value": "={{ $json.url }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "node-csv",
      "name": "Make CSV file",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        672,
        304
      ],
      "parameters": {
        "options": {
          "fileName": "google-maps-leads.csv"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "node-download",
      "name": "Download CSV",
      "type": "n8n-nodes-base.form",
      "position": [
        896,
        304
      ],
      "parameters": {
        "options": {},
        "operation": "completion",
        "respondWith": "returnBinary",
        "completionTitle": "Your leads are ready \u2705",
        "completionMessage": "Download the CSV below, then import it into Google Sheets (File \u2192 Import) or Excel."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-sell",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -624,
        -32
      ],
      "parameters": {
        "color": 6,
        "width": 436,
        "height": 732,
        "content": "## Turn a Google Maps search into a list of leads\n\nDo a normal search on Google Maps, paste the link here, and you get those businesses back in a spreadsheet \u2014 name, phone number, website, and email for each one.\n\nFrom there you can call them, send a WhatsApp or a text, or email them. Each email is the business's own address, listed on their website.\n\n---\n\n**What to enter**\n\n**Google Maps URL** \u2014 search on Google Maps like you normally would (e.g. \"plumbers in Miami\"), then copy the link from your browser's address bar and paste it here. You get exactly the places you saw.\n\n**How many leads** \u2014 how many businesses you want back. Start with 25 to try it.\n\n**Optional filters** \u2014 minimum rating, only businesses with a website, and skip permanently-closed places."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-apify",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        48,
        592
      ],
      "parameters": {
        "color": 5,
        "width": 460,
        "height": 2068,
        "content": "## \ud83d\udd11  One-time setup \u2014 your free Apify key  (~2 min)\n\nApify runs the scraping + email finding. The **free plan gives you $5 of credits every month** \u2014 enough to pull your first few hundred leads for **$0**.\n\n**1.  Create a free account** at **[apify.com](https://www.apify.com?fpr=rugg)** (no card needed).\n![](https://i.imgur.com/XEcG6I1.png)\n\n**2.  Open  Settings \u2192 API & Integrations**  in the Apify Console.\n![](https://i.imgur.com/C1YN9Um.png)\n\n**3.  Copy your  Personal API token.**\n![](https://i.imgur.com/kthZfd5.png)\n\n**4.  Add it to n8n:**  open the **Scrape Google Maps (Apify)** node \u2192 *Authentication* \u2192 **Predefined Credential Type** \u2192 choose **Apify API** \u2192 **Create new credential** \u2192 **paste your token** inside \"API Key\" \u2192 **Save**.\n![](https://i.imgur.com/unKByvE.png)\n![](https://i.imgur.com/yX9OOSC.png)\n\n\n\u2705  You only do this once \u2014 every run after that just works."
      },
      "typeVersion": 1
    },
    {
      "id": "de493bcc-0b8d-4ea3-869a-0abb37030348",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        384,
        32
      ],
      "parameters": {
        "color": 7,
        "height": 448,
        "content": "## Prepare lead records\n\nTakes the scraped Google Maps results and maps the key lead fields such as business name, category, rating, and review count into a structured list."
      },
      "typeVersion": 1
    },
    {
      "id": "fbaf2736-da45-47b8-bb06-c71beff90d87",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        128
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 352,
        "content": "## Create downloadable CSV\n\nConverts the structured lead list into a CSV file and returns it through a form response for download."
      },
      "typeVersion": 1
    },
    {
      "id": "d9760443-f223-4ec4-8994-7ae4370fda14",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        96
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 384,
        "content": "## Submit scrape request\n\nStarts the workflow from a form submission and sends the provided Google Maps search URL or lead request details to the Apify Google Maps scraping actor."
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "4ab6ae5b-7ba2-4fd8-94a2-d36b5a839763",
  "nodeGroups": [],
  "connections": {
    "Make CSV file": {
      "main": [
        [
          {
            "node": "Download CSV",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build lead list": {
      "main": [
        [
          {
            "node": "Make CSV file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lead request (form)": {
      "main": [
        [
          {
            "node": "Scrape Google Maps (Apify)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Google Maps (Apify)": {
      "main": [
        [
          {
            "node": "Build lead list",
            "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 collects a Google Maps search URL and lead filters through an n8n form, uses Apify to scrape matching places (including phone numbers and website emails), then returns a downloadable CSV file of the lead list. Receives a lead request via an n8n form with a Google…

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

This workflow uses the Zyte API to automatically detect and extract structured data from E-commerce sites, Articles, Job Boards, and Search Engine Results (SERP) - no custom CSS selectors required.

Form Trigger, HTTP Request, Form
Web Scraping

This templates helps you extract the top performing pages from your website using Google Analytics scrape the content of the pages using Firecrawl API (HTTP node provided) build a knowledge graph for

HTTP Request, Google Analytics, Form +1
Web Scraping

Travel agencies, freelance travel planners, or anyone who wants to automate personalized trip planning by combining real-time hotel and flight data with AI-generated recommendations. Collects travel d

Form Trigger, @Apify/N8N Nodes Apify, HTTP Request +4
Web Scraping

This workflow collects a LinkedIn profile URL via an n8n form, scrapes the public profile data using the Apify LinkedIn Profile Scraper actor, analyzes the results with a Groq-hosted Llama model, and

Form Trigger, HTTP Request, Chain Llm +2
Web Scraping

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

Form Trigger, HTTP Request, Google Sheets