Google Reviews Monitor - Multi Location Review Alerts
Pricing
from $15.00 / 1,000 location checkeds
Google Reviews Monitor - Multi Location Review Alerts
Watch Google reviews for every location you own. Each branch is its own Google Business profile. One bad branch is easy to miss. It checks them all and returns only what changed: new reviews and rating drops. Sends to Slack, Discord or a webhook. $0.015 per location checked, $0.001 per new review.
Pricing
from $15.00 / 1,000 location checkeds
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
8 hours ago
Last modified
Categories
Share
Google Reviews Monitor: watch every branch's Google reviews and get only what changed
Give it a labelled list of your Google Business locations and it checks each one on a schedule, remembers what it saw last time, and reports only the new and changed reviews. It flags low-star reviews, spots when your overall rating drops, and can draft a public reply for the urgent ones.
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, urgent reviews nested inside it |
| Ceiling | Around 300 reviews per location is the practical reach, whatever you ask for |
| Account needed | None to monitor. Your own model key only for the AI text |
| Price | $0.015 per location checked, plus $0.001 per new or changed review |
🔔 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.
Deltas, not re-dumps. Each run reports what appeared or changed since
the previous run. State lives in a named key-value store, reviews-monitor-state, on your account,
and the per-review change records go to a named dataset, reviews-monitor-history.
What counts as a change. A new review. An edited one. A review going from unanswered to answered. A fall in the location's overall star rating.
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 drafts come from new or changed reviews only, never from history.
📥 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,"onlyNewSinceLastRun": true,"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. See below. |
generateAiSummary | on | A short briefing per location, from the new reviews only. |
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. A short
?q=place_id: link does not identify the branch well enough here: two locations in that form are
tracked as though they were the same place, which gives wrong new-review counts on both.
trackOwnerReplies is read from the form and then not used. Reply detection happens anyway, so
leaving it on costs nothing, but switching it off switches nothing off.
📤 What you get back
One row per location, per run.
| Field | What it is |
|---|---|
clientName, placeName, url | Your label, Google's name for the place, and the link you gave. |
syncStatus | ok when the location was read, failed when it was not. error explains a failure. |
isFirstRun | true on the baseline run for that location, when there is nothing to compare against. |
overallRating, totalReviewCount | The location's headline numbers this run. |
counts | new, changed, negative, unanswered, newOwnerReplies and urgent. |
ratingChange | before, after, delta and dropped. |
themes | The words coming up most in the new negative reviews. |
urgentReviews | The negative and unanswered ones in full: reviewId, rating, reviewerName, relativeDate, text, reason, and suggestedReply when drafts are on. |
agencySummary | The short briefing for that location. |
hasSignal | true when something happened worth telling someone about. |
reportUrl | Link to the rolled-up HTML report, when weeklyReport is on. |
A real row from a recent run. This one is a location whose reviews feed would not load:
{"target": "gmaps:url:www.google.com/maps/place/","clientName": "Example ... Googleplex","syncStatus": "failed","error": "Reviews feed did not load (possible anti-bot block or layout change).","counts": { "new": 0, "changed": 0, "negative": 0, "unanswered": 0, "urgent": 0 },"ratingChange": { "before": null, "after": null, "delta": null, "dropped": false },"urgentReviews": [],"themes": [],"agencySummary": "Could not fetch this location (Reviews feed did not load ...).","hasSignal": false,"reportUrl": "https://api.apify.com/v2/key-value-stores/gm788eATqwJOTwG8y/records/latest-report.html?signature=..."}
🧾 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 loads the newest reviews to learn what is there,
reports isFirstRun: true, sends no webhook, and processes every review it loaded. Keep
maxReviewsPerRun small on that first run unless you want the backfill.
A failed location keeps its saved state, so the next run picks the same changes up.
▶️ How to run it
- 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.
- 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?
| What | Price |
|---|---|
| A location checked | $0.015 |
| A new or changed review processed | $0.001 |
| An AI summary or reply draft generated | $0.01 |
| The rolled-up HTML report | $0.05 per run |
Flat on every Apify plan, no volume tiers.
The report charge fires once 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 AI text runs on your own Anthropic or OpenAI key, and that provider bills you for the tokens.
💡 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 half a star 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.
🚧 What it does not do
- It is not one row per review. The run dataset gives a row per location. Full review data lives in your named store and history dataset.
- Google can refuse a location, and then you get a
failedrow instead of counts. It is not charged as a check, and the next run tries again. maxReviewsPerRunaccepts up to 1,000, but scrolling stops well before that. Past roughly 300 you will not get more however high you set it.- Review dates are Google's relative wording, like
2 weeks ago. No exact timestamp exists in that feed. - Deleted reviews are never reported. It sees what is there, not what left.
trackOwnerRepliesdoes nothing. Replies are detected 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.
🧭 Which Google scraper do you need?
| If you want | Use |
|---|---|
| A scheduled watch on your locations, with alerts | This one |
| Every review for one place, in one go | Google Maps Reviews Scraper |
| Places from a search, with reviews optional | Google Maps Scraper |
| Reviews for an Android app | Google Play Reviews Scraper |
| The web results page for a keyword | Google Search Results Scraper |
❓ Questions people ask
How do I get only new 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.
Do I need an AI key? Only for generateAiSummary and generateReplyDrafts. Monitoring, alerts
and rating-drop detection work 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 an AI assistant run it? Yes, through Apify's MCP server:
https://mcp.apify.com/?actors=dami_studio/google-reviews-monitor.
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 scraping and the law 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.
