# Review Pain Extractor (`seeb/review-pain-extractor`) Actor

Mine public reviews for customer complaints, missing features, severity, affected workflows, sentiment clues, and product or sales opportunities.

- **URL**: https://apify.com/seeb/review-pain-extractor.md
- **Developed by:** [Techionik](https://apify.com/seeb) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $25.00 / 1,000 review pain signals

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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 Extractor

Mine public reviews for customer complaints, missing features, severity, affected workflows, sentiment clues, and product or sales opportunities.

Review Pain Extractor is built for product, marketing, and sales teams that need usable voice-of-customer signals from public reviews. It does not simply count keywords. It extracts the complaint, the affected workflow, the requested feature, severity, and the business opportunity behind the review.

This actor is designed for focused marketplace research runs. You can give it public URLs, paste copied source text, or combine both. URL fetching is useful for public HTML pages; pasted text is useful when a site uses heavy JavaScript, login walls, CAPTCHA, or restrictive anti-bot controls that should not be bypassed.

### Who Uses It

- Product managers
- SaaS founders
- App marketplace researchers
- Sales and positioning teams
- Customer research and VOC analysts

### What It Extracts

- `productName` - Product, plugin, app, or vendor being reviewed.
- `reviewSource` - Marketplace, app store, review site, plugin directory, or source context.
- `rating` - Visible rating or sentiment rating when present.
- `painTheme` - Complaint theme such as support delay, missing feature, sync issue, pricing, reliability, or usability.
- `complaintText` - Core customer pain phrase extracted from the review.
- `requestedFeature` - Feature request, missing capability, or desired improvement.
- `affectedWorkflow` - Workflow affected by the pain, such as checkout, form submission, reporting, onboarding, or sync.
- `severity` - Severity based on rating, negative language, broken workflows, and urgency.
- `buyerOpportunity` - How a competitor, product team, or sales team can use the pain signal.
- `reviewUrl` - Original review page URL or synthetic URL for pasted review text.
- `evidenceText` - Short review sentence supporting the extracted pain.

### Why This Actor Is Useful

Reviews contain sales objections, roadmap clues, and competitor weaknesses. This actor converts raw review language into structured pain signals that are easier to prioritize.

### Input

- `startUrls` - Public pages to fetch and analyze.
- `sourceTexts` - Optional pasted source snippets for pages that are blocked, login-gated, JavaScript-heavy, or easier to collect manually.
- `maxPagesPerStartUrl` - Same-domain crawl depth for each URL. Use a low value for precise runs.
- `maxConcurrency` - Parallel request count.
- `proxyConfiguration` - Optional Apify Proxy settings for public pages that rate-limit normal requests.

### Example Input

```json
{
    "startUrls": [
        {
            "url": "https://wordpress.org/plugins/woocommerce/#reviews"
        }
    ],
    "sourceTexts": [
        "Shopify review for CartPilot rated 2 stars: merchants complain the bulk discount rules are missing, checkout campaigns fail during sales, and support takes three days to reply."
    ],
    "maxPagesPerStartUrl": 2,
    "maxConcurrency": 2
}
```

### Example Output

```json
{
    "productName": "CartPilot",
    "reviewSource": "Shopify",
    "rating": "2 stars",
    "painTheme": "missing feature",
    "complaintText": "bulk discount rules are missing",
    "requestedFeature": "bulk discount rules",
    "affectedWorkflow": "checkout campaigns",
    "severity": "high",
    "buyerOpportunity": "Position against checkout campaign failures and missing bulk-discount controls.",
    "reviewUrl": "pasted://review-1",
    "evidenceText": "Merchants complain the bulk discount rules are missing."
}
```

### How It Works

1. The actor normalizes every URL and pasted text item.
2. Public URLs are fetched with a browser-like user agent and a clear timeout.
3. HTML pages are converted into readable page text while scripts, styles, iframes, and hidden noise are removed.
4. The actor applies Review Pain Extractor-specific extraction rules rather than a generic page-summary template.
5. Only rows with useful actor-specific information are saved to the dataset.
6. A run summary is saved to the key-value store for quick review.

### Practical Workflows

- Mine competitor reviews before a positioning project.
- Feed feature-request evidence into product planning.
- Build sales battlecards from public complaints.
- Track recurring support or reliability pain themes.

### Reliability Notes

- Best results come from public HTML pages or pasted snippets that visibly contain the target signal.
- For JavaScript-heavy sites, paste the relevant text or use URLs that return readable HTML.
- The actor does not bypass logins, paywalls, CAPTCHA, private systems, or website restrictions.
- Some fields may be empty when the source does not contain that information.
- Use smaller crawl limits for broad portals and larger limits only for well-structured sites.

### Limitations

- This actor extracts public or user-provided visible text only.
- It is not a legal-access tool for restricted procurement portals, private retailer dashboards, closed review platforms, account-only changelogs, or internal documentation.
- Results should be reviewed before making procurement, legal, inventory, engineering, or sales decisions.

### Search Keywords

review pain extractor, review pain extractor, product name, review source, rating, pain theme, complaint text, requested feature, affected workflow, severity, buyer opportunity, review url, evidence text

# Actor input Schema

## `startUrls` (type: `array`):

Add public review pages or paste review snippets from app stores, plugin directories, marketplaces, SaaS review pages, or support communities.

## `sourceTexts` (type: `array`):

Optional pasted snippets. Use this for blocked pages, login-gated portals you can view manually, newsletters, exported notes, or copied page sections.

## `maxPagesPerStartUrl` (type: `integer`):

How many same-domain pages to analyze from each start URL. Keep this low for focused, low-cost runs.

## `maxConcurrency` (type: `integer`):

How many pages to analyze at the same time.

## `proxyConfiguration` (type: `object`):

Optional proxy settings. Use Apify Proxy for public pages that rate-limit normal datacenter requests.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://wordpress.org/plugins/woocommerce/#reviews"
    },
    {
      "url": "https://wordpress.org/plugins/contact-form-7/#reviews"
    }
  ],
  "sourceTexts": [
    "Shopify review for CartPilot rated 2 stars: merchants complain the bulk discount rules are missing, checkout campaigns fail during sales, and support takes three days to reply.",
    "WordPress plugin review for FormGuard rated 1 star says spam filtering breaks contact forms for agencies and the user wishes there was a safe test mode before enabling protection."
  ],
  "maxPagesPerStartUrl": 3,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

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

No description

## `rawJson` (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 = {
    "startUrls": [
        {
            "url": "https://wordpress.org/plugins/woocommerce/#reviews"
        },
        {
            "url": "https://wordpress.org/plugins/contact-form-7/#reviews"
        }
    ],
    "sourceTexts": [
        "Shopify review for CartPilot rated 2 stars: merchants complain the bulk discount rules are missing, checkout campaigns fail during sales, and support takes three days to reply.",
        "WordPress plugin review for FormGuard rated 1 star says spam filtering breaks contact forms for agencies and the user wishes there was a safe test mode before enabling protection."
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("seeb/review-pain-extractor").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 = {
    "startUrls": [
        { "url": "https://wordpress.org/plugins/woocommerce/#reviews" },
        { "url": "https://wordpress.org/plugins/contact-form-7/#reviews" },
    ],
    "sourceTexts": [
        "Shopify review for CartPilot rated 2 stars: merchants complain the bulk discount rules are missing, checkout campaigns fail during sales, and support takes three days to reply.",
        "WordPress plugin review for FormGuard rated 1 star says spam filtering breaks contact forms for agencies and the user wishes there was a safe test mode before enabling protection.",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("seeb/review-pain-extractor").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://wordpress.org/plugins/woocommerce/#reviews"
    },
    {
      "url": "https://wordpress.org/plugins/contact-form-7/#reviews"
    }
  ],
  "sourceTexts": [
    "Shopify review for CartPilot rated 2 stars: merchants complain the bulk discount rules are missing, checkout campaigns fail during sales, and support takes three days to reply.",
    "WordPress plugin review for FormGuard rated 1 star says spam filtering breaks contact forms for agencies and the user wishes there was a safe test mode before enabling protection."
  ]
}' |
apify call seeb/review-pain-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=seeb/review-pain-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/zCrWhOhGyJWByYINV/builds/PmQlsvQ7HcnILN77X/openapi.json
