Google Maps Listing Monitor - Hours, Phone & Address Changes
Pricing
from $2.00 / 1,000 listing checkeds
Google Maps Listing Monitor - Hours, Phone & Address Changes
Catch the day a Google Maps business listing changes: address, phone, website, name, category, hours or permanently closed. Built for local SEO agencies and multi-location brands; review-count churn is ignored so alerts stay meaningful. Needs a Maps data source you supply.
Pricing
from $2.00 / 1,000 listing checkeds
Rating
0.0
(0)
Developer
mohamed alaya
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a month ago
Last modified
Categories
Security
Limited permissionsShare
Google Maps Listing Monitor - Name, Phone, Hours, Website & Status Change Alerts
Know the day a Google Maps business listing changes. Give it your locations (or a competitor's), run it on a schedule, and every run tells you what changed, field by field: name, address, phone, website, category, opening hours (day by day), temporarily or permanently closed, pin location, and optionally rating and review count.
Built for local-SEO agencies and multi-location brands: a wrong phone number or a new "permanently closed" flag that nobody noticed costs calls and rankings.
How it works
- First run: each listing is read and stored as a baseline (
status: "FIRST_RUN", nothing is reported as changed). - Every later run: the listing is read again and compared with the baseline. Differences are reported as
status: "CHANGED"with afieldChangeslist and a one-linechangeSummary; unchanged listings areUNCHANGED. - Optionally a webhook (Slack, Discord, Zapier, Make) is called with the changes.
Comparison uses normalised values, so formatting noise is not a change: http vs https, www, a trailing slash,
phone punctuation, reordered categories, the thin spaces Google puts in opening hours.
Input
{"places": ["https://www.google.com/maps/place/?q=place_id:ChIJN1t_tDeuEmsRUsoyG83frY4","ChIJLU7jZClu5kcR4PcOOO6p3I0","https://maps.app.goo.gl/abc123",{ "placeUrl": "https://www.google.com/maps/place/Eiffel+Tower/@48.85,2.29,17z", "label": "paris-landmark" },"Blue Bottle Coffee Hayes Valley San Francisco"],"onlyChanges": true,"webhookUrl": "https://hooks.slack.com/services/..."}
places accepts Google Maps URLs (including short links), place IDs (ChIJ...), search text, or objects with a label
that becomes the stable key for that location. An empty input {} checks one sample listing (Google Sydney).
| Field | What it does |
|---|---|
provider | apify: reads listings with a Maps scraper Actor, all places in one run, billed to your own Apify account. places: Google's official Places API (New) with your own key. |
watchFields | Restrict what counts as a change (default: everything except rating and review count). |
criticalFields | Fields flagged critical: true when they change (default: address, phone, website, title, closed flags). |
ignoreReviewCount | On by default: rating and reviews are shown but never alert. Turn off to alert on rating moves and on review-count moves of at least minReviewCountChange. |
onlyChanges | Output only listings that changed or keep failing. Recommended for many locations. |
alertOnErrorAfter | Flags a listing (brokenTarget) after N failures in a row, often a removed or merged listing. |
resetBaseline | Forget stored data and start fresh. |
stateStoreName | Use a different name per client to keep baselines apart. |
webhookUrl | POSTs { text, content, summary, changes[] }, compatible with Slack and Discord incoming webhooks. |
Output (one row per listing)
{"type": "listing","key": "ChIJN1t_tDeuEmsRUsoyG83frY4","status": "CHANGED","changed": true,"critical": true,"changeCount": 2,"changeSummary": "phone: +61 2 9374 4000 -> +61 2 9374 4001; hours: Mon 8:30 AM to 5:30 PM -> 9 AM to 5:30 PM","name": "Google Sydney - Pirrama Road","address": "Ground Floor/48 Pirrama Rd, Pyrmont NSW 2009, Australia","phone": "+61 2 9374 4001","website": "http://google.com/","businessStatus": "OPERATIONAL","rating": 4.1,"reviewsCount": 1221,"fieldChanges": [{ "field": "phone", "from": "+61 2 9374 4000", "to": "+61 2 9374 4001", "critical": true },{ "field": "openingHours", "critical": false, "days": [ { "day": "Monday", "from": "8:30 AM to 5:30 PM", "to": "9 AM to 5:30 PM" } ] }],"listing": { "title": "...", "categories": ["Corporate office", "Software company"], "openingHours": [ { "day": "Monday", "hours": "8:30 AM to 5:30 PM" } ], "location": { "lat": -33.866, "lng": 151.1957 } },"firstSeenAt": "2026-10-03T18:16:59.967Z","lastChangedAt": "2026-10-10T06:00:03.120Z","checkedAt": "2026-10-10T06:00:03.120Z"}
An unchanged listing has the same shape with status: "UNCHANGED", changed: false and fieldChanges: []. The example above is illustrative: the listing data is real, the phone and hours change is made up to show the format.
Billing and cost
- This Actor:
listing-checkedfor every listing that was read,listing-changefor every listing that changed. Listings that could not be read are not billed. - Data source cost (not ours): with
provider: apifythe Maps scraper Actor runs under your account and is billed by its author, about $0.004 per place at the time of writing, plus a small start cost per run. All places go through one run (batches of 100), so 100 locations is one scraper run, not 100. Withprovider: placesyou pay Google per request on your own Google Cloud billing.
Honest limits
- Google Maps cannot be read directly (it is a JavaScript application with bot protection), so a data source is required: the Maps scraper Actor or the Places API. If that Actor changes its output, results can change with it.
- Google Places API source (
provider: places): implemented against Google's Places API (New) documentation and checked here with mocked responses only. We could not run it live without a billing-enabled key, so test it with one listing first. It reads place IDs and search text; a bare Maps URL without a place ID cannot be resolved by this source. - Keep the same data source and language between runs. Switching provider or language changes how names, categories and hours are written and will look like changes.
- Hours are the regular weekly hours. Special or holiday hours are not tracked.
- Opening-hours and category wording comes from the data source as-is.
- A listing that cannot be found any more shows up as an error row (and
brokenTargetafter N failures); it is not reported as a content change.
FAQ
Can I monitor a competitor? Yes, any public listing works.
How often should I schedule it? Daily is enough for NAP and hours changes; weekly for a quiet portfolio.
Why does a listing say FIRST_RUN again? You changed stateStoreName or the place key/label, or used resetBaseline.
Does it edit my listing? No. It is read-only.