Shopify Price & Stock Monitor
Pricing
from $1.00 / 1,000 product scrapeds
Shopify Price & Stock Monitor
Reads any Shopify store's public /products.json catalogue feed and returns clean per-variant rows: price, compare-at price, availability, SKU, vendor and tags. Optionally pass a previous run's rows as a snapshot and every variant is flagged for price changes, stock-outs, restocks and new...
Pricing
from $1.00 / 1,000 product scrapeds
Rating
0.0
(0)
Developer
Donghai Li
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
18 hours ago
Last modified
Categories
Share
Shopify Price & Stock Monitor β Apify Actor (deploy-ready, not yet published)
Reads any Shopify store's public /products.json catalogue feed and returns
clean per-variant rows (price, compare-at price, availability, SKU,
vendor, tags) plus a run summary. Pass a previous run's rows back in as
a snapshot and every variant is flagged for price changes, stock-outs,
restocks and new arrivals β built for competitor price tracking, catalogue
audits and scheduled price/stock alert pipelines (Make/Zapier/n8n via Apify
schedules + webhooks).
Status: built and locally verified 2026-10-29 (offline sample test, change-detection test, live test β all below). Deployed to Brian's account unpublished, no pricing set; publishing is a separate approved step.
Why this product (scan summary, Oct 2026)
This was the strong #2 in the Actor #1 niche scan: real merchant pain (competitor price/stock watching), and the data source is the store's own public feed β no login, no browser, no proxies, so pay-per-event economics can't go negative (same structural safety as Actor #1). Change detection is the differentiator vs raw catalogue scrapers: they sell rows, this sells "what changed since yesterday?" in one scheduled run.
Input (.actor/input_schema.json)
| Field | Type | Default | Notes |
|---|---|---|---|
storeUrl | string (required) | allbirds.com | Domain or full URL; feed must be enabled (most Shopify stores) |
maxProducts | int β₯0 | 0 | 0 = whole catalogue; cap for cheap trial runs |
previousSnapshot | array of rows | β | Prior run's dataset rows; enables change flags |
Output (per variant row)
store, productId, productTitle, handle, productUrl, vendor, productType, tags, variantId, variantTitle, price, compareAtPrice, available, sku, fetchedAt, priceChanged, oldPrice, wentOutOfStock, backInStock, isNewSummary (SUMMARY key in the key-value store)
productCount, variantCount, outOfStockVariants, onSaleVariants, priceMin, priceMax, priceAvg, snapshotProvidedchanges{priceChangedCount, wentOutOfStockCount, backInStockCount, newVariantCount, removedVariantCount}Removed products are counted from the snapshot's variant IDs. Note (same caveat as comparable monitors): removal counts are only meaningful when the whole catalogue was read on both runs β a capped run can shift feed order.
Pricing (proposed, pay-per-event β in .actor/pay_per_event.json)
| Event | Price | Notes |
|---|---|---|
actor-start | $0.10 / run | Mirrors Actor #1; covers fixed cost |
product-scraped | $0.001 / product | Per product (all its variant rows included) |
Sanity check against live Store pricing (Oct 29, 2026): the closest
comparable, pistachio_implementation/shopify-catalog-monitor, charges
$0.001 per product checked (+$0.005 per change); Media Pro Tools' Shopify
scraper/monitor charges $0.0005 per product/variant row (+$0.002 per
change); a generic product-page extractor charges $0.0015/row. The brief's
first guess of $0.002/product sat above that whole band, so it was adjusted
to $0.001/product β mid-band, at parity with the most comparable
monitor, with margin protected by near-zero compute (plain HTTPS GETs).
Local tests (2026-10-29)
- Offline sample (
tests/sample_products.json, 3 products / 5 variants): parsed exactly β string prices β floats,compare_at_price""/nullβ null, 1 out-of-stock, 2 on sale, price avg 64.7. - Change detection: mutated fixture (one price 120β99, one variant
flipped to unavailable, one variant removed) against the first run as
snapshot β , all flags on the right rows.priceChangedCount 1 (oldPrice 120.0), wentOutOfStockCount 1, removedVariantCount 1
- Live (
allbirds.com, cap 30 products): 30 products β 328 variant rows, 222 out of stock, 20 on sale, prices 50.0β145.0 (avg 109.74).
Project layout
shopify-monitor/βββ .actor/β βββ actor.json # name/title/description, dockerfile + schema pointersβ βββ input_schema.jsonβ βββ output_schema.json # legacy output schema (templates, string types)β βββ dataset_schema.json # dataset fields + table viewβ βββ pay_per_event.json # PPE pricing (proposed; NOT set on the platform)βββ Dockerfile # apify/actor-python:3.12βββ requirements.txt # core is stdlib-only; SDK from base imageβββ src/β βββ core.py # feed fetch/pagination, normalize, snapshot diff, summaryβ βββ main.py # thin Apify entrypoint (charges actor-start, product-scraped)βββ local_run.py # offline/live test harness (no account needed)βββ tests/sample_products.json
Deployment
Deploy (unpublished, no pricing) via the connector helper:
python3 ~/workspace/custom-connectors/custom.apify/bin/apify.py deploy ~/workspace/apify/shopify-monitor
Publishing to the Store and applying the pricing above are separate, approval-gated steps.