# Reviews Scraper & Reputation Monitor: Google, Yelp, Tripadvisor (`kirozhang/reputation-monitor`) Actor

Reviews scraper and reputation monitor for all platforms of your businesses in one scheduled run: Google Maps, Yelp, Tripadvisor, Booking.com, Facebook, App Store & Google Play. New reviews only, low-rating alerts, complaint topics, rating trends, category benchmarks and a client-ready HTML report.

- **URL**: https://apify.com/kirozhang/reputation-monitor.md
- **Developed by:** [Kiro Zhang](https://apify.com/kirozhang) (community)
- **Categories:** Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 new 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

> **Built for local-marketing and reputation agencies, multi-location brands and the teams that embed review data into their own products.** One scheduled run per client checks every review platform of every location and returns only what is new since the last run – low ratings flagged, complaint topics tagged, trends and category benchmarks computed, and a client-ready HTML report. Reviews you already received are never charged again.
>
> **Just need a one-off export?** Set *Baseline reviews per profile* (up to 500) and run once: you get the newest reviews from every platform in one format for $2 per 1,000 reviews plus $0.06 per business (platform data-source fees extra, see pricing).
>
> **Why not five scrapers and a spreadsheet?** Each platform scores differently (Google stars, Booking's 10-point score, Facebook recommendations), paginates differently and breaks differently. This monitor gives every review the same fields and the same 1–5 rating, remembers what you already have per *Tracking name*, and switches to a backup data source when one platform misbehaves – so a daily schedule just keeps working.

### What does this reviews scraper & reputation monitor do?

It watches the review profiles of your businesses on **Google Maps, Yelp, Tripadvisor, Booking.com, Facebook Pages, the App Store and Google Play** – and on your competitors' – and on every run returns:

- 🆕 **New reviews only**, newest first, one unified row format across all platforms (`rating` always 1–5, the platform's own score kept in `ratingRaw`).
- 🚨 **Alerts**: reviews with ≤ 2★ (configurable) are flagged `isAlert = true` so you can respond fast.
- 🏷️ **Complaint topics**: service & staff, wait time, price & value, food quality, cleanliness, rooms & facilities, location, noise, bookings & orders, quality of work, honesty.
- 📈 **Per-platform and overall rating & review-count trend** with the change since the last run, plus an owner reply rate.
- 🏆 **Leaderboard** of your locations and a **category benchmark** (is this location's rating and reply rate typical for a restaurant, hotel, clinic…?).
- 📊 **HTML report** you can forward to a client, and a JSON summary for your own dashboards or AI agents.

### Who is it for?

- **Reputation and local-SEO agencies** – one run per client, alerts to Slack or email, a report per client, all platforms in one place.
- **Hotel groups, restaurant chains, clinics, gyms, dealerships** – compare locations, catch problem locations by topic, track reply discipline.
- **Software companies** – a review data pipeline with one schema instead of six integrations.
- **AI agents** – ask "what new complaints did my locations get this week?" through the Apify MCP server.

### How to use it

1. Add **your businesses**, one per line, with all the review links you have for each:
   ```
   Hotel Edison | https://www.google.com/maps?cid=…, https://www.tripadvisor.com/Hotel_Review-…, https://www.booking.com/hotel/us/edison.html
   Joe's Pizza Broadway | https://www.google.com/maps/place/…, https://www.yelp.com/biz/joes-pizza-new-york-4, https://www.facebook.com/joespizzanyc
   ```
   A line with just one link works too. Supported links: Google Maps place / share / `?cid=` links and `ChIJ…` Place IDs, `yelp.com/biz/…`, Tripadvisor `Hotel_Review` / `Restaurant_Review` / `Attraction_Review` pages, `booking.com/hotel/…`, Facebook Page URLs, `apps.apple.com/…/idNNN`, `play.google.com/store/apps/details?id=…`.
2. Optionally add **competitors** in the same format (checked at half price).
3. Run once (baseline: the newest 30 reviews per profile), then add a **Schedule** – daily is typical – with the same **Tracking name**.
4. Connect Slack, email, Google Sheets, Zapier, Make or n8n and filter on `isAlert` for negative reviews only.

### Output

#### Dataset – one row per new review

```json
{
    "business": "Hotel Edison",
    "platform": "booking",
    "platformLabel": "Booking.com",
    "isMyBusiness": true,
    "rating": 2,
    "ratingRaw": 4,
    "sentiment": "negative",
    "isAlert": true,
    "topics": ["Cleanliness", "Room & facilities"],
    "title": "Tired rooms",
    "text": "+ Great location\n− Room was dirty and the shower didn't drain",
    "publishedAt": "2026-10-08T22:15:36.000Z",
    "ownerReply": null,
    "visitDate": "2026-10-02",
    "tripType": "Couple",
    "reviewUrl": null,
    "profileUrl": "https://www.booking.com/hotel/us/edison.en-gb.html",
    "isBaseline": false
}
```

Reviewer display names are **not** stored unless you turn on *Include reviewer names*.

#### Summary & report (key-value store)

- **OUTPUT** – per business: overall rating (review-count weighted across platforms), per-platform rating, review count and change, new reviews, alerts, reply rate, star distribution, top complaint topics, latest alerts, benchmark findings and a 30-run trend; plus a leaderboard of your locations and a `sources` block that says which data source answered for each profile.
- **REPORT** – a self-contained HTML dashboard.

### How much does it cost?

| Event | Free & Starter | Scale | Business |
|---|---|---|---|
| Business check (one business, all its platforms: metrics, trend, benchmark, report) | $0.06 | $0.05 | $0.04 |
| Competitor check | $0.03 | $0.025 | $0.02 |
| New review saved | $0.002 | $0.0017 | $0.0015 |

**Examples (Starter prices, daily schedule)**

- 1 location on Google + Yelp + Facebook, ~2 new reviews/day → about **$2 per month**.
- Agency with 20 locations on 3 platforms each, ~60 new reviews/day → about **$40 per month**.
- Hotel group with 50 properties on Google + Tripadvisor + Booking, ~150 new reviews/day → about **$83 per month** on the Scale plan.

**Data sources:** Google Maps, Yelp, Booking.com and Facebook reviews are read through maintained Store Actors ([Compass Google Maps Reviews Scraper](https://apify.com/compass/Google-Maps-Reviews-Scraper), [Yelp Reviews Scraper](https://apify.com/web_wanderer/yelp-reviews-scraper), [Booking Reviews Scraper](https://apify.com/voyager/booking-reviews-scraper), [Facebook Reviews Scraper](https://apify.com/apify/facebook-reviews-scraper)) started by this Actor in your account; their small per-review fees (about $0.0006–$0.0025 per review read) and compute appear separately on your bill and add roughly **$0.01 per business per day**. Tripadvisor, App Store and Google Play are read directly.

Reviews you already received are never charged again. On the Apify free plan a run monitors up to 2 businesses. To cap spending, set **Maximum cost per run** in the run options – the Actor stops cleanly when it is reached and keeps what it already saved.

### Automations: Slack, email, n8n, Make, Zapier

- **n8n – ready-made workflow:** [Negative reviews on any platform → Slack](https://api.apify.com/v2/key-value-stores/JFOMYybxejeFmBbUK/records/n8n-reputation-negative-reviews-to-slack). In n8n choose *Import from URL*, paste the link, add your Apify API token as a *Header Auth* credential (`Authorization` = `Bearer YOUR_TOKEN`), edit the input and activate.
- **Make or Zapier:** use the Apify app → *Run an Actor* with this Actor and the same input → filter on `isAlert = true` → Slack, Gmail or Google Sheets.
- **Apify only:** add a *Schedule*, then connect Slack or email in the Actor's *Integrations* tab.

### Reliability

Every platform has a primary and a backup data source; if the primary returns nothing or fails, the run switches to the backup for that profile and records it in `OUTPUT.sources`. An automated health check exercises every source against live pages every week, and open issues are checked twice a day. If something looks wrong, open an issue with the run ID and you'll get an answer within 24 hours.

### Tips & FAQ

- **Switching from Google Maps Review Monitor or Tripadvisor Review Monitor?** Use a new Tracking name here; the first run is a baseline (the newest 30 reviews per profile), later runs return only new reviews.
- **Booking.com scores** (1–10) are converted to 1–5 (`rating`), the original score stays in `ratingRaw`. **Facebook** has no stars: "Recommends" counts as 5, "Doesn't recommend" as 1.
- **A platform shows "–" for rating or review count:** the backup source answered and does not expose profile totals; the last known values are kept and marked `ratingStale`.
- **Review dates:** Tripadvisor and some Google reviews only expose the day or month; `publishedAt` is then the start of that period.
- **Languages:** reviews stay in their original language; Google reviews also carry `textTranslated` when Google provides a translation.
- Use one Tracking name per client or brand. A run with a new Tracking name starts a new baseline and does not affect existing ones.

# Actor input Schema

## `businesses` (type: `array`):

One business per line: <code>Business name | link1, link2, …</code>. Links can be any mix of Google Maps (place URL, share link or ?cid=), Yelp (yelp.com/biz/…), Tripadvisor (Hotel_Review / Restaurant_Review / Attraction_Review), Booking.com (booking.com/hotel/…), Facebook Page (facebook.com/pagename), App Store (apps.apple.com/…/idNNN) or Google Play (play.google.com/store/apps/details?id=…). A line with a single link and no name is also fine. JSON input also accepts objects: {"name": "Hotel Edison", "urls": \["…", "…"]}.

## `competitors` (type: `array`):

Optional. Same format. Tracked side by side and marked isMyBusiness = false; competitor checks cost half.

## `trackingId` (type: `string`):

Stable name for this group of businesses, e.g. one per client ('client-acme'). Runs with the same name share history, so only reviews you have not received yet are returned and charged.

## `alertMaxRating` (type: `integer`):

Reviews with this rating or lower (on the unified 1–5 scale) are flagged isAlert = true. Booking's 10-point scores and Facebook recommendations are converted to 1–5.

## `maxReviewsFirstRun` (type: `integer`):

How many of the newest reviews to save per platform profile on the first run (baseline). Each saved review is one 'review' charge. Later runs return only new reviews.

## `maxReviewsPerRun` (type: `integer`):

Safety cap per platform profile and run (limits cost if a run has not happened for a long time).

## `language` (type: `string`):

Interface language for platforms that support it (review texts stay in their original language; Google reviews also carry a translation).

## `includeReviewText` (type: `boolean`):

Store the full review text and owner reply. Turn off to keep only ratings, dates and topics.

## `includeReviewerNames` (type: `boolean`):

Off by default. When on, the public reviewer display name is stored with each review.

## `benchmark` (type: `boolean`):

Compare each business with the typical rating and reply rate of its category in the report.

## Actor input object example

```json
{
  "businesses": [
    "Hotel Edison | https://www.google.com/maps?cid=4280570365733019477, https://www.tripadvisor.com/Hotel_Review-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html"
  ],
  "alertMaxRating": 2,
  "maxReviewsFirstRun": 30,
  "maxReviewsPerRun": 300,
  "language": "en",
  "includeReviewText": true,
  "includeReviewerNames": false,
  "benchmark": true
}
```

# Actor output Schema

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

No description

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

No description

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

No description

# 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 = {
    "businesses": [
        "Hotel Edison | https://www.google.com/maps?cid=4280570365733019477, https://www.tripadvisor.com/Hotel_Review-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kirozhang/reputation-monitor").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 = { "businesses": ["Hotel Edison | https://www.google.com/maps?cid=4280570365733019477, https://www.tripadvisor.com/Hotel_Review-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html"] }

# Run the Actor and wait for it to finish
run = client.actor("kirozhang/reputation-monitor").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 '{
  "businesses": [
    "Hotel Edison | https://www.google.com/maps?cid=4280570365733019477, https://www.tripadvisor.com/Hotel_Review-g60763-d93437-Reviews-Hotel_Edison_Times_Square-New_York_City_New_York.html"
  ]
}' |
apify call kirozhang/reputation-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kirozhang/reputation-monitor"
        }
    }
}
```

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/bsrKRsjIfAClNdfzq/builds/5HCkwLA4YW5Wtfr2r/openapi.json
