Google Reviews Monitor
Pricing
from $14.40 / 1,000 locations
Google Reviews Monitor
Google reviews monitor for every location you look after: get only what changed, with 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
0
Monthly active users
a day ago
Last modified
Categories
Features
Share
Google reviews monitor for every location you look after, 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.
The dataset holds one row per location, with the counts, the rating change, the themes and the
urgent reviews in full. Turn on reviewRows for one more row per new or changed review. Every review
it has seen goes to a named store and a named dataset on your own account.
| Input | Your Google Business locations: a Maps link, a place ID or CID, or a search like dentists in Austin TX |
| Output | One row per location per run, with the urgent reviews nested inside it, and one per new review if you ask |
| 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 |
| Google's ids for the place | featureId, cid, placeId |
| Address, category, map position, website and phone, as the listing shows them | address, street, city, postalCode, state, countryCode, categories, latitude, longitude, website, phone |
| Whether Google marks the place permanently closed | permanentlyClosed |
| When this check ran | checkedAt |
| 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 |
| New reviews that mention your watched words, or carry the star ratings you picked | keywordMatches, ratingAlerts |
| Owner replies that appeared since the last run, with what they say | newOwnerReplies |
| A short briefing for the location | agencySummary |
| Whether anything happened worth telling someone about | hasSignal |
| A link to the rolled-up HTML report | reportUrl |
Each review, wherever it appears:
| What you get | Field |
|---|---|
| The exact time it was posted, or last edited, and Google's relative wording | publishedAt, relativeDate |
| A link that opens the review on Google Maps | reviewUrl |
| Stars, the writer's own words and their language, and Google's translation when there is one | rating, text, language, textTranslated, translatedFrom |
| The owner's reply and when it was posted | ownerReplyText, ownerReplyRelativeDate |
| Food, service and atmosphere scores, or rooms, service and location, and the trip details, on restaurants and hotels | subRatings, visitDetails |
| Where the review came from | source |
| The reviewer's name, unless you switch names off | reviewerName |
| Optional: photo links, the reviewer's profile link and id, their review and photo counts, Local Guide or not | photos, reviewerUrl, reviewerId, reviewerReviewCount, reviewerPhotoCount, reviewerIsLocalGuide |
▶️ How to scrape Google reviews for several locations
- Open Google Reviews Monitor and click Try for free.
- Add each branch to Client locations to monitor with your own label and its Maps link or place ID, or type a search into Search for places. 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 | none | One entry per location: clientName is your own label, googleMapsUrl is the Maps link, a review or search link, a place ID (ChIJ...), a CID or a feature ID. |
maxReviewsPerRun | 10 | Newest reviews to load per location each run. 10 suits a scheduled monitor. |
searchQueries | none | Searches like dentists in Austin TX. The first run saves the places found and later runs check the same ones. Each is billed as a location. |
maxPlacesPerSearch | 5 | Places taken from each search, 1 to 20. |
onlyReviewsNewerThan | none | A date like 2026-10-01 or an age like 7 days. Older reviews are not read, so a first run bills fewer. |
watchKeywords | none | Words like refund or parking. A new review or reply that contains one is listed in keywordMatches and raises the alert. |
alertOnRatings | none | Star ratings that raise the alert, say 5 for praise. When set, it replaces the threshold for alerts. |
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. |
includeReviewerNames | on | Off leaves names out of the rows and out of the stored history. |
includeReviewPhotos | off | Add photo links. Nothing is downloaded. |
includeReviewerDetails | off | Add the reviewer's public profile link, id, review and photo counts and Local Guide flag. Off, none of it is stored. |
googleReviewsOnly | off | Leave out any review another site supplied to Google. |
reviewRows | off | One more row per new or changed review, with the place's columns. No extra charge. |
proxyConfiguration | leave it alone | Optional. Your own servers are used exactly as given. |
Paste the place ID itself (ChIJ...), or the long /maps/place/... link. A ?q=place_id:
link, like the form's example, does not identify the branch: two locations written that way are
tracked as one place, with wrong 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. publishedAt has the exact time, and for an edited review it is the time of the edit. |
🧾 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 |
| A place with no reviews on Google yet, or a search that found no place with reviews | recordType: "note", errorCode: "NO_RESULTS", with the reason in error and what happens next in details | 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.
- No star breakdown, only the average and the count.
- 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, one row each with reviewRows on, and in the named
reviews-monitor-history dataset on your account.
Can I call it from code or connect it to an AI assistant?
The API tab has code for Python, JavaScript and the
CLI. MCP clients like Claude and ChatGPT use
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/google-reviews-monitor; coding assistants can load our
skill file.
All three bill 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.