Google Reviews Monitor — Multi-Location Alerts & Reports
Pricing
from $15.00 / 1,000 location checkeds
Google Reviews Monitor — Multi-Location Alerts & Reports
Monitor Google Maps reviews across all your client locations on a schedule. Only-new deltas, negative/unanswered alerts, rating-drop detection, AI summaries & reply drafts, Slack/webhook alerts, and a rolled-up HTML report. Built for marketing & SEO agencies — action-ready, not raw data.
Pricing
from $15.00 / 1,000 location checkeds
Rating
5.0
(1)
Developer
Imed
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
Monitor Google Maps reviews across all your client locations on autopilot. Schedule it, and every run sends you only the new reviews, flags negative and unanswered ones, detects rating drops, drafts replies, and rolls everything into one agency-ready report. Built for marketing & SEO agencies and multi-location businesses who need to act on reviews — not drown in raw data.
Snapshot → diff → alert. This is a monitor, not a one-shot scraper. Point it at 1 or 100 Google Business locations, put it on a daily schedule, and get deltas + alerts.
Why this instead of a plain reviews scraper?
Most Google reviews actors hand you a giant JSON dump of every review, every run. An agency managing 30 client locations doesn't need that — they need to know what changed since yesterday and what needs a reply right now. This actor is built around that job:
- 🆕 Only-new deltas — each scheduled run returns just the reviews that are new or changed since the last run (persisted between runs). No re-dumping history.
- 🚨 Action-ready alerts — new negative reviews, unanswered reviews, and rating drops surfaced per location, so you reply before the client notices.
- 🏢 True multi-location — one input, many locations, one rolled-up HTML report.
- 🤖 AI summary + reply drafts — a one-line briefing per location ("2 urgent reviews need replies; main complaint: wait times") and optional draft replies for urgent reviews.
- 🔔 Slack / Discord / webhook alerts — compact summaries pushed where your team works.
- 💸 Pay per event — pay for what you check, not a flat monthly rental.
What it does
- Opens each Google Maps location in a real browser (Crawlee + Playwright) via Apify residential proxy.
- Loads the newest reviews, expands "See more", and extracts: rating, text, reviewer, relative date, owner response (yes/no + text), and photos.
- Compares against the previous run's snapshot and computes new / changed reviews.
- Classifies: negative (≤ your threshold), unanswered, urgent (negative and unanswered), recurring complaint themes, and overall rating drops.
- Emits an action-ready record per location to the dataset, optionally fires a webhook, and saves a rolled-up HTML report to the Key-Value Store.
Input
| Field | Type | Default | Description |
|---|---|---|---|
locations | array | — (required) | One entry per location: { "clientName": "...", "googleMapsUrl": "https://www.google.com/maps/place/..." } |
maxReviewsPerRun | integer | 50 | Newest reviews to load per location each run |
onlyNewSinceLastRun | boolean | true | Emit only new/changed reviews (the core monitor behavior) |
alertOnNewReviews | boolean | true | Include locations with new reviews in the alert signal |
alertOnNegativeReviews | boolean | true | Flag new reviews ≤ threshold |
negativeRatingThreshold | integer | 3 | Reviews at/below this rating are "negative" |
trackOwnerReplies | boolean | true | Detect when the owner replies to a review |
detectRatingDrops | boolean | true | Flag overall rating drops vs last run |
generateAiSummary | boolean | true | One AI/rule-based briefing per location (on new reviews only) |
generateReplyDrafts | boolean | false | Draft replies for urgent reviews |
aiModel | string | gpt-4o-mini | AI model (GPT or Claude) used when a key is configured |
openaiApiKey | string (secret) | — | Optional BYO OpenAI key (default provider); otherwise rule-based (free) |
anthropicApiKey | string (secret) | — | Optional BYO Anthropic/Claude key (used if no OpenAI key) |
weeklyReport | boolean | true | Render a rolled-up HTML report to the KV store |
webhookUrl | string | "" | Slack/Discord/generic webhook for alerts |
proxyConfiguration | object | RESIDENTIAL | Apify Proxy (residential strongly recommended) |
Example input
{"locations": [{ "clientName": "Dental Group A — Downtown", "googleMapsUrl": "https://www.google.com/maps/place/..." },{ "clientName": "Dental Group A — Westside", "googleMapsUrl": "https://www.google.com/maps/place/..." }],"maxReviewsPerRun": 50,"onlyNewSinceLastRun": true,"alertOnNegativeReviews": true,"negativeRatingThreshold": 3,"generateAiSummary": true,"weeklyReport": true,"webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ","proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
How to get a location URL: open the business on Google Maps and copy the URL from your browser's address bar (it looks like
https://www.google.com/maps/place/Name/@lat,lng,17z/data=...).
Output
One action-ready record per location in the dataset:
{"clientName": "Dental Group A — Downtown","overallRating": 4.3,"isFirstRun": false,"counts": { "new": 2, "changed": 0, "negative": 2, "unanswered": 2, "newOwnerReplies": 0, "urgent": 2 },"ratingChange": { "before": 4.7, "after": 4.3, "delta": -0.4, "dropped": true },"themes": ["wait", "billing", "staff"],"urgentReviews": [{"reviewId": "abc123","rating": 1,"reviewerName": "Sam","relativeDate": "2 hours ago","text": "Terrible wait, over an hour past my appointment...","reason": "negative & unanswered","suggestedReply": "Hi Sam, thank you for sharing your experience and we're sorry it fell short..."}],"agencySummary": "2 new reviews (avg 1.5★). 2 urgent need replies. themes: wait, billing.","reportUrl": "https://api.apify.com/v2/key-value-stores/.../records/latest-report.html","syncStatus": "ok"}
The first run establishes a baseline (no alerts) so you don't get spammed with the full history; from the second run on you get pure deltas.
Scheduling (this is the point)
- Run the actor once to establish the baseline.
- Open the actor → Schedules → Create schedule → run daily (cron
0 8 * * *for 8am). Attach this actor + your saved input. - Add a
webhookUrlso your team gets a Slack/Discord ping only when something changes.
A monitor only compounds value when it runs on a schedule — that's where the alerts come from.
Use cases for agencies
- Reputation management retainers — prove value weekly with a per-client report.
- Reply-SLA enforcement — never miss a negative or unanswered review across 50 locations.
- Churn prevention — catch a rating drop the day it happens, not at the QBR.
- Franchise / multi-branch oversight — one dashboard for every location's reviews.
- White-label — pipe the webhook/report into your own client dashboard.
Pricing (pay per event)
You only pay for the work each run does:
| Event | Price | When |
|---|---|---|
| Actor start | $0.005 | once per run |
| Location checked | $0.01 | per location successfully checked |
| Review processed | $0.001 | per new/changed review (never re-charged for history) |
| AI generation | $0.01 | per AI summary / reply draft (only on new reviews) |
| Report generated | $0.05 | per rolled-up report |
A typical daily run for one location with a few new reviews costs only a few cents. See
MONETIZATION.md for the full cost math.
How it compares
Most Google reviews actors are extractors; this is a monitor. The three things they all leave for you to build yourself:
| Typical reviews scraper | Google Reviews Monitor | |
|---|---|---|
| Each scheduled run returns… | the full review history (re-scraped & re-billed) | only new/changed reviews since last run |
| New negative / unanswered / rating-drop alerts | DIY in n8n/Make | built-in, routed to Slack/Discord/webhook |
| Output | JSON/CSV dump | action-ready record + AI reply drafts + client-ready HTML report |
| Multi-location | a flat URL array | per-location records + one rolled-up report |
| Billing | per review scraped (history included) | pay-per-event on deltas — cents/day for many locations |
Apify's own guide lists negative-review and rating-drop alerts as things you must build yourself. This actor ships them natively. (See
DISTRIBUTION_KIT.mdfor the full competitor breakdown and sources.)
FAQ
Does this use the official Google Business Profile API? No — the GBP API only works on locations you own and requires per-user Google approval, so it can't power a tool you run for other people's locations. This actor reads public Google Maps reviews with a real browser + residential proxy.
Will it get blocked?
Use the default RESIDENTIAL proxy. The actor also rotates sessions/fingerprints and
retries. One location failing never stops the others (it's marked failed and the run
continues).
Do I need an AI API key?
No. Without one you still get a useful rule-based summary for free. Add an Anthropic
(Claude) or OpenAI key — or have the actor owner set the ANTHROPIC_API_KEY (or
OPENAI_API_KEY) secret — to get LLM-quality summaries and reply drafts. Default model is the
cheapest Claude (claude-haiku-4-5).
How many locations can I monitor?
As many as you want — add them all to locations. Each is checked independently.
How is "new" determined? By a stable review id + a fingerprint of meaningful fields (rating, text, owner reply). State persists between runs in a named Key-Value Store, so scheduled runs return true deltas.
What about deleted/old reviews scrolling off the page?
The monitor does not raise false "removed" alerts when an old review simply falls past
the maxReviewsPerRun window.
Notes & limitations
- Google Maps markup changes often; the actor uses resilient selectors with fallbacks and
forces English (
hl=en) for predictable parsing. - Some reviews are rating-only (no text) — that's normal and handled.
- Reply drafts are suggestions; review them before posting.
Built on the Apify SDK with a reusable, source-agnostic monitoring engine. See AGENTS.md
for architecture.