Shopify Competitor Watch (price & stock alerts) avatar

Shopify Competitor Watch (price & stock alerts)

Pricing

from $10.00 / 1,000 store watches

Go to Apify Store
Shopify Competitor Watch (price & stock alerts)

Shopify Competitor Watch (price & stock alerts)

Monitors competitor Shopify stores and alerts on price changes, product additions/removals, and stock (sold-out/restocked) changes. Uses the store's public product feed - no proxies, no logins, fully ToS-safe.

Pricing

from $10.00 / 1,000 store watches

Rating

0.0

(0)

Developer

Hossam Mohamed

Hossam Mohamed

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 hours ago

Last modified

Categories

Share

Shopify Competitor Watch

Monitors competitor Shopify stores and alerts you when they change prices, stock status (sold out / restocked), or their product catalog (items added or removed) — and when sales start or end (compare-at price).

Uses each store's public product feed (/products.json). No proxies, no logins, no brittle page scraping — fast, cheap, and reliable.

How it works

  1. First run — records a baseline snapshot of each store's catalog (every product variant: title, price, compare-at price, availability) and saves it to the Actor's key-value store. You'll see one baseline_recorded per store with productsTracked, complete, and capUsed.

  2. Subsequent runs (schedule it daily or hourly) — re-fetches each catalog, diffs it against the snapshot, and outputs one item per detected change:

changeTypelevelmeaningkey fields
price_changedvariantvariant price changedvariantId, oldPrice, newPrice
sale_started_or_endedvariantcompare-at price changed (sale on/off)variantId, oldPrice (compare-at), newPrice
stock_changedvariantvariant went in/out of stockvariantId, oldAvailable, newAvailable
product_addedproduct/handleproduct appeared (one event per handle)handle, title, variantCount, newPrice, newAvailable
product_removedproduct/handleproduct disappeared (one event per handle)handle, title, variantCount, oldPrice
baseline_recordedstorefirst run or baseline reset for a store — no diff yetproductsTracked, complete, capUsed

Snapshot persistence

  • Complete snapshots are authoritative. A snapshot with complete:true means the fetch reached the end of the store's public catalog without being truncated by maxProductsPerStore.
  • Incomplete snapshots persist normalized. When both the previous and current fetches are complete:false with the same cap, the Actor diffs on the overlap (price/stock/sale on shared variants, no removals) and then persists the current normalized snapshot so sentinel normalizations (e.g. compare_at "0.00" → null) take effect on the next run.
  • Incomplete → complete upgrades. A truncated snapshot is upgraded to complete:true when a later fetch covers the whole catalog.
  • Failed/unusable fetches do not overwrite state. Unreachable stores or empty fetches leave the previous snapshot untouched and emit no charge.
  • Cap or schema changes force a baseline. Changing maxProductsPerStore with a complete fetch records a fresh baseline; a truncated fetch after a cap change preserves the old snapshot and skips diffing to avoid false removals.

Each successful run reports changes since the previous successful snapshot for the same store and cap.

Input

fieldtypedefaultdescription
storeUrlsarray (required)Shopify storefront hostnames or URLs, e.g. kith.com
maxProductsPerStoreinteger1000Safety cap per store (250 products per page). When the catalog is larger than the cap, the snapshot is complete:false and product removals are suppressed — price/stock/sale still works on overlapping variants.
includeCompareAtPricebooleantrueAlso detect sale-price changes

Example

Run with storeUrls: ["brooklinen.com", "kith.com"]. First run records baselines. A day later, the run's dataset contains:

{"store": "kith.com", "changeType": "price_changed", "handle": "dmysun13sb", "title": "DMY Studios Margot Sunglasses - Black", "oldPrice": "290.00", "newPrice": "249.00"}
{"store": "brooklinen.com", "changeType": "stock_changed", "handle": "down-alternative-lumbar-pillow-insert", "oldAvailable": false, "newAvailable": true}

Product-level example (one handle, 4 variants):

{"store": "kith.com", "changeType": "product_removed", "handle": "old-season-tee", "title": "Old Season Tee", "variantCount": 4, "oldPrice": "45.00"}

Tips

  • Run on a schedule (daily is usually enough) for continuous monitoring.
  • Connect a webhook to get notified on new changes, or use Apify's dataset integrations (Slack, Sheets, email).
  • Keep maxProductsPerStore reasonable — very large catalogs take proportionally longer. For stores with >1000 products (e.g. Kith), the snapshot will be complete:false and removals are suppressed on truncated runs — raise the cap if you need full-catalog removal detection.
  • Stores that disable the public product feed or aren't on Shopify can't be tracked; the run continues with the remaining stores.

Cost

No proxies are used — runs are essentially compute-only, so monitoring a handful of stores daily costs a fraction of a cent per run. You are charged $0.20 per store-watch (one per successfully processed store per run).

Limitations (by design)

  • Tracks variant-level price/stock/sale and product-level adds/removes (with variantCount) — The public product feed exposes availability, not inventory counts, so "stock" means available vs. sold out.
  • Detects changes since the last successful snapshot; it is a monitor, not a historical price archive.
  • maxProductsPerStore can truncate large catalogs — complete:false means the snapshot is a window, not the full catalog; removals are suppressed on truncated runs, while price/stock/sale still works on overlapping variants.
  • compare_at values "0", "0.00", etc. are normalized to null (no sale) — you won't see 0.00→null sale flips.
  • First run for a store (or after a cap change with a complete fetch) always establishes a baseline (baseline_recorded) before diffs begin; failed fetches leave the previous snapshot untouched.
  • Does not send emails itself — use dataset/webhook integrations for notifications.

Use with AI agents

Built for agents: documented JSON input schema, one stable record per change event, no auth beyond the caller's own Apify token. The simplest integration is the run-sync endpoint, which starts the run and returns all detected changes in one call:

POST https://api.apify.com/acts/dev-hoss~shopify-competitor-watch/run-sync-get-dataset-items?token=YOUR_API_TOKEN
Content-Type: application/json
{"storeUrls": ["kith.com", "allbirds.com"], "maxProductsPerStore": 1000}

It also works with Apify's hosted MCP server (mcp.apify.com) — add the Actor to your MCP client and the input schema drives the tool call. Quiet runs (no changes) return zero records; failed store fetches are skipped without charge, so agents never pay for dead stores.