# Google Reviews Insights (AI) (`fuze/google-reviews-insights`) Actor

Turns Google reviews into concrete insights for a business and its competitors: top praises, top complaints, rating/theme trends over time, an action plan and a competitor comparison. Reviewer names and full review text are never reproduced. Actively maintained.

- **URL**: https://apify.com/fuze/google-reviews-insights.md
- **Developed by:** [Fredrik Hansson](https://apify.com/fuze) (community)
- **Categories:** AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $44.00 / 1,000 place analyzeds

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 Reviews Insights (AI)

Turn Google reviews into **concrete, owner-ready insights** — for your own business and for your competitors.

Point this actor at the output of any Google Maps reviews scraper (or give it a list of Google Maps URLs and it will fetch the reviews for you). It reads the reviews, finds the recurring themes, tracks how ratings move over time, and writes a ranked action plan. In **compare** mode it builds a competitor table plus a *where you win / where you lose* readout for your business.

> **Privacy by design:** the actor never reproduces a full review verbatim and never includes a reviewer's name. All examples are short paraphrases. Reviewer names are dropped before anything is sent to the AI.

This is the sister actor of **[Google Maps Lead Enricher (AI)](https://apify.com/fuze/google-maps-lead-enricher)** — that one turns Maps listings into sales leads; this one turns their reviews into insight.

![Google Reviews Insights (AI) — input and sample output](https://datatools-hub.vercel.app/actor-shots/google-reviews-insights.png)

### Quick start

1. **Fill in the input** — set the fields in the input tab (prefilled with a working example).
2. **Click Start** — the Actor runs and writes one record per item to the dataset.
3. **Get your data** — export to **JSON, CSV or Excel**, or pull it via the API.

***

### What you get, per place

- **topPraises** — the 5 most common positive themes, each with an approximate share and a short paraphrased example.
- **topComplaints** — the same for negative themes.
- **trend** — how the rating and themes evolved over time (per quarter when there is enough dated data).
- **unansweredNegativeShare** — the share of negative reviews (≤2★) that got **no owner reply** (when the source data includes owner responses).
- **actionPlan** — 3–5 concrete improvements, ranked by expected impact.
- **executiveSummary** — 3–4 sentences you can paste into a report.

In **compare** mode you also get one extra record with a **comparisonTable** across places and **whereYouWin / whereYouLose** for the first place in your list.

***

### Who it's for

- **Local SEO / reputation agencies** — generate a review audit for every client in minutes and benchmark them against local rivals.
- **Franchises & multi-location chains** — run every location through one dataset and compare them on the same themes.
- **Restaurants, clinics, hotels, gyms** — see exactly what guests praise and complain about, and what to fix first.
- **Consultants doing competitive analysis** — drop in your client plus 2–4 competitors in `compare` mode and get a ready-made battlecard.

***

### Input

Provide **one** of:

| Field | Type | Notes |
|---|---|---|
| `datasetId` | string | ID of a dataset from a Google Maps reviews scraper (one review per item). |
| `placeUrls` | string\[] | Google Maps place URLs. If set (and no `datasetId`), the actor runs [`compass/google-maps-reviews-scraper`](https://apify.com/compass/google-maps-reviews-scraper) to fetch the reviews first. **That scraper run is billed to your own Apify account.** |

Other options:

| Field | Default | Notes |
|---|---|---|
| `mode` | `single` | `single` = analyse each place on its own. `compare` = also build the competitor table + win/lose for the first place. |
| `maxReviewsPerPlace` | `300` | Newest reviews first. Also passed to the Maps scraper when `placeUrls` is used. |
| `outputLanguage` | `en` | Language for all generated text, e.g. `en`, `sv`, `Swedish`. |
| `model` | `gpt-4o-mini` | OpenAI model. `gpt-4o-mini` is cheap and plenty for this; `gpt-4o` is more thorough but costs more. |

#### Example input — single

```json
{
  "datasetId": "aBcD1234efGh5678",
  "mode": "single",
  "maxReviewsPerPlace": 300,
  "outputLanguage": "en"
}
```

#### Example input — compare (from URLs)

```json
{
  "placeUrls": [
    "https://www.google.com/maps/place/Your+Cafe/@59.33,18.06,17z/",
    "https://www.google.com/maps/place/Rival+Cafe/@59.34,18.07,17z/"
  ],
  "mode": "compare",
  "maxReviewsPerPlace": 200,
  "outputLanguage": "en"
}
```

***

### Example output

#### `single` — one record per place

```json
{
  "recordType": "place",
  "place": "Your Cafe",
  "placeUrl": "https://www.google.com/maps/place/Your+Cafe/...",
  "reviewsAnalyzed": 284,
  "averageRating": 4.3,
  "unansweredNegativeShare": 0.62,
  "topPraises": [
    { "theme": "Friendly, fast service", "approximateShare": "~45% of reviews", "example": "Several guests mention being greeted warmly and served quickly even at peak times." },
    { "theme": "Quality of the coffee", "approximateShare": "~30%", "example": "Regulars call the espresso consistently excellent." }
  ],
  "topComplaints": [
    { "theme": "Limited seating at lunch", "approximateShare": "~18%", "example": "Visitors describe struggling to find a table around midday." },
    { "theme": "Slow card payments", "approximateShare": "~9%", "example": "A few reviewers note the card terminal is often slow or down." }
  ],
  "trend": {
    "summary": "Ratings dipped in 2024-Q2 as seating complaints rose, then recovered through 2024-Q4 as service praise returned.",
    "byQuarter": [
      { "quarter": "2024-Q1", "averageRating": 4.5, "reviewCount": 61 },
      { "quarter": "2024-Q2", "averageRating": 4.0, "reviewCount": 78 },
      { "quarter": "2024-Q3", "averageRating": 4.2, "reviewCount": 70 },
      { "quarter": "2024-Q4", "averageRating": 4.5, "reviewCount": 75 }
    ]
  },
  "actionPlan": [
    { "rank": 1, "action": "Add or reconfigure lunchtime seating", "expectedImpact": "Directly addresses the top recurring complaint; likely lifts the Q2-style dips." },
    { "rank": 2, "action": "Reply to negative reviews — 62% currently get no response", "expectedImpact": "Shows prospective customers that issues are taken seriously; improves conversion from the listing." },
    { "rank": 3, "action": "Service or replace the card terminal", "expectedImpact": "Removes a small but repeated friction point at checkout." }
  ],
  "executiveSummary": "Your Cafe is well-liked (4.3★) mainly for friendly service and good coffee. The clearest drag is lunchtime seating, which coincided with a Q2 rating dip. Most negative reviews go unanswered, which is a quick, free win. Fixing seating and replying to criticism should lift both the rating and listing conversion."
}
```

#### `compare` — one extra record

```json
{
  "recordType": "comparison",
  "place": "Your Cafe",
  "comparisonTable": [
    { "theme": "Service speed", "places": [
      { "place": "Your Cafe", "sentiment": "strong", "note": "Repeatedly praised, even at peak." },
      { "place": "Rival Cafe", "sentiment": "mixed", "note": "Praised off-peak, criticised at lunch." }
    ]},
    { "theme": "Seating / space", "places": [
      { "place": "Your Cafe", "sentiment": "weak", "note": "Lunchtime seating is the top complaint." },
      { "place": "Rival Cafe", "sentiment": "strong", "note": "Guests highlight plenty of room." }
    ]}
  ],
  "whereYouWin": ["Service speed and friendliness", "Coffee quality"],
  "whereYouLose": ["Seating capacity at lunch", "Overall ambience"]
}
```

***

### How it works with the Google Maps scrapers

```
Google Maps reviews scraper            Google Reviews Insights (AI)
(e.g. compass/google-maps-reviews-scraper)
          │  dataset of reviews                 │
          └───────────────► datasetId ──────────┘
                                                 │
   OR: give placeUrls → this actor runs the scraper for you
       (that run is billed to your Apify account)
```

1. Run any Google Maps reviews scraper and copy its **dataset ID** into `datasetId` — **or** just pass `placeUrls` and let this actor call [`compass/google-maps-reviews-scraper`](https://apify.com/compass/google-maps-reviews-scraper) for you.
2. The actor groups reviews by place, computes ratings/quarters/owner-response stats in code, and uses OpenAI to summarise themes and write the action plan.
3. Pair it with the **[Google Maps Lead Enricher (AI)](https://apify.com/fuze/google-maps-lead-enricher)** to go from a Maps search → sales leads *and* review insight for the same places.

***

### Pricing (pay-per-event)

| Event | When it fires |
|---|---|
| `place-analyzed` | Once per place that produced a full insight report. |
| `reviews-processed` | Once per **100 reviews** actually sent to the AI (rounded up, per place). |

Pricing is tuned so the event prices cover the OpenAI token cost (with `gpt-4o-mini`) with margin. The actor logs a cost summary (`estimatedAiCostPerPlaceUsd`) at the end of every run so you can verify the margin. If you pass `placeUrls`, the underlying Google Maps scraper run is billed separately to your account by that actor.

***

### MCP support

Like every Apify actor, this one is available over the **Model Context Protocol (MCP)**, so AI agents and MCP-compatible clients (Claude, Cursor, etc.) can call it as a tool. Use Apify's MCP server (`https://mcp.apify.com`) or the Actors MCP Server to let an agent run `fuze/google-reviews-insights` and read the resulting dataset directly. See Apify's MCP documentation for setup.

***

### Notes & limits

- Trend buckets need dated reviews; if the source data lacks dates (or has too few), `trend.byQuarter` is empty and the summary says so.
- `unansweredNegativeShare` requires the scraper to include owner-response fields (`responseFromOwnerText` etc.); otherwise it is `null`.
- Reviewer names and verbatim quotes are never emitted — only short paraphrased examples.
- Requires an `OPENAI_API_KEY` (configured by the actor owner).

### Related actors

- [Amazon Reviews Scraper](https://apify.com/fuze/amazon-reviews-scraper) — Scrape Amazon product reviews — rating, title, body, author, date, verified-purchase and
- [Competitor Pulse — AI Competitor Intelligence Monitor](https://apify.com/fuze/competitor-pulse) — Watch competitors holistically — pricing, website, hiring, tech, news and
- [AI Share of Voice — Multi-Engine GEO Tracker](https://apify.com/fuze/ai-share-of-voice) — Track your brand's visibility and share of voice across AI answer engines, with

# Actor input Schema

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

A dataset produced by a Google Maps reviews scraper (e.g. compass/google-maps-reviews-scraper). Each item should be one review. Pick one of your datasets or paste its ID. Leave empty if you use 'Place URLs' instead.

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

Google Maps place URLs. If set (and no datasetId is given), the actor runs compass/google-maps-reviews-scraper to fetch the reviews first. That scraper run is charged to YOUR Apify account.

## `mode` (type: `string`):

single = analyse each place on its own. compare = also build a competitor comparison table plus 'where you win' / 'where you lose' for the FIRST place in the list.

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

Upper bound on how many reviews (newest first) are analysed per place. Also passed to the Google Maps scraper when 'Place URLs' is used.

## `outputLanguage` (type: `string`):

Language for all generated text (themes, trend, action plan, summaries). Use an English name or ISO code, e.g. 'en', 'sv', 'Swedish'.

## `model` (type: `string`):

OpenAI model used for the analysis. gpt-4o-mini is the cheapest and is plenty for review summarisation; gpt-4o is more thorough but costs more (pay-per-event pricing is tuned for gpt-4o-mini).

## Actor input object example

```json
{
  "placeUrls": [
    "https://www.google.com/maps/place/..."
  ],
  "mode": "single",
  "maxReviewsPerPlace": 300,
  "outputLanguage": "en",
  "model": "gpt-4o-mini"
}
```

# Actor output Schema

## `overview` (type: `string`):

The insight records in a table view (one row per place plus any comparison record).

## `allResults` (type: `string`):

Full per-place reports: top praises, complaints, trend, action plan, executive summary.

# 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 = {
    "placeUrls": [
        "https://www.google.com/maps/place/..."
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fuze/google-reviews-insights").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 = { "placeUrls": ["https://www.google.com/maps/place/..."] }

# Run the Actor and wait for it to finish
run = client.actor("fuze/google-reviews-insights").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 '{
  "placeUrls": [
    "https://www.google.com/maps/place/..."
  ]
}' |
apify call fuze/google-reviews-insights --silent --output-dataset

```

## MCP server setup

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

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/N2dzGEnwHsMwY8Q3H/builds/plYLSg3B0d86zrNNE/openapi.json
