Google Reviews Monitor - Multi Location Review Alerts avatar

Google Reviews Monitor - Multi Location Review Alerts

Pricing

from $15.00 / 1,000 location checkeds

Go to Apify Store
Google Reviews Monitor - Multi Location Review Alerts

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

8 hours ago

Last modified

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.

InputYour Google Business locations, each with a label and its Maps link
OutputOne row per location per run, urgent reviews nested inside it
CeilingAround 300 reviews per location is the practical reach, whatever you ask for
Account neededNone 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": ""
}
FieldDefaultWhat it is
locationsrequiredOne entry per location: clientName is your own label, googleMapsUrl is the public Maps link.
maxReviewsPerRun10Newest reviews to load per location each run. 10 suits a scheduled monitor.
onlyNewSinceLastRunonCurrently has no effect. Every run after the first reports only what is new or changed, on or off.
alertOnNewReviewsonCount a location as worth alerting on when it has any new review.
alertOnNegativeReviewsonFlag new reviews at or below the threshold.
negativeRatingThreshold3Stars at or below this count as negative.
detectRatingDropsonCompare the overall rating against last run and flag a fall.
trackOwnerRepliesonCurrently has no effect. See below.
generateAiSummaryonA short briefing per location, from the new reviews only.
generateReplyDraftsoffDraft a public reply for each urgent review. Capped per run.
aiModelgpt-4o-miniGPT models need an OpenAI key, Claude models an Anthropic key.
anthropicApiKeynoneYour own Anthropic key. Stored as a secret.
openaiApiKeynoneYour own OpenAI key. Stored as a secret.
weeklyReportonRender one rolled-up HTML report and link it from every row. Read the cost note.
webhookUrlemptySlack, Discord or any endpoint that takes JSON.
proxyConfigurationleave it aloneOptional. 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.

FieldWhat it is
clientName, placeName, urlYour label, Google's name for the place, and the link you gave.
syncStatusok when the location was read, failed when it was not. error explains a failure.
isFirstRuntrue on the baseline run for that location, when there is nothing to compare against.
overallRating, totalReviewCountThe location's headline numbers this run.
countsnew, changed, negative, unanswered, newOwnerReplies and urgent.
ratingChangebefore, after, delta and dropped.
themesThe words coming up most in the new negative reviews.
urgentReviewsThe negative and unanswered ones in full: reviewId, rating, reviewerName, relativeDate, text, reason, and suggestedReply when drafts are on.
agencySummaryThe short briefing for that location.
hasSignaltrue when something happened worth telling someone about.
reportUrlLink 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

RowHow to spot itCharged as a location check
A location that was readsyncStatus: "ok"yes
A location that could not be readsyncStatus: "failed" with an errorno

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

  1. Open Google Reviews Monitor and click Try for free.
  2. Open each branch on Google Maps, copy the address-bar link, and add it to Client locations to monitor with your own label.
  3. Leave Max reviews to load per location at 10, or raise it once for a backfill.
  4. Paste a Slack or Discord webhook into Webhook URL if you want alerts, then click Start.
  5. Once the first run looks right, put it on a schedule from the Schedules tab.

💰 How much does it cost?

WhatPrice
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 urgentReviews straight 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 failed row instead of counts. It is not charged as a check, and the next run tries again.
  • maxReviewsPerRun accepts 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.
  • trackOwnerReplies does 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 wantUse
A scheduled watch on your locations, with alertsThis one
Every review for one place, in one goGoogle Maps Reviews Scraper
Places from a search, with reviews optionalGoogle Maps Scraper
Reviews for an Android appGoogle Play Reviews Scraper
The web results page for a keywordGoogle 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.