If you run a local business, manage a multi-location franchise, lead a customer support team, or oversee client reputations, STATELESS review scraping isn't enough. Scraping the same 50 reviews every morning only to manually compare spreadsheets to figure out what is new, whether an unhappy customer upgraded their 1-star rating after your team reached out, which negative reviews still haven't received an owner reply, or whether a flagged spam review was finally removed by Google wastes hours every week.
The UnitBytes Google Maps Review Monitor & Change Tracker (unitbytes/google-maps-reviews-tracker) is a stateful review monitoring, SLA auditing, and change-detection engine. Instead of dumping raw, uncontextualized reviews on every run, it remembers your baseline across Apify Scheduled runs, automatically detects NEW, REMOVED, RATING_CHANGED, TEXT_EDITED, and OWNER_REPLIED reviews, sorts and filters directly on Google's backend (reviewsSort: "lowest_rating", reviewKeyword), and enriches every review with 55 flat fields including response_time_hours, unanswered_hours, is_burner_suspect, triage_flags, and 1-click Google dispute links (review_report_url).
Who Uses the Google Maps Review Monitor & Change Tracker?#
- Local Business Owners & Multi-Location Brands: Schedule a daily check on your Business Place URLs with
trackChanges: trueand connect Apify's native Slack, Email, or Google Sheets integration. Immediately spot when aNEWreview lands, when a customer upgrades their star rating (RATING_CHANGED), or when a reported fake review isREMOVED. - Customer Support & CX Teams: Set
reviewsSort: "lowest_rating"to surface 1-star and 2-star complaints first, filter bytriage_flags("UNANSWERED_NEGATIVE") andunanswered_hours, and audit franchise manager SLA compliance withresponse_time_hours. - Operations & Trust Teams Fighting Fake Reviews: Automatically flag suspicious 1-star attacks via
is_burner_suspect: trueandtriage_flags(LOW_HISTORY_REVIEWER,RATING_ONLY_NO_TEXT), and open Google's official policy violation form in 1 click viareview_report_url. - SaaS Builders & Automation Engineers: Pair
trackChanges: truewith Apify Webhooks, Make, Zapier, or n8n to stream flat 55-field payloads into HubSpot, Zendesk, or Airtable and route alerts based onchange_typeandtriage_flags. - Online Reputation Management (ORM) & Legal Teams: Verify whether disputed reviews are
ACTIVEorREMOVED—either from a Business Place URL baseline or direct review share links (maps.app.goo.gl/...)—with full context recovery (reviewer_name,previous_stars,previous_text, andbusiness_name) for client billing proof.
6 Core Superpowers That Set the Tracker Apart#
1. Stateful Cross-Run Change Detection (trackChanges)
When trackChanges: true (enabled by default), the Actor stores a compact baseline snapshot per Place inside a persistent Apify Named Key-Value Store (configurable via kvStoreName). On every subsequent run, it compares live reviews against the baseline and populates four delta fields:
change_type:"NEW"— Brand-new review posted since your last check."REMOVED"— A previously tracked review disappeared from the business and was verified deleted by Google!"RATING_CHANGED"— The reviewer changed their star rating (e.g., upgraded from1star to5stars after customer support resolved their issue)."TEXT_EDITED"— The reviewer updated their review text (previous_textis preserved alongside the newreview_text)."OWNER_REPLIED"— The business owner posted a reply since the last check."UNCHANGED"— No change since the previous run."BASELINE"— Initial snapshot recorded on the first run for a target.previous_stars&stars_delta: Shows the exact before-and-after rating (e.g.,previous_stars: 1,review_stars: 5,stars_delta: +4).previous_text: Preserves the prior complaint text before the reviewer edited or deleted it.
2. Automatic Disappeared-Review Verification & Context Recovery (status: "REMOVED")
Normally, when Google removes a review from a business listing, Google wipes the reviewer's name, star rating, and review text from its servers—and standard place scrapers simply stop returning the review without telling you it was deleted.
Because unitbytes/google-maps-reviews-tracker saves the baseline on Run 1, if a tracked review vanishes from your Place URL on Run 2, the Tracker automatically pings that review's saved permalink to verify if Google removed it. Once confirmed (status: "REMOVED", is_removed: true), it restores reviewer_name, previous_stars, and previous_text from the baseline snapshot alongside business_name, business_address, and place_cid—giving you complete proof of which exact review was taken down without ever having to manually collect single-review URLs!
3. 100% Server-Side Sorting & Keyword Filtering (reviewsSort & reviewKeyword)
All sorting and keyword filtering executes directly on Google's backend:
reviewsSort: "lowest_rating"(1-Star Complaints First): Prioritizes 1-star and 2-star negative reviews directly from Google's servers—ideal for customer recovery, SLA triage, and generating 1-clickreview_report_urldispute links.reviewsSort: "newest"(Chronological Monitoring): Fetches the latest reviews first for daily or hourly scheduled checks.reviewKeyword: Filter directly on Google's backend for specific topics (e.g.,"refund","rude","manager","scam","wait time").
4. Automated Owner Reply SLA & Burner Triage Fields
Every review is automatically enriched with calculated SLA and fraud-triage metrics:
response_time_hours: Exact hours elapsed betweenreview_timestampandowner_reply_timestamp(e.g.,2.5hours) to audit store manager response SLAs without writing spreadsheet date formulas.unanswered_hours: Exact hours an unanswered active review has been sitting without a response (e.g.,38.4hours).is_burner_suspect: Automatically set totruewhen a 1-star or 2-star review comes from a throwaway account (reviewer_number_of_reviews <= 2) or is an empty star-only rating with no text.triage_flags: Array of instant filter tags:"UNANSWERED_NEGATIVE"(1–2★ review with no owner reply)"LOW_HISTORY_REVIEWER"(reviewer_number_of_reviews <= 2)"RATING_ONLY_NO_TEXT"(star rating with empty text)"RATING_UPGRADED"/"RATING_DOWNGRADED""TEXT_EDITED"/"OWNER_REPLIED"/"NEW_REVIEW"/"REMOVED_CONFIRMED"
5. 1-Click Google Policy Violation Report Links (review_report_url)
Every extracted review includes a pre-built review_report_url:
https://www.google.com/local/content/rap/report?postId=ChdDSUhNMG9nS0VJQ0FnSUR...
Clicking this URL opens Google's official Report a Policy Violation (RAP) workflow directly for that review—eliminating the need to scroll through hundreds of reviews on Google Maps to find the three-dot menu.
6. Works Seamlessly with Native Apify Schedules & Integrations
Because Apify natively provides Schedules (cron execution) and Integrations (Slack, Email, Google Sheets, Webhooks, Make, Zapier, n8n), combining them with trackChanges: true gives you a complete, zero-maintenance alerting pipeline in 60 seconds:
- Save your
reviewsToCheckinput (e.g., 10 store Place URLs +trackChanges: true) as an Apify Task. - Add an Apify Schedule (e.g., Daily at 8:00 AM).
- In the Task's Integrations tab, connect Slack, Google Sheets, or a Webhook triggered on
Run succeeded—and filter onchange_type != "UNCHANGED"or"UNANSWERED_NEGATIVE"intriage_flags.
All 12 Supported Input Formats (Mix & Match in reviewsToCheck)#
You can pass any combination of business places, search queries, coordinates, or direct review links inside a single reviewsToCheck array:
- Google Maps Business Place URLs:
https://www.google.com/maps/place/Katz's+Delicatessen/@40.722233,-73.987429,17z/ - Plain-Text Business or Area Search Queries (with optional
#keyword):"Katz's Delicatessen#pastrami","Dentists in Austin TX", or"Metro Artisan Cafe" - Raw GPS Coordinates (
lat, lng):"40.722233, -73.987429"(automatically resolves the closest reviewable business at those coordinates) - Google Place IDs (
ChIJ...):"ChIJ2_VLfRdawokRXKfA6CMf5YQ"or"place_id:ChIJ2_VLfRdawokRXKfA6CMf5YQ" - Hex Feature IDs (
0x...:0x...) & Decimal CIDs (?cid=...):"0x89c2598f7ff4aa09:0x313547e757cb8cea"or"https://maps.google.com/?cid=11326615953751618799" - Google Search
#lrd=All-Reviews Dialog Links:"https://www.google.com/search?q=McDonalds+NYC#lrd=0x89c25a177d4bf5db:0x84e51f23e8c0a75c,1,,," - Business
g.page/r/&writereview?placeid=Links:"https://g.page/r/CeqMy1fnRzUxEBM/review"or"https://search.google.com/local/writereview?placeid=ChIJ2_VLfRdawokRXKfA6CMf5YQ" - Direct Review Permalinks (
/maps/reviews/data=...):"https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQ000..." <PlaceID>:<ReviewID>Shorthand Pairs:"ChIJ0000000000000000000001:Ci9DQUlRQUNvZENodHljRjlv..."or"0x0:0x1000000000000001:ChZDSUhN..."- Mobile Review Share Shortlinks (
maps.app.goo.gl/...):"https://maps.app.goo.gl/exampleReviewLink1" - Contributor Place Review Links:
"https://www.google.com/maps/contrib/100000000000000000001/place/ChIJ0000000000000000000002" - Contributor Profile Feeds:
"https://www.google.com/maps/contrib/100000000000000000002/reviews"
Feature Comparison: Reviews Tracker vs. Bulk Scraper vs. Manual Checks#
| Feature / Workflow | Google Maps Reviews Tracker | Google Maps Reviews Scraper | Manual Browser / Spreadsheets |
|---|---|---|---|
| Primary Best Fit | Ongoing Monitoring, Change Diffing, SLA Audits & Removal Checks | High-Volume Historical Dataset Extraction ($0.25/1K) | Checking 1–5 links by hand |
Stateful Cross-Run Diffing (change_type) | Yes (NEW, REMOVED, RATING_CHANGED, TEXT_EDITED, OWNER_REPLIED) | Stateless bulk extraction | Manual row-by-row comparison |
| Auto-Detect Deleted Reviews from Place URL | Yes (Restores reviewer_name, previous_stars & previous_text) | Single-review link only | Must save & open every link |
| 100% Server-Side Sorting & Keyword Filter | Yes (newest, lowest_rating, highest_rating, reviewKeyword) | Yes | Manual sorting & scrolling |
Owner Reply SLA (response_time_hours, unanswered_hours) | Calculated automatically on every review | Included in 55-field schema | Manual timestamp subtraction |
Burner Detection (is_burner_suspect, triage_flags) | Automated flags on every review | Included in 55-field schema | Manual profile clicking |
1-Click Report Link (review_report_url) | Included on every review | Included on every review | Must locate review on Map UI |
Python Example: Stateful Change Tracking, Negative Review Audits & SLA Triage#
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_API_TOKEN")
# Monitor business locations (and optional direct review share links)
run_input = {
"reviewsToCheck": [
# 1. Business Place URLs — automatically tracked across runs!
"https://www.google.com/maps/place/Katz's+Delicatessen/@40.722233,-73.987429,17z/",
# 2. Optional direct review share links to verify removal status
"https://maps.app.goo.gl/8xYz9AbCdEfGhIjKl",
],
"trackChanges": True, # Persist baseline across scheduled runs in Apify Key-Value Store
"reviewsSort": "newest", # Or "lowest_rating" to pull 1-star complaints first from Google's backend
"reviewKeyword": "", # Optional server-side keyword filter (e.g. "refund", "manager")
"maxReviewsPerPlace": 50,
"language": "en",
"region": "us",
}
run = client.actor("unitbytes/google-maps-reviews-tracker").call(run_input=run_input)
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
for r in items:
change = r.get("change_type")
biz = r.get("business_name")
if r.get("status") == "REMOVED":
print(
f"[REMOVED] {biz} | Author: {r.get('reviewer_name')} "
f"(was {r.get('previous_stars')}★: {r.get('previous_text')})"
)
elif change == "RATING_CHANGED":
print(
f"[RATING CHANGED] {biz} | {r.get('reviewer_name')}: "
f"{r.get('previous_stars')}★ -> {r.get('review_stars')}★ (delta: {r.get('stars_delta'):+d})"
)
elif "UNANSWERED_NEGATIVE" in (r.get("triage_flags") or []):
print(
f"[SLA ALERT] {biz} | {r.get('review_stars')}★ unanswered for {r.get('unanswered_hours')}h "
f"| Burner suspect: {r.get('is_burner_suspect')} | Report: {r.get('review_report_url')}"
)
Complete 55-Field Flat Output Schema Reference#
Every item returned by unitbytes/google-maps-reviews-tracker is a flat JSON object (VLOOKUP-ready for Excel and Google Sheets):
| Category | Output Fields |
|---|---|
| Change Tracking & Delta (4 Fields) | change_type (NEW, REMOVED, RATING_CHANGED, TEXT_EDITED, OWNER_REPLIED, UNCHANGED, BASELINE), previous_stars, stars_delta, previous_text |
| Automated Triage & SLA (4 Fields) | response_time_hours, unanswered_hours, is_burner_suspect, triage_flags |
| Status & Verification (6 Fields) | status (ACTIVE / REMOVED), is_active, is_removed, error, timestamp, check_timestamp |
| Dispute & Permalinks (5 Fields) | review_report_url (1-click Google RAP link), review_url, input_url, resolved_url, url |
| Review Content & Edits (11 Fields) | review_id, review_stars, review_text, review_text_original, text_snippet, review_language, review_date, review_timestamp, is_edited, review_modified_timestamp |
| Owner Reply Metadata (5 Fields) | has_owner_reply, owner_reply, owner_reply_date, owner_reply_timestamp, owner_reply_language |
| Reviewer Profile (5 Fields) | reviewer_name, reviewer_id, reviewer_url, reviewer_avatar_url, reviewer_number_of_reviews |
| Attached Media (2 Fields) | review_photos, review_photos_count |
| Business Metadata (14 Fields) | place_id, place_cid, business_name, business_address, business_place_url, business_primary_category, business_categories, business_city, business_country, business_country_code, business_latitude, business_longitude, business_timezone, business_cover_image_url |
Combine with the Full UnitBytes Google Maps Suite#
- Google Maps Review Monitor & Change Tracker (
unitbytes/google-maps-reviews-tracker): Stateful cross-run change detection (NEW,REMOVED,RATING_CHANGED,OWNER_REPLIED), server-sidelowest_rating&reviewKeywordfiltering, owner reply SLA calculation, and 1-clickreview_report_urlgeneration. - Google Maps Reviews Scraper (
unitbytes/google-maps-reviews-scraper): High-speed bulk extraction of up to 10,000 historical reviews per place starting at$0.25 / 1,000 reviews(read the Bulk Google Maps Reviews Scraper Guide). - Google Maps Contributor & Local Guide Scraper (
unitbytes/google-maps-contributor-scraper): Pass any suspiciousreviewer_urlorreviewer_idflagged withis_burner_suspect: trueto inspect that user's entire public review history across the globe (see the Contributor Fake Review Audit Guide). - Google Maps Photos, Menus & Videos Scraper (
unitbytes/google-maps-photos-scraper): Extract uncompressed=s0visual assets, restaurant menus, and playable MP4 storefront videos (see the Photos, Menus & Videos Scraper Guide). - Google Maps Email & Leads Scraper (
unitbytes/google-maps-leads-scraper): Extract B2B business leads with verified website emails, E.164 phones, social profiles, Meta/Google ad pixel detection,UNCLAIMED_GBPflags, and cold-outreach review hooks starting at$1.00 / 1,000 leads(see the Google Maps B2B Leads & Email Scraper Guide).
Frequently Asked Questions (FAQ)
How does stateful change tracking (trackChanges) work across scheduled runs?
When trackChanges is enabled, the Actor saves a lightweight baseline snapshot of each business's reviews in a persistent Apify Named Key-Value Store (configurable via kvStoreName). On subsequent scheduled runs, it compares current reviews against the baseline and tags every item with change_type: NEW, REMOVED, RATING_CHANGED, TEXT_EDITED, OWNER_REPLIED, or UNCHANGED.
Do I need individual review links to detect deleted (REMOVED) reviews?
No! You can simply pass your Business Place URL (/maps/place/...). When a review that was recorded in your baseline disappears from the Place feed on a later run, the Tracker automatically verifies its permalink to confirm if Google deleted it (status: REMOVED)—and even restores the deleted review's reviewer_name, previous_stars, and previous_text from the saved baseline.
Does sorting and keyword filtering happen on Google's backend?
Yes—100% of sorting (reviewsSort: 'newest', 'lowest_rating', 'highest_rating', 'most_relevant') and keyword filtering (reviewKeyword) is executed directly on Google's backend before reviews are returned, ensuring every single extracted review matches your query.
How does the 1-click review_report_url feature work?
Every active review extracted by unitbytes/google-maps-reviews-tracker includes a pre-built review_report_url (https://www.google.com/local/content/rap/report?postId=...). Clicking that URL opens Google's official policy violation flagging form directly for that specific review—saving you from scrolling through hundreds of reviews on Google Maps to find the 'Report review' button.
What triage and SLA fields are calculated automatically on every review?
Every review includes response_time_hours (exact hours elapsed between review creation and owner reply), unanswered_hours (how long an unanswered review has been waiting), is_burner_suspect (true for 1-2 star reviews from <=2 review accounts or textless star drops), stars_delta (rating change such as +4 when upgraded from 1 to 5 stars), and machine-filterable triage_flags.
Bypass Google Places API Caps — Extract Enriched B2B Leads, Photos & 10K Reviews
Extract B2B business leads with verified website emails & ad pixels ($0.50/1K), uncompressed original (=s0) photos, up to 10,000 reviews per place ($0.25/1K), and Local Guide contributor histories at a fraction of official Places API costs.
Related Technical Guides & Teardowns
How to Scrape Naver Map & Naver Place (2026): South Korea Business Leads, Menus & Visitor Reviews Guide ($0.50–$1.00/1K)
Complete 2026 engineering and B2B lead generation guide to scraping Naver Map (네이버 지도) and Naver Place (네이버 플레이스). Bypass the official Naver Local Search API's 5-item limit to extract 36+ South Korean business fields, road/jibun addresses, KRW menu prices, Instagram/Kakao links, and receipt-verified visitor reviews (영수증 리뷰) from $0.50 to $1.00 per 1,000 items.
How to Scrape All 10,000 Google Maps Reviews per Business in 2026 ($0.25/1K vs. The 5-Review API Cap)
Why the official Google Places API caps you at 5 reviews per location—and how to extract up to 10,000 Google Maps reviews per business at $0.25/1K with keyword filtering, 1-star sorting, and 55 flat CSV/JSON fields.
Google Places Photo API Pricing & 10-Photo Limit in 2026 ($7.00/1K vs. $0.20–$0.25/1K Alternatives)
Complete breakdown of Google Places Photo API pricing ($7.00 per 1,000 photos + Place Details fees), the 10-photo and 1600px limits, and how to extract uncompressed (=s0) photos, restaurant menus, MP4 videos, and Local Guide portfolios at $0.20–$0.25/1K.