Every free way to get your reviews into a spreadsheet has the same catch, and nobody puts it in the headline: it only works on businesses you already own.
Google Takeout, the Business Profile API, the review widgets, the $45/month dashboards. All of them authenticate as you.
Which means they stop dead the moment you point them at a competitor, a prospect, or a client who hasn’t added you to their listing yet. If you do local SEO for other people, that’s most of your job.
20
Reviews per request (hard cap)
~2,000
Reviews/month on the free tier
28
Fields per review
2021
How far back our test pulled
So this post covers the two methods that don’t care who owns the profile. One is a script you paste into Google Sheets, the other is Python.
Both run on the same Google Maps reviews API , and the code for each is on GitHub . They also give you the one thing extensions can’t: real dates.
The FlyByAPIs Google Maps Extractor returns reviews for any public business, not just profiles you own. Every review carries a Unix timestamp next to the “3 months ago” string, which is what makes an export sortable. The
limitcaps at 20 per request, and the free tier covers roughly 2,000 reviews a month.
Everything below ran this week against live data. I pulled 60 reviews for Reading Terminal Market in Philadelphia, then a three-business batch that came back with 80 rows and 13 owner responses.
No cherry-picking. Where something is annoying, I say so.
One honest note before we start, because I don’t want to waste your time.
If you own the profile and just want a one-off dump:
Go to Google Takeout, click "Deselect all", tick Google Business Profile, and create the export. It's free, it's official, and it takes 30 seconds to start. You'll get JSON in a ZIP rather than a spreadsheet, but for a single backup of your own listing it does the job. Everything past this box is for the cases Takeout can't reach.
Why the obvious free routes fall short
Search this topic and you get four suggestions on repeat. Here’s where each one runs out of road.
| Route | Works on others' listings? | Where it breaks |
|---|---|---|
| Google Takeout | No | JSON in a ZIP, not a spreadsheet. Your own profiles only. |
| Browser extensions | Yes | Only grabs what's loaded on screen, and dates arrive as "a month ago". |
| Google Places API | Yes | Capped at 5 reviews per business. Fine for a widget, useless for analysis. |
| Business Profile API | No | Full history and exact dates, but OAuth as the owner. Same wall as Takeout. |
The extension problem deserves a second look, because it’s the one that quietly ruins spreadsheets. Reviewflowz, whose help article ranks on page one for this, is blunt about it: exports with relative dates are “pretty much entirely useless”.
They’re right. A column full of “3 months ago” can’t be sorted, can’t be filtered by quarter, and can’t be charted. And it goes stale the day after you export it.
Both methods below fix exactly that. The FlyByAPIs Google Maps Scraper API hands back a Unix timestamp alongside the human string, and one line of code turns it into a date your spreadsheet understands.
What you need before either method
Both methods use the same two endpoints, so the setup is identical.
A free API key
Sign up on RapidAPI and subscribe to the free tier of the Google Maps scraping API. 100 requests a month, no card.
A business name with its city
"Zahav, Philadelphia" works. Bare "Zahav" is ambiguous and you may resolve the wrong listing.
Under the hood there are two calls. /locate_and_search turns the name into a google_id, the hex string Google uses internally. Then /business_reviews takes that ID and hands back the reviews.
You never have to see the ID. Both scripts chain the calls for you, which is exactly the step most tutorials skip when they just list endpoint URLs.
Method 1: export Google reviews straight into a spreadsheet
No install, no terminal. Google Sheets can call the Google Maps API for review data itself through Apps Script , and the reviews land in the sheet you’re already looking at.
Open a new spreadsheet
In the menu bar click Extensions, then Apps Script. A new tab opens with an empty file called Code.gs.
Paste the script below
Delete the empty function that's already there, paste everything, then set your key, the business, and how many reviews you want.
Click Run and approve the prompt
Google asks for permission the first time because the script talks to an outside service. That's expected.
Here’s the whole thing:
| |
To switch businesses, change the BUSINESS line and click Run again. The sheet clears and refills.
Why toDate() is the important line:
It turns the Unix timestamp into a genuine Sheets date object, not text. That's what lets you sort chronologically, build a pivot by month, and chart your rating trend. Every export that hands you "3 months ago" fails at exactly this step.
One caution about your key: it sits in the script, so don’t share that spreadsheet publicly with edit access, and never paste the script online with your real key in it. If a key leaks, regenerate it on RapidAPI in one click.
100 requests/month free · No credit card required
Method 2: the Python script for many businesses at once
Apps Script handles one business at a time. When you’re building a quarterly report across a dozen client locations plus their competitors, you want a loop and a proper CSV.
Setup:
| |
Then:
| |
| Flag | Default | What it does |
|---|---|---|
| --max | 100 | Maximum reviews per business |
| --sort | mostRecent | Also qualityScore, ratingHighToLow, ratingLowToHigh |
| --from-file | — | Text file with one business per line |
| --out | google_reviews.csv | Output path |
The pagination loop is the heart of it, and it’s worth reading even if you never run the script, because it’s what every extension gets wrong:
| |
And the date conversion, the Python twin of toDate():
| |
The full script is in the repo , with 18 columns including reviewer history, owner responses, photo counts, and a direct link to each review. It’s the same pattern we used to pull business listings into a spreadsheet, just pointed at the reviews endpoint instead.
Here’s a real run against three Philadelphia restaurants:
| |
Note the third line. A name with no match comes back empty rather than throwing an error, so one typo in a 40-row client list doesn’t kill the whole run. The business reviews endpoint reference lists every parameter if you want to go deeper.
What you actually get back
Each review carries 28 fields. The ones that actually matter for a client report:
The review itself
Exact date, star rating, full text, photo count, language, and a permalink back to the review on Google.
Context around it
Reviewer name, Local Guide status, how many reviews they've written, plus the owner's response and when it was posted.
That owner response column is the one clients react to, and the Maps API returns it across the full review history rather than only for the newest few. In our three-business run, 13 of 80 reviews had a reply.
Sort by rating with the response column visible and every unanswered one-star surfaces in about four seconds. That’s usually the first slide of the report.
Reply speed is the other thing that falls out of this for free. Both dates are real timestamps, so one column minus the other gives you the average per location, over whatever window you want.
Three limits worth knowing before you run it
I’d rather you hear these from me than discover them at 11pm before a client call.
Twenty per request, no exceptions
I sent limit=100 and got 20 back. The cap is real, so budget one request per 20 reviews. A business with 3,000 reviews needs 150 requests to pull in full.
A third to a half of reviews have no text
Between 30% and 48% across the businesses we tested were star-only. That's how people rate things, not a bug in the export. Filter the blanks before you count anything.
Sorting by newest has odd stragglers
A 2021 review turned up in the middle of a most-recent run. Those are edited reviews: Google reorders them by edit date while the timestamp stays original. Sort your spreadsheet by the date column afterwards and it's a non-issue.
On cost: the FlyByAPIs free tier is 100 requests a month, which is about 2,000 reviews. That covers a handful of locations comfortably.
Past that you’re into paid plans, and the Google Maps data extraction API starts at $19.99/month. That’s still a third of what a single-location review dashboard charges.
Which method should you pick
Pick Google Sheets
One or two businesses, a report due today, and no appetite for a terminal. You'll have data in the sheet within five minutes of pasting the script.
Pick Python
More than three businesses, a recurring report, or you want to diff this month against last. The --from-file flag turns a client list into one CSV.
Most agencies I’ve talked to end up running both. Sheets for the ad-hoc “what are they saying about us” question in a meeting, Python for the monthly deliverable.
Either way you’re hitting the same endpoint, and the Google Maps business data API bills both identically. Switching later costs you nothing.
Review data is rarely the only thing a client report needs, and the same key covers the rest of what we run.
Rank tracking
SERP data for keyword positions, for when the review work turns into a full local audit.
Product data
Amazon product and review data, same idea applied to listings instead of storefronts.
Company research
Funding and firmographics, plus job postings as a hiring signal.
Translation
A translation API, which sounds like overkill until a tourist-heavy listing comes back half in six languages.
The short version
Takeout and the official API both work fine, right up to the moment you need data on a business that isn’t yours. Then they stop, and no amount of configuration gets you past it.
The two scripts here don’t have that ceiling, because the FlyByAPIs endpoint behind them reads public listings instead of authenticating as the owner. Paste one into Sheets or run the other from a terminal, and you get the full review history with dates you can actually sort.
At the volumes most agencies work at, neither one costs you anything. They both live in the code repo , so fork them and add whatever columns your reports want.
Key takeaway: ownership is the only thing that separates these two methods from every other free option. Drop that requirement and the whole problem becomes a pagination loop.
The Google Sheets version is where I’d start. Five minutes, one paste, and you’ll know within a single run whether this solves your problem.
100 requests/month free · No credit card required
P.S. If you extend the script, the field I’d add next is user_reviews_count. A one-star from someone with 400 reviews and Local Guide level 8 is a different animal from a one-star on a brand new account.
That distinction has settled more than one argument about whether a review is worth disputing.
Oriol.
