Shopify Store Products & Price Tracker — Any Store
Pricing
from $0.40 / 1,000 products
Shopify Store Products & Price Tracker — Any Store
Any Shopify store's catalogue as clean rows: price, compare-at price, sale flag, stock, SKU, vendor, tags and image per variant. Run it again or on a schedule for price drops, restocks, sell-outs, new and removed products since the last run. Store domains or collection URLs. No login.
Pricing
from $0.40 / 1,000 products
Rating
0.0
(0)
Developer
Northbell
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 hours ago
Last modified
Categories
Share
Shopify Store Products & Price Tracker
Give it any Shopify store — a domain like allbirds.com or a collection URL — and get every product as clean rows: price, compare-at price, sale flag, in-stock flag, SKU, vendor, product type, tags and image for each variant. $0.50 per 1,000 rows, no login, no API key. Most Shopify product scrapers stop at today's list; this one also tells you what changed since your last run.
Run it again — or put it on a daily schedule — and every row also says what changed since the last run: the old price and the price change, items back in stock or sold out, products that are new, and a free summary row per store that counts them and lists the ids of removed products. A plain product scraper hands you today's list and leaves the comparison to you; this is the part of competitor price and stock monitoring you would otherwise build yourself.
What you get
One row per variant (size, colour…) — or per product, if you switch variants off.
| Field | What it is |
|---|---|
type, observedAt | product for these rows; when the row was read (UTC) |
store, collection | the store (without www.) and, when you read a collection, its handle |
productId, handle, title, vendor, productType, tags, url, imageUrl | the product, as the store lists it; url opens the exact variant when variants are on |
variantId, variantTitle, sku, variantCount | the variant, and how many variants the product has |
price, compareAtPrice, onSale, discountPercent, currency | current price, the store's compare-at price when it set one, whether that makes it a sale (onSale: compare-at is above the price), the discount, and the currency the prices are in |
available | true if the variant can be bought (Shopify's public feed says in stock or not, not how many) |
createdAt, publishedAt, updatedAt | when the product was created, published and last changed (UTC) |
isNew, previousPrice, priceChange, priceChangePercent, becameAvailable, becameUnavailable | the change since your previous run (null on the first run). priceChange is new minus old, so negative means cheaper |
Each store also gets one free store-summary row:
| Field | What it is |
|---|---|
products, variants, rows, onSaleProducts, onSaleShare | what was read, and the share of products with at least one variant on sale |
catalogueComplete, stoppedBecause | true when the whole catalogue was read; otherwise limit (Max products per store), pages (the store hands out fewer products per page than asked for) or error |
newSinceLastRun, removedSinceLastRun, removedSinceLastRunCount | new products, and the ids of products that disappeared (first 500) |
priceChanges, priceDrops, priceIncreases, restocked, soldOut | how many rows (variants, or products) changed price, came back in stock or sold out |
firstRun, previousRunAt, country, currency, note | run context, and a plain-English note when something limits the comparison |
Use it for
- Competitor price monitoring — schedule it daily on the stores you compete with and see every price drop and increase, with the old price
- Sale and discount watch —
onSale,discountPercentandonSaleShareshow how deep and how wide a competitor's promotion is - Restock and sell-out alerts —
becameAvailableandbecameUnavailableper size, for resellers and for buyers waiting on a drop - Assortment tracking — new products and removed products per store, per collection
Input
{ "stores": ["allbirds.com", "https://colourpop.com"], "maxProductsPerStore": 1000, "includeVariants": true, "country": "US" }
- Stores — domains or store URLs, one per line. A collection URL such as
https://www.allbirds.com/collections/mens-sneakersreads just that collection; the Collection field does the same for every store in the list. - Max products per store — 1,000 by default, up to 20,000.
- One row per variant — on by default. Off gives one row per product with its lowest price, and
availableistrueif any variant is in stock. - Country — which country's prices to read (default
US).
The previous values are remembered per store, collection, country and row mode in a named key-value store in your Apify account, so the second run of the same Actor already shows changes. Schedule it (Apify → Schedules) for a daily history.
Pricing
$0.50 per 1,000 rows, plus $0.01 per run. With variants on, every size and colour is a row: a store with 700 products and 7,500 variants is about $3.75, and the same store with variants off (700 rows) is about $0.35. Error rows and store-summary rows are free. The $0.01 run-start fee is the one charge every run pays, even one that returns nothing.
Notes
- Public data only: the product feed every Shopify store publishes for visitors. No customer, reviewer or other personal data, and no product descriptions are returned. Titles, vendors and tags are cleaned of HTML and entities (
&becomes&). - Prices follow the country. Stores that sell in several currencies show a different price per country, so the Actor pins one country (US unless you change it;
UKis read asGB) and reads the currency from the store's own reply.currencyisnullonly if a store does not report one. Changingcountrystarts a separate history for that store, and if a store switches currency between runs the summary says so and does not report price changes. - New and removed products need the whole catalogue. They are only reported when this run and the previous run both read everything (
catalogueCompleteistrue). If a run stops at Max products per store,isNewcan benullfor products it has not seen before andremovedSinceLastRunisnull— set the limit above the store's size to track them. With variants on, a new size on an old product isisNew: true, whilenewSinceLastRunin the summary counts products. - Fields that are empty on some rows by nature:
compareAtPriceis filled only where the store set a compare-at price (it can equal the price, thenonSaleisfalse) anddiscountPercentonly whileonSaleistrue;productType,skuandimageUrlare blank where the store leaves them blank;collectionappears only when you read a collection; the six change fields arenullon a store's first run (and everything butisNewfor an item that is new). With variants off,variantId,variantTitleandskuarenullandpriceis the lowest variant price.variantTitleisDefault Titlefor products with a single variant — that is Shopify's own name for it. - Some stores cannot be read: those behind a bot-protection wall (Cloudflare and similar), password-protected stores, and sites that are not on Shopify. Each gets a free error row saying why — nothing is made up. Not sure a competitor runs on Shopify? The Tech Stack Detector tells you what a site is built with.
- Shopify's feed pages through at most 25,000 products, so a single store is capped at 20,000. A catalogue of 5,400 products and 24,500 variant rows is read in about 25 seconds and fits in the default 256 MB; for catalogues several times bigger, set the run's memory to 512 MB.
Looking at the Shopify app side instead? See the Shopify App Reviews Scraper.
For AI agents
{"stores": ["allbirds.com"], "maxProductsPerStore": 5} returns the variant rows of 5 products (about 60 rows) with price, compare-at price and availability, plus one free store-summary row. Run it again with the same input to get priceChange, becameAvailable and isNew filled in. Rows have type: product, store-summary or error.