Shopify & WooCommerce Scraper – Prices & Stock Changes
Pricing
from $1.00 / 1,000 products
Shopify & WooCommerce Scraper – Prices & Stock Changes
Export full product catalogs from any Shopify or WooCommerce store (public storefront endpoints, no login) and track price drops, price increases, restocks, sell-outs and removed products between runs.
Pricing
from $1.00 / 1,000 products
Rating
0.0
(0)
Developer
Rahul Neeraj Mody
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Shopify & WooCommerce Scraper – Products, Prices & Stock Changes
Export the full product catalog of any Shopify or WooCommerce store and track price drops, price increases, restocks, sell-outs and removed products between runs. Paste store homepage URLs, press Start, and get a clean spreadsheet of products, variants, SKUs, prices, compare-at prices, stock status, images and tags. No login, no API key, no browser needed.
This Actor reads the stores' public storefront endpoints (Shopify /products.json and the WooCommerce Store API) — the same data any visitor's browser can see. It is fast, cheap and does not collect any customer or personal data.
What can this Shopify & WooCommerce scraper do?
- Auto-detects the platform – Shopify or WooCommerce, per store.
- Exports the whole catalog – title, vendor/brand, product type/category, handle, URL, SKU, price, compare-at price, currency, availability, stock status, tags, image, created/updated dates.
- Per product or per variant – one row per product (lowest price, any-in-stock) or one row per size/colour variant.
- Price & stock change tracking – every row gets a
changeType:new,price_up,price_down,back_in_stock,out_of_stock,removedorunchanged, pluspreviousPrice. - Only-changes mode – schedule it daily and get (and pay for) only the products that changed.
- Collection / category filter – scrape one Shopify collection or one WooCommerce category.
- Polite by design – sequential requests per store, delays, retries with exponential backoff and
Retry-Aftersupport for HTTP 429.
Use cases
- Competitor price monitoring – schedule daily runs on competitors' stores and get alerted on every price drop or increase.
- Dropshipping & product research – find what a store sells, its price points, best-selling categories, and newly added products.
- Stock / restock alerts – know when a sold-out product is back in stock (or a competitor runs out).
- Catalog migration & backups – export a Shopify or WooCommerce catalog to CSV, Excel or JSON.
- Market and assortment analysis – compare vendors, product types, discount depth (
compareAtPricevsprice) across many stores. - MAP / reseller compliance – check that resellers' prices stay above your minimum advertised price.
How to use it
- Add one or more store URLs to Store URLs (e.g.
https://www.allbirds.com). - Optionally set Collection / category, Max products per store and One row per variant.
- Keep Track price & stock changes on. The first run records a baseline (all rows are
new). - Schedule the Actor (e.g. daily) and turn on Output only changed products to receive just the changes.
- Download results as JSON, CSV, Excel, or connect them to Google Sheets, Slack, Make, Zapier or webhooks.
Input example
{"startUrls": [{ "url": "https://www.allbirds.com" },{ "url": "https://colourpop.com" },{ "url": "https://www.filamentive.com" }],"platform": "auto","collection": "","maxProductsPerStore": 1000,"includeVariants": false,"trackChanges": true,"onlyChanges": false}
| Field | Description |
|---|---|
startUrls | Store homepages. Product/collection URLs also work (the store root is used). |
platform | auto (default), shopify or woocommerce. |
collection | Shopify collection handle (e.g. mens) or WooCommerce category slug/ID. |
maxProductsPerStore | Product cap per store (default 1000). |
includeVariants | true = one row per variant, false = one row per product. |
trackChanges | Compare with the previous run's snapshot (default true). |
onlyChanges | Output only rows whose changeType is not unchanged. |
requestDelayMs | Pause between page requests to one store (default 700 ms). |
Output example
{"store": "https://www.allbirds.com","platform": "shopify","productId": "7340901859408","variantId": null,"title": "Women's Allbirds Flip Flop - Dusty Pink","vendor": "Allbirds","productType": "Shoes","handle": "womens-allbirds-flip-flop-dusty-pink","url": "https://www.allbirds.com/products/womens-allbirds-flip-flop-dusty-pink","sku": "A12513W050","price": 25,"maxPrice": 25,"compareAtPrice": 50,"currency": "USD","available": true,"stockStatus": "in_stock","tags": ["allbirds::gender => womens", "shoprunner"],"imageUrl": "https://cdn.shopify.com/s/files/1/1104/4168/files/A12513_26Q2_Allbirds-Flip-Flop-Dusty-Pink_PDP_LEFT.png","variantCount": 7,"createdAt": "2026-03-27T14:03:50-07:00","updatedAt": "2026-10-15T21:27:17-07:00","changeType": "price_down","changes": ["price_down"],"previousPrice": 30,"previousAvailable": true,"scrapedAt": "2026-10-16T04:27:14.391Z"}
The dataset has three ready-made views: Products, Price & stock changes, and All fields. A run summary (products, rows, change counts per store) is saved to the SUMMARY record in the run's key-value store.
If a store cannot be read (not Shopify/WooCommerce, API disabled, or blocked), you are not charged for it: the reason is listed under errors in the run's SUMMARY record (Storage → Key-value store), and in the run log.
Change types
changeType | Meaning |
|---|---|
new | Not present in the previous snapshot (every row on the first run). |
price_up / price_down | Price changed since the last run; see previousPrice. |
back_in_stock / out_of_stock | Availability flipped. If price also changed, changes lists both. |
removed | Was in the last snapshot but is gone now (only reported when the full catalog was scraped). |
unchanged | Same price and availability. |
Snapshots are stored per store (and per collection / variant mode) in the named key-value store store-catalog-tracker-snapshots in your Apify account, so tracking works across scheduled runs. Delete a record there to reset the baseline.
Pricing
Pay per result: $0.001 per product row in the dataset ($1 per 1,000 products). Error rows are free, and rows skipped by Output only changed products are not charged. Set a maximum cost per run in the run options – the Actor stops cleanly when your budget is reached (and doesn't advance the change-tracking baseline, so you never miss a change).
Example: tracking 3 competitor stores with 1,000 products each, daily, with only-changes on – the first run costs ~$3, then you pay only for the products that changed.
FAQ
Is it legal to scrape Shopify and WooCommerce stores? This Actor only reads public product data that stores expose to every visitor through their storefront endpoints. It collects no personal data. You are still responsible for complying with the target site's terms and applicable laws.
Why did a store return an error?
Some stores disable /products.json or the WooCommerce Store API, sit behind bot protection (Cloudflare, etc.), or use another platform (Magento, BigCommerce, Wix…). Those stores can't be read via public endpoints.
How many products can it get? Shopify's public endpoint paginates up to 100 pages × 250 = 25,000 products per store (or per collection – use collections to go beyond). WooCommerce has no fixed cap.
Does it get inventory quantities?
Shopify's public endpoint exposes only availability (in/out of stock), not quantities. WooCommerce exposes lowStockRemaining when the store shows "only X left".
Why is currency empty?
Shopify currency comes from the store's /meta.json (base currency); a few stores hide it. WooCommerce always returns a currency code.
Do I need proxies? Usually not – requests are light and polite. Heavily protected stores may block datacenter IPs.
Can I monitor only one collection? Yes – set Collection / category. Each collection keeps its own change-tracking snapshot.
Limitations
- Shopify page-based pagination stops at page 100 (25,000 products per endpoint).
- WooCommerce Store API does not expose created/updated dates or vendor unless the store uses WooCommerce Brands.
- Prices are those shown to an anonymous visitor in the store's default currency/market (no currency conversion, no B2B/member pricing).
removedis only reported when the whole catalog fits undermaxProductsPerStore.