Google Reviews Monitor avatar

Google Reviews Monitor

Pricing

from $14.40 / 1,000 locations

Go to Apify Store
Google Reviews Monitor

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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

a day ago

Last modified

Features

Limited permissions

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.

InputYour Google Business locations: a Maps link, a place ID or CID, or a search like dentists in Austin TX
OutputOne row per location per run, with the urgent reviews nested inside it, and one per new review if you ask
CeilingUp to 1,000 of the newest reviews per location per run
Account neededNone 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 getField
Your label, Google's name for the place, and the link you gaveclientName, placeName, url
Google's ids for the placefeatureId, cid, placeId
Address, category, map position, website and phone, as the listing shows themaddress, street, city, postalCode, state, countryCode, categories, latitude, longitude, website, phone
Whether Google marks the place permanently closedpermanentlyClosed
When this check rancheckedAt
Whether the location could be read, and why notsyncStatus, error
Whether this was the baseline runisFirstRun
The headline numbers this runoverallRating, totalReviewCount
New, changed, negative, unanswered, newly answered and urgent, as countscounts
The rating before and after, and whether it fellratingChange
The words coming up most in new negative reviewsthemes
The negative, unanswered reviews in full, with a draft reply when drafts are onurgentReviews
New reviews that mention your watched words, or carry the star ratings you pickedkeywordMatches, ratingAlerts
Owner replies that appeared since the last run, with what they saynewOwnerReplies
A short briefing for the locationagencySummary
Whether anything happened worth telling someone abouthasSignal
A link to the rolled-up HTML reportreportUrl

Each review, wherever it appears:

What you getField
The exact time it was posted, or last edited, and Google's relative wordingpublishedAt, relativeDate
A link that opens the review on Google MapsreviewUrl
Stars, the writer's own words and their language, and Google's translation when there is onerating, text, language, textTranslated, translatedFrom
The owner's reply and when it was postedownerReplyText, ownerReplyRelativeDate
Food, service and atmosphere scores, or rooms, service and location, and the trip details, on restaurants and hotelssubRatings, visitDetails
Where the review came fromsource
The reviewer's name, unless you switch names offreviewerName
Optional: photo links, the reviewer's profile link and id, their review and photo counts, Local Guide or notphotos, reviewerUrl, reviewerId, reviewerReviewCount, reviewerPhotoCount, reviewerIsLocalGuide

▶️ How to scrape Google reviews for several locations

  1. Open Google Reviews Monitor and click Try for free.
  2. 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.
  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 to scrape and monitor Google reviews?

WhatPrice
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": ""
}
FieldDefaultWhat it is
locationsnoneOne 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.
maxReviewsPerRun10Newest reviews to load per location each run. 10 suits a scheduled monitor.
searchQueriesnoneSearches 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.
maxPlacesPerSearch5Places taken from each search, 1 to 20.
onlyReviewsNewerThannoneA date like 2026-10-01 or an age like 7 days. Older reviews are not read, so a first run bills fewer.
watchKeywordsnoneWords like refund or parking. A new review or reply that contains one is listed in keywordMatches and raises the alert.
alertOnRatingsnoneStar ratings that raise the alert, say 5 for praise. When set, it replaces the threshold for alerts.
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. Reply detection happens anyway.
generateAiSummaryonA short briefing per location, from the new reviews only. Plain and free without a key.
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.
includeReviewerNamesonOff leaves names out of the rows and out of the stored history.
includeReviewPhotosoffAdd photo links. Nothing is downloaded.
includeReviewerDetailsoffAdd the reviewer's public profile link, id, review and photo counts and Local Guide flag. Off, none of it is stored.
googleReviewsOnlyoffLeave out any review another site supplied to Google.
reviewRowsoffOne more row per new or changed review, with the place's columns. No extra charge.
proxyConfigurationleave it aloneOptional. 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=..."
}
FieldHow to read it
counts.urgentNegative and unanswered. These are the ones in urgentReviews.
ratingChange.droppedtrue when the overall rating fell since the last run.
agencySummaryThe plain summary here, since this run had no AI key. With a key it reads like a short briefing.
targetThe 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.
relativeDateGoogle's own wording. publishedAt has the exact time, and for an edited review it is the time of the edit.

🧾 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
A place with no reviews on Google yet, or a search that found no place with reviewsrecordType: "note", errorCode: "NO_RESULTS", with the reason in error and what happens next in detailsno

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 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.

From a brand name to a morning alert, in three steps:

  1. Run Google Maps Scraper on a search like Acme Coffee in Chicago, IL and copy the name and placeUrl of each branch.
  2. Add each one to locations here, the name as clientName and the link as googleMapsUrl.
  3. Paste a Slack webhook into webhookUrl and 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 failed row 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.
  • onlyNewSinceLastRun and trackOwnerReplies do 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 wantUse
Places from a search, with reviews optionalGoogle Maps Scraper
Reviews for a place you can link or name, with exact datesGoogle Maps Reviews Scraper
The photos and videos on a placeGoogle Maps Place Photos Scraper
Only what changed in your own locations' reviews, on a scheduleThis one
Businesses in Russia and the CIS, from Yandex MapsYandex 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.

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.