Google Reviews Monitor - Multi Location Review Alerts
Pricing
from $14.40 / 1,000 locations
Google Reviews Monitor - Multi Location Review Alerts
Watch the Google reviews of every location you look after and get only what changed: new and edited reviews, owner replies and rating drops, one row per location per run. Alerts go to Slack, Discord or any webhook. $0.015 per location checked, plus $1.00 per 1,000 new or changed reviews.
Pricing
from $14.40 / 1,000 locations
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Watch the Google reviews of every location you look after and get only what changed: new reviews, edited ones, fresh owner replies and a falling star rating, checked on a schedule and flagged when a low-star review sits unanswered. It can also draft a public reply for the urgent ones, on your own AI key.
Get the shape clear before you wire anything up. The dataset holds one row per location, not one row per review. That row carries the counts, the rating change, the themes and the urgent reviews in full. Every review it has ever seen goes to a named store and a named dataset on your own account, not into the run's dataset.
| Input | Your Google Business locations, each with a label and its Maps link |
| Output | One row per location per run, with the urgent reviews nested inside it |
| Ceiling | Up to 1,000 of the newest reviews per location per run |
| Account needed | None to monitor. Your own Anthropic or OpenAI key only for the AI text |
| Price | $1.00 per 1,000 new or changed reviews, plus $0.015 per location checked, $0.01 per AI summary or reply draft and $0.05 per HTML report on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 5,000 reviews, or about 330 location checks |
🔍 What Google Reviews Monitor does
Each branch is its own Google Business profile, and a bad week at one of them is easy to miss when you have twenty. So this checks them all and tells you what moved.
Changes, not re-dumps. The first run for a location learns what is there. Every run after that
reports only what appeared or changed: a new review, an edited one, a review going from unanswered to
answered, a fall in the overall rating. State lives in a named key-value store,
reviews-monitor-state, on your account, and the change records go to a named dataset,
reviews-monitor-history.
Alerts. Put a Slack or Discord incoming webhook in webhookUrl and you get a short summary when
something moved. Anything else gets plain JSON, which is what Zapier, Make and n8n want.
The AI part is optional and runs on your key. Summaries and reply drafts come from new or changed reviews only, never from history. Without a key you still get a plain summary, free.
📋 What data you get from each Google Business location
| What you get | Field |
|---|---|
| Your label, Google's name for the place, and the link you gave | clientName, placeName, url |
| Whether the location could be read, and why not | syncStatus, error |
| Whether this was the baseline run | isFirstRun |
| The headline numbers this run | overallRating, totalReviewCount |
| New, changed, negative, unanswered, newly answered and urgent, as counts | counts |
| The rating before and after, and whether it fell | ratingChange |
| The words coming up most in new negative reviews | themes |
| The negative, unanswered reviews in full, with a draft reply when drafts are on | urgentReviews |
| A short briefing for the location | agencySummary |
| Whether anything happened worth telling someone about | hasSignal |
| A link to the rolled-up HTML report | reportUrl |
▶️ How to scrape Google reviews for several locations
- Open Google Reviews Monitor and click Try for free.
- Open each branch on Google Maps, copy the address-bar link, and add it to Client locations to monitor with your own label. Replace the example.
- Leave Max reviews to load per location at 10, or raise it once for a backfill.
- Paste a Slack or Discord webhook into Webhook URL if you want alerts, then click Start.
- Once the first run looks right, put it on a schedule from the Schedules tab.
💰 How much does it cost to scrape and monitor Google reviews?
| What | Price |
|---|---|
| A new or changed review processed | $0.001 |
| A location checked | $0.015 |
| An AI summary or reply draft generated | $0.01 |
| The rolled-up HTML report | $0.05 per run |
These are Free plan prices. Paid plans pay a little less on every line. On the free plan, the $5 Apify gives you each month covers about 5,000 processed reviews, or about 330 location checks.
The report charge fires on every run while weeklyReport is on, including a quiet run and a run
where no location could be read. Switch it off if you do not read the HTML report, especially on a
frequent schedule.
A location that could not be read is not charged as a check. The first run processes every review
it loads, so keep maxReviewsPerRun small then unless you want the backfill. The AI text runs on
your own Anthropic or OpenAI key, and that provider bills you for the tokens.
📥 What you give it
{"locations": [{"clientName": "Acme Coffee, Downtown","googleMapsUrl": "https://www.google.com/maps/place/Acme+Coffee/@40.7185,-73.9571,17z/data=!4m7..."}],"maxReviewsPerRun": 10,"negativeRatingThreshold": 3,"webhookUrl": ""}
| Field | Default | What it is |
|---|---|---|
locations | required | One entry per location: clientName is your own label, googleMapsUrl is the public Maps link. |
maxReviewsPerRun | 10 | Newest reviews to load per location each run. 10 suits a scheduled monitor. |
onlyNewSinceLastRun | on | Currently has no effect. Every run after the first reports only what is new or changed, on or off. |
alertOnNewReviews | on | Count a location as worth alerting on when it has any new review. |
alertOnNegativeReviews | on | Flag new reviews at or below the threshold. |
negativeRatingThreshold | 3 | Stars at or below this count as negative. |
detectRatingDrops | on | Compare the overall rating against last run and flag a fall. |
trackOwnerReplies | on | Currently has no effect. Reply detection happens anyway. |
generateAiSummary | on | A short briefing per location, from the new reviews only. Plain and free without a key. |
generateReplyDrafts | off | Draft a public reply for each urgent review. Capped per run. |
aiModel | gpt-4o-mini | GPT models need an OpenAI key, Claude models an Anthropic key. |
anthropicApiKey | none | Your own Anthropic key. Stored as a secret. |
openaiApiKey | none | Your own OpenAI key. Stored as a secret. |
weeklyReport | on | Render one rolled-up HTML report and link it from every row. Read the cost note. |
webhookUrl | empty | Slack, Discord or any endpoint that takes JSON. |
proxyConfiguration | leave it alone | Optional. Your own servers are used exactly as given. |
Copy the Maps link out of your browser's address bar, the long /maps/place/... one. The form's
example uses a short ?q=place_id: link, and that form does not identify the branch well enough:
two locations written that way are tracked as though they were the same place, which gives wrong
new-review counts on both.
📤 What you get back
A real row from a scheduled run on 26 September 2026, with the review texts and the report link cut short and one of the three urgent reviews left out:
{"clientName": "Example. Googleplex","placeName": "Googleplex","url": "https://www.google.com/maps/place/?q=place_id:ChIJj61dQgK6j4AR4GeTYWZsKWw","isFirstRun": false,"overallRating": 4.1,"totalReviewCount": 9653,"counts": { "new": 4, "changed": 0, "negative": 3, "unanswered": 4, "newOwnerReplies": 0, "urgent": 3 },"ratingChange": { "before": 4.1, "after": 4.1, "delta": 0, "dropped": false },"themes": ["google", "course", "one", "complete"],"urgentReviews": [{"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT213eldUQkROREZHZWpoNFdUTnRVV3RHYVhWUmRVRRAB","rating": 1,"reviewerName": "Reviewer","relativeDate": "a month ago","text": "ONE OF MY ON GOING EMAIL BATTLES WITH GOOGLE WHILE TRYING TO COMPLETE ONE OF THEIR AI CERTIFICATIONS...","reason": "negative & unanswered"},{"reviewId": "Ci9DQUlRQUNvZENodHljRjlvT25RNFUxQTNSRkp0TjI5RU9WWTVhVkZ0TVdsTlVuYxAB","rating": 1,"reviewerName": "Reviewer","relativeDate": "a month ago","text": "Example review text.","reason": "negative & unanswered"}],"agencySummary": "4 new reviews (avg 2.5*). 3 urgent need replies. themes: google, course, one, complete.","aiGenerations": 0,"hasSignal": true,"target": "gmaps:url:www.google.com/maps/place/","syncStatus": "ok","reportUrl": "https://api.apify.com/v2/key-value-stores/qpMTl0FkluYVVBYZs/records/latest-report.html?signature=..."}
| Field | How to read it |
|---|---|
counts.urgent | Negative and unanswered. These are the ones in urgentReviews. |
ratingChange.dropped | true when the overall rating fell since the last run. |
agencySummary | The plain summary here, since this run had no AI key. With a key it reads like a short briefing. |
target | The key the location's history is stored under. A ?q=place_id: link always gives this same key, which is why the warning above matters. |
relativeDate | Google's own wording. No exact timestamp exists in that feed. |
🧾 Reading the output
| Row | How to spot it | Charged as a location check |
|---|---|---|
| A location that was read | syncStatus: "ok" | yes |
| A location that could not be read | syncStatus: "failed" with an error | no |
Filter your alerting on hasSignal. A quiet run writes a row per location with hasSignal: false
and empty counts, which is normal and not a fault.
The first run for a location is a baseline: it reports isFirstRun: true and sends no webhook. A
failed location keeps its saved state, so the next run picks the same changes up.
💡 What people use it for
- An agency watching every client's branches and getting one Slack message a morning.
- A franchise spotting the one site whose rating slipped this week.
- A support team pulling
urgentReviewsstraight into a queue, with a draft reply attached. - Keeping a record of what changed, by reading the named history dataset rather than the run.
From a brand name to a morning alert, in three steps:
- Run Google Maps Scraper on a search like
Acme Coffee in Chicago, ILand copy thenameandplaceUrlof each branch. - Add each one to
locationshere, the name asclientNameand the link asgoogleMapsUrl. - Paste a Slack webhook into
webhookUrland schedule the run for every morning.
🚧 What it does not do
- Some locations will not load on a given run, and then you get a
failedrow instead of counts. It is not charged as a check, and the next run tries again. - At most 1,000 reviews per location per run, the newest first. Older history past that is not read.
- Review dates are Google's relative wording, like
2 weeks ago. - Deleted reviews are never reported. It sees what is there, not what left.
onlyNewSinceLastRunandtrackOwnerRepliesdo nothing. Changes and replies are reported either way.- The saved state never prunes, so the named store grows the longer you run it.
- A
?q=place_id:link cannot tell two locations apart. Use the full address-bar link. - It is not an official Google tool. Dami's Studio is independent and is not affiliated with or endorsed by Google, or by any other company named on this page.
🧭 Which Google Maps scraper do you need?
| If you want | Use |
|---|---|
| Places from a search, with reviews optional | Google Maps Scraper |
| Reviews for a place you can link or name, with exact dates | Google Maps Reviews Scraper |
| The photos and videos on a place | Google Maps Place Photos Scraper |
| Only what changed in your own locations' reviews, on a schedule | This one |
| Businesses in Russia and the CIS, from Yandex Maps | Yandex Maps Scraper |
❓ Questions people ask
How do I get only new Google reviews instead of the whole history?
Every run does that. The first run is the baseline; after that you get changes only.
Can it post to Slack?
Yes. Put a Slack incoming webhook in webhookUrl and the payload is formatted for it. Discord works
the same way, and anything else gets plain JSON. Nothing is sent on a quiet run or on the first one.
Do I need an AI key?
Only for AI-written summaries and reply drafts. Everything else works without one.
Where are the individual reviews?
In urgentReviews on the row, and in the named reviews-monitor-history dataset on your account for
everything else.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made
code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/google-reviews-monitor. Either way the
run happens on your Apify account at the same price.
Is monitoring Google reviews legal?
These are public reviews, and they carry personal data that GDPR and similar laws cover, so have a reason for keeping it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and the Maps link of the location that
misbehaved. The error text on a failed row usually names the problem on its own.