Shopify Competitor Price Stock Monitor & Catalog Scraper
Pricing
from $1.00 / 1,000 results
Shopify Competitor Price Stock Monitor & Catalog Scraper
Detect price drops, sales, restocks, sold-outs, and new product launches across competitor Shopify stores.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Leafy
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Shopify Competitor Price & Stock Monitor
Detect price drops, sales, restocks, sold-outs, and new product launches across competitor Shopify stores, automatically.
Paste your competitors' Shopify URLs and press Start. The first run saves a baseline of their catalog. Every run after that reports exactly what changed, so you know the moment a rival cuts a price, starts a sale, restocks a sold-out size, or launches something new.
What it detects
| Event | Meaning |
|---|---|
PRICE_DROP / PRICE_INCREASE | A variant got cheaper or more expensive |
SALE_STARTED / SALE_ENDED | A compare-at ("was") price appeared or disappeared |
OUT_OF_STOCK / RESTOCKED | A variant sold out or came back |
NEW_PRODUCT / REMOVED_PRODUCT | A product was added, removed, or unpublished |
NEW_VARIANT / REMOVED_VARIANT | A size, color, or option was added or removed |
TITLE_CHANGED / VENDOR_CHANGED / TAG_CHANGED | Metadata edits (off by default) |
Every change gets a plain-English summary like "Price dropped 20% from 50.00 GBP to 40.00 GBP on Vital Seamless Leggings (Black / M)".
Quick start
- Paste one or more store URLs into Competitor Shopify store URLs (the homepage is fine).
- Press Start.
- (Optional) Add keywords to watch only certain products, or a webhook to get alerts.
First run = baseline. There is nothing to compare against yet, so the run reports 0 changes and clearly says a baseline was created. That is expected. Change events start on the second run.
Schedule it (Apify > Schedule Actor) to monitor on autopilot: hourly for sales and restocks, daily for pricing, weekly for new launches.
Output
The dataset holds your change events, plus one summary row per store with a plain-English status (baseline created, number of changes, or an error). The full catalog for each store is saved separately in the snapshot Key-Value store, so the dataset stays focused on what actually changed.
recordType | What it is |
|---|---|
change_event | One detected change, with severity and summary |
store_summary | Per-store status message, totals, and change counts |
Example change event:
{"recordType": "change_event","eventType": "PRICE_DROP","storeName": "Gymshark","productTitle": "Vital Seamless Leggings","variantTitle": "Black / M","sku": "GS-VSL-BLK-M","oldPrice": 50,"newPrice": 40,"priceChangePercent": -20,"currency": "GBP","severity": "high","changeSummary": "Price dropped 20.0% from 50.00 GBP to 40.00 GBP on Vital Seamless Leggings (Black / M)","detectedAt": "2026-07-04T09:00:00.000Z","productUrl": "https://gymshark.com/products/vital-seamless-leggings"}
If a store cannot be read (invalid URL, blocked, or not Shopify), you still get a store_summary row with an errors message, and the run keeps going for every other store.
Want the whole product list, not just the changes? See Get the full catalog as a file below.
Get the full catalog as a file
Sometimes you want a competitor's entire catalog, not just what changed. Turn on Export the full catalog as files in the input and choose one or more formats:
- Excel (
catalog.xlsx) opens straight in Excel or Google Sheets. - JSON (
catalog.json) is a clean array, one row per variant. - CSV (
catalog.csv) opens in any spreadsheet.
Where to get it: open the run, go to the Storage tab (or the Output tab), and download catalog.xlsx, catalog.json, or catalog.csv.
Each row has store, product, variant, SKU, price, sale price, availability, currency, vendor, type, tags, image URL, and product URL. This runs on every run, including the very first one, so you can grab a full catalog immediately even before any changes exist.
Prefer the catalog as dataset rows instead (for a one-off export)? Set outputMode to both or fullSnapshot in the JSON input tab.
How it remembers changes
To know what changed, the actor remembers what each store looked like last time:
- After every run it saves a snapshot (a JSON photo of the catalog) to an Apify Key-Value store named
shopify-monitor, with one record per store, keyed by domain (for examplegymshark-com). This is also where you can browse a store's full current catalog. - The next run loads that record and compares it to the live catalog. That comparison is where change events come from, and why the first run finds nothing.
- Find it in Storage > Key-value stores >
shopify-monitor. It stores only public catalog data and keeps just the latest snapshot per store, so scheduled runs always compare against the previous run automatically.
Need to start a store over? Add its URL to Reset baseline for these stores and the next run rebuilds its baseline from scratch. Other stores keep their history.
Options
The form shows store URLs, keywords, webhook, export the full catalog as files, and reset baseline for these stores. Everything below is optional, has a sensible default, and can be set from the JSON input tab.
| Field | Default | What it does |
|---|---|---|
storeUrls (required) | Competitor Shopify store URLs | |
keywords | [] | Only track products matching any keyword |
webhookUrl | POST a change summary here (Slack, Zapier, Make) | |
catalogExportFormats | [] | Save the full catalog as files in storage: any of json, xlsx, csv |
resetBaselineStores | [] | Forget saved history for these stores and start them fresh |
outputMode | changesOnly | changesOnly, both, or fullSnapshot (also writes catalog rows to the dataset) |
collectionHandles | [] | Track specific collections instead of the whole catalog |
minPriceChangePercent | 0 | Ignore price moves smaller than this % |
includeNewProducts / includeRemovedProducts | true | Toggle new and removed product events |
includeStockChanges / includeSaleChanges | true | Toggle restock/sold-out and sale events |
includeVariantChanges / includeVariants | true | Toggle variant tracking |
includeMetadataChanges | false | Title, vendor, and tag events (noisy) |
maxProductsPerStore | 5000 | Safety cap per store |
maxConcurrency | 3 | Stores fetched in parallel |
requestDelayMs | 300 | Delay between requests to a store |
resetBaseline | false | Reset the baseline for every store at once |
storeSnapshotKeyPrefix | shopify-monitor | Snapshot store name (change it to run separate setups) |
Webhook payload: when changes are found, the actor POSTs { totalChanges, countsByEventType, topChanges (up to 20), runUrl }. A failed webhook never fails the run.
Pricing
This actor uses pay per event: you are charged one small flat fee for each competitor store checked in a run, no matter how big its catalog is. A store with 50,000 products costs the same as one with 50.
- Watching 5 competitors on a daily schedule is about 150 store checks per month.
- Stores that error out (blocked, not Shopify, or empty) are not charged.
- There is no per-product or per-result fee, so a large catalog never inflates your bill.
- Your run also has a max-cost limit you can set in Apify, so spend is always capped.
Good to know
- Availability, not exact stock counts. Shopify's public data exposes an in-stock or out-of-stock flag, not quantities.
- Public data only. No login, Admin API, tokens, or customer and order data. Just the public product JSON.
- Some stores block it. A minority disable
/products.jsonor sit behind a bot wall. Those return an error row instead of crashing the run. - Currency is best-effort (read from the storefront when possible, and may be
null). - Polite by default: low concurrency, request delays, and automatic retry with backoff on 429 and 5xx.
- Detects and reports changes. It does not reprice your own store.