Google Maps to Google Sheets, reviews logged clean
Copying Google Maps reviews by hand looks simple until you do it more than once. Tabs multiply, formatting breaks, and you end up with “almost usable” notes that nobody trusts when it’s time to report.
This hits marketing managers and agency owners hardest, but ops folks cleaning data for dashboards feel it too. With Maps reviews logging automation, you get a Google Sheet that fills itself with clean, consistent rows you can filter, chart, and send to clients.
This workflow pulls places from a Google Maps-style search, fetches reviews per place through SerpApi, and appends everything into a structured spreadsheet. You’ll see what it fixes, what you need, and how to run it without babysitting.
How This Automation Works
See how this solves the problem:
n8n Workflow Template: Google Maps to Google Sheets, reviews logged clean
flowchart LR
subgraph sg0["Execute Workflow Flow"]
direction LR
n0@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If - Local or Place Results", pos: "b", h: 48 }
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Local Results", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Places", pos: "b", h: 48 }
n3@{ icon: "mdi:web", form: "rounded", label: "Search Google Maps", 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/code.svg' width='40' height='40' /></div><br/>Update Review Count & Next P.."]
n5["<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/>Set num for Pagination"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Route Next Step", pos: "b", h: 48 }
n7@{ icon: "mdi:database", form: "rounded", label: "Append Reviews", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Reviews", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If Reviews Present", pos: "b", h: 48 }
n10@{ icon: "mdi:web", form: "rounded", label: "Get Reviews", pos: "b", h: 48 }
n11@{ icon: "mdi:play-circle", form: "rounded", label: "Execute Workflow", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Set Review Limit", pos: "b", h: 48 }
n13["<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/>Initialize Vars"]
n10 --> n9
n8 --> n7
n7 --> n4
n13 --> n10
n6 --> n5
n6 --> n2
n11 --> n12
n2 --> n13
n12 --> n3
n9 --> n8
n9 --> n2
n3 --> n0
n1 --> n2
n5 --> n10
n0 --> n13
n0 --> n1
n4 --> n6
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 n11 trigger
class n0,n6,n9 decision
class n7 database
class n3,n10 api
class n4,n5,n13 code
classDef customIcon fill:none,stroke:none
class n4,n5,n13 customIcon
The Challenge: Turning messy reviews into usable data
Reviews are gold for positioning, reputation management, and content ideas. But getting them out of Google Maps and into something you can actually work with is a chore. The first time, you paste a few snippets into a doc and move on. The second time, you realize dates don’t match, ratings are missing, and the client wants “all locations” with a trend line by week. Now it’s hours of repetitive clicking, plus the quiet anxiety that you missed the most important review.
It adds up fast. Here’s where it breaks down in real life.
- You lose consistency because every copy-paste session produces a different format (and “fixing” it later is worse).
- Pulling reviews for 10–20 places becomes a half-day job when each location needs multiple loads and scrolls.
- Reporting stalls because you can’t reliably group by date, rating, or location name without manual cleanup.
- Spot checks don’t scale, so competitor monitoring turns into guesswork instead of evidence.
The Fix: Pull Google Maps reviews into a clean Sheet automatically
This automation starts with a Google Maps-style search query (the same kind of phrase you’d type into Maps). It sends that query to SerpApi’s Google Maps API to retrieve the top places that match. Then it loops through those places one by one, fetching their reviews through SerpApi’s Reviews API. Reviews arrive in pages, so the workflow keeps track of how many it has collected and uses a page token to request the next batch until it hits your limit. Finally, every review is appended to your connected Google Sheet in a predictable structure, so you can sort, filter, pivot, chart, or hand it to a client without apologizing for the formatting.
The workflow begins when you run it manually in n8n. After SerpApi returns places, n8n handles batching and pagination behind the scenes, then writes each review as a new row with a name, date, rating, and snippet.
What Changes: Before vs. After
| What This Eliminates | Impact You’ll See |
|---|---|
|
|
Real-World Impact
Say you track 10 local competitors and pull 50 reviews each. Manually, you might spend about 10 minutes per place just loading, scrolling, and copying, plus another hour cleaning the data, so you’re looking at roughly 3 hours total. With this workflow: you run one query, let it loop through the places, and the Sheet fills itself. You’ll still wait for SerpApi calls to complete, but your hands-on time drops to about 10 minutes.
Requirements
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- SerpApi to search Google Maps and fetch reviews.
- Google Sheets to store clean rows for reporting.
- SerpApi API key (get it from serpapi.com/manage-api-key).
Skill level: Beginner. You’ll connect accounts, set a query, and confirm your sheet headers match.
Need help implementing this? Talk to an automation expert (free 15-minute consultation).
The Workflow Flow
You trigger a run from n8n. It’s a manual start by default, which is handy while you’re testing different queries and sheet setups.
Your Google Maps search query is sent to SerpApi. SerpApi returns up to the top 20 matching places for that query, which becomes the list the workflow processes.
Each place is processed in batches and paginated. n8n loops through places, then loops through review pages for each place. It checks if more reviews are available, updates the page token, and continues until it hits your review cap (default is 50 per place, and you can change it).
Reviews are normalized and appended to Google Sheets. Every review becomes a new row with the place name, an ISO-formatted date, a rating, and a snippet. That consistency is what makes charts and client reporting painless.
You can easily modify the search query and the review limit to match how often you report and how deep you want the history to go. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Start the workflow manually so you can validate the review sync logic before automating it.
- Add the Manual Start Trigger node to your workflow canvas.
- Leave all fields at their defaults for manual execution.
- Connect Manual Start Trigger to Define Review Cap.
Step 2: Connect SerpApi Search and Place Discovery
This step queries Google Maps and determines whether the response is a single place or a list of local results.
- Configure Define Review Cap to set review_limit to
50. - In Lookup Maps Places, set Operation to
google_mapsand Query toitalian restaurants in austin tx. - In Lookup Maps Places, set Additional Fields → json_restrictor to
local_results,place_results. - Configure Detect Single vs List with the condition
{{ $json.place_results }}to detect whether a single place result exists. - Connect Detect Single vs List true output to Initialize Review State and false output to Expand Local Listings.
Credential Required: Connect your SerpApi credentials in Lookup Maps Places.
Step 3: Initialize State and Batch Processing
This step prepares the global state, expands local listings, and iterates through multiple places when needed.
- In Initialize Review State, keep the JavaScript code as provided to initialize
review_limit,place_id,place_name,is_single_business,num,count, andnext_page_token. - Configure Expand Local Listings with Field to Split Out set to
local_results. - Connect Expand Local Listings to Iterate Places Batch, and ensure Iterate Places Batch continues to Initialize Review State when iterating through multiple places.
Step 4: Fetch Reviews and Expand Review Items
This step retrieves reviews, checks availability, and splits each review into its own item for insertion into the sheet.
- In Set Page Size Value, keep the JavaScript code that sets
numto20. - Configure Fetch Place Reviews with Operation set to
google_maps_reviewsand place_id set to{{ $json.place_id }}. - In Fetch Place Reviews, set Additional Fields → num to
{{ $json.num }}and Additional Fields → next_page_token to{{ $json.next_page_token }}. - Configure Check Review Availability with the boolean condition
{{ !!$json.reviews || $('Initialize Review State').item.json.is_single_business}}. - In Explode Review Items, set Field to Split Out to
reviews, and include Fields to Include asplace_info.title.
Credential Required: Connect your SerpApi credentials in Fetch Place Reviews.
Step 5: Append Reviews to Google Sheets
This step writes each exploded review item to your Google Sheet with mapped fields.
- Open Append Rows to Sheet and set Operation to
append. - Select your target spreadsheet in Document ID and choose the destination tab in Sheet Name.
- Map columns using expressions: rating →
{{ $json.reviews.rating }}, snippet →{{ $json.reviews.extracted_snippet.original }}, iso_date →{{ $json.reviews.iso_date }}, place_name →{{ $('Initialize Review State').first().json.place_name }}.
Credential Required: Connect your Google Sheets credentials in Append Rows to Sheet.
Step 6: Configure Pagination Logic
This step updates counters and routes the workflow to fetch more pages or move to the next place.
- In Update Count & Page Token, keep the JavaScript code that increments
countand updatesnext_page_tokenfrom Fetch Place Reviews. - Configure Route Pagination Logic with three rules using these expressions:
{{ !!$json.next_page_token && ($json.review_limit > $json.count + 20)}}for “Get More Pages,”{{ $json.is_single_business && (!$json.next_page_token || $json.review_limit < $json.count + 20 ) }}for “End Workflow,” and{{ !$json.is_single_business && (!$json.next_page_token || $json.review_limit < $json.count + 20 ) }}for “Get Next Place.” - Connect the “Get More Pages” output to Set Page Size Value, and the “Get Next Place” output to Iterate Places Batch.
num defined.Step 7: Test and Activate Your Workflow
Run a full test to confirm reviews are retrieved, expanded, and appended to your sheet.
- Click Execute Workflow to run Manual Start Trigger and observe the node-by-node execution.
- Verify that Append Rows to Sheet writes rows with rating, snippet, iso_date, and place_name in your Google Sheet.
- Confirm pagination continues until the
review_limitis reached or nonext_page_tokenremains. - When results look correct, toggle the workflow to Active for production use.
Watch Out For
- SerpApi credentials can expire or be pasted incorrectly. If it fails, check your SerpApi API key in n8n credentials and confirm you still have search credits in your SerpApi dashboard.
- 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 writes can fail silently when headers don’t match. Make sure your sheet has exactly name, iso_date, rating, snippet before you run a big pull.
Common Questions
About 20–30 minutes if your SerpApi key and Google Sheet are ready.
Yes. You’ll connect SerpApi and Google Sheets, then paste in your search query and pick the target 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 SerpApi credits since each request consumes 1 search credit.
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.
Start with the query in the “Lookup Maps Places” step, because that determines which locations you’re pulling from. Then adjust the cap in the “Define Review Cap” step if you need more (or fewer) reviews per place. If you only care about recent feedback, keep the limit low and run it weekly; if you’re doing a one-time audit, raise the limit and let pagination run longer. You can also change the Google Sheet columns and map extra fields before the “Append Rows to Sheet” step if you want things like review author or review URL.
Usually it’s an invalid or expired API key, or you’ve run out of SerpApi search credits. Update the SerpApi credentials in n8n, then check your SerpApi dashboard for remaining credits. If it still fails, your query may be too broad or returning no places, which means the review loop has nothing to fetch.
Practically, it’s capped by two things: SerpApi credits and how many places you pull (Google Maps results top out at 20 in this workflow). With the default 50 reviews per place, you can burn through around 60 credits in a single run if you hit the maximum results. If you self-host n8n there’s no execution limit, but you’ll still want to pace requests and keep an eye on Google Sheets write volume for very large pulls.
For this workflow, n8n has a few advantages: more complex pagination logic without awkward workarounds, a self-hosting option for unlimited executions, and easier control over batching when SerpApi returns multiple places and pages. Zapier or Make can work, but multi-loop flows often get expensive or brittle once you add paging and limits. n8n also makes it simpler to keep all review formatting rules in one place, so Sheets stays consistent. If you’re unsure, Talk to an automation expert and you’ll get a straight recommendation based on volume and budget.
Once this is in place, review collection stops being a recurring task and becomes a background process. Your Google Sheet stays clean, and you finally have data you can build decisions on.
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.