# Shopify Price Tracker: Competitor Price Snapshot (`blond_terrarium/shopify-competitor-price-snapshot`) Actor

Track competitor prices on any Shopify store. One snapshot per store: min/median/max prices, price bands by product type and vendor, sale share and discounts, stock, cheapest and newest products, CSV price list, and price drops, new and removed products since your last run.

- **URL**: https://apify.com/blond_terrarium/shopify-competitor-price-snapshot.md
- **Developed by:** [LiveFree Analytics](https://apify.com/blond_terrarium) (community)
- **Categories:** E-commerce, Automation, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $45.00 / 1,000 store price snapshots

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Price Tracker: Competitor Price Snapshot & Price Change Monitor

**Track competitor prices on any Shopify store**, custom domains included. Each run gives you **one finished snapshot per store**. It shows the store's price range (min, median, average, max), **price bands by product type and vendor**, how much of the catalog is **on sale** and the average discount, the **in-stock share**, and the cheapest, priciest, most-discounted and newest products. You also get a **CSV price list**. **From the second run on, it shows what changed:** price drops, price increases, new products, removed products, back in stock and sold out.

- ✅ **One row per store:** no 5,000-row product dump to clean up
- ✅ **Change monitor:** schedule it daily or weekly, and every snapshot is compared with the last one
- ✅ **Price bands per product type:** see where a competitor positions each category
- ✅ **Free cross-store comparison row** when you track 2+ stores
- ✅ **Keyword filter:** track only part of a catalog (for example "hoodie, jacket")
- ✅ **Free error rows:** non-Shopify, password-protected or blocked stores are never charged

### Who it's for

- **Shopify and DTC brands:** watch 3-10 competitors' prices and promotions every week
- **Agencies:** a competitive pricing slide for a client, in one run
- **Dropshippers and resellers:** spot price drops and restocks fast
- **Analysts:** median price and discount depth across a niche

### What you get (real output, shortened; the `changes` come from our change-detection test run)

```
{ "store": "deathwishcoffee.com", "storeName": "Death Wish Coffee", "currency": "USD", "productCount": 159,
  "price": { "min": 5, "median": 29.98, "average": 28.69, "max": 90 }, "onSaleShare": 0.16, "averageDiscountPercent": 31.42, "inStockShare": 0.98,
  "byProductType": [ { "productType": "Apparel", "products": 38, "median": 34, "onSaleShare": 0.39 }, { "productType": "Coffee", "products": 37, "median": 14.99, "onSaleShare": 0 } ],
  "changesSummary": "Since 2026-10-26: 1 price drop(s), 1 increase(s), 1 new, 1 removed, 1 back in stock, 0 sold out.",
  "changes": { "priceDrops": [ { "title": "Gingerdead Chocolate Bark", "previousPrice": 25, "price": 15, "changePercent": -40 } ] },
  "priceListCsvUrl": "https://api.apify.com/v2/key-value-stores/…/records/prices-deathwishcoffee.com-csv", "charged": true }
```

### Try it in 1 minute

1. Add competitor stores (`allbirds.com`, `gymshark.com`).
2. Run once to save a baseline, then **schedule it** (daily or weekly) to get the changes.
3. Export the snapshots as CSV, Excel or JSON, or open each store's CSV price list.

   { "stores": \["allbirds.com", "deathwishcoffee.com"], "maxProductsPerStore": 1000, "compareWithPrevious": true }

### Price

One `store-snapshot` event per store **per started 1,000 products** (1-1,000 products = 1 snapshot, 1,001-2,000 = 2).

| Apify plan | Per store snapshot |
|---|---|
| Free | $0.06 |
| Bronze | $0.055 |
| Silver | $0.05 |
| Gold | $0.045 |

Example: tracking 5 competitors weekly costs about $1.30 a month on the Free plan.

- **No start fee** from us. Only Apify's standard minimum start event.
- **If no snapshot can be made** (no store had public Shopify products), the run fails with a clear message and **costs nothing**.
- Need every product with every variant, SKU and image? Use our [Shopify Store Products Scraper](https://apify.com/blond_terrarium/shopify-store-products-scraper).

### All settings

| Field | Default | What it does |
|---|---|---|
| stores | – | Shopify store domains or URLs |
| maxProductsPerStore | 1000 | Products per snapshot (up to 10,000) |
| keyword | – | Only track matching products |
| compareWithPrevious | true | Report changes since the last run |
| snapshotStoreName | shopify-price-snapshots | Named key-value store that keeps history |
| listSize | 10 | Items in each top list |
| savePriceListCsv | true | CSV of all products per store |
| maxChargedSnapshots | 0 | Hard stop (0 = none) |

### FAQ

**Does it work on custom domains?** Yes. It uses the public storefront product feed that every Shopify store has, so custom domains like allbirds.com work.
**Where is the history kept?** It's kept in a named key-value store in your own Apify account. Use a different `snapshotStoreName` per project.
**Is it legal?** It reads only public product pages that the store publishes for everyone, and it follows robots.txt.

### Use it from code, no-code tools or AI agents

- **API:** `POST https://api.apify.com/v2/acts/blond_terrarium~shopify-competitor-price-snapshot/run-sync-get-dataset-items?token=YOUR_TOKEN`
- **Schedules, Make, Zapier, n8n, Slack or email alerts** through Apify integrations
- **AI agents (MCP):** `https://mcp.apify.com?tools=blond_terrarium/shopify-competitor-price-snapshot`

# Actor input Schema

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

Competitor Shopify stores, custom domains welcome (allbirds.com, https://www.deathwishcoffee.com, store.myshopify.com).

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

Products included in each snapshot. One snapshot is charged per started 1,000 products (1-1,000 = 1 snapshot, 1,001-2,000 = 2).

## `keyword` (type: `string`):

Comma-separated keywords to track just part of a catalog (for example: hoodie, jacket).

## `compareWithPrevious` (type: `boolean`):

Save each snapshot in a named key-value store in your account and report price drops, increases, new, removed and restocked products next time. Schedule the Actor daily or weekly.

## `snapshotStoreName` (type: `string`):

Named key-value store that keeps the previous snapshots. Use different names for different projects.

## `listSize` (type: `integer`):

How many products to list under cheapest, most expensive, biggest discounts and newest.

## `savePriceListCsv` (type: `boolean`):

Save a CSV of every product with price, compare-at price, discount and stock per store.

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

How many stores to snapshot at once.

## `maxChargedSnapshots` (type: `integer`):

Stop after this many charged snapshots. The run also stops at your "Max cost per run".

## Actor input object example

```json
{
  "stores": [
    "allbirds.com",
    "deathwishcoffee.com"
  ],
  "maxProductsPerStore": 1000,
  "compareWithPrevious": true,
  "snapshotStoreName": "shopify-price-snapshots",
  "listSize": 10,
  "savePriceListCsv": true,
  "maxConcurrency": 3,
  "maxChargedSnapshots": 0
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `bands` (type: `string`):

No description

## `results` (type: `string`):

No description

## `files` (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",
        "deathwishcoffee.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("blond_terrarium/shopify-competitor-price-snapshot").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",
        "deathwishcoffee.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("blond_terrarium/shopify-competitor-price-snapshot").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",
    "deathwishcoffee.com"
  ]
}' |
apify call blond_terrarium/shopify-competitor-price-snapshot --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,blond_terrarium/shopify-competitor-price-snapshot"
        }
    }
}
```

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/j1kJM1sa5hQe5ImXH/builds/CCfzXbJq4NDBFxqoo/openapi.json
