Shopify Catalogue & Price Change Monitor
Pricing
from $10.00 / 1,000 product change detecteds
Shopify Catalogue & Price Change Monitor
Track any Shopify store's full catalogue and get only what changed since the last run: price drops, price rises, new products, stock-outs, restocks and removals.
Pricing
from $10.00 / 1,000 product change detecteds
Rating
0.0
(0)
Developer
Mohanad Alshaka
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Watch any Shopify store and get only what changed since your last run: price drops, price rises, new products, stock-outs, restocks and removals.
Point it at your competitors, schedule it daily, and each run returns a short list of what moved instead of a fresh dump of the whole catalogue.
Why this one is reliable
Every Shopify store serves its catalogue at /products.json without authentication. That endpoint is part of the Shopify platform, not a page template, so it does not break when a store restyles its theme or swaps its front end. No browser, no proxies, no login.
Verified against live storefronts on 13 September 2026: page size is capped at 250 regardless of what is requested, page paginates cleanly with no overlap, and storefronts answer bursts with HTTP 429. This Actor paginates correctly, backs off on 429 honouring Retry-After, and refuses to mistake an HTML challenge page for an empty catalogue.
What a change row looks like
{"domain": "gymshark.com","changeType": "price_drop","reasons": ["price_drop"],"title": "Gymshark Diffuse Sweat Headwrap - Black","previousMinPrice": 51,"minPrice": 26,"maxPrice": 28,"previousInStock": true,"inStock": true,"onSale": true,"vendor": "Gymshark","variantCount": 2,"availableVariantCount": 1,"url": "https://gymshark.com/products/diffuse-sweat-headwrap-black","detectedAt": "2026-09-13T12:31:00.000Z"}
Change types: price_drop, price_rise, price_change, back_in_stock, out_of_stock, variant_availability_change, title_change, new_product, removed_product, first_seen.
Two details that matter in practice:
- The first run reports
first_seen, not a flood ofnew_product. A store's entire catalogue appearing at once is a baseline, not news. Real additions after that arenew_product. - Every row has the same fields, including
removed_productrows for items pulled from the storefront. Exports to CSV stay rectangular instead of going ragged.
Input
| Field | What it does |
|---|---|
domains | Storefronts to read. Full URLs, bare domains and www. all work. |
mode | changes returns only what moved since last run. catalog returns everything each time. |
stateKey | Names the saved baseline. Use one key per watchlist so separate schedules don't overwrite each other. |
inStockOnly | Skip products with no available variant. |
onSaleOnly | Keep only products discounted below their compare-at price. |
maxProductsPerStore | How deep to read each catalogue. |
Daily competitor price watch
{"domains": ["gymshark.com", "allbirds.com"],"mode": "changes","stateKey": "competitors","maxProductsPerStore": 2000}
Schedule that daily. The first run records the baseline; every run after returns just the moves.
Full catalogue export
{"domains": ["gymshark.com"],"mode": "catalog","maxProductsPerStore": 5000}
Notes and limits
- Public storefront data only. No customer data, no orders, no accounts, nothing behind a login.
- Prices are returned in the store's own currency as the storefront publishes them. No conversion is applied.
- A domain that is not a Shopify store returns a clear per-store error and the run continues with the rest.
changesmode needs somewhere to keep the baseline between runs, so it writes to a named key-value store. Deleting that store resets the baseline and the next run reportsfirst_seenagain.
Development
npm installnpm testnode src/main.js