# Review Pain Intelligence for Product Teams (`signal_lab/review-pain-intelligence`) Actor

Analyze product review datasets to find recurring customer pain points, complaints, and unmet needs. Rank issue clusters by frequency, ratings, trends, matched topics, and source evidence—no LLM key required.

- **URL**: https://apify.com/signal\_lab/review-pain-intelligence.md
- **Developed by:** [Signal Lab](https://apify.com/signal_lab) (community)
- **Categories:** E-commerce, AI, Automation
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 pain clusters

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Review Pain Intelligence

Convert product-review datasets into a ranked map of recurring customer pain. This Actor groups complaint topics by product, measures frequency and negative sentiment signals, compares adjacent time windows, and attaches source excerpts so every finding can be verified.

Use it for **product discovery, roadmap prioritization, competitive research, voice-of-customer analysis, and sales messaging**. The deterministic engine supports common English and Russian complaint language and needs no LLM key.

### What this Actor does

- Detects recurring complaint topics across products.
- Ranks pain clusters by mentions, negative share, rating, and recent trend.
- Returns matched keywords and source evidence instead of fabricated summaries.
- Suggests a concrete validation next step for each pain cluster.
- Accepts up to 100,000 reviews and returns up to 500 ranked clusters.
- Runs with limited Apify permissions and a fixed 256 MB memory ceiling.

This Actor analyzes existing review records. It does not scrape review sites itself. Use inline records, select an Apify dataset, or connect a compatible limited-permission upstream Actor.

### How to use Review Pain Intelligence

1. Choose `records`, `datasetId`, or `sourceActorId` as the source.
2. Provide review text and preferably product, rating, date, and source URL.
3. Set `lookbackDays` to define the recent trend window.
4. Set `minMentions` to control how much repetition a pain needs.
5. Set `maxEvidencePerPain` and `maxResults`.
6. Run the Actor and inspect the ranked clusters in the default dataset.

### Output

One dataset item represents one product/topic pain cluster. It includes the product, topic, pain score, mention count, negative share, average rating, recent and previous mentions, growth rate, matched keywords, evidence excerpts, and a recommended validation action.

The `OUTPUT` record summarizes source volume and emitted clusters. Results are available through the Apify API and can be exported as JSON, CSV, Excel, XML, or RSS, scheduled, or connected to integrations and webhooks.

### Pricing

This Actor uses transparent pay-per-event pricing:

- **$0.002 per analysis run**
- **$0.005 per emitted pain cluster**

Examples: 10 pain clusters cost **$0.052**; 100 clusters cost **$0.502**. Runs with fewer qualified clusters cost less. This Actor's platform usage is included; an optional paid upstream Actor has its own separate charges.

At 256 MB, bounded cloud benchmarks processed 25,000 inline reviews in about 6.6 seconds. The highest measured run cost across review scenarios was approximately **$0.000312**, leaving a substantial safety margin.

### Other Signal Lab Actors

- [Hiring Signal Intelligence](https://apify.com/signal_lab/hiring-signal-intelligence) ranks companies showing concentrated hiring activity.
- [Marketplace Deal Alerts](https://apify.com/signal_lab/marketplace-deal-alerts) finds underpriced listings and price drops.

### FAQ

#### Does the Actor use an LLM?

No. The launch version uses explainable multilingual keyword topics and rating/negative-language rules. This avoids hallucinated themes and unpredictable API costs.

#### What languages are supported?

The built-in topic dictionary focuses on common English and Russian complaint language. Other languages may still contribute through ratings, but topic coverage will be limited.

#### Why did I receive no clusters?

Check that review text is present, reduce `minMentions`, widen the date window, and confirm date fields use recognizable timestamps.

#### Can it analyze a private dataset?

Yes. Select it in the dataset picker. The Actor receives read-only access to that dataset and otherwise remains limited-permission.

### Privacy and support

Do not submit secrets, payment data, health information, or unnecessary personal identifiers in review text. For support, open the Actor's Issues tab with a run ID and a small redacted sample.

### Free product guide

See the [Review Pain Intelligence workflow, use cases, and expected output](https://signal-lab-tools.vitaxastar.chatgpt.site/tools/review-pain-intelligence), or browse [all Signal Lab data tools](https://signal-lab-tools.vitaxastar.chatgpt.site).

# Actor input Schema

## `records` (type: `array`):

Inline review records for testing or small analyses.

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

Read reviews from this existing Apify dataset.

## `sourceActorId` (type: `string`):

Optional upstream Actor to run. It must support limited permissions; any upstream Actor charges are separate.

## `sourceActorInput` (type: `object`):

JSON input passed to the selected upstream Actor.

## `lookbackDays` (type: `integer`):

Compare recent mentions with an equally long preceding window.

## `minMentions` (type: `integer`):

Do not emit topic clusters with fewer matching reviews.

## `maxEvidencePerPain` (type: `integer`):

Maximum source excerpts attached to each topic cluster.

## `maxResults` (type: `integer`):

Maximum number of ranked product/topic clusters to emit.

## `maxSourceItems` (type: `integer`):

Hard cap on review records read from the source.

## Actor input object example

```json
{
  "records": [
    {
      "product": "ExampleCRM",
      "rating": 1,
      "date": "2026-08-20",
      "text": "Support never responds to our tickets.",
      "url": "https://example.com/reviews/1"
    },
    {
      "product": "ExampleCRM",
      "rating": 2,
      "date": "2026-08-20",
      "text": "Terrible customer support response time."
    },
    {
      "product": "ExampleCRM",
      "rating": 2,
      "date": "2026-08-20",
      "text": "Support agent did not resolve the problem."
    },
    {
      "product": "ExampleCRM",
      "rating": 2,
      "date": "2026-08-20",
      "text": "The interface is confusing and hard to use."
    },
    {
      "product": "ExampleCRM",
      "rating": 2,
      "date": "2026-08-20",
      "text": "Navigation is difficult."
    }
  ],
  "sourceActorInput": {},
  "lookbackDays": 30,
  "minMentions": 2,
  "maxEvidencePerPain": 3,
  "maxResults": 20,
  "maxSourceItems": 10000
}
```

# Actor output Schema

## `painClusters` (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 = {
    "records": [
        {
            "product": "ExampleCRM",
            "rating": 1,
            "date": "2026-08-20",
            "text": "Support never responds to our tickets.",
            "url": "https://example.com/reviews/1"
        },
        {
            "product": "ExampleCRM",
            "rating": 2,
            "date": "2026-08-20",
            "text": "Terrible customer support response time."
        },
        {
            "product": "ExampleCRM",
            "rating": 2,
            "date": "2026-08-20",
            "text": "Support agent did not resolve the problem."
        },
        {
            "product": "ExampleCRM",
            "rating": 2,
            "date": "2026-08-20",
            "text": "The interface is confusing and hard to use."
        },
        {
            "product": "ExampleCRM",
            "rating": 2,
            "date": "2026-08-20",
            "text": "Navigation is difficult."
        }
    ],
    "lookbackDays": 30,
    "minMentions": 2,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("signal_lab/review-pain-intelligence").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 = {
    "records": [
        {
            "product": "ExampleCRM",
            "rating": 1,
            "date": "2026-08-20",
            "text": "Support never responds to our tickets.",
            "url": "https://example.com/reviews/1",
        },
        {
            "product": "ExampleCRM",
            "rating": 2,
            "date": "2026-08-20",
            "text": "Terrible customer support response time.",
        },
        {
            "product": "ExampleCRM",
            "rating": 2,
            "date": "2026-08-20",
            "text": "Support agent did not resolve the problem.",
        },
        {
            "product": "ExampleCRM",
            "rating": 2,
            "date": "2026-08-20",
            "text": "The interface is confusing and hard to use.",
        },
        {
            "product": "ExampleCRM",
            "rating": 2,
            "date": "2026-08-20",
            "text": "Navigation is difficult.",
        },
    ],
    "lookbackDays": 30,
    "minMentions": 2,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("signal_lab/review-pain-intelligence").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 '{
  "records": [
    {
      "product": "ExampleCRM",
      "rating": 1,
      "date": "2026-08-20",
      "text": "Support never responds to our tickets.",
      "url": "https://example.com/reviews/1"
    },
    {
      "product": "ExampleCRM",
      "rating": 2,
      "date": "2026-08-20",
      "text": "Terrible customer support response time."
    },
    {
      "product": "ExampleCRM",
      "rating": 2,
      "date": "2026-08-20",
      "text": "Support agent did not resolve the problem."
    },
    {
      "product": "ExampleCRM",
      "rating": 2,
      "date": "2026-08-20",
      "text": "The interface is confusing and hard to use."
    },
    {
      "product": "ExampleCRM",
      "rating": 2,
      "date": "2026-08-20",
      "text": "Navigation is difficult."
    }
  ],
  "lookbackDays": 30,
  "minMentions": 2,
  "maxResults": 20
}' |
apify call signal_lab/review-pain-intelligence --silent --output-dataset

```

## MCP server setup

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

```

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/2z6eTefolheuMOkiK/builds/mC2aQsuSYvABT2pXV/openapi.json
