# Review Alerts & AI Reply Drafts – Google, App Store, Any Source (`yck69/review-alerts`) Actor

Get alerted about new bad or urgent reviews with a ready-to-post reply draft in the reviewer's language. Works with Google Maps, Trustpilot or any review scraper (as an integration), App Store reviews built in. Sends to Slack, Discord, Telegram, email or a webhook.

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

## Pricing

from $10.00 / 1,000 review alerts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Review Alerts & AI Reply Drafts – Google, App Store, Any Source

Know the moment a **bad or urgent review** lands, and answer it in a minute. Each run finds the reviews you have not seen yet, flags what needs attention (1–3 stars, food poisoning, legal threats, refund demands…), and sends you an alert with a **ready-to-post reply draft in the reviewer's language**.

- **Google Maps, Trustpilot, Tripadvisor, Booking…**: connect this Actor to any review scraper as an integration. Each scrape is checked for new reviews automatically.
- **App Store**: built in, nothing else needed.
- **Alerts where you work**: Slack, Discord, Telegram, email or any webhook (Zapier, Make, n8n).
- **Reply drafts**: built-in templates in English, French, German and Spanish, or AI-written replies in any language.
- **Triage**: urgency (urgent / needs a reply / fine), topics (staff, waiting time, price, cleanliness, food, delivery, defects, refunds, bookings, app bugs, safety, legal) and whether you already replied.

### What data can you get?

<table>
<tr><td>⭐ Rating</td><td>📝 Review title and text</td><td>👤 Author and date</td></tr>
<tr><td>🌍 Language</td><td>😊 Sentiment</td><td>🚦 Urgency: urgent, medium, low</td></tr>
<tr><td>🏷️ Topics</td><td>↩️ Whether you already replied</td><td>✍️ Reply draft</td></tr>
<tr><td>🤖 Draft source: template or AI</td><td>🔗 Review link</td><td>📣 Where the alert was sent</td></tr>
</table>

### How to use it

1. Click **Try for free** at the top of this page.
2. Add your **App Store app**, or open a Google Maps / Trustpilot review scraper and add this Actor in its **Integrations** tab.
3. Fill in your business name, contact and where to send alerts (Slack, email, Telegram, webhook).
4. Click **Start**, then schedule it (or its scraper) hourly or daily.
5. Answer bad reviews from the alert, with the reply draft.

### Setup for Google Maps reviews

1. Open a **Google Maps reviews scraper** in Apify Store, enter your place, sort by **newest**, keep the number of reviews small (20–50) and **schedule** it daily or hourly.
2. In that scraper's **Integrations** tab, add **Apify Actor → Review Alerts & AI Reply Drafts**, with your settings (business name, contact, Slack or email…).
3. Done: each scrape triggers this Actor with its results, and only new reviews are alerted.

The same works with Trustpilot, Tripadvisor, Booking or Yelp scrapers. Field names are detected automatically.

### Input examples

**Your app's bad reviews to Slack**

```json
{
    "appStoreApps": ["https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281"],
    "businessName": "Notion",
    "businessType": "app",
    "contactInfo": "team@makenotion.com",
    "slackWebhookUrl": "https://hooks.slack.com/services/…"
}
```

**A restaurant's Google reviews by email** (as an integration of a Google Maps reviews scraper)

```json
{
    "businessName": "Café Rouge",
    "businessType": "local",
    "contactInfo": "hello@caferouge.fr",
    "signature": "Claire, Café Rouge",
    "emailTo": "claire@caferouge.fr",
    "maxRating": 3
}
```

**Urgent reviews only, to a Telegram group**

```json
{
    "datasetIds": ["aBcDeFgHiJkLmNoPq"],
    "alertOn": "urgent",
    "telegramBotToken": "123456:ABC…",
    "telegramChatId": "-1001234567890"
}
```

**Every new review with AI replies, to your own system**

```json
{
    "datasetIds": ["aBcDeFgHiJkLmNoPq"],
    "businessName": "Hotel Sole",
    "alertOn": "all",
    "aiProvider": "apify",
    "aiModel": "anthropic/claude-haiku-5.5",
    "replyGuidelines": "We offer free cancellation up to 48 h before arrival. Never mention discounts.",
    "webhookUrl": "https://hooks.zapier.com/hooks/catch/…"
}
```

### Output

One row per alert (real output of a test run with Google Maps-style data):

```json
{
    "product": "Café Rouge",
    "author": "Marie Dupont",
    "rating": 1,
    "text": "Attente de 45 minutes et serveur désagréable. Inadmissible.",
    "date": "2026-10-23T21:51:51.941Z",
    "url": "https://maps.google.com/r/g1",
    "language": "fr",
    "sentiment": "negative",
    "topics": ["staff", "wait"],
    "urgency": "medium",
    "ownerReplied": false,
    "replyDraft": "Bonjour Marie, merci pour votre retour, et nous sommes désolés que votre expérience n’ait pas été à la hauteur. Une telle attente n’est pas acceptable, et nous revoyons notre organisation aux heures d’affluence. Ce n’est pas l’accueil que nous souhaitons offrir, et nous en parlerons avec l’équipe. Contactez-nous à hello@caferouge.fr afin que nous puissions regarder cela ensemble.\n– Claire, Café Rouge",
    "replySource": "template",
    "notifiedVia": ["slack", "webhook"]
}
```

The Slack, Discord and Telegram messages show the stars, the review, the topics, the reply draft and a link to the review:

```
🔴 Urgent ★☆☆☆☆ New review for Café Rouge by A Google User
> I got sick after eating the chicken here. Food poisoning, I am calling my lawyer.
Topics: food, safety, legal
Reply draft
> Hi there, thank you for your feedback, and I’m sorry your experience fell short. We take this very seriously and would like to hear from you directly. …
```

| Field | Meaning |
|---|---|
| `urgency` | `high`: safety, legal threats or a 1-star refund demand. `medium`: 1–2 stars. `low`: the rest |
| `topics` | What the review is about |
| `sentiment` | `negative` (1–2 stars), `mixed` (3), `positive` (4–5) |
| `ownerReplied` | The source shows a reply from you already |
| `replyDraft`, `replySource` | The reply, written by `ai` or from a `template` |
| `summary` | With AI: one line for you about what happened and what the reviewer wants |
| `notifiedVia` | Channels the alert went to |

### How it works

- Every review read is remembered (per alert name), so a review is only alerted once, even if the scraper returns it again.
- On the **first run**, reviews older than 7 days are only remembered, so you are not flooded with the past.
- With **Skip reviews already answered**, reviews where the source shows your reply are left out.

### Pricing

| Event | Price |
|---|---|
| Review checked | $0.0001 |
| Review alert (with reply draft) | $0.01 |

A restaurant whose scraper returns 30 reviews a day and gets 3 bad reviews a week pays about $0.12 a month. **AI replies** are optional and billed separately: with Apify AI on your Apify account (the model's list price on paid Apify plans, about 10 times more on the free plan), or with your own Anthropic key.

### More Actors from this developer

### FAQ

##### Can I use it through the API, Make, Zapier or Google Sheets?

Yes. Every run can be started and read through the [Apify API](https://docs.apify.com/api/v2) (JavaScript and Python clients, CLI, MCP), and Apify integrations connect it to Make, Zapier, n8n, Google Sheets, Slack, webhooks and more.

##### Is it legal to use this data?

The Actor only reads public or official open data and doesn't log in anywhere. Check the source's licence and your local rules (for example GDPR when data concerns people) for your use case; if in doubt, ask a lawyer.

##### Something isn't working, or you need another field?

Open an issue on the **Issues** tab: feedback is read and answered.

# Actor input Schema

## `appStoreApps` (type: `array`):

App Store links, IDs or names. Their newest reviews are read on each run.

## `countries` (type: `array`):

Two-letter store codes (us, gb, fr…). Empty: the country in the link, else us.

## `datasetIds` (type: `array`):

Dataset IDs of any review scraper (Google Maps, Trustpilot, Booking, Tripadvisor…). Easier: add this Actor as an integration of the scraper, see the README.

## `fileUrls` (type: `array`):

CSV, JSON or JSON Lines exports with one review per row.

## `fieldMapping` (type: `object`):

Only if detection picks the wrong fields: {"text": "reviewBody", "rating": "stars", "date": "publishedAtDate", "author": "name", "ownerReply": "responseFromOwnerText"}.

## `businessName` (type: `string`):

Used in alerts and replies.

## `businessType` (type: `string`):

Adapts the wording of replies.

## `contactInfo` (type: `string`):

Email, phone or page given in replies to complaints, e.g. support@yourshop.com.

## `signature` (type: `string`):

Ends each reply, e.g. "Claire, owner".

## `replyTone` (type: `string`):

Style of AI-written replies.

## `replyLanguage` (type: `string`):

Without AI, replies are written in English, French, German or Spanish.

## `replyGuidelines` (type: `string`):

Anything the AI should know: opening hours, how refunds work, what never to say…

## `alertOn` (type: `string`):

Which new reviews trigger an alert.

## `maxRating` (type: `integer`):

With "Bad and urgent reviews".

## `skipAnswered` (type: `boolean`):

When the source includes the owner's reply.

## `firstRunDays` (type: `integer`):

On the very first run, older reviews are only remembered, so you are not flooded.

## `maxReviewsPerSource` (type: `integer`):

Newest reviews read from each app or dataset per run.

## `alertName` (type: `string`):

Separate memory per alert. Defaults to one per set of sources.

## `slackWebhookUrl` (type: `string`):

Slack → Apps → Incoming Webhooks.

## `discordWebhookUrl` (type: `string`):

Channel settings → Integrations → Webhooks.

## `telegramBotToken` (type: `string`):

From @BotFather.

## `telegramChatId` (type: `string`):

Your chat or group ID (send a message to your bot, then open api.telegram.org/bot<token>/getUpdates).

## `emailTo` (type: `string`):

One email per run with all alerts, sent with Apify's free Send Email Actor. Several addresses: comma-separated.

## `webhookUrl` (type: `string`):

Receives {"alerts": \[...]} as JSON: for Zapier, Make, n8n or your own system.

## `aiProvider` (type: `string`):

An AI model writes a tailored reply and a one-line summary for each alert, in the reviewer's language. Apify AI bills the model's list price on paid Apify plans (about 10 times more on the free plan): with the default Claude Opus 5.5 under a cent per review, far less with anthropic/claude-haiku-5.5.

## `anthropicApiKey` (type: `string`):

Used only with the Anthropic option.

## `aiModel` (type: `string`):

Default: Claude Opus 5.5 (anthropic/claude-opus-5.5 with Apify AI, claude-opus-5-5 with your key).

## Actor input object example

```json
{
  "appStoreApps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
  ],
  "businessName": "Duolingo",
  "businessType": "app",
  "replyTone": "warm",
  "replyLanguage": "auto",
  "alertOn": "negative",
  "maxRating": 3,
  "skipAnswered": true,
  "firstRunDays": 7,
  "maxReviewsPerSource": 50,
  "aiProvider": "none"
}
```

# Actor output Schema

## `alerts` (type: `string`):

New reviews with urgency, topics and a reply draft.

## `results` (type: `string`):

Every field.

# 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 = {
    "appStoreApps": [
        "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
    ],
    "businessName": "Duolingo",
    "businessType": "app",
    "maxReviewsPerSource": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("yck69/review-alerts").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 = {
    "appStoreApps": ["https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"],
    "businessName": "Duolingo",
    "businessType": "app",
    "maxReviewsPerSource": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("yck69/review-alerts").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 '{
  "appStoreApps": [
    "https://apps.apple.com/us/app/duolingo-language-lessons/id570060128"
  ],
  "businessName": "Duolingo",
  "businessType": "app",
  "maxReviewsPerSource": 50
}' |
apify call yck69/review-alerts --silent --output-dataset

```

## MCP server setup

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

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/d65T26METIJCXza3B/builds/Pl2NHJ8JyAhCYqdtj/openapi.json
