🔓 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 Maps to Google Sheets, clean lead lists

Lisa Granqvist Partner Workflow Automation Expert

Building outreach lists from Google Maps sounds simple until you actually do it. You copy names, paste addresses, miss phone numbers, and somehow end up with duplicates that make your sheet look “done” while your results say otherwise.

This hits marketers running local campaigns first, but agency owners and sales ops folks feel it too. With Google Maps leads automation, you turn a messy manual task into a repeatable system that keeps your list clean and ready to contact.

This workflow pulls Google Maps listings via SerpAPI, formats the data, removes duplicates, and appends everything into Google Sheets. You’ll see how it works, what you need, and what to watch out for so it runs reliably.

How This Automation Works

The full n8n workflow, from trigger to final output:

n8n Workflow Template: Google Maps to Google Sheets, clean lead lists

The Problem: Google Maps leads are messy when collected manually

Manual Google Maps scraping is a slow drip of frustration. You start with a search, open listing after listing, then try to standardize what you find: phone numbers in different formats, websites missing on some profiles, and addresses that don’t paste cleanly into separate columns. Then the real pain shows up later. You message the same business twice because duplicates slipped in, or you realize your “lead list” is missing the one field your outreach depends on. It’s not hard work. It’s constant, mistake-prone work.

The friction compounds. Here’s where it breaks down in real life.

  • You spend about 2 hours assembling a list, then another hour cleaning it.
  • Duplicates sneak in when you rerun the same search next week and can’t remember what you already captured.
  • Data ends up inconsistent, so sorting and filtering becomes a chore instead of a quick decision.
  • One missing detail (like a website or phone) turns outreach into extra research for every single record.

The Solution: Scrape Google Maps via SerpAPI into a clean Google Sheet

This n8n workflow turns a Google Maps search into a structured lead list in Google Sheets, without the copy-paste loop. It starts by reading your inputs from a sheet (including your Google Maps search URL), then converts that into the query details SerpAPI needs. From there, it requests Google Maps results through SerpAPI, keeps paging through the next “start” index, and combines everything into one unified set. After that, it filters out empty entries, formats each place into consistent fields, removes duplicates, and appends only clean rows into your target sheet. If the request fails, the workflow marks that input as failed so you don’t waste time guessing what happened.

The workflow starts on an hourly schedule (or manually when you want). It pulls listings from Google Maps through SerpAPI, then cleans and deduplicates the dataset. Finally, it writes fresh rows to Google Sheets and marks the run as successful so you can track progress.

What You Get: Automation vs. Results

Example: What This Looks Like

Say you need 200 local leads every Monday for a new outreach push. Manually, if you spend even 1 minute per listing to open, copy, and paste core details, that’s about 3 hours, and it usually turns into longer once cleanup starts. With this workflow, you drop your Google Maps search URL into the input sheet, let the hourly run pick it up, and wait for the SerpAPI pull and formatting to finish (often around 15 minutes). Your output sheet updates with deduped rows, ready for outreach the same morning.

What You’ll Need

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Google Sheets to store inputs and output leads.
  • SerpAPI to scrape Google Maps listings affordably.
  • SerpAPI API key (get it from your SerpAPI dashboard).

Skill level: Intermediate. You’ll connect accounts, paste an API key, and be comfortable mapping spreadsheet columns to the workflow’s expected inputs.

Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).

How It Works

Scheduled or manual trigger. The workflow runs hourly by default, and you can also kick it off manually when you add a new search and want results right away.

Input retrieval and parsing. n8n reads your Google Maps search URL from Google Sheets, then extracts the query and geo parameters needed to run a consistent scrape.

SerpAPI scraping with pagination. The workflow calls SerpAPI for Google Maps results, figures out the next “start” index, and loops until there’s nothing left to fetch (or until your configured limit is reached).

Cleaning, dedupe, and write-back. Results get combined, split into individual place records, filtered for empty entries, and formatted into consistent fields. Duplicates are removed, then new rows are appended to your Google Sheet, and the input row is marked successful (or failed if the scrape didn’t work).

You can easily modify the columns you capture to match your outreach workflow, so your sheet contains exactly what your team uses. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Schedule Trigger

Set up the hourly and manual triggers so the workflow can run automatically or on demand.

  1. Open Hourly Schedule Trigger and set the interval rule to run every hour (field hours).
  2. Keep Manual Run Trigger in place for testing and one-off runs.
  3. Verify both triggers connect to Retrieve Search Inputs as shown in the canvas.

Step 2: Connect Google Sheets

Configure the Google Sheets nodes that read search inputs and write status/results.

  1. Open Retrieve Search Inputs and set Document ID to https://docs.google.com/spreadsheets/d/[YOUR_ID]/edit#gid=0 and Sheet Name to the tab labeled Add your search here.
  2. In Retrieve Search Inputs, keep the filter on Status (lookup column) to pull only pending rows.
  3. Open Append Rows to Sheet and set Document ID to https://docs.google.com/spreadsheets/d/[YOUR_ID]/edit#gid=2023033319 and Sheet Name to Results.
  4. Confirm Append Rows to Sheet uses Operation appendOrUpdate and Matching Columns includes place_id.
  5. In Mark Status Successful and Mark Status Failed, keep the Operation as update and the URL column value as {{ $('Retrieve Search Inputs').first().json.URL }}.
  6. Credential Required: Connect your googleSheetsOAuth2Api credentials in Retrieve Search Inputs, Append Rows to Sheet, Mark Status Successful, and Mark Status Failed.

Tip: Ensure the Results sheet includes all columns listed in Append Rows to Sheet (e.g., place_id, title, address) to avoid mapping issues.

Step 3: Set Up Query Parsing and SERPAPI Request

Extract query parameters from the input URLs and call the SERPAPI Maps endpoint.

  1. In Parse Query and Geo, set keyword to {{ $json.URL.match(/\/search\/(.*?)\//)[1] }} and geo to {{ $json.URL.match(/(@[^\/?]+)/)[1]}}.
  2. Open SERPAPI Maps Request and set URL to https://serpapi.com/search.json.
  3. In SERPAPI Maps Request, keep Send Query enabled and add these query parameters: engine google_maps, q {{ $json?.search_parameters?.q || $json.keyword }}, ll {{ $json?.search_parameters?.ll|| $json.geo }}, type search, and start {{ $json.start|| 0 }}.
  4. Credential Required: Connect your serpApi credentials in SERPAPI Maps Request.

⚠️ Common Pitfall: If your input URL format changes, the regex in Parse Query and Geo may return empty values, causing SERPAPI to fail.

Step 4: Configure Looping and Result Aggregation

Handle pagination and consolidate SERPAPI results into a unified dataset.

  1. In Parse Next Start Index, keep Mode set to runOnceForEachItem and retain the provided JavaScript for extracting the next start value.
  2. Configure Loop Continuation Check with conditions to check search_parameters.start and serpapi_pagination.next are not empty using {{ $json.search_parameters.start }} and {{ $json.serpapi_pagination.next }}.
  3. Ensure the true branch of Loop Continuation Check continues to SERPAPI Maps Request and the false branch goes to Combine SERPAPI Results.
  4. In Combine SERPAPI Results, keep the provided code that aggregates local_results across all SERPAPI calls.

Step 5: Process and Deduplicate Output Data

Split, clean, and deduplicate the SERP results before inserting into the Results sheet.

  1. In Split Result Items, set Field to Split Out to allData.
  2. In Filter Empty Entries, set the condition to check {{ $json[0] }} is not empty.
  3. Keep the JavaScript in Format Data Payload to merge all item objects and return non-null entries.
  4. In Eliminate Duplicate Records, set Operation to removeDuplicates, Compare to selectedFields, and Fields to Compare to place_id.

Step 6: Configure Output and Status Updates

Write the cleaned data to Google Sheets and update processing status based on success or failure.

  1. Confirm Eliminate Duplicate Records connects to Append Rows to Sheet to store final results.
  2. Ensure Append Rows to Sheet connects to Mark Status Successful to set Status to .
  3. Verify SERPAPI Maps Request has the error output connected to Mark Status Failed, which sets Status to .

Tip: Keep Append Rows to Sheet Cell Format as RAW to avoid unwanted formatting changes in your Results tab.

Step 7: Test and Activate Your Workflow

Validate the workflow end-to-end, then enable hourly processing.

  1. Click Execute Workflow on Manual Run Trigger to perform a test run.
  2. Confirm that Append Rows to Sheet adds rows in the Results tab and that Mark Status Successful updates the input row status to .
  3. If errors occur, check Mark Status Failed updates the input row status to and review the SERPAPI response.
  4. Activate the workflow so Hourly Schedule Trigger runs automatically each hour.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Common Gotchas

  • Google Sheets credentials can expire or need specific permissions. If things break, check the n8n credential connection test and the Sheet sharing settings first.
  • 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 rate limits and quota are real. If you start seeing failed runs, check your SerpAPI dashboard usage and confirm your API key is still active.

Frequently Asked Questions

How long does it take to set up this Google Maps leads automation?

About 30 minutes if your Sheets and SerpAPI key are ready.

Do I need coding skills to automate Google Maps leads?

No coding required. You’ll mainly connect accounts, add your SerpAPI key, and map a few spreadsheet fields.

Is n8n free to use for this Google Maps leads 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 costs (it varies by plan and volume, but it’s typically cheaper than the official Google Maps API for this use case).

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.

Can I customize this Google Maps leads workflow for multiple search locations?

Yes, and it’s a common tweak. Add multiple Google Maps search URLs as separate input rows in the “Retrieve Search Inputs” sheet, then adjust the formatting code so each output row includes a “source query” or “location” column. If you want different output sheets per city, you can route items after “Parse Query and Geo” using an If node and write to different Google Sheets nodes.

Why is my Google Sheets connection failing in this workflow?

Most of the time it’s a permissions issue: the Google account connected in n8n can’t access the spreadsheet, or the Sheet ID changed. Re-check the n8n Google Sheets credential, then open the spreadsheet and confirm it’s shared with the same account. Also make sure the target worksheet tab name matches what the node expects. Small mismatch, big headache.

How many leads can this Google Maps leads automation handle?

On n8n Cloud Starter, you can run a healthy number of executions each month for small campaigns, and higher tiers handle more. If you self-host, there’s no execution cap, but your server and SerpAPI quota become the real limits. Practically, most teams run this per search URL and pull a few hundred places per run without issues, then schedule it to refresh daily or weekly.

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

Often, yes. This workflow needs looping through pages of results, merging batches, and deduping before you write to Sheets, which is the kind of logic that gets awkward (and expensive) in Zapier. n8n handles branching and code steps cleanly, and self-hosting means you can run it as often as you want without worrying about per-task billing. Zapier or Make can still be fine if you only want a tiny two-step flow, like “new row in Sheets → send Slack message.” If you’re unsure, Talk to an automation expert and you’ll get a straight answer for your situation.

Clean lead lists are a growth lever that most teams treat like busywork. Set this up once, and your Google Sheets stays stocked with fresh, deduped Google Maps leads while you focus on outreach that actually converts.

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