# Google Maps Reviews Analyzer (AI) (`signalsift/google-maps-reviews-analyzer`) Actor

Turn Google Maps reviews into a client-ready report: themes with real quotes, sentiment trends, a fix-first list and reply drafts. Use a Google Maps Scraper or Reviews Scraper dataset, or place URLs. $1.20 per 1,000 reviews, $0.05 per report. Free demo, no input needed.

- **URL**: https://apify.com/signalsift/google-maps-reviews-analyzer.md
- **Developed by:** [SignalSift](https://apify.com/signalsift) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 analyzed reviews

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Google Maps Reviews Analyzer (AI)

Turn Google Maps reviews into a report a business owner can act on: what customers love, what they complain about, what to fix first, how it is trending, and polite reply drafts for unanswered negative reviews. Every quote is copied word for word from a real review.

**No setup and no AI account needed.** Run it with no input to get a free demo report on sample reviews.

[![Sample report: fix-first list and complaint themes with real quotes](https://api.apify.com/v2/key-value-stores/sPoeiS9NLJKW813gE/records/google-maps-reviews-analyzer-report.png?signature=1p6AylMOOhtXmeCPNcoLw)](https://api.apify.com/v2/key-value-stores/sPoeiS9NLJKW813gE/records/google-maps-reviews-analyzer-report.html?signature=1fuNSeZiEzcENK3UGMIpU)

[Open the full sample report](https://api.apify.com/v2/key-value-stores/sPoeiS9NLJKW813gE/records/google-maps-reviews-analyzer-report.html?signature=1fuNSeZiEzcENK3UGMIpU): 40 fictional reviews of a demo café, with themes, a monthly trend and reply drafts.

### What you get

| | |
|---|---|
| 🧭 **Fix-first list** | Complaint themes ranked by how often, how badly and how recently customers mention them, with a rising / steady / falling trend |
| 💬 **Themes with real quotes** | Top praise and complaint themes with counts, share of reviews and up to 3 verbatim quotes each, linked to the review (or the place) |
| 📈 **Month by month** | Review volume and average stars per month |
| 🏪 **Location comparison** | Side-by-side table when you analyze several places |
| 🚨 **Needs attention now** | Reviews about illness, safety, discrimination, fraud or legal threats |
| ✍️ **Reply drafts** | Specific, polite drafts for recent unanswered negative reviews, in the review's language |
| 📄 **Three outputs** | A client-ready HTML report, a short JSON summary for code and AI agents, and one dataset row per review |

### How to use it

1. **With place URLs:** paste Google Maps place URLs or place IDs and click Start. We scrape the newest reviews with [Google Maps Reviews Scraper](https://apify.com/compass/google-maps-reviews-scraper) on your account first, then analyze them.
2. **With a dataset you already have:** put the dataset ID from a [Google Maps Reviews Scraper](https://apify.com/compass/google-maps-reviews-scraper) or [Google Maps Scraper](https://apify.com/compass/crawler-google-places) run (with reviews) in **Dataset ID**.
3. **Automatically after every scrape:** open your scraper (or its saved task), go to **Integrations**, add **Google Maps Reviews Analyzer (AI)**. The scraper's dataset is passed in automatically, so each scheduled scrape produces a fresh report.

Then open the **Report** tab of the run for the HTML report, or the **Summary** tab for JSON.

### How much does it cost

You pay per result. Running the Actor itself costs you nothing extra: no compute or proxy charges.

| Event | Free & Starter | Scale | Business and up |
|---|---|---|---|
| Review analyzed (per 1,000) | $1.20 | $1.00 | $0.80 |
| Report generated (per run) | $0.05 | $0.05 | $0.05 |
| Reply draft (each) | $0.01 | $0.01 | $0.01 |

**Never charged:** the demo run, star-only reviews with no text (they still count toward stars and trends), reviews we could not analyze, and runs that find no reviews.

**Examples on the Free and Starter plans:**

- One place with 250 reviews: $0.30 + $0.05 report = **$0.35**, plus up to $0.25 for reply drafts ($0.10 on Free).
- 1,000 reviews: $1.20 + $0.05 = **$1.25**, plus up to $0.25 for reply drafts ($0.10 on Free). Apify's free $5 monthly credit covers about **3,700 reviews a month**, or 4,000 with reply drafts off.
- An agency reporting monthly on 20 locations with 250 reviews each: about **$7** a month, plus up to $5 for reply drafts ($0.25 per location).
- If you give place URLs, scraping is billed separately by Google Maps Reviews Scraper (about $0.60 per 1,000 reviews on the Free plan).

**Reply drafts are on by default.** Each run drafts replies to up to 25 unanswered negative reviews (10 on the Free plan) at $0.01 each: up to **+$0.25** per run on paid plans and up to **+$0.10** on Free. To skip that cost, turn off **Draft replies** (`draftReplies: false`) or lower **Max reply drafts** (`maxReplyDrafts`).

Free-plan runs analyze up to 1,000 reviews and draft up to 10 replies each. Your run's spending limit is always respected: if it is lower than the full job, we analyze what fits and tell you in the status message.

### Output

**JSON summary** (the `OUTPUT` record), shortened, from a real run on 50 Yellowstone National Park reviews:

```json
{
  "coverage": { "reviews": 50, "analyzed": 27, "noText": 23, "skipped": 0 },
  "overall": {
    "avgStars": 4.94,
    "topPraise": [{ "name": "Breathtaking scenic landscapes", "count": 10, "share": 0.37, "quote": "The wonders of nature" }],
    "topComplaints": [{ "name": "Crowded on weekends and October", "count": 2, "share": 0.07, "quote": "Wochenende und Feiertage meiden." }],
    "fixFirst": [{ "name": "Disgusting bathrooms", "score": 0.249, "negativeCount": 1, "shareOfNegative": 0.2, "trend": "up" }]
  }
}
```

**Dataset**, one row per review: place, stars, date, language, text, owner replied, analysis status, sentiment and score, aspects, phrases with verified excerpts, urgent flag and reason. Export it to Excel, CSV or JSON from the Storage tab.

### How accurate is it

On a hand-labeled test set of 60 reviews in 8 languages (2026-10-17):

| Check | Result |
|---|---|
| Overall sentiment matches the label | 96.7% to 98.3% |
| Aspects found (F1) | 0.87 to 0.88 |
| Urgent reviews caught | 100% |
| Quotes that are word for word from the review | 100% (enforced by code: anything else is dropped) |

The AI only labels reviews. Every count, share, score and trend is computed by code from those labels, so the numbers add up.

**What it does not do:** it does not read review photos, does not detect fake reviews, and cannot analyze star-only reviews (they still count in stars and trends). AI labels can be wrong on sarcasm or very short reviews, which is why every theme shows its quotes.

### For AI agents and automations

- **Free demo:** call it with `{}` to get a full sample report and JSON summary at no cost.
- **Minimal input:** `{ "placeUrls": ["https://www.google.com/maps/place/..."] }` or `{ "datasetId": "<dataset id>" }`.
- **Read the result:** the `OUTPUT` record is a short JSON summary designed to fit in one tool call (under 20,000 characters; with many places, per-place detail is shortened first, and with many reply drafts only the first ones are kept): coverage, average stars, sentiment split, top 3 praise and complaint themes with one quote each, fix-first list, monthly trend, reply drafts and a link to the HTML report.
- **Never charged:** no reviews found, star-only reviews, and reviews that could not be analyzed. The status message says why.
- Works through [Apify's MCP server](https://mcp.apify.com), the Apify API and SDKs, and Make, Zapier or n8n.

### FAQ

**Which languages does it support?** Reviews in any language. Theme names are in the language you choose (`reportLanguage`, default English) and report headings are in English. Quotes and reply drafts stay in each review's own language.

**Does it collect reviewer names?** No. When we scrape for you, personal data collection is switched off. Reviewer names, profile links and photos are removed from any dataset you give us before anything else happens, and never appear in the output.

**Where is review text processed?** By the Anthropic API (Claude). SignalSift keeps nothing after the run; your results stay in your Apify storage.

**Is it legal?** It analyzes publicly available reviews. You are responsible for how you use the results and for complying with the laws that apply to you, including GDPR when you handle personal data.

**Something is wrong or missing?** Open an issue on the Issues tab. We read every one.

### Changelog

- **0.1.11 (2026-10-18):** Reply drafts never greet a reviewer by a name taken from their review, such as a signature (such a draft is dropped and not charged). Catch-all themes read "Other complaints" instead of "Other other complaints". The same place given twice is scraped and budgeted once.
- **0.1.10 (2026-10-18):** If the platform restarts a run after its reply drafts were charged, the drafts already paid for are delivered again without a second charge, even when the AI cannot write them again: drafts are now saved in the run's storage (the `REPLY_DRAFTS` record) before they are charged. With many reply drafts, the JSON summary keeps the first ones and says how many it left out, to stay under 20,000 characters (the report has them all).
- **0.1.9 (2026-10-18):** A run restarted by the platform waits for the scrape it already started instead of paying Google Maps Reviews Scraper twice. Text from your dataset is trimmed of surrounding spaces.
- **0.1.8 (2026-10-18):** Fixed: a batch of reviews was sometimes reported as not analyzed when the AI rated an aspect as mixed; dataset rows can now show `mixed` for an aspect. The status message no longer says "(0 with stars only)". Line breaks in quoted reviews show as " — " instead of running sentences together. On the Free plan, a run restarted by the platform stays within 1,000 reviews. With many places, the JSON summary shortens per-place detail to stay under 20,000 characters (the report keeps everything).
- **0.1.6 (2026-10-18):** When the AI cannot analyze the reviews, the run stops early and says so instead of retrying until it times out (reviews that were not analyzed are never charged). The status message lists reply drafts when they were charged. Reply drafts in the JSON summary no longer repeat the place link (the report and the dataset still have it), which keeps a default one-place summary under 20,000 characters. The cost examples include reply drafts.
- **0.1 (2026-10-17):** First release. Place URLs, datasets and integrations; themes with verified quotes; fix-first list; monthly trend; location comparison; urgent flags; reply drafts; HTML report and JSON summary; free demo.

***

SignalSift is not affiliated with or endorsed by Google, Amazon, TikTok, Meta or YouTube. Their logos only show which platform each Actor works with.

# Actor input Schema

## `placeUrls` (type: `array`):

Places to analyze. We scrape their reviews with Google Maps Reviews Scraper on your account first (billed by that Actor), then analyze them. Leave empty if you give a dataset ID instead.

## `maxReviewsPerPlace` (type: `integer`):

Newest reviews to scrape per place when you give place URLs. 1 to 5,000.

## `maxReviews` (type: `integer`):

Total cap for this run. Your spending limit can lower it further.

## `reviewsSince` (type: `string`):

Skip reviews published before this date, for example 2026-01-01.

## `reportLanguage` (type: `string`):

Language for theme names, as a code such as en, de or es. Report headings are in English; quotes and reply drafts stay in each review's own language.

## `draftReplies` (type: `boolean`):

Write a polite, specific reply draft for recent negative reviews the owner has not answered.

## `maxReplyDrafts` (type: `integer`):

Most recent unanswered negative reviews to draft replies for. 0 to 100.

## `datasetId` (type: `string`):

ID of a dataset produced by Google Maps Reviews Scraper (compass/google-maps-reviews-scraper) or Google Maps Scraper (compass/crawler-google-places) with reviews. When this Actor runs as an integration after one of those scrapers, the dataset is passed automatically.

## Actor input object example

```json
{
  "placeUrls": [],
  "maxReviewsPerPlace": 200,
  "maxReviews": 5000,
  "reportLanguage": "en",
  "draftReplies": true,
  "maxReplyDrafts": 25
}
```

# Actor output Schema

## `report` (type: `string`):

Client-ready report: themes with linked quotes, fix-first list, monthly trend, location comparison, urgent reviews and reply drafts.

## `summary` (type: `string`):

Short JSON summary for AI agents and code: coverage, average stars, sentiment split, top themes with one quote each, fix-first list, monthly trend and reply drafts.

## `reviews` (type: `string`):

One row per review: stars, sentiment, aspects, phrases with verified excerpts, urgent flag.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("signalsift/google-maps-reviews-analyzer").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("signalsift/google-maps-reviews-analyzer").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call signalsift/google-maps-reviews-analyzer --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,signalsift/google-maps-reviews-analyzer"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VV1TLzRS8rB2BATkp/builds/4vbeqfOqChNVoa4F7/openapi.json
