# Trustpilot & G2 Scraper: Negative Reviews & B2B Leads (`junodcreator/trustpilot-g2-review-lead-enricher`) Actor

B2B scraper for Trustpilot and G2 reviews. Extracts 1-3 star negative reviews, competitor churn signals, pain point tags, and company profiles, then enriches official company websites for business emails, phones, LinkedIn, CMS/tech stack, and ad pixels.

- **URL**: https://apify.com/junodcreator/trustpilot-g2-review-lead-enricher.md
- **Developed by:** [Juno Artha Dinamika](https://apify.com/junodcreator) (community)
- **Categories:** Lead generation, E-commerce, Marketing
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 review extracteds

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

## Trustpilot & G2 Negative Review Intent & Churn Lead Enricher

Turn 1-to-3 star competitor reviews on **Trustpilot** and **G2** into B2B sales leads.

This Actor extracts negative reviews for any company, scores each review for **churn intent** (`CRITICAL`, `HIGH`, `MEDIUM`, `LOW`) by analyzing switching signals (pricing hikes, billing disputes, bugs, downtime, poor support), and enriches the target company's website with contact emails, phone numbers, social links, and installed software stack.

***

### What data can you extract?

| Data Field | Description | Example |
| :--- | :--- | :--- |
| **Review Content & Rating** | Star rating (`1`–`5`), review title, full text, published date, verified status, direct review URL | `1 ★ — "Impossible to downgrade or cancel"` |
| **Competitor Response** | Whether the company replied (`hasCompanyReply`), reply text, and reply timestamp | `hasCompanyReply: false` (unanswered complaint) |
| **Churn Intent Scoring** | Numeric score (`0`–`100`), urgency tier (`CRITICAL`, `HIGH`, `MEDIUM`, `LOW`), pain-point categories, and matched trigger phrases | `Score: 88 (CRITICAL)` — `["Active Churn / Cancellation", "Customer Support Failure"]` |
| **Reviewer Context** | Reviewer name, location/country, total reviews count, and parsed B2B role/industry hints when mentioned | `Daniel K. (US)` |
| **Company Website & Contacts** | Target company domain, business emails, phone numbers, and social profiles (LinkedIn, X/Twitter, Instagram, YouTube, Facebook) | `zendesk.com`, `press@zendesk.com`, `linkedin.com/company/zendesk` |
| **Tech Stack & Ad Pixels** | Installed pixels (Meta, TikTok, GTM, Google Ads, Klaviyo) and site stack (`Next.js`, `Webflow`, `HubSpot`, `Intercom`, `Shopify`) | `googleTagManager: true`, `Next.js` |

***

### Common B2B Use Cases

1. **Competitor Displacement Campaigns (SaaS & Agencies):** Monitor your top 5–10 competitors for new 1–2 star reviews mentioning *"canceling"*, *"switching from"*, *"overpriced"*, or *"terrible support"*.
2. **Reputation Management & PR Outreach:** Identify businesses struggling with unanswered 1-star Trustpilot reviews (`hasCompanyReply: false`) and pitch review management, customer support automation, or AI helpdesk tools.
3. **Product & Sales Battlecards:** Aggregate real customer complaints (`painPointCategories`) across competing software products to see exactly why users churn.

***

### Input Parameters

| Parameter | Type | Default | Description |
| :--- | :--- | :--- | :--- |
| `targetUrls` | `string[]` | `["https://www.trustpilot.com/review/hubspot.com", ...]` | Trustpilot (`https://www.trustpilot.com/review/<domain>`) or G2 (`https://www.g2.com/products/<slug>/reviews`) URLs. |
| `companyDomains` | `string[]` | `["hubspot.com", "zendesk.com"]` | Shorthand company domains (automatically mapped to Trustpilot review pages). |
| `maxStarRating` | `integer` | `3` | Maximum star rating to collect (`1` = only 1-star reviews; `3` = 1, 2, and 3-star reviews). |
| `painPointKeywords` | `string[]` | `[]` | Optional custom keywords to boost intent scores (e.g., `["api limit", "migration", "hidden fee"]`). |
| `enrichCompanyContacts` | `boolean` | `true` | Crawl the company domain to extract emails, phone numbers, social profiles, and tech stack. |
| `maxReviewsPerTarget` | `integer` | `25` | Maximum qualifying reviews to extract per target company. |
| `maxTotalChargeUsd` | `number` | `10.0` | Hard spending cap in USD for Pay-Per-Event billing. |

#### Example Input JSON

```json
{
  "targetUrls": [
    "https://www.trustpilot.com/review/zendesk.com",
    "https://www.trustpilot.com/review/mailchimp.com"
  ],
  "maxStarRating": 2,
  "painPointKeywords": ["cancel", "switching", "support", "price increase"],
  "enrichCompanyContacts": true,
  "maxReviewsPerTarget": 25,
  "maxTotalChargeUsd": 5.0
}
```

***

### Output Example

```json
{
  "platform": "trustpilot",
  "targetCompanyName": "Zendesk",
  "targetCompanyDomain": "zendesk.com",
  "targetReviewPageUrl": "https://www.trustpilot.com/review/zendesk.com?stars=1&stars=2",
  "reviewId": "6714f9a28c19b40218e54c10",
  "reviewUrl": "https://www.trustpilot.com/reviews/6714f9a28c19b40218e54c10",
  "starRating": 1,
  "reviewTitle": "Impossible to downgrade or cancel without 30 days notice",
  "reviewText": "We have been paying $1,400/month and support takes 5 days to reply to basic tickets. When we tried to remove seats before renewal, billing locked us into another annual term. We are actively migrating our team to a new helpdesk.",
  "publishedAt": "2026-10-18T14:22:10.000Z",
  "dateOfExperience": "2026-10-15",
  "isVerifiedReview": true,
  "hasCompanyReply": false,
  "companyReplyText": null,
  "companyReplyDate": null,
  "reviewerName": "Daniel K.",
  "reviewerLocation": "US",
  "reviewerTotalReviews": 4,
  "reviewerCompanyHint": null,
  "reviewerRoleHint": null,
  "painPointCategories": [
    "Pricing & Billing Dispute",
    "Customer Support Failure",
    "Active Churn / Cancellation"
  ],
  "matchedKeywords": ["billing", "locked", "support", "migrating"],
  "activeSwitchSignal": true,
  "intentScore": 88,
  "urgencyTier": "CRITICAL",
  "recommendedOutreachAngle": "Highlight transparent month-to-month billing, fast onboarding migration, and responsive human SLA support.",
  "companyEnrichment": {
    "domain": "zendesk.com",
    "scannedUrls": ["https://zendesk.com", "https://zendesk.com/contact"],
    "emails": ["press@zendesk.com", "security@zendesk.com"],
    "phones": ["+18886704887"],
    "socials": {
      "linkedin": "https://www.linkedin.com/company/zendesk",
      "instagram": "https://www.instagram.com/zendesk",
      "tiktok": null,
      "youtube": "https://www.youtube.com/user/Zendesk",
      "twitter": "https://x.com/Zendesk",
      "facebook": "https://www.facebook.com/zendesk"
    },
    "adPixels": {
      "metaPixel": true,
      "tiktokPixel": false,
      "googleTagManager": true,
      "googleAds": true,
      "klaviyo": false
    },
    "platformStack": ["Next.js"]
  },
  "extractionTier": "tier1_live_json",
  "scrapedAt": "2026-10-21T16:45:02.119Z"
}
```

***

### Pricing (Pay-Per-Event)

Company domain enrichment is deduplicated — if you extract 50 reviews for `zendesk.com`, `company-contact-enriched` is charged **only once**.

| Event Name | Price (USD) | Triggered When |
| :--- | :--- | :--- |
| `actor-start` | **$0.005** | Charged once when the run starts. |
| `review-extracted` | **$0.001** | A review matching your `maxStarRating` filter is extracted with churn & pain-point scoring. |
| `company-profile-analyzed` | **$0.002** | Charged once per target company profile analyzed for rating distribution & aggregate metrics. |
| `company-contact-enriched` | **$0.004** | Charged **once per unique company domain** when contact/tech-stack enrichment succeeds. |

***

### Integrations & Automation Workflows

Plug competitor churn signals directly into your revenue engine:

- **Clay.com / Smartlead / Instantly:** Enrich negative review signals and route `recommendedOutreachAngle`, `painPointCategories`, and `companyEnrichment.emails` into automated competitor-displacement sequences.
- **Make.com / n8n / Zapier / Slack:** Set up daily or weekly monitoring on your top 10 competitors and send real-time Slack alerts to Account Executives whenever a `CRITICAL` or `HIGH` churn review is posted.
- **CRM & Battlecards (HubSpot / Salesforce / Notion):** Export structured pain-point breakdowns via CSV or JSON API to build live competitive intelligence dashboards.

***

### FAQ

**Do I need to enter full URLs or just company domains?**\
Either works. Pass simple domains in `companyDomains` (e.g., `["klaviyo.com", "activecampaign.com"]`) or full review page URLs in `targetUrls`.

# Actor input Schema

## `targetDomains` (type: `array`):

List of company domains (e.g. 'shopify.com', 'hubspot.com', 'mailchimp.com') or full Trustpilot/G2 review URLs to extract reviews and B2B company intelligence from.

## `categorySlug` (type: `string`):

Optional Trustpilot category slug (e.g. 'crm_software', 'email_marketing', 'ecommerce_platform', 'software_company') to automatically discover and scrape businesses in that category.

## `includeG2Signals` (type: `boolean`):

When enabled, checks public G2 product metadata and cross-references SaaS category/competitor switching signals alongside Trustpilot reviews.

## `starRatings` (type: `array`):

Select which star ratings to extract. Default \[1, 2, 3] targets negative and neutral reviews ideal for Competitor Churn Outreach, reputation management, and product weakness intelligence.

## `publishedAfter` (type: `string`):

Only keep reviews published on or after this date (e.g. '2025-01-01'). Leave empty to include all available reviews.

## `enrichCompanyContacts` (type: `boolean`):

Automatically visits each reviewed company's officialWebsiteDomain once per run to extract verified business emails, phone/WhatsApp numbers, LinkedIn & social links, web CMS/tech stack, and ad pixels.

## `maxReviewsPerCompany` (type: `integer`):

Maximum number of matching reviews to extract per target company.

## `maxTotalItems` (type: `integer`):

Maximum total review records to save across all companies in a single run.

## `maxTotalChargeUsd` (type: `number`):

Hard spending ceiling for Pay-Per-Event (PPE) billing in USD. The Actor gracefully stops once this budget limit is reached.

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

Proxy settings for HTTP requests. Uses Apify Proxy by default for reliable anti-bot bypass.

## Actor input object example

```json
{
  "targetDomains": [
    "shopify.com",
    "hubspot.com",
    "mailchimp.com"
  ],
  "categorySlug": "",
  "includeG2Signals": true,
  "starRatings": [
    1,
    2,
    3
  ],
  "publishedAfter": "2025-01-01",
  "enrichCompanyContacts": true,
  "maxReviewsPerCompany": 50,
  "maxTotalItems": 150,
  "maxTotalChargeUsd": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

Full B2B dataset containing customer reviews, star ratings, churn intent levels, pain point tags, and enriched company emails, socials, and tech stack.

## `outputSummary` (type: `string`):

Execution summary report including total reviews extracted, companies enriched, and Pay-Per-Event (PPE) billing ledger.

# 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 = {
    "targetDomains": [
        "shopify.com",
        "hubspot.com",
        "mailchimp.com"
    ],
    "categorySlug": "",
    "includeG2Signals": true,
    "starRatings": [
        1,
        2,
        3
    ],
    "publishedAfter": "2025-01-01",
    "enrichCompanyContacts": true,
    "maxReviewsPerCompany": 50,
    "maxTotalItems": 150,
    "maxTotalChargeUsd": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("junodcreator/trustpilot-g2-review-lead-enricher").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 = {
    "targetDomains": [
        "shopify.com",
        "hubspot.com",
        "mailchimp.com",
    ],
    "categorySlug": "",
    "includeG2Signals": True,
    "starRatings": [
        1,
        2,
        3,
    ],
    "publishedAfter": "2025-01-01",
    "enrichCompanyContacts": True,
    "maxReviewsPerCompany": 50,
    "maxTotalItems": 150,
    "maxTotalChargeUsd": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("junodcreator/trustpilot-g2-review-lead-enricher").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 '{
  "targetDomains": [
    "shopify.com",
    "hubspot.com",
    "mailchimp.com"
  ],
  "categorySlug": "",
  "includeG2Signals": true,
  "starRatings": [
    1,
    2,
    3
  ],
  "publishedAfter": "2025-01-01",
  "enrichCompanyContacts": true,
  "maxReviewsPerCompany": 50,
  "maxTotalItems": 150,
  "maxTotalChargeUsd": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call junodcreator/trustpilot-g2-review-lead-enricher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,junodcreator/trustpilot-g2-review-lead-enricher"
        }
    }
}
```

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/NmqTWZyCEikrGixgP/builds/jhK8yEqNPDehWuGMV/openapi.json
