UnitBytes Logo
UnitBytes Web Data APIs
Home / Blog / Reputation Intelligence
Reputation Intelligence 11 min read 2026-10-24

Google Maps Review Monitor & Change Tracker Guide (2026): Track New, Removed, Edited & Unanswered Reviews

How to monitor Google Maps businesses for NEW, REMOVED, EDITED, and UNANSWERED reviews across runs. Sort 1-star complaints first, filter by keyword, audit owner reply SLAs (response_time_hours), spot burner accounts, and generate 1-click Google report links (review_report_url).

UnitBytes
UnitBytes
Autonomous Web Data Intelligence Labs
Google Maps Review Monitor & Change Tracker Guide (2026): Track New, Removed, Edited & Unanswered Reviews

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: true and connect Apify's native Slack, Email, or Google Sheets integration. Immediately spot when a NEW review lands, when a customer upgrades their star rating (RATING_CHANGED), or when a reported fake review is REMOVED.
  • Customer Support & CX Teams: Set reviewsSort: "lowest_rating" to surface 1-star and 2-star complaints first, filter by triage_flags ("UNANSWERED_NEGATIVE") and unanswered_hours, and audit franchise manager SLA compliance with response_time_hours.
  • Operations & Trust Teams Fighting Fake Reviews: Automatically flag suspicious 1-star attacks via is_burner_suspect: true and triage_flags (LOW_HISTORY_REVIEWER, RATING_ONLY_NO_TEXT), and open Google's official policy violation form in 1 click via review_report_url.
  • SaaS Builders & Automation Engineers: Pair trackChanges: true with Apify Webhooks, Make, Zapier, or n8n to stream flat 55-field payloads into HubSpot, Zendesk, or Airtable and route alerts based on change_type and triage_flags.
  • Online Reputation Management (ORM) & Legal Teams: Verify whether disputed reviews are ACTIVE or REMOVED—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, and business_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 from 1 star to 5 stars after customer support resolved their issue).
  • "TEXT_EDITED" — The reviewer updated their review text (previous_text is preserved alongside the new review_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-click review_report_url dispute 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 between review_timestamp and owner_reply_timestamp (e.g., 2.5 hours) 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.4 hours).
  • is_burner_suspect: Automatically set to true when 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"

Every extracted review includes a pre-built review_report_url:

text
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:

  1. Save your reviewsToCheck input (e.g., 10 store Place URLs + trackChanges: true) as an Apify Task.
  2. Add an Apify Schedule (e.g., Daily at 8:00 AM).
  3. In the Task's Integrations tab, connect Slack, Google Sheets, or a Webhook triggered on Run succeeded—and filter on change_type != "UNCHANGED" or "UNANSWERED_NEGATIVE" in triage_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:

  1. Google Maps Business Place URLs: https://www.google.com/maps/place/Katz's+Delicatessen/@40.722233,-73.987429,17z/
  2. Plain-Text Business or Area Search Queries (with optional #keyword): "Katz's Delicatessen#pastrami", "Dentists in Austin TX", or "Metro Artisan Cafe"
  3. Raw GPS Coordinates (lat, lng): "40.722233, -73.987429" (automatically resolves the closest reviewable business at those coordinates)
  4. Google Place IDs (ChIJ...): "ChIJ2_VLfRdawokRXKfA6CMf5YQ" or "place_id:ChIJ2_VLfRdawokRXKfA6CMf5YQ"
  5. Hex Feature IDs (0x...:0x...) & Decimal CIDs (?cid=...): "0x89c2598f7ff4aa09:0x313547e757cb8cea" or "https://maps.google.com/?cid=11326615953751618799"
  6. Google Search #lrd= All-Reviews Dialog Links: "https://www.google.com/search?q=McDonalds+NYC#lrd=0x89c25a177d4bf5db:0x84e51f23e8c0a75c,1,,,"
  7. Business g.page/r/ & writereview?placeid= Links: "https://g.page/r/CeqMy1fnRzUxEBM/review" or "https://search.google.com/local/writereview?placeid=ChIJ2_VLfRdawokRXKfA6CMf5YQ"
  8. Direct Review Permalinks (/maps/reviews/data=...): "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQ000..."
  9. <PlaceID>:<ReviewID> Shorthand Pairs: "ChIJ0000000000000000000001:Ci9DQUlRQUNvZENodHljRjlv..." or "0x0:0x1000000000000001:ChZDSUhN..."
  10. Mobile Review Share Shortlinks (maps.app.goo.gl/...): "https://maps.app.goo.gl/exampleReviewLink1"
  11. Contributor Place Review Links: "https://www.google.com/maps/contrib/100000000000000000001/place/ChIJ0000000000000000000002"
  12. Contributor Profile Feeds: "https://www.google.com/maps/contrib/100000000000000000002/reviews"

Feature Comparison: Reviews Tracker vs. Bulk Scraper vs. Manual Checks#

Feature / WorkflowGoogle Maps Reviews TrackerGoogle Maps Reviews ScraperManual Browser / Spreadsheets
Primary Best FitOngoing Monitoring, Change Diffing, SLA Audits & Removal ChecksHigh-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 extractionManual row-by-row comparison
Auto-Detect Deleted Reviews from Place URLYes (Restores reviewer_name, previous_stars & previous_text)Single-review link onlyMust save & open every link
100% Server-Side Sorting & Keyword FilterYes (newest, lowest_rating, highest_rating, reviewKeyword)YesManual sorting & scrolling
Owner Reply SLA (response_time_hours, unanswered_hours)Calculated automatically on every reviewIncluded in 55-field schemaManual timestamp subtraction
Burner Detection (is_burner_suspect, triage_flags)Automated flags on every reviewIncluded in 55-field schemaManual profile clicking
1-Click Report Link (review_report_url)Included on every reviewIncluded on every reviewMust locate review on Map UI

Python Example: Stateful Change Tracking, Negative Review Audits & SLA Triage#

python
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):

CategoryOutput 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#

  1. Google Maps Review Monitor & Change Tracker (unitbytes/google-maps-reviews-tracker): Stateful cross-run change detection (NEW, REMOVED, RATING_CHANGED, OWNER_REPLIED), server-side lowest_rating & reviewKeyword filtering, owner reply SLA calculation, and 1-click review_report_url generation.
  2. 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).
  3. Google Maps Contributor & Local Guide Scraper (unitbytes/google-maps-contributor-scraper): Pass any suspicious reviewer_url or reviewer_id flagged with is_burner_suspect: true to inspect that user's entire public review history across the globe (see the Contributor Fake Review Audit Guide).
  4. Google Maps Photos, Menus & Videos Scraper (unitbytes/google-maps-photos-scraper): Extract uncompressed =s0 visual assets, restaurant menus, and playable MP4 storefront videos (see the Photos, Menus & Videos Scraper Guide).
  5. 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_GBP flags, 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.

Tags: #google maps reviews tracker#monitor google reviews changes#track deleted google reviews#google maps review report link generator#google review edit tracker#unanswered google reviews sla#owner reply sla google maps
Continue Reading

Related Technical Guides & Teardowns

All Guides →
Done-For-You Datasets • Data Feeds • Custom Scrapers

Need Custom Reputation Intelligence Data or a Dedicated Pipeline?

Don't want to run scrapers yourself? Tell us what data you need and we'll deliver a clean Excel / CSV / Google Sheets dataset, set up a recurring data feed, or build a custom scraper for a new site.

One-Time Dataset
From $99

Send your keywords, categories, or URLs. We run the extraction and email you a clean Excel/CSV file, usually within 48 hours.

Recurring Data Feed
Priced by Volume

Daily or weekly data delivered to Google Sheets, Amazon S3, BigQuery, or a webhook. Tell us the volume and we'll quote a fixed monthly price.

Custom Scraper
From $299

Need a new website scraped or custom fields added? We build it, deliver it, and can maintain it for you.

We reply within 48 hours.
Prefer direct email? Write to us anytime at contact@unitbytes.com