Google Maps to Google Sheets, lead lists done fast
Copying business details out of Google Maps is the kind of task that looks “quick” until you’re 40 tabs deep, missing half the phone numbers, and your sheet still isn’t usable.
This Maps Sheets leads automation hits marketing managers and growth folks first, but agency owners building client lists and small local businesses doing their own outreach feel it too. You end up with cleaner lead lists, faster, without re-checking every row.
Below, you’ll see what the workflow does, what it replaces, and how to set it up so you can open your sheet and start outreach.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Google Maps to Google Sheets, lead lists done fast
flowchart LR
subgraph sg0["Form Query Intake Flow"]
direction LR
n0["<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 Query Intake"]
n1["<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/>Initial Text Search"]
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Next Page Check 2", pos: "b", h: 48 }
n3@{ icon: "mdi:cog", form: "rounded", label: "Pause 5s A", 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/httprequest.dark.svg' width='40' height='40' /></div><br/>Second Text Lookup"]
n5@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Next Page Check 3", pos: "b", h: 48 }
n6@{ icon: "mdi:cog", form: "rounded", label: "Pause 5s B", pos: "b", h: 48 }
n7["<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/>Third Text Lookup"]
n8["<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/>Combine Page Results"]
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Expand Result Items", pos: "b", h: 48 }
n10["<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/>Retrieve Place Details"]
n11["<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/>Prepare Sheet Rows"]
n12@{ icon: "mdi:database", form: "rounded", label: "Append to Sheet", pos: "b", h: 48 }
n3 --> n4
n6 --> n7
n8 --> n9
n10 --> n11
n1 --> n2
n1 --> n8
n4 --> n5
n4 --> n8
n7 --> n8
n0 --> n1
n9 --> n10
n2 --> n3
n5 --> n6
n11 --> n12
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 n0 trigger
class n2,n5 decision
class n12 database
class n1,n4,n7,n10 api
class n11 code
classDef customIcon fill:none,stroke:none
class n0,n1,n4,n7,n8,n10,n11 customIcon
The Challenge: Turning Google Maps into a clean lead list
You find the right search in Google Maps (like “Accountants London”), and the first few results look promising. Then reality kicks in. Phone numbers are formatted differently, websites are missing, and addresses get pasted into the wrong columns. After an hour, you don’t just have a messy spreadsheet. You have a list you don’t trust, which means you’ll double-check everything later (and later never comes). Honestly, it’s not the research that drains you. It’s the repetitive extracting, formatting, and fixing.
It adds up fast. Here’s where it breaks down.
- Manually pulling names, phones, sites, and addresses takes about 2–3 minutes per business, and the time multiplies as the list grows.
- Google Maps results are not “lead-list ready,” so your columns end up inconsistent and outreach gets delayed.
- You miss fields because some listings hide details behind extra clicks, and it is easy to skip one when you’re moving fast.
- Scaling becomes painful since doing the next location or industry means repeating the same process from scratch.
The Fix: Google Places results appended straight to Google Sheets
This workflow turns a simple “Industry + Location” query into a structured Google Sheet that’s ready for outreach. It starts with a form submission (for example, “Accountants London”), then calls the Google Places Text Search endpoint to fetch the first page of matching businesses. If Google returns a “next page” token, the workflow waits a few seconds (because the token needs time to activate), then fetches page two, and optionally page three. After that, it merges the results into one list, loops through each place, and calls Place Details to pull the specific fields you actually need: company name, formatted phone number, website, and formatted address. Finally, it formats those results into clean rows and appends them to your Google Sheet.
The workflow starts when you submit an industry/location search. From there, it fetches up to three pages of Google Places results, then enriches each business using Place Details. The finished output lands in Google Sheets as one row per business, mapped to your columns.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you build a weekly list for two niches in two cities (4 searches total). If you collect 50 businesses per search and spend roughly 2 minutes per business copying details, that’s about 7 hours of repetitive work. With this workflow, you submit each query in a form (maybe 1 minute), let it run while it fetches up to three pages and details (often under 10 minutes per query), and your Google Sheet fills itself. Most teams get back an afternoon every week, and the sheet is cleaner too.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets for storing the lead list.
- Google Cloud Places API to fetch Text Search and Details.
- Google Places API key (get it from Google Cloud Console).
Skill level: Intermediate. You’ll paste an API key, connect Google Sheets OAuth, and map columns once.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
A simple query kicks things off. You submit an “Industry + Location” phrase via the built-in form trigger, which becomes the search term for Google Places.
Google Places returns results in pages. The workflow pulls page one, checks for a next_page_token, waits a few seconds, then pulls page two and page three when available. Those waits are there for a reason.
Each business gets enriched. After merging all pages, the workflow loops through every place_id and calls Place Details to fetch the fields you care about (name, phone, website, address). If a field doesn’t exist, it’s left blank instead of breaking the run.
Your sheet is updated automatically. The results are formatted into rows and appended to a Google Sheet with your chosen document ID and tab name, using the columns you created.
You can easily modify which Place Details fields are pulled (like opening hours) or increase/decrease the number of pages fetched based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Form Trigger
Set up the intake form that collects the search query used for Google Places lookups.
- Add and open Form Query Intake.
- Set Form Title to
Enter your Query. - Set Form Description to
Enter Industry + Location. - Ensure the form field label is Query with placeholder
Ex. Accountants Londonand mark it required.
Step 2: Configure the Google Places Text Search Requests
Set up the three paginated Places Text Search calls to gather results across multiple pages.
- Open Initial Text Search and set URL to
https://maps.googleapis.com/maps/api/place/textsearch/json. - In Initial Text Search, set the query parameter query to
{{ $json.Query }}and key to[CONFIGURE_YOUR_API_KEY]. - Open Second Text Lookup and set URL to
https://maps.googleapis.com/maps/api/place/textsearch/json. - In Second Text Lookup, set pagetoken to
{{ $json.next_page_token }}and key to[CONFIGURE_YOUR_API_KEY]. - Open Third Text Lookup and set URL to
https://maps.googleapis.com/maps/api/place/textsearch/json. - In Third Text Lookup, set pagetoken to
{{ $json.next_page_token }}and key to[CONFIGURE_YOUR_API_KEY].
Initial Text Search outputs to both Next Page Check 2 and Combine Page Results in parallel, and Second Text Lookup outputs to both Next Page Check 3 and Combine Page Results in parallel.
⚠️ Common Pitfall: The Google Places API will return errors if [CONFIGURE_YOUR_API_KEY] is not replaced with a valid key or if the Places API is not enabled in your Google Cloud project.
Step 3: Configure Pagination and Result Merging
Handle pagination tokens, add delays for token readiness, and combine results from all pages.
- Open Next Page Check 2 and confirm the condition checks for existence of
{{ $json.next_page_token }}. - Open Pause 5s A and keep the default wait settings to delay before the next page request.
- Open Next Page Check 3 and confirm the condition checks for existence of
{{ $json.next_page_token }}. - Open Pause 5s B and keep the default wait settings to delay before the third page request.
- Open Combine Page Results and set Number of Inputs to
3to merge results from all pages.
Step 4: Expand Items and Retrieve Place Details
Split the results array into individual items, then request detailed place data for each result.
- Open Expand Result Items and set Field to Split Out to
results. - Open Retrieve Place Details and set URL to
https://maps.googleapis.com/maps/api/place/details/json. - In Retrieve Place Details, set place_id to
{{ $json.place_id }}. - Set fields to
name,formatted_phone_number,website,formatted_addressand key to[CONFIGURE_YOUR_API_KEY].
Tip: If you add more fields to Retrieve Place Details, update the output mapping in Prepare Sheet Rows to match.
Step 5: Set Up Row Preparation and Google Sheets Output
Transform the place details into structured row data and append it to your Google Sheet.
- Open Prepare Sheet Rows and keep the JavaScript code as provided to map
companyName,number,address, andwebsite. - Open Append to Sheet and set Operation to
append. - Set Document and Sheet Name to your target spreadsheet values (replace
[YOUR_ID]). - Credential Required: Connect your googleSheetsOAuth2Api credentials in Append to Sheet.
⚠️ Common Pitfall: Ensure your sheet has headers that align with the fields produced by Prepare Sheet Rows or the append may create mismatched columns.
Step 6: Test and Activate Your Workflow
Run a full test to confirm pagination, detail retrieval, and sheet output before activating.
- Click Execute Workflow and submit the form in Form Query Intake with a query like
Accountants London. - Verify that Initial Text Search, Second Text Lookup, and Third Text Lookup run, and that Combine Page Results merges three inputs.
- Confirm that Retrieve Place Details returns phone, address, and website fields, and that Append to Sheet adds rows to your Google Sheet.
- When the test succeeds, toggle the workflow to Active for production use.
Watch Out For
- Google Places API credentials can expire or be restricted too tightly. If things break, check your Google Cloud Console API key restrictions and that “Places API” is enabled 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.
- Google Sheets OAuth can fail silently when the connected Google account loses access to the spreadsheet. Confirm the OAuth user can edit the specific file and tab you mapped in the Google Sheets node.
Common Questions
About 30 minutes if your Google accounts are ready.
Yes. You won’t write code, but you will paste an API key and point the Google Sheets node to the right spreadsheet.
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 Google Places API usage, which depends on how many searches and Place Details calls you run.
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.
You can change what gets pulled by editing the Place Details HTTP Request fields (for example, adding opening_hours or address_components) and then updating the mapping in the “Prepare Sheet Rows” code node. If you need more or fewer results, adjust the paging logic by removing page 3 or adding more pages (with an extra wait and request). Common customizations include adding a “Search Query” column for traceability, inserting a dedupe check before appending, or branching the output into a CRM after the sheet write.
Most of the time it’s OAuth access: the connected Google account doesn’t have edit permission on the target file or the spreadsheet was moved. Reconnect Google Sheets credentials in n8n, then verify the documentId and sheetName match a real tab. If the spreadsheet is in a shared drive, permissions can be stricter, so double-check sharing. And if you’re testing with a brand-new sheet, add the exact column headers first so appends don’t land in the wrong place.
It’s built to fetch up to three pages per query, which is often around 60 businesses. On n8n Cloud Starter you can run a healthy number of executions per month for list-building; if you self-host there’s no execution cap, but you’ll still be limited by Google Places quota and how aggressively you call Place Details. If you plan to do high volume, throttle the loop or add waits so you don’t hit rate limits.
For multi-page fetches plus per-item enrichment, n8n is usually the cleaner fit because it handles branching (page tokens), looping, and merging in one workflow without turning it into a fragile chain of zaps. It’s also easier to self-host if you don’t want usage-based pricing surprises. Zapier or Make can still work if you keep it simple, like one search and a single write to Sheets. If you’re deciding, Talk to an automation expert and we’ll sanity-check your use case.
Once this is running, list building stops being “a project” and becomes a quick input you can repeat whenever you need new leads. The workflow handles the repetitive stuff. You handle the outreach.
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.