This workflow corresponds to n8n.io template #7607 — we link there as the canonical source.
This workflow follows the Airtable → Gmail 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 →
{
"id": "RDxVDTX2mj9U1BO2",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Google Maps leads: names, emails, phones with Apify + Airtable + personalized emails",
"tags": [],
"nodes": [
{
"id": "1a38e723-d45b-4ec1-ae13-1770aab8cfc9",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
272,
-48
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "bc63dc4b-5bbc-4b6e-9886-3b7991c4cb05",
"name": "GO",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-240,
-48
],
"parameters": {},
"typeVersion": 1
},
{
"id": "e303891a-36f4-47d1-a0ff-06ae06a7761b",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1264,
-928
],
"parameters": {
"color": 7,
"width": 336,
"height": 208,
"content": ""
},
"typeVersion": 1
},
{
"id": "94423aac-8826-4f99-9bc5-7fade0182d02",
"name": "APIFY SCRAPT GOOGLE MAPS",
"type": "n8n-nodes-base.httpRequest",
"position": [
32,
-48
],
"parameters": {
"url": "YOUR URL ",
"method": "POST",
"options": {},
"jsonBody": "{\n \"area_height\": 10,\n \"area_width\": 10,\n \"emails_only\": true,\n \"gmaps_url\": \"https://www.google.com/maps/search/centres+de+formation+%C3%A0+proximit%C3%A9+de+Amiens/@49.7566146,2.2528038,9.75z?entry=ttu&g_ep=EgoyMDI1MDgxMy4wIKXMDSoASAFQAw%3D%3D\",\n \"max_results\": 200,\n \"search_query\": \"centre de formation\"\n}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "1239d5a5-8fee-4049-b052-581f0b1558ad",
"name": "CLEAN DATA MAPPING",
"type": "n8n-nodes-base.set",
"position": [
544,
-48
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "91a75c6f-35b8-42da-8e6f-7819146738da",
"name": "Soci\u00e9t\u00e9",
"type": "string",
"value": "={{ $json.name }}"
},
{
"id": "935cde97-255a-48b2-ab31-e4f9e8090370",
"name": "Mail",
"type": "string",
"value": "={{ $json.email }}"
},
{
"id": "9a97e5ed-d4c6-459a-815c-bfa657325353",
"name": "T\u00e9l\u00e9phone",
"type": "string",
"value": "={{ $json.phone_number }}"
},
{
"id": "72aeb15f-c2e7-4995-94ef-1deda482cdc1",
"name": "Site Web",
"type": "string",
"value": "={{ $json.website_url }}"
},
{
"id": "a3dc6fc2-2a8e-4974-9975-0bd768f776d9",
"name": "Linkedin",
"type": "string",
"value": "={{ $json.linkedin }}"
},
{
"id": "d90903e6-4b18-45ea-b0d0-e836f6996d6e",
"name": "Facebook",
"type": "string",
"value": "={{ $json.facebook }}"
},
{
"id": "d8b054b7-4b4f-446c-8d43-df1f183d7885",
"name": "Ville",
"type": "string",
"value": "={{ $json.city }} "
},
{
"id": "79d3f281-fd47-4bf0-bfeb-5db91af83ea8",
"name": "Cat\u00e9gorie centre formation",
"type": "string",
"value": "={{ $json.google_business_categories }}"
},
{
"id": "41a8eb11-c02a-4e0a-ba35-3985dd42dd08",
"name": "Notes google maps",
"type": "string",
"value": "={{ $json.reviews_number }} avis avec une note de {{ $json.review_score }} / 5 "
},
{
"id": "40c0b0ef-4ad3-4138-9c35-ca5e817574d9",
"name": "Lien Google MAP ",
"type": "string",
"value": "={{ $json.google_maps_url }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "2f44f519-83b5-45f5-8c97-572eb0830239",
"name": "AIRTABLE CREATE RECORD",
"type": "n8n-nodes-base.airtable",
"position": [
960,
-48
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appA6eMHOoquiTCeO",
"cachedResultUrl": "https://airtable.com/appA6eMHOoquiTCeO",
"cachedResultName": "GOOGLE MAPS SCRAPT"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblZFszM5ubwwSYDK",
"cachedResultUrl": "https://airtable.com/appA6eMHOoquiTCeO/tblZFszM5ubwwSYDK",
"cachedResultName": "Google maps scrapt"
},
"columns": {
"value": {
"Mail": "={{ $json.Mail }}",
"Ville": "={{ $json.Ville }}",
"Facebook": "={{ $json.Facebook }}",
"Linkedin": "={{ $json.Linkedin }}",
"Site Web": "={{ $json['Site Web'] }}",
"Soci\u00e9t\u00e9": "={{ $json['Soci\u00e9t\u00e9'] }}",
"T\u00e9l\u00e9phone": "={{ $json['T\u00e9l\u00e9phone'] }}",
"Lien Google Maps": "={{ $json['Lien Google MAP '] }}",
"Notes google maps": "={{ $json['Notes google maps'] }}",
"Cat\u00e9gorie centre formation": "={{ $json['Cat\u00e9gorie centre formation'] }}"
},
"schema": [
{
"id": "Soci\u00e9t\u00e9",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Soci\u00e9t\u00e9",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mail",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Mail",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "T\u00e9l\u00e9phone",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "T\u00e9l\u00e9phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Site Web",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Site Web",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Linkedin",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Linkedin",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Facebook",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Facebook",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Ville",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Ville",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Cat\u00e9gorie centre formation",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Cat\u00e9gorie centre formation",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Notes google maps",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Notes google maps",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Lien Google Maps",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Lien Google Maps",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "118454ed-e384-40fe-b95a-111b71c5c9e7",
"name": "SEND EMAIL AUTOMATIC",
"type": "n8n-nodes-base.gmail",
"position": [
1376,
-48
],
"parameters": {
"sendTo": "={{ $json.fields.Mail }}",
"message": "=<div style=\"font-family:Arial,Helvetica,sans-serif;font-size:15px;line-height:1.6;color:#111;max-width:620px;margin:0 auto;padding:18px\"> \n <p>Hello {{ $json.fields['Soci\u00e9t\u00e9'] }} team,</p> \n\n <p>I design custom automations for training centers. Goal: <strong>zero repetitive manual tasks</strong>, from registration to invoicing.</p> \n\n <ul style=\"padding-left:18px;margin:10px 0\"> \n <li>Registrations \u2192 Airtable + automatic file generation (Drive/PDF).</li> \n <li>Invitations & reminders \u2192 scheduled email/SMS.</li> \n <li>Attendance (e.g. EduSign) \u2192 automatic export & archiving.</li> \n <li>Invoicing & OPCO files \u2192 generation + storage in the right folders.</li> \n <li>Weekly reporting \u2192 KPIs sent by email/Slack.</li> \n </ul> \n\n <p style=\"margin-top:12px\"> \n <em>Info:</em> {{ $json.fields['Soci\u00e9t\u00e9'] }} in {{ $json.fields.Ville }} \n \u2014 website: <a href=\"{{ $json.fields['Site Web'] }}\" style=\"color:#0b5fff\">{{ $json.fields['Site Web'] }}</a> \n {{ $json.fields['Notes google maps'] ? ('\u2014 ' + $json.fields['Notes google maps']) : '' }} \n </p> \n\n <p>Would you be open to a quick <strong>15-min call</strong> (video) where I show you a mini-workflow adapted to {{ $json.fields['Soci\u00e9t\u00e9'] }}?</p> \n\n <p style=\"margin:16px 0\"> \n <a href=\"https://calendly.com/ton-lien/15min\" style=\"background:#0b5fff;color:#fff;text-decoration:none;padding:10px 14px;border-radius:8px;display:inline-block\">Book a slot</a> \n </p> \n\n <p>Talk soon,<br/>Baptiste Fort</p> \n</div>\n",
"options": {},
"subject": "={{ $json.fields['Soci\u00e9t\u00e9'] }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "e7b95129-ab76-48d6-b7ad-f006c4ce38c2",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-288,
-336
],
"parameters": {
"height": 464,
"content": "## **Step 1 \u2013 GO Trigger** \n- **Node**: Manual Trigger \n- **Purpose**: Start the workflow manually. \n\ud83d\udc49 You can replace this trigger with a **Webhook** (to launch the flow via a URL) or a **Cron** (to run it automatically on a schedule). "
},
"typeVersion": 1
},
{
"id": "53d9dca3-704c-4d6e-9537-b0c2f0432634",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-48,
-768
],
"parameters": {
"color": 2,
"width": 256,
"height": 896,
"content": "## **Step 2 \u2013 Scrape Google Maps** \n- **Node**: HTTP Request \n- **Method**: `POST` \n\n**Where to find the Apify URL?** \n1. Go to [Google Maps Email Leads Fast Scraper](https://console.apify.com/actors/j66N0LgqJT3a7fSzu/input) \n2. Click on **API** (top right) \n3. Open **API Endpoints** \n4. Copy the URL of the **3rd option**: *Run Actor synchronously and get dataset items* \n\n\ud83d\udc49 This URL already includes your **Apify API token**. \n\n **Body Content Type**: JSON \n- **Body JSON (example)**: \n\n- **Body Content Type**: JSON \n- **Body JSON (example)**: \n\n*{ \n \"area_height\": 10, \n \"area_width\": 10, \n \"emails_only\": true, \n \"gmaps_url\": \"https://www.google.com/maps/search/training+centers+near+Amiens/\", \n \"max_results\": 200, \n \"search_query\": \"training center\" \n}* "
},
"typeVersion": 1
},
{
"id": "0d2bf046-8eae-463e-b3a9-46212f2080a1",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
208,
-336
],
"parameters": {
"color": 3,
"height": 464,
"content": "## Step 3 \u2013 Wait \n\n- **Node**: Wait \n- **Purpose**: Give the scraper enough time to return data. \n- **Recommended delay**: *10 seconds* (adjust if needed). \n\n\ud83d\udc49 This ensures that Apify has finished processing before we continue. "
},
"typeVersion": 1
},
{
"id": "cb179395-d2bf-424a-b1a7-6c4df0b3621b",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
448,
-624
],
"parameters": {
"color": 4,
"width": 304,
"height": 752,
"content": "## Step 4 \u2013 Mapping \n\n- **Node**: Set \n- **Purpose**: Clean and reorganize the raw dataset into structured fields that match Airtable columns. \n\n**Assignments (example):** \n\n*Company = {{ $json.name }}* \n*Email = {{ $json.email }}* \n*Phone = {{ $json.phone_number }}* \n*Website = {{ $json.website_url }}* \n*LinkedIn = {{ $json.linkedin }}* \n*Facebook = {{ $json.facebook }}* \n*City = {{ $json.city }}* \n*Category = {{ $json.google_business_categories }}* \n*Google Maps Reviews = {{ $json.reviews_number }} reviews, rating {{ $json.review_score }}/5* \n*Google Maps Link = {{ $json.google_maps_url }}* \n\n\ud83d\udc49 **Result**: The data is now clean and ready for Airtable."
},
"typeVersion": 1
},
{
"id": "c852694e-bb9c-4e95-bf48-12da1b5fe71c",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
752,
-1088
],
"parameters": {
"color": 5,
"width": 512,
"height": 1216,
"content": "## Step 5 \u2013 Airtable Storage \n\n- **Node**: Airtable \u2192 Create Record \n- **Parameters**: \n - **Credential to connect with**: Airtable Personal Access Token account \n - **Resource**: Record \n - **Operation**: Create \n - **Base**: Select from list \u2192 your base (example: *GOOGLE MAPS SCRAPT*) \n - **Table**: Select from list \u2192 your table (example: *Google maps scrapt*) \n - **Mapping Column Mode**: Map Each Column Manually \n\n\ud83d\udc49 To get your **Base ID** and **Table ID**, open your Airtable in the browser: \n*https://airtable.com/appA6eMHOoquiTCeO/tblZFszM5ubwwSYDK* \n\nHere: \n- Base ID = *appA6eMHOoquiTCeO* \n- Table ID = *tblZFszM5ubwwSYDK* \n\n### Authentication \n\n1. Go to: [https://airtable.com/create/tokens](https://airtable.com/create/tokens) \n2. Create a new Personal Access Token \n3. Give it access to the correct base \n4. Copy the token into n8n credentials (select **Airtable Personal Access Token**). \n\n\n### Field Mapping (example) \n\n*Company: {{ $json['Company'] }}* \n*Email: {{ $json.Email }}* \n*Phone: {{ $json['Phone'] }}* \n*Website: {{ $json['Website'] }}* \n*LinkedIn: {{ $json.LinkedIn }}* \n*Facebook: {{ $json.Facebook }}* \n*City: {{ $json.City }}* \n*Category: {{ $json['Category'] }}* \n*Google Maps Reviews: {{ $json['Google Maps Reviews'] }}* \n*Google Maps Link: {{ $json['Google Maps Link'] }}* \n\n\ud83d\udc49 **Result**: Each lead scraped from Google Maps is automatically saved into Airtable, ready to be filtered, sorted, or used for outreach."
},
"typeVersion": 1
},
{
"id": "1e09688f-058c-46a7-a96b-a1a645e3de9b",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
1264,
-720
],
"parameters": {
"color": 7,
"width": 336,
"height": 848,
"content": "## Step 6 \u2013 Automatic Email \n\n- **Node**: Gmail \u2192 Send Email \n- **Parameters**: \n - **To**: *= {{ $json.fields.Email }}* \n - **Subject**: *= {{ $json.fields['Company'] }}* \n - **Message**: HTML email with dynamic lead details. \n\n**Example HTML message:** \n\n*Hello {{ $json.fields['Company'] }} team,* \n\n*I design custom automations for training centers.* \n*Goal: zero repetitive manual tasks, from registration to invoicing.* \n\n*Details: {{ $json.fields['Company'] }} in {{ $json.fields.City }} \u2014 website: {{ $json.fields['Website'] }} \u2014 {{ $json.fields['Google Maps Reviews'] }}* \n\n*Interested in a quick 15-min call to see a live demo?* \n\n\ud83d\udc49 **Result**: Each contact receives a fully personalized email with their company name, city, website, and Google Maps rating."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "fceb5fdc-0432-44c5-9b74-70d517601074",
"connections": {
"GO": {
"main": [
[
{
"node": "APIFY SCRAPT GOOGLE MAPS",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "CLEAN DATA MAPPING",
"type": "main",
"index": 0
}
]
]
},
"CLEAN DATA MAPPING": {
"main": [
[
{
"node": "AIRTABLE CREATE RECORD",
"type": "main",
"index": 0
}
]
]
},
"AIRTABLE CREATE RECORD": {
"main": [
[
{
"node": "SEND EMAIL AUTOMATIC",
"type": "main",
"index": 0
}
]
]
},
"APIFY SCRAPT GOOGLE MAPS": {
"main": [
[
{
"node": "Wait",
"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.
airtableTokenApigmailOAuth2
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is perfect for anyone who wants to: Automatically collect contacts from Google Maps: emails, phone numbers, websites, social media (LinkedIn, Facebook), city, ratings, and reviews. Organize everything neatly in Airtable, without dealing with messy CSV exports that…
Source: https://n8n.io/workflows/7607/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This n8n workflow collects leads from Google Maps, scrapes their websites via direct HTTP requests, and extracts valid email addresses — all while mimicking real user behavior to improve scraping reli
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
PDF convert. Uses n8n-nodes-pdfco, httpRequest, gmail, n8n-nodes-pdfkit. Event-driven trigger; 19 nodes.
🚀 Instagram Leads Scraper (Perfect for Cold Outreach)
Marketers, lead generation agencies, freelancers, consultants, and sales teams who need to collect business leads from Google Maps. Small business owners looking to build targeted local business lists