# SaaS Competitor Churn & Negative Review Poacher (`atlasdean/saas-competitor-churn-poacher`) Actor

Find real users publicly complaining about a competitor on X, Reddit & the web in the last 30 days, with complaint category, post links, this month's top weakness and a non-creepy poaching angle.

- **URL**: https://apify.com/atlasdean/saas-competitor-churn-poacher.md
- **Developed by:** [Jonny Dean](https://apify.com/atlasdean) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $250.00 / 1,000 competitor scan with verified complaints

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

## SaaS Competitor Churn & Negative Review Poacher

**Finds real, recent public posts from customers who are frustrated with a competitor (price hikes, billing problems, support failures, outages, or plans to cancel or switch). For each competitor you get verified post links, a category for every complaint, the most common weakness right now, and a tactful positioning hook. Competitors with nothing verified are free.**

Built for SaaS founders, product marketers, growth teams and agencies who want to know *why customers are leaving a competitor this month* and how to position against it.

### Who it's for

- **Founders and PMMs** looking for live competitive intel and messaging angles
- **Growth and demand-gen teams** writing "switch from X" ads, landing pages and comparison pages
- **SDRs and agencies** who want to know which pain points to lead with
- **Clay and automation users** who want a weekly competitor-pain column

### How it works

1. For each competitor it runs several targeted searches at once: X posts about switching or cancelling ("switching from X", "cancel X", "X alternative"), pricing, billing, renewal and support complaints, replies to the brand's own X account, plus recent Reddit posts in the brand's subreddit and in communities like r/CustomerSuccess and r/smallbusiness.
2. Every candidate post goes through strict checks:
   - **Real and specific:** the link must be a single post that actually appeared in that run's live search results. Listing pages and search pages are rejected.
   - **Recent:** X dates are decoded from the post ID and Reddit dates come from a public Reddit archive. Undated or out-of-window posts are dropped.
   - **First-person paying customer:** second-hand stories, news commentary, free-plan limit gripes and non-users are dropped.
   - **The competitor's fault:** complaints about third-party rules (e.g. WhatsApp messaging windows, app-store policies, GDPR) are dropped.
   - **A strong signal:** passing mentions, feature wishes and mild UI annoyances are dropped.
   - **Not a vendor:** people selling or promoting an alternative are dropped, including founders posting in r/SaaS.
   - **One row per author.**
3. **Auto-widen:** if nothing is verified within your lookback window (default 30 days), it retries once with a wider window (60 days, capped at 90). Each result shows the window actually used in `lookback_days_used`.

### Works best on widely-used tools

This Actor shines on popular products with active customer conversation (HubSpot, Mailchimp, Zendesk and similar). Niche or quiet competitors often have no verifiable recent complaints. Those come back as an empty row and are **not charged**.

### What you get for each competitor

| Field | What it is |
|---|---|
| `competitor_name` | The competitor scanned |
| `frustrated_users_found` | Verified posts: public handle/username as shown, `platform`, `post_url`, `complaint_category` (`pricing_hike`, `bug_or_outage`, `bad_support`, `missing_feature`, `other`), one-sentence `summary`, `approx_date`, and `date_source` |
| `top_competitor_weakness_this_month` | The most common complaint theme across the verified posts |
| `poaching_angle_hook` | A generic, respectful positioning line built around that weakness and your advantage |
| `has_recent_signal` / `charged` | `true` only when at least one verified post was found |
| `lookback_days_used` | 30 by default, or the wider window if auto-widen kicked in |
| `cached_result` | `true` if served from the 24-hour cache |

#### Example input

```json
{
  "competitors": ["HubSpot", "Mailchimp"],
  "your_product_advantage": "Flat, transparent pricing with no contact-count surprises and live chat support for every plan.",
  "max_users_per_competitor": 5,
  "lookback_days": 30,
  "use_cache": true
}
```

### Example output

Real results from test runs on Oct 22, 2026, paraphrased and anonymized for display (the dataset contains the public post link and handle):

| Competitor | Platform | Category | What the customer said (paraphrased) | Date |
|---|---|---|---|---|
| HubSpot | X | pricing_hike | Upset about a 22% per-seat increase tied to AI features they didn't want | Oct 21 |
| HubSpot | Reddit | pricing_hike | Customer since 2015, angry at a large bill for a barely-used hub | Oct 21 |
| HubSpot | X | bad_support | Cancelled the annual plan after sales never answered a request to go monthly | Oct 20 |
| Mailchimp | Reddit | bad_support | Paying customer of nearly 10 years, account disabled right after a payment, no support reply for days | Oct 13 |
| Mailchimp | X | pricing_hike | Billed for unsubscribed contacts and comparing costs before renewal | Oct 20 |
| Zendesk | X | bad_support | Four weeks of emails with nine different support reps and only canned answers | Oct 21 |
| A quiet niche tool | – | – | No verified complaints found | **free** |

Example hook (HubSpot): *"Teams scaling their CRM often hit surprise costs and delayed support when changing plans. Flat pricing and live chat on every tier keep things simple and responsive from day one."*

### Public posts only, and no creepy outreach

The Actor reads only publicly available posts and never logs in anywhere. Hooks are written as **generic positioning** for ads, landing pages and cold messaging. They never name the individual and never say or imply "I saw your post". Use the post links to understand the market, and follow platform rules and anti-spam laws if you contact anyone.

### Pricing

Pay-per-event: **$0.25 per competitor scan that returns at least one verified complaint** (event `competitor-scan`), plus a negligible Apify start fee. **Competitors with nothing verified are free**, and failed lookups are free too. Use **maximum cost per run** to cap spend. The 24-hour cache returns identical inputs without re-running the search.

Free Apify plan users can scan up to 2 competitors per run.

### Pairs well with

- **[Live X & Web B2B Lead Enricher + Cold Email Icebreaker](https://apify.com/atlasdean/b2b-grok-lead-enricher)**: enrich the prospects you target with your new positioning, and get a personalized, recent-activity icebreaker.
- **[B2B Trigger Event Radar](https://apify.com/atlasdean/b2b-trigger-event-radar)**: find which target accounts have a buying signal right now (funding, exec hires, launches).
- **[Journalist, Podcast & Creator Pitch Dossier Generator](https://apify.com/atlasdean/media-guest-pitch-dossier)**: pitch your "why teams are switching" story to the right journalists and podcasters.

### Integrations

- **Apify API**: start runs and fetch results with the REST API or the `run-sync-get-dataset-items` endpoint (JavaScript and Python clients available).
- **Zapier, Make, and n8n**: run it on a schedule and push the weekly competitor-pain report to Slack, Notion, a sheet or your CRM.
- **Schedules and webhooks**: run it every Monday and get notified when results are ready.
- **AI agents**: callable as a tool through the **Apify MCP server**.
- **Exports**: JSON, CSV, Excel, or HTML from the Console.

### FAQ

**Where does the data come from?** Public X posts, Reddit (through live search and a public Reddit archive), and other public pages, researched live at run time.

**Can it make up posts?** Every charged post must be a single-post link that appeared in that run's live search results or was fetched from the Reddit archive, with a verified recent date. Anything that can't be verified is dropped, and if nothing survives the scan is free.

**Why did my competitor come back empty?** Quiet or niche tools often have no recent public complaints. The Actor already retries with a wider window. Empty results cost nothing, so try again next week or raise `lookback_days` (up to 90).

**Why are most results from X and Reddit?** That's where customers vent in public with dated, linkable posts. Review sites rarely expose individual dated reviews to search, so they seldom pass verification.

**Can I use the handles for outreach?** The handles are public, but the Actor is designed for market intelligence and positioning. If you reach out, be helpful, never reference the person's post, and follow platform rules and anti-spam laws (CAN-SPAM, GDPR, etc.).

### Support

Found a bug or want a feature? Open an issue on the Actor's **Issues** tab and I'll respond quickly.

# Actor input Schema

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

Competitor brand names or X handles (e.g. 'Mailchimp' or '@Mailchimp'). One scan per competitor.

## `your_product_advantage` (type: `string`):

What makes your product better (used for the poaching angle).

## `max_users_per_competitor` (type: `integer`):

1 to 15.

## `lookback_days` (type: `integer`):

How far back to look for complaints, 1 to 90 days. Default 30; widen it for less-discussed tools.

## `use_cache` (type: `boolean`):

Reuse results from the last 24 hours for identical inputs so you don't pay twice.

## Actor input object example

```json
{
  "competitors": [
    "Mailchimp"
  ],
  "your_product_advantage": "Flat, transparent pricing with no contact-count surprises and live chat support for every plan.",
  "max_users_per_competitor": 5,
  "lookback_days": 30,
  "use_cache": true
}
```

# Actor output Schema

## `overview` (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 = {
    "competitors": [
        "Mailchimp"
    ],
    "your_product_advantage": "Flat, transparent pricing with no contact-count surprises and live chat support for every plan.",
    "max_users_per_competitor": 5,
    "lookback_days": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("atlasdean/saas-competitor-churn-poacher").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 = {
    "competitors": ["Mailchimp"],
    "your_product_advantage": "Flat, transparent pricing with no contact-count surprises and live chat support for every plan.",
    "max_users_per_competitor": 5,
    "lookback_days": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("atlasdean/saas-competitor-churn-poacher").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 '{
  "competitors": [
    "Mailchimp"
  ],
  "your_product_advantage": "Flat, transparent pricing with no contact-count surprises and live chat support for every plan.",
  "max_users_per_competitor": 5,
  "lookback_days": 30
}' |
apify call atlasdean/saas-competitor-churn-poacher --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,atlasdean/saas-competitor-churn-poacher"
        }
    }
}
```

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/m7JTOEba9siqlCmxt/builds/RviMCZtsHcRy0Dvoe/openapi.json
