Google Maps Reviews Pro - Sentiment, Topics, Competitor Delta
Pricing
from $10.00 / 1,000 business summaries
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.
Google Maps Reviews Pro
Multi-business Google Maps reviews scraper with built-in sentiment, topic clustering, responder tracking, time-series trend, and competitor delta analysis.
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 ApifyClientfrom langchain.schema import Documentfrom langchain_community.vectorstores import Weaviatefrom langchain_openai import OpenAIEmbeddingsclient = 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_scorein [-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 intotopic_distributionand ranked intotop_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_readyand every record gets allm_summary_mdmarkdown 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_deltaanswers "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.
Related Actors
- 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
| Mode | What it does | Inputs |
|---|---|---|
batch_analysis | Independent analysis of N businesses (up to 50). | List of URLs / place IDs / names. |
competitor_delta | Pairwise comparison of 2-5 businesses. | 2-5 inputs. |
single_business_deep | Max 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:
| Event | Price | When charged |
|---|---|---|
business_summary | $0.010 | Once per business successfully analyzed. |
review_record | $0.001 | Once per individual review extracted. |
competitor_delta_record | $0.020 | Once per pairwise comparison. |
llm_summary | $0.005 | Once 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.
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.