Scrape Google Maps Leads (Email, Phone, Website) Using Apify + Google Places + Airtable
### Who is it for? This workflow is for **marketers, sales teams, and local businesses** who want to quickly collect leads (business name, phone, website, and email) from Google Maps and store them in Airtable. You can use it for **real estate agents, restaurants, therapists, or any local niche**. --- ## How it works 1. **Scrape Google Maps** with [Apify Google Maps Extractor](https://apify.com/compass/google-maps-extractor). 2. **Clean and structure the data** (name, address, phone, website). 3. **Visit each website** and retrieve the raw HTML. 4. **Use GPT** to extract the most relevant email from the site content. 5. **Save everything to Airtable** for easy filtering and future outreach. It works for **any location or keyword** - just adapt the input in Apify. --- ## Requirements Before running this workflow, you'll need: - An **Apify account** (to use the Google Maps Extractor) - An **OpenAI API key** (for GPT email extraction) - An **Airtable account & base** with the following fields: - `Business Name` - `Address` - `Website` - `Phone Number` - `Email` - `Google Maps URL` --- ## Airtable Structure Your Airtable base should contain these columns: | Title | Street | Website | Phone Number | Email | URL | |--------------------------|--------------------------|---------------------|-----------------|-------------------|--------------------| | Paris Real Estate Agency | 10 Rue de Rivoli, Paris | https://agency.fr | +33 1 23 45 67 | contact@agency.fr | maps.google.com/...| | Example Business 2 | 25 Avenue de l'Opéra | https://example.fr | +33 1 98 76 54 | info@example.fr | maps.google.com/...| | Example Business 3 | 8 Boulevard Haussmann | https://demo.fr | +33 1 11 22 33 | contact@demo.fr | maps.google.com/...| --- ## Error Handling - **Missing websites:** If a business has no website, the flow skips the scraping step. - **No email found:** GPT returns `Null` if no email is detected. - **API rate limits:** Add a `Wait` node between requests to avoid Apify/OpenAI throttling.  Now let's take a detailed look at how to set up this automation, using real estate agencies in Paris as an example. ## Step 1 - Launch the Google Maps Scraper Start with a When clicking Execute workflow trigger to launch the flow manually. Then, **add an HTTP Request** node with the method set to POST. Head over to Apify: Google Maps Extractor  On the page: [https://apify.com/compass/google-maps-extractor](https://apify.com/compass/google-maps-extractor) Enter your business keyword (e.g., real estate agency, hairdresser, restaurant) Set the location you want to target (e.g., Paris, France) Choose how many results to fetch (e.g., 50) Optionally, use filters (only places with a website, by category, etc.) No matter your industry, this works - just adapt the keyword and location. Once everything is filled in: Click Run to test. Then, go to the top right and click on API. Select the API endpoints tab. Choose Run Actor synchronously and get dataset items.  Copy the URL and paste it into your HTTP Request (in the URL field). Then enable: - Body Content Type → JSON - Specify Body Using JSON Go back to Apify, click on the JSON tab, copy the entire code, and paste it into the JSON body field of your HTTP Request.  At this point, if you run your workflow, you should see a structured output similar to this: title subtitle price categoryName address neighborhood street city postalCode ........ ## Step 2 - Clean and structure the data  Once the raw data is fetched from Apify, we clean it up using the Edit Fields node. In this step, we manually select and rename the fields we want to keep: - Title → {{ $json.title }} - Address → {{ $json.address }} - Website → {{ $json.website }} - Phone → {{ $json.phone }} - URL → {{ $json.url }}* This node lets us keep only the essentials in a clean format, ready for the next steps. On the right: a clear and usable table, easy to work with. ## Step 3 - Loop Over Items  Now that our data is clean (see step 2), we'll go through it item by item to handle each contact individually. The Loop Over Items node does exactly that: It takes each row from the table (each contact pulled from Apify) and runs the next steps on them, one by one. Just set a Batch Size of 20 (or more, depending on your needs). Nothing tricky here, but this step is essential to keep the flow dynamic and scalable. ## Step 4 - Edit Field (again) 
Who is it for?
This workflow is for marketers, sales teams, and local businesses who want to quickly collect leads (business name, phone, website, and email) from Google Maps and store them in Airtable.
You can use it for real estate agents, restaurants, therapists, or any local niche.
How it works
- Scrape Google Maps with Apify Google Maps Extractor.
- Clean and structure the data (name, address, phone, website).
- Visit each website and retrieve the raw HTML.
- Use GPT to extract the most relevant email from the site content.
- Save everything to Airtable for easy filtering and future outreach.
It works for any location or keyword - just adapt the input in Apify.
Requirements
Before running this workflow, you'll need:
- An Apify account (to use the Google Maps Extractor)
- An OpenAI API key (for GPT email extraction)
- An Airtable account & base with the following fields:
Business NameAddressWebsitePhone NumberEmailGoogle Maps URL
Airtable Structure
Your Airtable base should contain these columns:
| Title | Street | Website | Phone Number | URL | |
|---|---|---|---|---|---|
| Paris Real Estate Agency | 10 Rue de Rivoli, Paris | https://agency.fr | +33 1 23 45 67 | contact@agency.fr | maps.google.com/... |
| Example Business 2 | 25 Avenue de l'Opéra | https://example.fr | +33 1 98 76 54 | info@example.fr | maps.google.com/... |
| Example Business 3 | 8 Boulevard Haussmann | https://demo.fr | +33 1 11 22 33 | contact@demo.fr | maps.google.com/... |
Error Handling
- Missing websites: If a business has no website, the flow skips the scraping step.
- No email found: GPT returns
Nullif no email is detected. - API rate limits: Add a
Waitnode between requests to avoid Apify/OpenAI throttling.
Now let's take a detailed look at how to set up this automation, using real estate agencies in Paris as an example.
Step 1 - Launch the Google Maps Scraper
Start with a When clicking Execute workflow trigger to launch the flow manually.
Then, add an HTTP Request node with the method set to POST.
Head over to Apify: Google Maps Extractor
On the page: https://apify.com/compass/google-maps-extractor
Enter your business keyword (e.g., real estate agency, hairdresser, restaurant)
Set the location you want to target (e.g., Paris, France)
Choose how many results to fetch (e.g., 50)
Optionally, use filters (only places with a website, by category, etc.) No matter your industry, this works - just adapt the keyword and location.
Once everything is filled in:
Click Run to test.
Then, go to the top right and click on API.
Select the API endpoints tab.
Choose Run Actor synchronously and get dataset items.
Copy the URL and paste it into your HTTP Request (in the URL field).
Then enable:
- Body Content Type → JSON
- Specify Body Using JSON
Go back to Apify, click on the JSON tab, copy the entire code, and paste it into the JSON body field of your HTTP Request.
At this point, if you run your workflow, you should see a structured output similar to this:
title subtitle price categoryName address neighborhood street city postalCode ........
Step 2 - Clean and structure the data
Once the raw data is fetched from Apify, we clean it up using the Edit Fields node.
In this step, we manually select and rename the fields we want to keep:
- Title → {{ $json.title }}
- Address → {{ $json.address }}
- Website → {{ $json.website }}
- Phone → {{ $json.phone }}
- URL → {{ $json.url }}*
This node lets us keep only the essentials in a clean format, ready for the next steps. On the right: a clear and usable table, easy to work with.
Step 3 - Loop Over Items
Now that our data is clean (see step 2), we'll go through it item by item to handle each contact individually.
The Loop Over Items node does exactly that:
It takes each row from the table (each contact pulled from Apify) and runs the next steps on them, one by one.
Just set a Batch Size of 20 (or more, depending on your needs).
Nothing tricky here, but this step is essential to keep the flow dynamic and scalable.
Step 4 - Edit Field (again)
New buyers can create an account from the cart to unlock a controlled $10 first-purchase credit on eligible orders of $25+.
Related bundle
Lead Generation Machine
8 hand-picked workflows for $49.00.
That is $6.13 each, vs $14.99 for this one alone.
View bundleSecure checkout powered by Stripe
Support
How to import this workflow into n8n
- 1Purchase or download the workflow to get the n8n workflow JSON file.
- 2In your n8n instance, open Workflows and choose "Import from File" (or paste the JSON with Ctrl+V on the canvas).
- 3Open each node marked with a credential warning and connect your own accounts and API keys.
- 4Run the workflow once manually to verify the data flow, then toggle it to Active.
Related Marketing workflows
- Automate UGC Video Creation and Instagram Posting with Google Gemini and Veo 3$9.99
- Automate Lead Generation and Cold Email Outreach$14.99
- Automate Professional Video Ad Creation from Product Images$19.99
- Track SEO Keyword Rankings with Bright Data MCP and GPT-4o AI Analysis$14.99
- Automate Google Maps Data Scraping and Email Discovery for Local Business Outreach$14.99
- Automate AI-Driven Social Media Content for Auto Services$19.99
More from Baptiste Fort
Need this deployed? We'll set it up for you.
Our automation experts deploy this workflow in your stack, connect your accounts, and verify it works — or build a custom solution from scratch.