Shopify Price & Stock Monitor avatar

Shopify Price & Stock Monitor

Pricing

from $1.00 / 1,000 product scrapeds

Go to Apify Store
Shopify Price & Stock Monitor

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

Donghai Li

Maintained by Community

Actor 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)

FieldTypeDefaultNotes
storeUrlstring (required)allbirds.comDomain or full URL; feed must be enabled (most Shopify stores)
maxProductsint β‰₯000 = whole catalogue; cap for cheap trial runs
previousSnapshotarray 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, isNew

Summary (SUMMARY key in the key-value store)

productCount, variantCount, outOfStockVariants, onSaleVariants, priceMin, priceMax, priceAvg, snapshotProvided
, and with a snapshot:
changes{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)

EventPriceNotes
actor-start$0.10 / runMirrors Actor #1; covers fixed cost
product-scraped$0.001 / productPer 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 β†’
    priceChangedCount 1 (oldPrice 120.0), wentOutOfStockCount 1, removedVariantCount 1
    , all flags on the right rows.
  • 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.