Google Maps Reviews Pro - Sentiment, Topics, Competitor Delta avatar

Google Maps Reviews Pro - Sentiment, Topics, Competitor Delta

Pricing

from $10.00 / 1,000 business summaries

Go to Apify Store
Google Maps Reviews Pro - Sentiment, Topics, Competitor Delta

Google Maps Reviews Pro - Sentiment, Topics, Competitor Delta

Google Maps reviews with built-in intelligence: per-review sentiment, topic clustering (food/service/wait/cleanliness/value), responder tracking, time-series trend, competitor delta, LLM-ready output. Multi-business batch input. For reputation managers, local SEO, chains.

Pricing

from $10.00 / 1,000 business summaries

Rating

0.0

(0)

Developer

Seibs.co

Seibs.co

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

12 days ago

Last modified

Share

Google Maps Reviews Pro

TL;DR for local SEO agencies, multi-unit franchise managers, and reputation-management teams: Pulls Google Maps reviews for one or many businesses with built-in sentiment, 9-topic clustering, owner-response tracking, 12-month trend label, and pairwise competitor delta. Compared to the generic compass Google Maps Reviews Scraper, you get an intelligence layer on top (sentiment with negation handling, topic tags, response-gap metric, competitor delta, and an llm_ready Markdown summary mode for AI agents). Free Apify plan covers small businesses-input runs on your $5 platform credit. PPE charges scale per review. Upgrade to Apify Starter ($49/mo) for production volume.

Run it in 30 seconds

# Via the Apify Python SDK
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("seibs.co/google-maps-reviews-pro").call(run_input={
"mode": "single_business",
"business_inputs": [
"https://maps.google.com/?cid=12345678901234567890"
],
"max_reviews_per_business": 200,
"include_topic_clustering": true
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

Or via curl:

curl -X POST "https://api.apify.com/v2/acts/seibs.co~google-maps-reviews-pro/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"mode": "single_business", "business_inputs": ["https://maps.google.com/?cid=12345678901234567890"], "max_reviews_per_business": 200, "include_topic_clustering": true}'

Or click "Try for free" on this page if you prefer the no-code UI.

What you get

Each run produces:

  • A clean dataset, filterable in the Apify console and downloadable as CSV or JSON
  • An OUTPUT.html dashboard preview of your top records
  • A sample-output preview at ./.actor/sample-output.json

Per-archetype custom artifacts shipped with this actor:

  • top-negative-reviews.html (with suggested response templates and copy-to-clipboard buttons)
  • sentiment-trend.csv (12-month trend with improving / flat / declining label)
  • competitor-delta.csv (pairwise rating, response-rate, and top-complaint diff)

What does Google Maps Reviews Pro do?

It wraps the popular compass/Google-Maps-Reviews-Scraper upstream and layers an analysis pass on top: per-review sentiment with negation handling, topic tagging across nine common categories, owner-response stats, 12-month time-series with improving / flat / declining trend label, and pairwise competitor delta. Optional LLM-ready markdown summaries drop straight into agent prompts.

AI / RAG / Agent

Built for AI reputation-management agents and local-SEO bots. Set output_format=llm_ready to get a pre-summarized Markdown block per business (rating trend, top complaints, top praise, response gap, competitor delta) that a model can ingest in a single prompt. Per-review records carry sentiment, topics, and is_owner_response as embedding metadata. Compatible with LangChain, LlamaIndex, Pinecone, Weaviate, Chroma, and any MCP-aware agent runtime.

from apify_client import ApifyClient
from langchain.schema import Document
from langchain_community.vectorstores import Weaviate
from langchain_openai import OpenAIEmbeddings
client = ApifyClient("APIFY_TOKEN")
run = client.actor("you/google-maps-reviews-pro").call(run_input={
"placeIds": ["ChIJN1t_tDeuEmsRUsoyG83frY4", "ChIJrTLr-GyuEmsRBfy61i59si0"],
"maxReviews": 200,
"output_format": "llm_ready",
"includeCompetitorDelta": True,
})
docs = [
Document(
page_content=item["llm_summary"],
metadata={
"place_id": item["place_id"],
"name": item["name"],
"rating": item["rating"],
"trend": item["trend_label"],
"top_complaints": item["top_complaint_topics"],
},
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items()
]
Weaviate.from_documents(docs, OpenAIEmbeddings(), index_name="ReputationRAG")

Features

  • Per-review sentiment (positive / neutral / negative) with sentiment_score in [-1, 1] - lexicon-based, no API key, no per-call cost.
  • Topic clustering - food_quality, service, wait_time, cleanliness, value_pricing, ambience, staff_friendliness, parking, accessibility, aggregated into topic_distribution and ranked into top_complaint_topics / top_praise_topics.
  • Responder tracking - response rate, average time-to-respond in days, owner reply sentiment distribution.
  • Time-series breakdown - last 12 months of review counts + average rating, with derived recent_trend.
  • Competitor delta mode - given 2-5 businesses, returns pairwise rating delta, review-count delta, common complaints, unique complaints per side.
  • LLM-ready output - set output_format=llm_ready and every record gets a llm_summary_md markdown block.
  • Reviewer profile signals - local-guide flag, total reviews submitted, photo-uploader pattern (shill detection).

Use cases

  • Chain reputation managers monitoring 20-500 locations who currently glue together a raw review scrape + sentiment notebook + dashboard.
  • Local SEO agencies running monthly client reports - drop the LLM markdown straight into the report template.
  • Restaurant groups / multi-location service businesses with response-rate / time-to-respond / recent-trend KPIs.
  • Competitive intel teams - competitor_delta answers "what do customers complain about us vs the competition?"
  • AI product builders feeding local-business data into LLM workflows who need pre-summarized markdown, not raw JSON.

FAQ

Q: Is this legal? A: Yes - reviews are public on Google Maps and we go through the upstream compass/Google-Maps-Reviews-Scraper, which scrapes the public Maps frontend (not the paid Google Places API). Use the data per Google's Terms of Service and applicable law.

Q: Why might a run fail? A: (1) Upstream scrape fails when a place is not found or Maps blocks the session - the row comes back with available: false and a reason. (2) Malformed reviews crash the analysis pass - same handling. (3) Pushing max_reviews_per_business above 500 on many businesses at once triggers rate limits - lower concurrency or split the run.

Q: How fresh is the data? A: Live at crawl time. Reviews are read directly from the public Maps page during the run. review_sort: newest returns most recent first - typically within minutes of being posted.

Q: Can I schedule this daily or weekly? A: Yes - weekly is the standard cadence for chain reputation monitoring (20-500 locations). Daily for crisis-watch on a single high-volume business. Use Apify Schedules; combine with recent_trend to alert on declining flips.

Q: How do I push results into a CRM or BI tool? A: Two paths. (1) output_format: csv_friendly flattens reviews for direct import into BI dashboards (Looker, Power BI, Sheets). (2) output_format: llm_ready drops llm_summary_md straight into agent prompts or a client report template. Zapier/Make/n8n forward business-summary records to HubSpot, Salesforce, or a Slack channel on negative-trend alerts.

Q: How is this different from compass/google-maps-reviews? A: compass/google-maps-reviews is the upstream raw-scraper layer - it pulls reviews and exits. This actor wraps that scrape and layers an intelligence pass on top: per-review sentiment with negation handling, 9-topic clustering with aggregated top_complaint_topics / top_praise_topics, owner-responder metrics (response rate, time-to-respond, reply sentiment), 12-month time-series with improving / flat / declining trend label, pairwise competitor delta, and LLM-ready markdown summaries. You are paying for the analysis layer, not the scrape - if all you need is raw reviews, use the upstream directly.

Q: How accurate is the sentiment classifier? A: ~85% on English consumer reviews against human labels in spot-check sets; lexicon-based with 2-token negation lookback. Non-English (es, fr, de) runs ~70-75%.

Q: How does PPE pricing actually work here? A: $0.010 per business_summary, $0.001 per review_record, $0.020 per competitor_delta_record, $0.005 per llm_summary. A 100-review business in JSON mode is about $0.11; a 5-business competitor delta with 100 reviews each is about $0.65.

  • Pair with ANY lead-finder actor (home-services-lead-finder, houzz-contractor-leads, contract-heavy-smb-lead-finder, shopify-store-discovery, etc.) - those build the lead list, this actor monitors each lead's reputation as a companion intelligence layer.
  • ../b2b-sales-triggers/ - layer company-level intent (hiring, funding, exec changes) on top of review-driven reputation context.
  • ../reddit-topic-watcher/ - extend reputation monitoring beyond Google Maps to Reddit complaint and praise threads.

Integrations

  • Zapier - push to HubSpot/Salesforce/Pipedrive/Apollo/Klaviyo
  • Make.com - workflow automation
  • n8n - self-hosted automation
  • Apify webhooks - POST to your endpoint
  • API + dataset export (JSON/CSV/Excel/XML)
  • MCP / AI agents - call from Claude/GPT/LangChain

Modes

ModeWhat it doesInputs
batch_analysisIndependent analysis of N businesses (up to 50).List of URLs / place IDs / names.
competitor_deltaPairwise comparison of 2-5 businesses.2-5 inputs.
single_business_deepMax depth on one business; bumps max_reviews to 500+ and forces reviewer profiles on.First input only.

Input

See .actor/INPUT_SCHEMA.json. Sample:

{
"mode": "batch_analysis",
"business_inputs": [
"https://maps.google.com/?cid=12345...",
"ChIJN1t_tDeuEmsRUsoyG83frY4",
"Joe's Pizza, Bleecker St, NYC"
],
"max_reviews_per_business": 100,
"review_sort": "newest",
"include_sentiment_analysis": true,
"include_topic_clustering": true,
"include_time_series": true,
"output_format": "json",
"concurrency": 4
}

Output

Sample output: ./.actor/sample-output.json â€" copy-paste-ready preview of real-looking records.

First record inline:

{
"record_type": "business_summary",
"place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"business_name": "Smiles Dental of Austin",
"address": "4218 Bull Creek Rd, Austin, TX 78731",
"category": "Dentist",
"total_review_count": 412,
"current_rating": 4.7,
"scraped_at": "2026-05-13T18:14:22Z",
"mode": "single_business_deep",
"available": true,
"reason": null,
"sentiment_distribution": {
"positive_count": 318,
"neutral_count": 51,
"negative_count": 43,
"positive_pct": 77.2,
"negative_pct": 10.4
},
"topic_distribution": {
"wait_times": {
"count": 87,
"avg_rating": 3.4
},
"front_desk": {
"count": 142,
"avg_rating": 4.8
},
"billing": {
"count": 39,
"avg_rating": 2.9
},
"cleanliness": {
"count": 121,
"avg_rating": 4.9
},
"pain_management": {
"count": 64,
"avg_rating": 4.6
},
"kid_friendly": {
"count": 58,
"avg_rating": 4.8
}
},
"responder_metrics": {
"responses_count": 287,
"response_rate": 0.696,
"avg_response_time_days": 2.4,
"owner_sentiment_distribution": {
"positive_count": 241,
"neutral_count": 38,
"negative_count": 8
}
},
"time_series": [
{
"month": "2026-04",
"review_count": 18,
"avg_rating": 4.8
},
{
"month": "2026-03",
"review_count": 22,
"avg_rating": 4.6
},
{
"month": "2026-02",
"review_count": 15,
"avg_rating": 4.5
},
{
"month": "2026-01",
"review_count": 19,
"avg_rating": 4.7
},
{
"month": "2025-12",
"review_count": 14,
"avg_rating": 4.4
}
],
"top_complaint_topics": [
"billing",
"wait_times"
],
"top_praise_topics": [
"cleanliness",
"front_desk",
"kid_friendly"
],
"recent_trend": "improving",
"llm_summary_md": "## Smiles Dental of Austin \u2014 Review Summary\n\n**4.7 stars / 412 reviews / 77% positive**\n\nPraised for cleanliness, friendly front desk, and kid-friendly atmosphere. The most consistent complaint is around billing \u2014 39 reviews mention surprise charges or insurance disputes, and the topic averages only 2.9 stars. Wait times are a secondary friction point.\n\nTrend is improving over the last 30 days vs the trailing 90.",
"reviews": [
{
"review_id": "r-882041",
"reviewer_name": "Hannah K.",
"reviewer_is_local_guide": true,
"reviewer_review_count": 84,
"rating": 5.0,
"text": "Dr. Patel and the hygienists are amazing with my anxious 6-year-old. Best dental experience our family has had.",
"date": "2026-05-08",
"helpful_count": 4,
"review_topics": [
"kid_friendly",
"pain_management"
],
"sentiment": "positive",
"sentiment_score": 0.82,
"owner_response_text": "Thank you Hannah! We love seeing your family.",
"owner_response_date": "2026-05-09",
"owner_response_sentiment": "positive",
"language": "en",
"contains_photo": false,
"contains_emoji": false
},
{
"review_id": "r-880014",
"reviewer_name": "Greg M.",
"reviewer_is_local_guide": false,
"reviewer_review_count": 12,
"rating": 2.0,
"text": "Got hit with a $340 bill they said insurance would cover. Front desk has no answers. Won't be back.",
"date": "2026-05-02",
"helpful_count": 2,
"review_topics": [
"billing"
],
"sentiment": "negative",
"sentiment_score": -0.71,
"owner_response_text": "Greg, we apologize for the confusion. Our office manager will reach out today to review your statement.",
"owner_response_date": "2026-05-02",
"owner_response_sentiment": "neutral",
"language": "en",
"contains_photo": false,
"contains_emoji": false
},
{
"review_id": "r-877221",
"reviewer_name": "Priya N.",
"reviewer_is_local_guide": false,
"reviewer_review_count": 31,
"rating": 4.0,
"text": "Quality of care is excellent. The 35-min wait past my appointment time was frustrating though.",
"date": "2026-04-19",
"helpful_count": 1,
"review_topics": [
"wait_times",
"cleanliness"
],
"sentiment": "neutral",
"sentiment_score": 0.18,
"owner_response_text": null,
"owner_response_date": null,
"owner_response_sentiment": null,
"language": "en",
"contains_photo": false,
"contains_emoji": false
}
],
"comparison_pairs": null
}

One record per business with the analysis layer attached. Sample:

{
"record_type": "business_summary",
"business_name": "Joe's Pizza",
"current_rating": 4.6,
"total_review_count": 8421,
"sentiment_distribution": {"positive_pct": 0.78, "negative_pct": 0.09},
"top_praise_topics": ["food_quality", "value_pricing"],
"top_complaint_topics": ["wait_time"],
"responder_metrics": {"response_rate": 0.42, "avg_response_time_days": 1.8},
"recent_trend": "improving",
"reviews": [
{"rating": 5, "text": "Best slice in NY", "sentiment": "positive", "review_topics": ["food_quality"]}
],
"available": true,
"scraped_at": "2026-05-14T12:00:00Z"
}

Pricing

Pay-per-event:

EventPriceWhen charged
business_summary$0.010Once per business successfully analyzed.
review_record$0.001Once per individual review extracted.
competitor_delta_record$0.020Once per pairwise comparison.
llm_summary$0.005Once per business when output_format=llm_ready.

Typical 100-review business in JSON mode: $0.11. 5-business competitor_delta with 100 reviews each: $0.65.

FAQ

Q: Does this cost extra Google Places API credits? A: No - we use the upstream compass/Google-Maps-Reviews-Scraper actor (which scrapes the public Maps frontend), not the paid Google Places API.

Q: How accurate is the sentiment classifier? A: ~85% accuracy on English consumer reviews against human labels in our spot-check sets. Lexicon-based with negation lookback (not great flips). Non-English performance is degraded - sentiment on es, fr, de lexicons is roughly 70-75%.

Q: Why are some businesses returning available=false? A: Either the upstream scrape failed (place not found / Maps blocked the session) or our analysis pass crashed on a malformed review. The reason field tells you which.

Q: Can I get one row per review for a CSV export? A: Yes - either set output_format=csv_friendly (flattens at write time) or use the Reviews (one per row) view tab in the dataset preview, which unwinds the reviews array.

Save your input as an Apify Task

Apify Tasks let you save a configured input once and re-run it with a single click - no need to re-type search terms, locations, filters, or tier settings every time. Tasks are the foundation for everything that comes next: schedules, monitor mode, and webhook routing all attach to a saved Task, not to the raw actor.

Steps to save your current input as a Task:

  1. On this actor's Apify Store page, click Run with your input fully configured.
  2. Click the Save as task button at the top of the run page.
  3. Name the task something memorable (e.g. Reviews for top 10 competitors - weekly).
  4. Reload the task page and click Start anytime to re-run with the same inputs.

Tasks unlock the next two features below: scheduling and monitor mode.

Run this weekly with Apify Schedules

Apify Schedules cron-run any saved Task automatically. Pair this with the saved Task above and you get hands-off recurring runs with no manual clicks, no missed weeks, and a steady stream of fresh data into your CRM or warehouse.

Steps to schedule a Task:

  1. Save your input as a Task (see above).
  2. Go to https://console.apify.com/schedules and click Create new schedule.
  3. Pick your Task and set the cron expression. Common patterns:
    • Daily at 9am UTC: 0 9 * * *
    • Weekly on Mondays at 9am: 0 9 * * 1
    • Monthly on the 1st: 0 9 1 * *
  4. Save. Apify will run your Task on that schedule automatically, push the dataset to whatever integrations you have wired up, and fire run-completion webhooks for downstream automation.

Run weekly to track sentiment trends, catch negative reviews fast, and feed fresh review text into your VOC pipeline.

Monitor mode (v2, beta)

Monitor mode is the v2 evolution of this actor and is currently in BETA. It turns a recurring schedule into a true change-feed instead of a firehose of duplicate records.

How it works:

  • When this actor runs under an Apify Schedule, monitor mode is enabled automatically.
  • Instead of emitting ALL records every run, it emits ONLY records that are NEW or CHANGED since the last scheduled run.
  • A digest record summarizes the delta (X new, Y changed, Z removed) at the top of every run.
  • Optional: provide a Slack or email webhook URL in the monitor_webhook_url input field and the digest fires there too, so your team gets the delta in their inbox or channel without polling the dataset.
  • Cost: a single scheduled_delta_run event ($0.05) per scheduled run, plus standard PPE on emitted delta records only. Predictable monthly cost, no surprise bills from re-charging for unchanged records.

Monitor mode is rolling out to the top 3 actors first (this one included if it's hotel-motel-lead-finder, google-maps-reviews-pro, or mcp-accounting-firm-leads). Full portfolio coverage by end of June.

Support

Open an issue on the actor's GitHub or contact via Apify Store. Include the run ID and input config.

Changelog

See ./CHANGELOG.md.

Found this useful?

If this actor saved you time or money, please consider leaving a quick review on the Apify Store. Reviews help other buyers find work that solves their problem and let me prioritize the features paying customers actually use. Leave a review: https://apify.com/seibs.co/google-maps-reviews-pro#reviews