🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

Google Sheets + Apify, clean Google Maps lead lists

Lisa Granqvist Partner Workflow Automation Expert

Building a local lead list sounds simple until you’re three tabs deep, copy-pasting business names, fixing weird formatting, and still missing half the emails. Then you realize you already scraped the same places last week. Again.

This hits marketers running local campaigns first, but agency owners and consultants doing prospecting feel it too. Google Maps leads automation turns that messy, manual “research day” into a repeatable workflow that outputs a clean sheet you can actually use.

This workflow pulls prospects from Google Maps via SerpAPI, scrapes each site with Apify, uses GPT‑4o to extract public emails, then writes everything into Google Sheets while marking searches as complete. You’ll see what it does, why it matters, and what to watch for before you run it.

How This Automation Works

See how this solves the problem:

n8n Workflow Template: Google Sheets + Apify, clean Google Maps lead lists

The Challenge: Clean lead lists from messy local data

Local prospecting breaks down in boring, expensive ways. You search Google Maps, open listings one by one, copy a phone number that’s formatted five different ways, and paste an address that doesn’t fit your CRM fields. Then you visit the website hoping there’s an email somewhere, only to find a contact form and a dozen pages to check. By the time you’ve built a “decent” list, it’s out of date, full of duplicates, and you honestly don’t trust it enough to run outreach at scale.

It’s not one big failure. It’s the pile of small frictions that keeps you stuck in spreadsheet purgatory.

  • You end up re-doing the same search terms because there’s no reliable “processed” flag.
  • Manual copy-paste creates subtle errors, so your outreach bounces or your CRM imports fail.
  • Email discovery turns into tab-hopping, and the best-case outcome is still “maybe we found one.”
  • Your list becomes a one-off artifact instead of a system you can run every week.

The Fix: Google Maps search + website scraping + email extraction

This workflow starts with a simple source of truth: a Google Sheet tab called “Searches” where you store search terms and locations. When you run it, it reads only the rows that aren’t marked Complete, so you don’t keep pulling the same prospects. For each search term + area pair, SerpAPI queries Google Maps and returns core business details like name, website, address, and phone. Next, the workflow visits each website using Apify’s Fast Website Content Crawler, then passes the scraped content to a GPT‑4o AI Agent that looks specifically for publicly listed email addresses. Finally, everything gets written into a “Results” tab, and the original search row is marked Complete so the workflow can be safely re-run.

The flow is simple on purpose. Google Sheets provides the queue, SerpAPI supplies the Maps data, Apify fetches the site content, and GPT‑4o extracts an email when one exists. You end up with a tidy results table ready for outreach or CRM import, not a half-finished research project.

What Changes: Before vs. After

Real-World Impact

Say you run 10 searches a week (like “dentist” in 10 suburbs) and you typically collect 20 prospects per search. Manually, even a quick pass is maybe 5 minutes per business between Maps, the website, and a paste into Sheets, which is about 15 hours for 200 leads. With this workflow, you spend about 20 minutes setting up those 10 rows in the “Searches” tab, then let the automation run while it fetches, scrapes, and writes results. You’ll still review the output, but you’re no longer doing 200 tiny, repetitive tasks.

Requirements

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Google Sheets to store searches and results.
  • SerpAPI for Google Maps search results.
  • Apify to crawl business websites for page content.
  • OpenAI API key (get it from the OpenAI platform dashboard).

Skill level: Intermediate. You’ll connect accounts, install required community nodes, and paste a few API keys in the right places.

Need help implementing this? Talk to an automation expert (free 15-minute consultation).

The Workflow Flow

Google Sheets kicks things off. When you execute the workflow, it reads rows from your “Searches” tab and filters out anything already marked Complete, so it only processes fresh searches.

Each search term is turned into a Google Maps query. The workflow sends the search term + location to SerpAPI, then formats the response into a consistent “results table” shape (name, site, address, phone, and the original search context).

Websites are fetched and scanned for emails. Using an HTTP request to Apify’s crawler, it pulls page content for each site. Then the GPT‑4o AI Agent extracts any publicly listed email address and returns structured JSON so you’re not parsing messy text.

Everything lands back in Google Sheets (and can extend to a CRM). The workflow writes each enriched row into your “Results” tab and updates the source row status to Complete. There are also nodes that support pushing leads into tools like Pipedrive if you want to go straight from research to pipeline.

You can easily modify the “Searches” columns to include niche tags, sales rep assignment, or campaign names, then write those fields into the Results output. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Manual Trigger

This workflow starts on demand, allowing you to manually run a batch of searches and process results.

  1. Add the Manual Execution Start node as your trigger.
  2. Leave all settings at default in Manual Execution Start (no parameters are required).
  3. Connect Manual Execution Start to Retrieve Search Phrases.

Step 2: Connect Google Sheets

These nodes fetch search phrases, update processing status, and store extracted emails.

  1. Open Retrieve Search Phrases and set Document to [YOUR_ID] and Sheet to gid=0 (Searches).
  2. Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Search Phrases.
  3. Open Update Row Status and keep Operation as appendOrUpdate with Matching Columns set to Search.
  4. Verify Update Row Status column mapping includes Search set to {{ $json.Search }} and Complete set to Yes.
  5. Credential Required: Connect your googleSheetsOAuth2Api credentials in Update Row Status.
  6. Open Store Emails in Sheet and keep Operation as appendOrUpdate, Sheet set to 1470668196 (Results), and Document set to [YOUR_ID].
  7. Ensure column mappings in Store Emails in Sheet include:
    • Area{{ $('Retrieve Search Phrases').item.json.Area }}
    • Search{{ $('Retrieve Search Phrases').item.json.Search }}
    • Search Name{{ $('Retrieve Search Phrases').item.json['Area Name'] }}
    • title{{ $('Format Results Table').item.json.title }}
    • website{{ $('Format Results Table').item.json.website }}
    • address{{ $('Format Results Table').item.json.address }}
    • phone{{ $('Format Results Table').item.json.phone }}
    • email (Manual Entry){{ $json.output.email }}
  8. Credential Required: Connect your googleSheetsOAuth2Api credentials in Store Emails in Sheet.

If your sheet uses different column headers, update the column mappings in Update Row Status and Store Emails in Sheet to match exactly.

Step 3: Set Up Search Filtering and Routing

This section filters for incomplete rows, picks a single search phrase, and branches in parallel.

  1. In Filter Pending Rows, set the condition Complete to is empty using {{ $json.Complete }}.
  2. In Select First Record, keep the code as return [items[0]]; to process one search at a time.
  3. Connect Retrieve Search PhrasesFilter Pending RowsSelect First Record.
  4. Ensure Select First Record outputs to both Update Row Status and Query Google Maps in parallel.

⚠️ Common Pitfall: If the Complete column contains values other than empty (like “No”), update the Filter Pending Rows condition to match your dataset.

Step 4: Configure Google Maps Search and Result Parsing

This segment queries Google Maps via SerpApi and formats results into individual records.

  1. Open Query Google Maps and set Operation to google_maps.
  2. Set q to {{ $json.Search }} and ll to {{ $json.Area }} in Query Google Maps.
  3. Credential Required: Connect your serpApi credentials in Query Google Maps.
  4. In Format Results Table, keep the JavaScript that cleans website URLs and outputs title, website, address, and phone as individual items.
  5. Connect Query Google MapsFormat Results TableIterate Through Records.

Step 5: Set Up Web Content Fetching and AI Email Extraction

This stage crawls each business website and extracts an email address using AI.

  1. In Fetch Web Content, set URL to =https://api.apify.com/v2/acts/6sigmag~fast-website-content-crawler/run-sync-get-dataset-items.
  2. Set Method to POST and JSON Body to {"startUrls":[ "{{ $json.website }}" ]} in Fetch Web Content.
  3. Credential Required: Connect your httpQueryAuth credentials in Fetch Web Content.
  4. In AI Email Extractor, set Text to {{ $json.text }} and keep Prompt Type as define with Has Output Parser enabled.
  5. Ensure OpenAI Chat Engine is connected as the language model for AI Email Extractor and Structured Output Decoder is connected as the output parser.
  6. Credential Required: Connect your openAiApi credentials in OpenAI Chat Engine (credentials are added to the parent model, not the parser).
  7. Keep Structured Output Decoder schema as { "email": "emailaddress" } to standardize output.
  8. Connect Iterate Through RecordsFetch Web ContentAI Email ExtractorIterate Through Records (second output loop).

If websites block crawlers, consider adding delay or alternative scraping settings in the Apify actor.

Step 6: Configure Parallel Outputs and Sub-Workflow

Results are saved to the sheet while a summary is sent to a sub-workflow.

  1. Confirm that Iterate Through Records outputs to both Store Emails in Sheet and Summarize Single Row in parallel.
  2. In Summarize Single Row, keep Fields to Summarize set to include title.
  3. Open Run Sub-Workflow (Configure Required) and select a Workflow in Workflow ID.
  4. Connect Summarize Single RowRun Sub-Workflow (Configure Required).

⚠️ Common Pitfall: Run Sub-Workflow (Configure Required) has no workflow selected by default. You must choose a workflow or remove this node if not needed.

Step 7: Test and Activate Your Workflow

Validate the full execution and then enable the workflow for ongoing use.

  1. Click Execute Workflow to run Manual Execution Start and process one pending search.
  2. Verify Update Row Status marks the row Complete as Yes.
  3. Confirm Store Emails in Sheet writes records with expected fields, including email (Manual Entry).
  4. Check that AI Email Extractor outputs either an email or null in output.email.
  5. If everything looks correct, toggle the workflow to Active for production use.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Watch Out For

  • Google Sheets access fails more often than people expect. If rows stop updating, check your Google OAuth connection in n8n and confirm the account still has edit access to the sheet.
  • If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
  • SerpAPI and Apify both have usage limits. If the workflow suddenly returns partial results, look at your SerpAPI dashboard for rate limiting and your Apify runs for failed crawls, then reduce batch size.

Common Questions

How quickly can I implement this Google Maps leads automation?

About an hour if you already have the API keys and the Google Sheet copied.

Can non-technical teams implement this Google Maps leads automation?

Yes, but you’ll want someone comfortable with connecting accounts and API keys. The hardest part is usually installing the community nodes and making sure the Google Sheet columns match.

Is n8n free to use for this Google Maps leads automation workflow?

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 SerpAPI, Apify, and OpenAI usage costs.

Where can I host n8n to run this automation?

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 unlimited executions but requires basic server management.

How do I adapt this Google Maps leads automation solution to my specific challenges?

You can. Swap the Google Sheets “Searches” structure to include vertical tags (like “urgent” or “high value”), then map those fields into the “Store Emails in Sheet” step so every result stays segmented. If you prefer another crawler, you can replace the Apify “Fetch Web Content” request with a different scraper as long as it outputs HTML or page text for the AI Email Extractor. And if you want a CRM-first flow, send rows to Pipedrive after the email extraction instead of waiting for a manual import.

Why is my Google Sheets connection failing in this workflow?

Usually the OAuth token expired or the Google account you authenticated with lost access to the sheet. Reconnect the Google Sheets credential in n8n, then open the spreadsheet and confirm that same account can edit both the “Searches” and “Results” tabs.

What’s the capacity of this Google Maps leads automation solution?

If you self-host, capacity is mostly your server plus your SerpAPI/Apify limits. On n8n Cloud, it depends on your plan’s execution allowance, and this workflow can consume multiple executions per run because it loops through results. Practically, most teams start with a few searches per day, confirm data quality, then scale up once they’re confident about rate limits and costs.

Is this Google Maps leads automation better than using Zapier or Make?

Often, yes. This workflow relies on looping, structured parsing, and an AI Agent step, which is where Zapier/Make setups can get brittle or pricey as volume grows. n8n also gives you self-hosting, so you can run big batches without paying per task. The tradeoff is setup: you’re managing more moving parts (community nodes, API keys, data shape). Talk to an automation expert if you want a quick recommendation based on your weekly lead volume.

Once this is running, your lead list becomes something you generate on demand, not something you dread. The workflow does the repetitive digging so you can spend your time on targeting, messaging, and follow-up.

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.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal