# 💰 SaaS Pricing Tracker — Monitor Competitor Pricing Changes (`nexgendata/saas-pricing-tracker`) Actor

Track any SaaS pricing page: extract plans, prices, features & billing cycles. Monitor competitor pricing changes over time. PriceIntelligently alternative for product managers. Tracker mode scores value-per-dollar & generates competitive positioning insights.

- **URL**: https://apify.com/nexgendata/saas-pricing-tracker.md
- **Developed by:** [Stephan Corbeil](https://apify.com/nexgendata) (community)
- **Categories:** Marketing, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## SaaS Pricing Tracker -- Monitor & Compare Software Pricing Pages

Track, extract, and compare pricing data from any SaaS pricing page. The SaaS Pricing Tracker scrapes pricing pages to pull structured plan details -- plan names, prices, billing periods, feature lists, and tier metadata -- so you can **monitor competitor pricing changes, benchmark your own plans, and make data-driven product decisions.** Stop manually checking pricing pages every week. Let this actor do it automatically.

### Key Features

- **Universal Pricing Page Parsing** -- Works with any SaaS pricing page layout. Extracts structured data from card-based, table-based, toggle-based, and slider-based pricing designs.
- **Plan Detail Extraction** -- Captures plan names, monthly and annual prices, billing cycles, feature lists, usage limits, and calls-to-action for every visible tier.
- **Free Tier & Trial Detection** -- Automatically identifies free plans, free trials, freemium models, and "contact sales" enterprise tiers so you have the complete pricing picture.
- **Feature List Normalization** -- Parses feature lists and checkmark grids into structured arrays, making it easy to compare what each tier includes across competitors.
- **Value Scoring** -- Calculates a composite value score for each plan based on price-per-feature ratios, helping you identify the best value tiers in any market.
- **Competitive Tier Analysis** -- Compare pricing structures across multiple SaaS products in a single run to identify pricing patterns, anchoring strategies, and market positioning.
- **Tracker Mode** -- Schedule recurring runs to detect pricing changes automatically. Get notified when a competitor raises prices, adds a new tier, or restructures their plans.
- **Billing Cycle Normalization** -- Converts all prices to a consistent monthly or annual basis regardless of how they are displayed on the page, enabling accurate cross-company comparisons.

### Output Example

Each scraped pricing page returns structured data for every detected plan:

```json
{
  "url": "https://slack.com/pricing",
  "company": "Slack",
  "scrapedAt": "2025-12-15T10:30:00Z",
  "plans": [
    {
      "name": "Free",
      "monthlyPrice": 0,
      "annualPrice": 0,
      "billingCycle": "free",
      "features": ["90-day message history", "10 integrations", "1:1 huddles"],
      "isTrial": false,
      "isEnterprise": false
    },
    {
      "name": "Pro",
      "monthlyPrice": 8.75,
      "annualPrice": 7.25,
      "billingCycle": "per user/month",
      "features": ["Unlimited message history", "Unlimited integrations", "Group huddles", "Canvases"],
      "isTrial": false,
      "isEnterprise": false
    }
  ],
  "totalPlans": 4,
  "hasFreeTier": true,
  "hasTrial": true,
  "valueScore": 7.8
}
````

### How to Use

1. **Provide pricing page URLs** -- Enter one or more SaaS pricing page URLs (e.g., `https://slack.com/pricing`). The actor works with any publicly accessible pricing page.
2. **Configure extraction options** -- Choose whether to normalize billing cycles, calculate value scores, and include feature list extraction. All options are enabled by default.
3. **Run the actor** -- Click "Start" in the Apify Console or trigger via API. Each pricing page typically completes in 10-30 seconds depending on complexity.
4. **Analyze and export** -- Review structured pricing data in the Apify Console, download as JSON/CSV, or push to Google Sheets, Notion, or webhooks for ongoing monitoring.

### Integration Examples

**Python SDK**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("nexgendata/saas-pricing-tracker").call(
    run_input={
        "urls": [
            "https://slack.com/pricing",
            "https://notion.so/pricing",
            "https://linear.app/pricing"
        ]
    }
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    for plan in item["plans"]:
        print(item["company"], plan["name"], plan["monthlyPrice"])
```

**cURL**

```bash
curl "https://api.apify.com/v2/acts/nexgendata~saas-pricing-tracker/runs?token=YOUR_API_TOKEN" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"urls": ["https://slack.com/pricing", "https://notion.so/pricing"]}'
```

### Use Cases

- **Product Managers** -- Monitor competitor pricing to inform your own pricing strategy. Know immediately when a competitor raises prices, adds a tier, or restructures their feature gating.
- **Competitive Intelligence Teams** -- Build comprehensive pricing databases across your entire competitive landscape. Track pricing evolution over quarters and years.
- **SaaS Founders** -- Benchmark your pricing against the market before launch or before a pricing change. Understand how your value proposition compares on a per-feature basis.
- **Analysts & Consultants** -- Create pricing comparison reports for clients without spending hours manually transcribing pricing pages. Deliver structured data, not screenshots.
- **Investors & VCs** -- Evaluate SaaS companies by understanding their pricing power, tier structure, and monetization strategy relative to competitors in the same category.
- **Sales Teams** -- Build competitive battle cards with up-to-date pricing comparisons. Know exactly how your pricing stacks up against alternatives your prospects are evaluating.

### FAQ

**What are the rate limits?**
The actor handles rate limiting automatically. You can scrape 100+ pricing pages in a single run. Pages with complex JavaScript rendering may take slightly longer but are fully supported.

**How fresh is the data?**
Data is scraped in real-time on every run. There is no caching. You always get the current pricing as displayed on the live page at the moment of extraction.

**What output formats are supported?**
JSON, CSV, Excel, and XML. You can also push results to Google Sheets, Notion, Slack, or any webhook endpoint via Apify integrations. The structured schema imports cleanly into any database.

**How much does it cost?**
This actor uses pay-per-event pricing at $0.02 per pricing page plus $0.01 per actor start. Scraping 50 competitor pricing pages costs approximately $1.01. See the pricing table below for detailed breakdowns.

**How does this compare to PriceIntelligently or Profitwell?**
PriceIntelligently (now part of Paddle) charges $5,000+/month for pricing intelligence services. This actor provides raw pricing data extraction at a fraction of the cost. While it does not include the consulting layer, it gives you the same underlying data to run your own analysis.

**Can I access this via API?**
Yes. Full REST API access plus official Python, JavaScript, and Node.js SDKs. Schedule weekly or daily runs to automatically track pricing changes across your competitive set.

### Pricing

| Metric | Cost |
|---|---|
| Cost per pricing page | $0.02 |
| Cost per actor start | $0.01 |
| 10 pages | $0.21 |
| 50 pages | $1.01 |
| 100 pages | $2.01 |
| 500 pages (quarterly audit) | $10.01 |
| **PriceIntelligently (competitor)** | **$5,000+/mo** |
| **Manual research (1 hr per page @ $50/hr)** | **$50 per page** |
| **Freelancer pricing audit** | **$500 - $2,000** |

Tracking 100 SaaS pricing pages costs just $2 per run -- less than what most companies spend on a single coffee meeting to discuss pricing strategy.

### Why Choose This Actor

- **Universal parser** -- Works with any SaaS pricing page layout. Card grids, comparison tables, toggle switches, and sliders are all supported without any configuration.
- **Value scoring built in** -- Go beyond raw extraction with automatic price-per-feature calculations that help you instantly identify the best-value tiers in any market.
- **Change detection via tracker mode** -- Schedule recurring runs and get notified when competitors adjust their pricing. Never be surprised by a competitor's price increase again.
- **No monthly commitment** -- Pay per page, not per month. Run an audit once a quarter for $2 instead of paying $5,000/month for enterprise pricing intelligence.

### Get Started

New to Apify? [Sign up here](https://apify.com/?fpr=2ayu9b) to get started with $5 in free credits -- enough to track pricing for dozens of SaaS competitors for free.

# Actor input Schema

## `urls` (type: `array`):

List of SaaS pricing page URLs to scrape. Each URL should point directly to the pricing page (e.g., https://www.notion.so/pricing).

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

Maximum number of pricing pages to process in a single run. Set lower to reduce costs or higher for large competitor lists.

## `outputMode` (type: `string`):

Choose 'raw' for structured pricing data per page, or 'tracker' for competitive analysis with tier breakdowns, value scoring, and cross-company insights.

## Actor input object example

```json
{
  "urls": [
    "https://www.notion.so/pricing",
    "https://slack.com/pricing"
  ],
  "maxResults": 20,
  "outputMode": "raw"
}
```

# 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 = {
    "urls": [
        "https://www.notion.so/pricing",
        "https://slack.com/pricing"
    ],
    "maxResults": 20,
    "outputMode": "raw"
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgendata/saas-pricing-tracker").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 = {
    "urls": [
        "https://www.notion.so/pricing",
        "https://slack.com/pricing",
    ],
    "maxResults": 20,
    "outputMode": "raw",
}

# Run the Actor and wait for it to finish
run = client.actor("nexgendata/saas-pricing-tracker").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 '{
  "urls": [
    "https://www.notion.so/pricing",
    "https://slack.com/pricing"
  ],
  "maxResults": 20,
  "outputMode": "raw"
}' |
apify call nexgendata/saas-pricing-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=nexgendata/saas-pricing-tracker",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "💰 SaaS Pricing Tracker — Monitor Competitor Pricing Changes",
        "description": "Track any SaaS pricing page: extract plans, prices, features & billing cycles. Monitor competitor pricing changes over time. PriceIntelligently alternative for product managers. Tracker mode scores value-per-dollar & generates competitive positioning insights.",
        "version": "0.0",
        "x-build-id": "eicuYDRm9gCUbte0k"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/nexgendata~saas-pricing-tracker/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-nexgendata-saas-pricing-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/nexgendata~saas-pricing-tracker/runs": {
            "post": {
                "operationId": "runs-sync-nexgendata-saas-pricing-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/nexgendata~saas-pricing-tracker/run-sync": {
            "post": {
                "operationId": "run-sync-nexgendata-saas-pricing-tracker",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "urls"
                ],
                "properties": {
                    "urls": {
                        "title": "Pricing Page URLs",
                        "type": "array",
                        "description": "List of SaaS pricing page URLs to scrape. Each URL should point directly to the pricing page (e.g., https://www.notion.so/pricing).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of pricing pages to process in a single run. Set lower to reduce costs or higher for large competitor lists.",
                        "default": 20
                    },
                    "outputMode": {
                        "title": "Output Mode",
                        "enum": [
                            "raw",
                            "tracker"
                        ],
                        "type": "string",
                        "description": "Choose 'raw' for structured pricing data per page, or 'tracker' for competitive analysis with tier breakdowns, value scoring, and cross-company insights.",
                        "default": "raw"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
