Google Maps Listing Monitor - Hours, Phone & Address Changes avatar

Google Maps Listing Monitor - Hours, Phone & Address Changes

Pricing

from $2.00 / 1,000 listing checkeds

Go to Apify Store
Google Maps Listing Monitor - Hours, Phone & Address Changes

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

mohamed alaya

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a month ago

Last modified

Security

Limited permissions

Share

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

  1. First run: each listing is read and stored as a baseline (status: "FIRST_RUN", nothing is reported as changed).
  2. Every later run: the listing is read again and compared with the baseline. Differences are reported as status: "CHANGED" with a fieldChanges list and a one-line changeSummary; unchanged listings are UNCHANGED.
  3. 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).

FieldWhat it does
providerapify: 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.
watchFieldsRestrict what counts as a change (default: everything except rating and review count).
criticalFieldsFields flagged critical: true when they change (default: address, phone, website, title, closed flags).
ignoreReviewCountOn 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.
onlyChangesOutput only listings that changed or keep failing. Recommended for many locations.
alertOnErrorAfterFlags a listing (brokenTarget) after N failures in a row, often a removed or merged listing.
resetBaselineForget stored data and start fresh.
stateStoreNameUse a different name per client to keep baselines apart.
webhookUrlPOSTs { 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-checked for every listing that was read, listing-change for every listing that changed. Listings that could not be read are not billed.
  • Data source cost (not ours): with provider: apify the 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. With provider: places you 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 brokenTarget after 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.