Google Places to Google Sheets, enriched leads ready
Lead research looks simple until you’re 30 tabs deep, copying phone numbers, hunting for emails, and still ending up with a spreadsheet full of “no website” and “contact us only.” It’s busywork. And it quietly kills your outreach momentum.
This Places lead enrichment setup hits sales teams first (because pipeline waits for nobody). But agency owners building prospect lists and marketers running local campaigns feel the same grind. You get a Google Sheet filled with scored, enriched prospects that are actually ready to contact.
Below, you’ll see exactly what this n8n workflow automates, what outcomes to expect, and how to customize it without turning it into a science project.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Places to Google Sheets, enriched leads ready
flowchart LR
subgraph sg0["Manual Launch Flow"]
direction LR
n0@{ icon: "mdi:code-braces", form: "rounded", label: "Compile Lead Summary", pos: "b", h: 48 }
n1@{ icon: "mdi:code-braces", form: "rounded", label: "Record Issue Log", pos: "b", h: 48 }
n2@{ icon: "mdi:brain", form: "rounded", label: "AI Chat Engine", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Structured Data Parser", pos: "b", h: 48 }
n4@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Launch Trigger", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Define Search Inputs", pos: "b", h: 48 }
n6["<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 Nearby Businesses"]
n7@{ icon: "mdi:code-braces", form: "rounded", label: "Parse and Rate Leads", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Filter Premium Leads", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Lead List", 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/>Scrape Site HTML"]
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Validate Scrape Result", 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/html.dark.svg' width='40' height='40' /></div><br/>Extract Footer Section"]
n13@{ icon: "mdi:robot", form: "rounded", label: "AI Contact Extraction", pos: "b", h: 48 }
n14@{ icon: "mdi:database", form: "rounded", label: "Append Leads to Sheets", pos: "b", h: 48 }
n2 -.-> n13
n7 --> n8
n5 --> n6
n3 -.-> n13
n9 --> n10
n8 --> n9
n8 --> n0
n8 --> n1
n12 --> n13
n13 --> n14
n10 --> n11
n6 --> n7
n11 --> n12
n4 --> n5
n14 --> n9
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 n4 trigger
class n3,n13 ai
class n2 aiModel
class n8,n11 decision
class n14 database
class n6,n10 api
class n0,n1,n7 code
classDef customIcon fill:none,stroke:none
class n6,n10,n12 customIcon
The Problem: Prospecting Turns Into Tab-Hopping
Pulling leads from Google Maps is easy. Turning them into outreach-ready prospects is the painful part. You grab a list, then you manually click into each business, open their website, scroll for a footer, look for an email, copy socials, and try to guess if the business is even worth your time. After about 20 leads, you’re already making shortcuts. That’s when errors creep in, duplicates sneak through, and your “lead list” becomes a pile of maybes instead of a pipeline you can work.
It adds up fast. Here’s where it breaks down in real life.
- Google Places results are not the same as usable leads, because many listings don’t include direct contact details.
- Manually checking 50 websites for emails and socials can burn an afternoon, and you still miss things hiding in footers.
- Without scoring, your team wastes prime outreach time on closed locations, low-rated businesses, or listings with no website.
- Copy-paste workflows invite messy Sheets data, which means follow-ups slip and reporting becomes guesswork.
The Solution: Google Places Leads, Scored and Enriched in Sheets
This workflow turns Google Places searches into a clean, enriched Google Sheet your team can act on. It starts with a trigger (manual launch, webhook, or schedule), then uses your chosen category and location to pull business listings from the Google Places API. Each business is scored for quality using factors like rating, operational status, and whether a website exists. Only the “good” leads move forward. Then Scrape.do fetches the lead’s website HTML reliably (the whole point is avoiding blocks), and an OpenAI-powered AI agent parses the site’s footer to extract contact details like emails, phone numbers, and social links. Finally, everything is appended into Google Sheets as structured rows, so outreach can start immediately.
The workflow begins with your search inputs (like “dentists” in “Istanbul”). It then scores and filters leads before enriching them one by one through website scraping and AI extraction. The end result is a living spreadsheet that keeps filling itself on your schedule.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you want 60 new prospects a week from Google Places. Manually, if you spend about 6 minutes per lead to open the listing, visit the site, hunt the footer, and paste details into Sheets, that’s roughly 6 hours. With this workflow, you set the search once and let it run on a schedule. Even if enrichment takes a couple minutes per business in the background, your hands-on time drops to about 10 minutes to review the sheet and start outreach.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Places API for pulling local business listings
- Google Sheets to store and share enriched leads
- Scrape.do API token (get it from your Scrape.do dashboard)
- OpenAI API key (get it from the OpenAI platform dashboard)
Skill level: Intermediate. You’ll connect a few credentials, map Sheet columns, and adjust search inputs confidently.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
Trigger and search inputs. You launch it manually, via webhook, or on a schedule. A simple “Define Search Inputs” step sets the category and location you want to target.
Google Places pulls the raw leads. The workflow sends an HTTP request to the Google Places API and returns a list of nearby businesses that match your criteria. This is the same source your team is already using, just automated.
Scoring and filtering protect your time. A Function step calculates a leadScore using signals like rating, website presence, and operational status, then an IF filter keeps only the leads worth enriching. Frankly, this is where most “scraping” setups fail, because they try to process everything.
Website scraping and AI enrichment. Leads are processed in batches, Scrape.do fetches the website HTML, and an HTML extraction step isolates the footer area. Then an AI agent (OpenAI Chat Model + structured parsing) extracts emails, phone numbers, and social links and sends clean fields to Google Sheets.
You can easily modify the scoring rules to prioritize different lead types based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts manually so you can test and tune the lead search before automating.
- Add and open Manual Launch Trigger.
- Leave default settings as-is to run on demand.
- Connect Manual Launch Trigger to Define Search Inputs.
Step 2: Connect Google Places Search Inputs and API Request
Define the search location and query, then call the Google Places Nearby Search endpoint.
- Open Define Search Inputs and set values:
- Set searchCategory to
dentist, locationName toIstanbul, Turkey, latitude to41.0082, longitude to28.9784, radius to5000, and maxResults to20. - Open Retrieve Nearby Businesses and set URL to
https://places.googleapis.com/v1/places:searchNearby. - Set Method to
POSTand JSON Body to={"includedTypes":["{{$json["searchCategory"]}}"],"maxResultCount":{{$json["maxResults"]}},"locationRestriction":{"circle":{"center":{"latitude":{{$json["latitude"]}},"longitude":{{$json["longitude"]}}},"radius":{{$json["radius"]}}}}}. - Enable Send Headers and include header parameters: X-Goog-FieldMask
places.id,places.displayName,places.formattedAddress,places.nationalPhoneNumber,places.websiteUri,places.rating,places.businessStatus,places.primaryType,places.locationand Content-Typeapplication/json. - Credential Required: Connect your httpHeaderAuth credentials in Retrieve Nearby Businesses.
Step 3: Set Up Lead Scoring and Routing
Score leads, filter premium entries, and route low-quality leads for logging.
- Open Parse and Rate Leads and keep the scoring logic that calculates leadScore based on rating, website, phone, and business status.
- In Filter Premium Leads, confirm conditions: leadScore
largerthan50and businessNamenotEqualtoN/Ausing{{$json["leadScore"]}}and{{$json["businessName"]}}. - Ensure the true output of Filter Premium Leads connects to Iterate Lead List.
- Ensure the false output of Filter Premium Leads connects to both Compile Lead Summary and Record Issue Log.
- Open Iterate Lead List to confirm batch processing is enabled (defaults are fine).
Step 4: Configure Site Scraping and HTML Extraction
Scrape each lead’s website and pull the footer HTML for contact extraction.
- Open Scrape Site HTML and set URL to
http://api.scrape.do/with Send Query enabled. - Set query parameters: url to
{{ $json.website }}and token to{{$env["SCRAPE_DO_API_KEY"]}}. - In Validate Scrape Result, ensure the condition checks
{{ $json.error.status }}isnotEquals400. - In Extract Footer Section, set Operation to
extractHtmlContentand CSS Selector tofooterfor the footer key.
SCRAPE_DO_API_KEY is defined in your n8n instance.Step 5: Set Up AI Contact Extraction
Use the AI agent with a structured output parser to extract contact and social data from the footer HTML.
- Open AI Chat Engine and set the model to
gpt-4.1-mini. - Credential Required: Connect your openAiApi credentials in AI Chat Engine.
- Open Structured Data Parser and set Schema Type to
manualwith the provided JSON schema for contact, social, location, and other_contact_methods. - Open AI Contact Extraction and confirm the prompt includes
{{ $json.footer }}and Has Output Parser is enabled.
Step 6: Configure Output to Google Sheets
Append enriched lead data to your spreadsheet with fields mapped from the AI output and the original lead data.
- Open Append Leads to Sheets and set Operation to
append. - Set Document ID to
[YOUR_ID]and Sheet Name togid=0. - Map key fields using expressions, for example: BusinessName →
{{ $('Iterate Lead List').item.json.businessName }}, emails →{{ $json.output.contact.emails[0] }}, Facebook →{{ $json.output.social.facebook }}, and Other →{{ $json.output.other_contact_methods[0].url }}. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Append Leads to Sheets.
- Ensure Append Leads to Sheets routes back to Iterate Lead List to process the next lead in the batch.
Step 7: Test and Activate Your Workflow
Run the workflow end-to-end and verify data is appended to your sheet.
- Click Execute Workflow on Manual Launch Trigger to start a test run.
- Confirm that Retrieve Nearby Businesses returns place data and Parse and Rate Leads outputs items with leadScore.
- Check that Scrape Site HTML and Extract Footer Section produce footer content and that AI Contact Extraction outputs structured JSON.
- Verify a new row is added in your spreadsheet by Append Leads to Sheets.
- When satisfied, switch the workflow to Active for production use.
Common Gotchas
- Google Places API credentials can expire or be restricted by project settings. If things break, check your Google Cloud Console API key restrictions and billing status first.
- If you’re using Wait behavior indirectly (batch looping plus external scraping), processing times vary. Bump up the batch size downwards or increase any waits if downstream nodes fail on empty responses.
- Default AI prompts are generic. Add your exact output rules early (what counts as “email,” which socials matter, how to handle missing data) or you’ll be cleaning rows forever.
Frequently Asked Questions
About an hour if your API keys and Google Sheet are ready.
No. You’ll mostly connect accounts, paste API keys, and map your Google Sheets columns. The only “techy” part is adjusting the lead scoring rules, and even that is optional.
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 Scrape.do and OpenAI API usage, plus Google Places API costs depending on volume.
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.
Yes, but you’ll want to change the “Define Search Inputs” node to accept a list of locations, then loop through them before calling “Retrieve Nearby Businesses.” Common customizations include running one category across five cities, running five categories in one city, or increasing the minimum leadScore so you only enrich top-tier listings.
Usually it’s an API key restriction or billing issue in Google Cloud. Confirm the Places API is enabled, your key is active, and the key restrictions allow the request type you’re making. In n8n, also double-check the Header Auth credential is selected in the “Retrieve Nearby Businesses” HTTP Request node. If you’re testing heavily, rate limits can show up too.
A lot. On n8n Cloud, capacity depends on your plan’s monthly executions, because each lead can trigger multiple steps (Places lookup, scrape, AI extraction, Sheets write). If you self-host, there’s no execution cap, but your server resources and API rate limits become the bottleneck. Practically, most teams start with a few hundred leads per week, verify quality, then scale up.
For this kind of workflow, n8n is usually the better fit because you can score and filter leads, loop through batches, and run an AI agent with structured output without fighting platform limits. Self-hosting is another big deal if you plan to scale. Zapier or Make can still work if you’re doing a simpler version (basic Places pull to Sheets, no scraping). If you’re unsure, Talk to an automation expert and get a recommendation based on your volume and goals.
Once this is running, your spreadsheet stops being a dumping ground and starts acting like a pipeline. Set it up once, then spend your time on outreach that actually moves deals forward.
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.