Google Maps to Airtable, enriched lead lists ready
Pulling leads from Google Maps sounds simple. Then you’re three tabs deep, copying phone numbers by hand, and still missing the one thing you actually need: a real contact email.
This Maps Airtable enrichment automation hits sales teams hardest, but marketing managers building outreach lists and agency owners selling lead gen feel it too. The payoff is straightforward: you go from “random map results” to a structured Airtable lead list with websites, phone numbers, and enriched emails you can actually use.
Below, you’ll see how the workflow runs, what it outputs, and what you need to set it up without turning this into a technical project.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Maps to Airtable, enriched lead lists ready
flowchart LR
subgraph sg0["Input Form Flow"]
direction LR
n0@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Have URL and OPERATIONAL", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Out", pos: "b", h: 48 }
n3@{ icon: "mdi:swap-vertical", form: "rounded", label: "Main Info", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge"]
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "All Registers", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Convert to File", pos: "b", h: 48 }
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter", pos: "b", h: 48 }
n10@{ icon: "mdi:memory", form: "rounded", label: "Window Buffer Memory", pos: "b", h: 48 }
n11@{ icon: "mdi:robot", form: "rounded", label: "Web Scraping Agent", pos: "b", h: 48 }
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Domain and Sitemap"]
n13@{ icon: "mdi:swap-vertical", form: "rounded", label: "URLs", pos: "b", h: 48 }
n14@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser1", pos: "b", h: 48 }
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>Input Form"]
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Google Places Search"]
n17@{ icon: "mdi:brain", form: "rounded", label: "GPT-5-mini", pos: "b", h: 48 }
n18@{ icon: "mdi:swap-vertical", form: "rounded", label: "Format Input", pos: "b", h: 48 }
n19@{ icon: "mdi:robot", form: "rounded", label: "Places Query Agent", pos: "b", h: 48 }
n20@{ icon: "mdi:swap-vertical", form: "rounded", label: "Places_API_Key", pos: "b", h: 48 }
n21@{ icon: "mdi:brain", form: "rounded", label: "GPT-5-mini1", pos: "b", h: 48 }
n22["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/form.svg' width='40' height='40' /></div><br/>Form"]
n23@{ icon: "mdi:cog", form: "rounded", label: "web_scraper_tool", pos: "b", h: 48 }
n24["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtable.svg' width='40' height='40' /></div><br/>Create a record"]
n25["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Finish message"]
n26@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", pos: "b", h: 48 }
n27@{ icon: "mdi:cog", form: "rounded", label: "Wait 8 Sec", pos: "b", h: 48 }
n28@{ icon: "mdi:cog", form: "rounded", label: "Wait 8 Sec1", pos: "b", h: 48 }
n29@{ icon: "mdi:location-exit", form: "rounded", label: "Error", pos: "b", h: 48 }
n7 --> n29
n7 --> n16
n26 --> n24
n26 --> n28
n22 --> n20
n13 --> n11
n4 --> n26
n9 --> n6
n3 --> n4
n2 --> n0
n17 -.-> n19
n15 --> n22
n27 --> n5
n21 -.-> n11
n28 --> n0
n18 --> n19
n5 --> n0
n20 --> n18
n6 --> n25
n24 --> n27
n0 --> n9
n0 --> n1
n23 -.-> n11
n12 --> n13
n19 --> n7
n11 --> n4
n16 --> n2
n10 -.-> n11
n1 --> n3
n1 --> n12
n1 --> n0
n8 -.-> n19
n14 -.-> n11
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n15 trigger
class n8,n11,n14,n19 ai
class n17,n21 aiModel
class n10 ai
class n1,n7,n9,n26 decision
class n24 database
class n16 api
class n12 code
class n6 disabled
class n9 disabled
class n25 disabled
classDef customIcon fill:none,stroke:none
class n4,n12,n15,n16,n22,n24,n25 customIcon
The Problem: Google Maps leads are messy and slow to use
You can find plenty of businesses on Google Maps. The frustrating part is turning those listings into an outreach-ready list. Half the entries have no usable website, some are closed, and the contact email is almost never visible. So you open each site, hunt for a contact page, copy details into a sheet, then clean it all again before it’s safe to send to your CRM or outreach tool. Even with a small target list, it becomes a multi-hour task, and errors sneak in because you’re doing repetitive work while switching between tabs.
The friction compounds. Here’s where it breaks down.
- Manual copy-paste turns 20 leads into a tedious session of typing, checking, and re-checking.
- Google Maps results include non-operational businesses, which means you waste time on dead ends.
- Websites rarely show emails upfront, so you end up clicking around “Contact” and “About” pages for each company.
- Data gets logged inconsistently, and later you’re stuck cleaning columns instead of sending outreach.
The Solution: Google Maps leads into Airtable, with email enrichment
This workflow automates the whole loop: search, filter, enrich, then store. You start by filling out a simple form with the country, city, and business type you want. An AI agent turns that input into a better Google Places query, then n8n calls the official Google Places (Google Maps) API to pull up to about 20 matching businesses. From there, the workflow filters out low-quality entries (like businesses that aren’t operational or don’t have a website). For every valid lead, a second AI “web scraping” agent uses Jina AI to visit the company site and look for a contact email by checking common paths like /contact or /about. Finally, the workflow writes a clean, consistent record into Airtable with the company name, website, address, phone, location link, language code, and the enriched email.
It starts with a form submission inside n8n. Then Google Maps data is pulled and cleaned before enrichment happens. Airtable becomes the final source of truth, so your outreach list is ready the moment the run finishes.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you need 20 roofing contractors in Austin for a cold email campaign. Manually, you might spend about 5 minutes per business (open Maps, find site, hunt for email, copy details), which is roughly 100 minutes for a small list. With this workflow, you spend about 2 minutes filling the form, then wait while it fetches results, checks websites, and enriches emails. Even if the run takes 15–20 minutes end to end, your hands-on time drops to almost nothing, and Airtable is populated automatically.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Airtable for storing leads in a base
- Google Places API to pull Google Maps business data
- OpenAI API key (get it from your OpenAI dashboard)
- Jina AI API key (get it from your Jina AI account)
Skill level: Intermediate. You’ll mostly paste API keys, map Airtable fields, and run a few test executions.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Form submission kicks things off. You enter country, city, and business type in the n8n form, and the workflow validates the input so you don’t burn API calls on junk requests.
The search query gets improved automatically. An OpenAI-powered agent rewrites your request into a better Google Places query, then n8n sends it via HTTP Request to the Google Places (Maps) API.
Results are cleaned and processed in batches. n8n expands the API response into individual businesses, loops through them with split-in-batches, checks if the listing is operational, and confirms there’s a valid website before enrichment.
Email enrichment happens on the company website. The workflow generates a URL list (including likely contact pages), then a Jina AI-powered scraping tool helps the agent locate a real email address and return structured data.
Airtable gets the final record. The workflow merges details (name, phone, address, Maps link, language code) with the email, then creates a new Airtable row. You can also enable the optional file output or Slack message if you want a “run finished” notification.
You can easily modify the number of leads fetched to match your budget and outreach volume. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
This workflow begins when a form submission is received, which then feeds data into the lead enrichment pipeline.
- Add the Form Intake Trigger node as the workflow trigger.
- Connect Form Intake Trigger to Form Receiver to capture submitted fields.
- In Form Receiver, confirm your form fields match the data you expect to send into the workflow.
Step 2: Prepare Places API Payload and Search
The workflow builds the request payload for a Places search and executes the search through an AI agent.
- In Places API Key, store your API key in fields that Format Payload expects.
- Configure Format Payload to assemble the final request body for Places Search Agent.
- Attach Chat Model A as the language model for Places Search Agent.
- Attach Structured Parse A as the output parser for Places Search Agent to normalize results.
- Connect Places Search Agent to Condition Gate for validation before continuing.
Step 3: Validate and Enrich Places Results
After the search results are validated, the workflow fetches detailed places data and expands it into individual records.
- Set up Condition Gate rules to decide whether results proceed or fail.
- Route failed results to Stop With Error for clear error handling.
- Route valid results to Places API Lookup to retrieve detailed place data.
- Pass the response to Expand Items to split the response into individual items.
- Send expanded items to Iterate Records for controlled batching.
Step 4: Process URLs and Run Web Scraping in Parallel
Each record is checked and then split into two parallel flows to assemble core details and scrape website content.
- From Iterate Records, ensure records flow to Validate URL Status for basic URL checks.
- Validate URL Status outputs to both Core Details and Domain + Sitemap in parallel.
- In Domain + Sitemap, prepare data required by URL List.
- In URL List, format the list of URLs to be scraped by Web Scrape Agent.
- Attach Chat Model B as the language model for Web Scrape Agent.
- Attach Structured Parse B as the output parser and Windowed Memory as memory for Web Scrape Agent.
- Attach Web Scraper Tool as the tool for Web Scrape Agent.
Step 5: Merge, Branch, and Store Lead Records
The core details and scraped data are merged, filtered, and then either stored or delayed depending on the conditional logic.
- Ensure Core Details and Web Scrape Agent both connect to Combine Streams.
- Route Combine Streams to Conditional Branch to decide next actions.
- When the condition passes, send data to Create Airtable Row to save the lead.
- When the condition fails, route to Delay 8 Seconds B and then back to Iterate Records for retries.
Step 6: Optional File Output and Notifications
This workflow includes disabled output nodes for file rendering and Slack notifications you can enable as needed.
- Review Filter Records and Render File Output to produce a file output (both are currently disabled).
- If you enable Render File Output, connect it to Send Slack Notice for notifications.
- Ensure Delay 8 Seconds connects to All Entries and back to Iterate Records for paced processing.
Step 7: Add Error Handling
Error handling prevents invalid requests from continuing and makes failures visible during execution.
- Keep Condition Gate connected to Stop With Error to halt bad requests.
- Ensure error messages in Stop With Error are descriptive if you customize it.
Step 8: Test and Activate Your Workflow
Validate the full path from form submission through Airtable creation and optional notifications before going live.
- Click Execute Workflow and submit a test entry through Form Intake Trigger.
- Confirm that Places Search Agent returns results and Places API Lookup expands them in Expand Items.
- Verify that Create Airtable Row creates a new record for each valid lead.
- If enabled, confirm Send Slack Notice fires after Render File Output.
- Toggle the workflow to Active for production use.
Common Gotchas
- Google Places API credentials can expire or be restricted by billing and API settings. If things break, check your Google Cloud console API key restrictions and Places API enablement first.
- If you’re using Wait nodes or external scraping, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- OpenAI prompts in the agents can be generic out of the box. Add your targeting rules early (industry exclusions, email formats you trust), or you will be reviewing and editing outputs forever.
Frequently Asked Questions
About an hour if you already have the API keys.
No. You’ll connect accounts, paste a few API keys, and match Airtable fields. The only “technical” part is being careful with permissions and testing with a small run first.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI, Jina AI, and Google Places API usage costs, which depend on how many leads you enrich.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you more control but you’ll handle updates and basic monitoring.
Yes, but do it intentionally. In the Google Places Search (HTTP Request) node, increase the pageSize in the JSON body to fetch more results, then keep the batch processing in place so you don’t overwhelm enrichment. Common customizations include changing the lead limit, writing to Google Sheets instead of Airtable, and adjusting the scraping agent prompt to prioritize specific emails (like sales@ or info@).
Most of the time it’s a token or permission issue. Regenerate your Airtable Personal Access Token, make sure it has access to the right base, and reselect the base/table in the “Create Airtable Row” node. If it still fails, check that your Airtable field names match what the workflow expects (even small naming differences can cause mapping errors). Also watch out for rate limits if you run large batches back-to-back.
If you self-host n8n, there’s no hard execution cap (it’s mostly your server and API limits). On n8n Cloud, your monthly execution limit depends on the plan, and enrichment calls can add up because each business may trigger multiple requests. Practically, most teams run this in batches of 20–100 leads per city so quality stays high and costs stay predictable.
Often, yes. This workflow uses branching, looping, and structured AI steps that are awkward (and sometimes expensive) in Zapier-style builders. n8n also gives you more control over batching, retries, and filtering before you spend money on enrichment calls. If your only goal is “send Google Sheets row to Airtable,” Zapier or Make is fine. But for multi-step lead gen with cleanup and scraping, n8n is usually the calmer choice, honestly. Talk to an automation expert if you want help choosing.
Set this up once, and your next lead list is a form submission away. The workflow handles the repetitive digging so you can focus on outreach that actually gets replies.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.