Google Maps Review Analyzer | Customer Complaints
DeprecatedPricing
from $2.00 / 1,000 review analyzeds
Google Maps Review Analyzer | Customer Complaints
DeprecatedCollect available Google Maps reviews and group recurring complaints, sentiment and service themes. Review supporting evidence and transparent scores for local business research. Missing or blocked reviews are not inferred.
Pricing
from $2.00 / 1,000 review analyzeds
Rating
0.0
(0)
Developer
Scopras Data Labs
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
13 days ago
Last modified
Categories
Share
Google Maps Review Pain-Point Miner
Turn Google Maps reviews into customer insight and sales opportunities. Find recurring complaints, service issues, sentiment patterns and positive differentiators for local businesses, locations and competitors.
Mines Google Maps reviews for recurring complaints, positive differentiators and an explainable business opportunity score.
Input
| Field | Type | Default | Notes |
|---|---|---|---|
placeUrls | string[] | [] | Google Maps place URLs (direct route) or search URLs (search route). |
searchQueries | string[] | [] | Google Maps search queries (search route). |
businessTargets | string[] | [] | Business name (+ optional location) looked up via the search route. |
maxReviewsPerPlace | integer | 120 | Reviews analysed per place. |
maxTotalReviews | integer | 2000 | Global cap on reviews analysed across the run. |
language | string | "en" | hl hint. |
requestTimeoutSecs | integer | 30 | Per-request timeout. |
concurrency | integer | 3 | Places fetched in parallel. |
minReviewsForConfidence | integer | 15 | Reviews needed for dataConfidence = 1.0; fewer reviews dampen the score. |
emitReviewRows | boolean | false | Also emit one row per analysed review (topic tags + sentiment). |
maxResponseBytes | integer | 4000000 | Max bytes read from one Google Maps response. |
If no target is given, a sample search ("Joe's Pizza NYC") runs. Invalid place URLs (non-Google hosts, short links such as maps.app.goo.gl) are skipped with a warning; out-of-range numbers are clamped to the allowed range. If every URL is invalid the run ends without charges and explains why. The direct place
route and the search route are tracked separately and reported per place.
Output
type: "place_analysis" — one per-business summary row (see
.actor/dataset_schema.json). Every field is flat (no nested objects/arrays
in the columns that matter for CSV/Excel), so the Apify Console's auto-export
button renders a clean table without opening a single item:
- rating:
ratingReported,ratingFromReviews, and a flattenedrating1Count…rating5Countbreakdown. ownerResponseRate— share of analysed reviews with an owner response.- Headline complaint/praise columns (the buyer's TL;DR — no need to read
every review):
topComplaintCategory,topComplaintMentions,topComplaintNegativeShare,secondComplaintCategory,thirdComplaintCategory,complaintCategoriesCount,topPositiveCategory,topPositiveMentions,positiveCategoriesCount. opportunityScore(0–100) /opportunityGrade/scoreExplanation/recommendedActions.dataConfidence(0–1).- Full detail, JSON-stringified into single cells for deep re-import:
topicFindingsJson(per recurring topic — waiting time, pricing, service, cleanliness, staff, availability, quality, location — withmentions,negativeMentions,positiveMentions,negativeShare,sentiment,confidence,sampleQuotes),painPointsJson(topics with enough mentions,≥ max(2, 10 % of reviews), andnegativeShare ≥ 0.4, most negative first),positiveDifferentiatorsJson(topics reviewers consistently praise), andscoreTermsJson(the opportunity-score component breakdown).JSON.parse()any of these to get the structured detail back.
Optional type: "review" rows. A SUMMARY record with per-place reports,
counts and failuresByReason is written to the key-value store.
The score formula (explainable)
opportunityScore = round( dampen × weightedAverage[low-rating(w3) = inverse of rating vs a 2.5–4.7 benchmarkpain-breadth(w2) = number of distinct pain points, scaled 0–4pain-intensity(w2) = negative share of the worst pain pointowner-neglect(w1) = inverse of owner response rate vs 0–0.6negative-sentiment(w2) = (1 − mean review sentiment) / 2] )dampen = 0.5 + 0.5 × dataConfidencedataConfidence = min(1, reviewsAnalyzed / minReviewsForConfidence)
The exact term values are echoed back in every item's scoreExplanation and
scoreTermsJson.
No fabrication
If a place returns no rating and no reviews, opportunityScore is null,
opportunityGrade is "N/A", and recommendedActions says to gather data
first. A high reputation opportunity is never invented from missing data.
placesWithoutReviewData in the summary counts these.
Safety
All fetches use the shared safeFetch (http/https only, DNS checked against
private ranges, manual redirects, content-type allow-list, byte ceiling, timeout
cleared in finally). One failing place never aborts the run; failures are
counted by reason. No CAPTCHA solving, no login, no private endpoints.
Known limitations
- Google serves reviews through a JS app / internal RPC. This Actor issues a
GETand parses framed JSON or an embedded state blob heuristically; an interstitial or a layout change yields fewer / no reviews and a warning, never a crash. ReviewreviewIdand absolute dates are usually unavailable via this path (relativeDateis kept when present). All aggregation, topic mining, sentiment, scoring and resilience logic is fully implemented and fixture-tested.
Billing
Every Apify plan, including Free, gets full runs: you pay only for delivered results, within your configured limits and run spending limit. The Actor checks the available budget before collecting.
Billing: $0.01 startup plus $0.002 per review analyzed. The place analysis is delivered before review events are charged. An empty or blocked source is not evidence of absent customer complaints.
The Pricing tab is authoritative. Source access and layouts can change. Inspect the output and source evidence before using it in a business workflow.