# Shopify Competitor Price Tracker (`subtle_pluto/shopify-catalog-watch`) Actor

Track competitor Shopify stores every day. Get each price change, sale, sellout, restock, new product and removed product, plus a plain-English competitor brief with a suggested action. No login or API key needed.

- **URL**: https://apify.com/subtle_pluto/shopify-catalog-watch.md
- **Developed by:** [Subtle Pluto](https://apify.com/subtle_pluto) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 store checks

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

## Shopify Competitor Price Tracker: Prices, Stock and Launch Alerts

**See every move your competitors make on their Shopify stores, and what to do about it.** Add competitor store domains and schedule a daily run. You get every price cut, price increase, new discount, sellout, restock, launch, and removed product, plus a short competitor brief with one suggested action.

Price monitoring apps charge $99 a month and up. This runs on your own schedule and you pay only for what it finds.

### What you get

**One row per change:**

- Change type: `price-decrease`, `price-increase`, `sale-started`, `sale-ended`, `new-product`, `removed-product`, `sold-out`, `restocked`
- Product name, type, and link
- Old price, new price, and the percent change

**One row per store:**

- A plain-English brief of what the competitor did, with numbers and product names
- One suggested action for this week, written for your store when you describe it
- Catalog stats: product count, products on sale, sold-out products, median, lowest, and highest price

### Sample output

```json
{
  "recordType": "change",
  "store": "competitor.example",
  "changeType": "price-decrease",
  "product": "Wool Runner - Natural Grey",
  "oldPrice": 125,
  "newPrice": 98,
  "pctChange": -21.6,
  "url": "https://competitor.example/products/wool-runner-natural-grey"
}
```

```json
{
  "recordType": "store",
  "store": "competitor.example",
  "brief": "competitor.example cut prices on 14 running shoes by 18% on average and launched 3 new trail models. Two of its best-known styles sold out.",
  "suggestedAction": "Hold your price on the Trail Runner this week and promote it to their sold-out customers.",
  "changeCounts": { "price-decrease": 14, "new-product": 3, "sold-out": 2 }
}
```

### Who uses it

- **Shopify and DTC brands** watching direct competitors
- **Resellers and dropshippers** tracking supplier prices and stock
- **Agencies** running competitor reports for e-commerce clients
- **Analysts** tracking pricing and launches across a category

### How to track competitor prices on Shopify

1. Add competitor domains under **Competitor stores**, one per line.
2. Optional: describe your own store in one line, so the brief is written for you.
3. Run it once. The first run saves each catalog as a baseline.
4. Schedule it daily. Every later run reports what changed since the last one.
5. Optional: add a webhook to send briefs to Slack, Zapier, Make, or n8n.

### Pricing

| Event | Price |
| --- | --- |
| Store checked (catalog read successfully) | $0.01 |
| Change detected | $0.02 |
| AI competitor brief (only when the store changed) | $0.25 |

Ten stores checked daily costs about $3 a month before changes. Stores that hide their product feed are never charged.

### Good to know

- The Actor reads each store's public product feed. It does not log in, add to cart, or touch checkout.
- Stock is reported as available or sold out. Shopify does not publish exact inventory counts publicly, so we never estimate them.
- A few stores turn off their public product feed. Those are reported as `not-shopify` and cost nothing.
- Snapshots live in a named key-value store in your own account (`catalog-watch-state` by default).

### FAQ

#### How do I track a competitor's Shopify prices?

Add the competitor store domains, click Start once to save a baseline, then schedule a daily run. Each run reports every price increase, price decrease, sale, sellout, restock, new product and removed product since the last check.

#### How does it read a Shopify store?

It reads the store's public products.json feed. No login, no API key and no access to the store's admin.

#### Does it work with every Shopify store?

Most stores work. Stores that hide their product feed are reported as not-shopify and are not charged.

#### Can I watch only certain products?

Yes. Use Only products matching to report changes for one keyword, such as runner, or pick only the change types you care about.

#### Can I get the competitor brief in Slack?

Yes. Add a webhook URL and each store brief is POSTed as JSON when anything changed. Connect it to a Slack workflow, Zapier, Make or n8n.

### More tools from Subtle Pluto

- [Website Change Monitor with AI Alerts](https://apify.com/subtle_pluto/ai-website-change-monitor): real changes on competitor pricing, plan and policy pages, explained by AI.
- [Hiring Signals from Greenhouse, Lever and Ashby](https://apify.com/subtle_pluto/hiring-signal-feed): a ranked list of target accounts that are hiring now, with a why-now note and an opener.
- [Google Review Responder: AI Reply Generator](https://apify.com/subtle_pluto/google-review-responder): new Google reviews for every location, with AI-drafted owner replies and low-star alerts.

### Support

Open an issue on the Issues tab. We aim to reply the same day.

# Actor input Schema

## `stores` (type: `array`):

Store domains, one per line, for example allbirds.com. Most Shopify stores work. Stores that hide their product feed are reported as not-shopify and are not charged.

## `ownStoreDescription` (type: `string`):

One line, for example: we sell merino running shoes from $95 to $140. The brief and the suggested action are written for you.

## `changeTypes` (type: `array`):

Leave empty to report every type.

## `productKeyword` (type: `string`):

Report only changes whose product title or type contains this word, for example: runner.

## `minPriceChangePercent` (type: `integer`):

Price moves smaller than this percent are ignored.

## `writeBrief` (type: `boolean`):

When a store changed, write a short brief of what the competitor did and one suggested action. Without AI, a built-in summary is written instead.

## `notifyWebhookUrl` (type: `string`):

Store briefs are POSTed here as JSON when anything changed. Works with Slack workflows, Zapier, Make and n8n.

## `anthropicApiKey` (type: `string`):

Optional. Leave empty to use the built-in AI.

## `maxStores` (type: `integer`):

A safety cap on how many stores one run checks.

## `maxProductsPerStore` (type: `integer`):

A safety cap on how many products are read per store.

## `stateStoreName` (type: `string`):

Catalog snapshots live in this named key-value store in your account.

## Actor input object example

```json
{
  "stores": [
    "allbirds.com"
  ],
  "minPriceChangePercent": 1,
  "writeBrief": true,
  "maxStores": 50,
  "maxProductsPerStore": 5000,
  "stateStoreName": "catalog-watch-state"
}
```

# Actor output Schema

## `results` (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 = {
    "stores": [
        "allbirds.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("subtle_pluto/shopify-catalog-watch").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 = { "stores": ["allbirds.com"] }

# Run the Actor and wait for it to finish
run = client.actor("subtle_pluto/shopify-catalog-watch").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 '{
  "stores": [
    "allbirds.com"
  ]
}' |
apify call subtle_pluto/shopify-catalog-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,subtle_pluto/shopify-catalog-watch"
        }
    }
}
```

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/BqrJjV9mzqtHTCXnb/builds/OIP9IW4SJIWfgUPXE/openapi.json
