How to Scrape Google Maps with n8n (and Send Results to Google Sheets)
A working n8n workflow that pulls Google Maps business data into a Google Sheet on demand or on a schedule. No code, no browser automation, no proxy configuration. The template is free, the actor bills about a dollar per thousand places, and the whole thing sets up in under ten minutes.
In this tutorial
- What you will build
- Prerequisites
- Step 1: Get your Apify API token
- Step 2: Import the n8n template
- Step 3: Paste your token and search query
- Step 4: Connect Google Sheets
- Step 5: Run it
- Schedule daily runs
- Add reviews, popular times, or contact emails
- Skip places you have already scraped
- Handling large runs
- What it costs
- FAQ
What you will build
A four-node n8n workflow. Click Run, and about ten seconds later a fresh batch of businesses lands in your Google Sheet with 30-plus fields per row: business name, category, full address with parsed city and postal code, phone, website, GPS coordinates, rating, review count, opening hours, price range, photos, and more.
The workflow calls the NanoScrape Google Maps Scraper under the hood. That actor is a lightweight Go binary running on Apify, roughly 80 MB in size, uses datacenter proxies, and returns results in seconds. All the field extraction, geocoding, and pagination is handled for you.
Prerequisites
- An n8n instance. Cloud, self-hosted, or Desktop all work. If you do not have one, n8n Cloud has a free trial and n8n Desktop is free forever.
- A free Apify account. Sign up at the actor page. The free tier gives you $5 of usage credit every month, which covers about 5,000 places from this scraper.
- A Google account with a fresh Google Sheet ready to receive data.
Get your Apify API token
- Open the Google Maps Scraper and click Try for free.
- Sign up with Google or email. It takes about a minute.
- Once signed in, click your avatar (top right), open Settings, then Integrations.
- Copy the Personal API token. Keep the tab open, you will paste it in a moment.
Import the n8n template
- Download the workflow: scrape-google-maps-to-google-sheets.json
- In n8n, open the workflows list. Click the three-dot menu at the top right and choose Import from File.
- Select the JSON you just downloaded.
You will see four nodes wired left to right:
- Manual Trigger starts the run when you click a button.
- Set Search Params holds your Apify token, search query, and options.
- Run Google Maps Scraper calls the Apify sync endpoint and gets results back in the same request.
- Append to Google Sheet writes one row per business.
Paste your Apify token and search query
Open the Set Search Params node and fill in the four fields:
apifyToken: the Personal API token you copied in step 1.searchQuery: what you want to scrape. Examples: coffee shops in Berlin, law firms Manhattan, Zahnarzt Zurich. Include the location in the query itself.maxResults: how many places to return, between 20 and 120 per query.language: an ISO 639-1 code likeen,de,fr,ja,es. Use the local language for best results in non-English regions.
Save the node.
Create a Google Sheet and connect it
- Go to Google Sheets and create a new blank spreadsheet. Leave the first row empty. The n8n node handles headers automatically.
- Copy the spreadsheet ID from the URL. It is the long string between
/d/and/edit. - In n8n, open the Append to Google Sheet node.
- Paste the spreadsheet ID into the Document ID field.
- Leave the sheet name as
Sheet1if that is what your tab is called, otherwise update it. - Click the Credential dropdown at the top of the node. Pick an existing Google Sheets credential or click Create New to walk through the Google OAuth flow.
- Save the node.
Run it
Click Test Workflow at the bottom left. You should see each node light up green as it runs. Within about ten seconds, open your Google Sheet. You will find one row per business with columns for name, address, phone, website, rating, review count, opening hours, GPS coordinates, and roughly 25 other fields.
If nothing shows up, check the output of the Run Google Maps Scraper node:
- HTTP 401: your Apify token is wrong or has a trailing space.
- HTTP 403: your Apify account has run out of free-tier credit for the month.
- Empty array: the search query returned no results. Try something less specific.
- Google Sheets error: the spreadsheet ID is wrong or the sheet name does not match a tab in the file.
Schedule daily runs
Replace the Manual Trigger with a Schedule Trigger node. Set the interval to once a day, once a week, or a cron expression of your choice. Every morning your sheet will grow with fresh data for the search terms you configured.
To keep the sheet clean, either clear it at the start of each run (add a Google Sheets "Clear" node before the Append), or skip already-scraped places (see the next section).
Add reviews, popular times, or contact emails
The Google Maps Scraper has three optional enrichments that stack on top of the basic scrape. Enable them by adding fields to the JSON body of the Run Google Maps Scraper node.
Featured reviews
Add "includeReviews": true and each place gets a user_reviews array with author name, star rating, publication date, and review text. Adds about 300 ms per place.
{
"searchStrings": ["restaurants in Paris"],
"maxResultsPerQuery": 20,
"includeReviews": true,
"maxReviewsPerPlace": 10,
"reviewsSort": "newest"
}Sort options: most_relevant (default), newest, highest_rating, lowest_rating. To only pull reviews from the last month, add "reviewsNewerThan": "2026-06-14".
Popular times histogram
Add "includePopularTimes": true and each place gets a popular_times object with visitor-traffic scores by weekday and hour (0 to 100). Great for finding low-traffic time slots. Adds about 1.5 seconds per place.
Contact email extraction
Add "enableContactExtraction": true and "geminiApiKey": "your-gemini-key". After the Maps scrape completes, an AI-powered add-on visits every business website found in the results and extracts team member names, emails, phone numbers, and departments. Great for turning a lead list into a contact list in one step. Get a free Gemini API key at Google AI Studio.
Skip places you have already scraped
Every place on Google Maps has a stable identifier called a CID. It does not change even if the business renames or moves. To avoid re-collecting places on scheduled runs, pass an array of CIDs in the excludeCids parameter.
{
"searchStrings": ["cafes in Zurich"],
"maxResultsPerQuery": 100,
"excludeCids": ["12345678901234567", "98765432109876543"]
}A common pattern in n8n: read the CID column from your existing sheet with a Google Sheets "Read" node, feed it into a Set node that builds the array, then reference that array in the HTTP Request body.
Handling large runs
The template uses Apify's synchronous endpoint, which returns results in the same HTTP response. That endpoint has a 5-minute timeout, which is plenty for a few hundred places. For larger jobs, switch to the async pattern:
- Change the URL to
/runs(drop-sync-get-dataset-items) to start the run without waiting. - Add a Wait node that polls
/runs/{runId}every 30 seconds until the status isSUCCEEDED. - Fetch results from
/datasets/{defaultDatasetId}/itemsonce the run finishes.
The Apify API docs cover the full endpoint list.
What it costs
- Apify actor: $1.00 per 1,000 places. All 30-plus fields included. Reviews and popular times are free add-ons. Contact extraction is billed separately by the sub-actor.
- n8n: free on Desktop and self-hosted. n8n Cloud starts at $20/month.
- Google Sheets: free.
A daily workflow that pulls 100 new places every morning runs at about $3 per month. A weekly workflow that pulls 1,000 places every Monday runs at $4 per month.
FAQ
Do I need a paid Apify plan to run this?
No. The free tier includes $5 of usage credit every month, enough for around 5,000 places from this actor. You only pay if you go over.
Does the template work with n8n Cloud, self-hosted, and Desktop?
Yes, all three. The template uses only core n8n nodes (Manual Trigger, Set, HTTP Request, Google Sheets), so there is nothing to install and no community node dependency.
Can I send results to Airtable, PostgreSQL, or Notion instead?
Yes. Replace the Google Sheets node at the end of the workflow with whatever destination you prefer. All incoming fields are auto-mapped, so you just need to point the new node at your target and pick which fields to keep.
How do I search multiple queries in one run?
Two options. Simple approach: add more strings to the searchStrings array in the HTTP Request body. Advanced approach: use the structured queries parameter, which lets you attach your own company_id per query and separate the search term from the location and country code. The actor README has examples.
Can I collect email addresses too?
Yes. Set enableContactExtraction to true and provide a Gemini API key. The scraper visits every business website found in the results and extracts team member emails, names, positions, and phone numbers using AI.
What if I want to scrape more than 500 places in one query?
Google Maps returns at most about 120 results per single query. For broader coverage, split the search by neighborhood, category, or sub-region and run each as a separate search string. For example, instead of "restaurants in London", try "restaurants in Shoreditch", "restaurants in Camden", "restaurants in Notting Hill".
How fresh is the data?
Every scrape hits Google Maps live. There is no cached data. Whatever Google shows at the moment of the run is what you get in your sheet.
Is scraping Google Maps legal?
Scraping publicly available data is generally permitted in most jurisdictions, but the specifics depend on where you and your users are located and what you do with the data. The hiQ Labs v. LinkedIn ruling in the US established that scraping public data is not a violation of the Computer Fraud and Abuse Act. GDPR still applies to any personal data you collect. Consult a lawyer if you have specific compliance questions.
Related resources
- Google Maps Scraper on Apify: full actor documentation, all input parameters, complete field reference.
- NanoScrape actor page: quick-reference specs, pricing, use cases.
- Download the n8n template used in this tutorial.
- All templates: n8n, Make, and Zapier workflows for other NanoScrape actors.