Shopify Price Monitor & Price Tracker - Stock & Margins
Pricing
from $4.25 / 1,000 completed product checks
Shopify Price Monitor & Price Tracker - Stock & Margins
Track prices and stock of Shopify products variant by variant: Shopify stock tracker for price drops, rises, restocks and sell-outs since your last run, plus margin checks against your own costs. Competitor price monitoring for any public Shopify store, no login. $0.005 per product, all variants.
Pricing
from $4.25 / 1,000 completed product checks
Rating
0.0
(0)
Developer
Saulius AutomatesIT
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
18 days ago
Last modified
Categories
Share
Track the price and stock of products on any public Shopify store, variant by variant. Each run exports title, SKU, barcode, price, compare-at price, currency and availability, and labels what changed since your last run: price drops, price rises, restocks and sell-outs. Add your own price and unit cost to see the price gap and whether you can match a competitor at your target margin. No store login, no Shopify Admin access.
Price: $0.005 per product checked, all its variants included ($5 per 1,000 product checks).
Quick start
- Paste a public product URL into Product watchlist, for example
{"productUrl": "https://www.beardbrand.com/products/fox-hunt-mens-cologne"}. - Press Start. The first run records a baseline.
- Open the Products dataset and download JSON, CSV or Excel. Save the SNAPSHOT record and pass it as
previousSnapshotnext time to see what changed.
Our own test: one product, every variant, in about 2 seconds for $0.005.
Use cases
- Ecommerce brands: watch competitor prices and stock-outs on the products you compete with.
- Dropshippers and resellers: know when a supplier's product sells out or changes price.
- Pricing teams: see the minimum price that keeps your margin before you match a competitor.
- Agencies and analysts: a scheduled price and stock feed for client watchlists in Sheets or a database.
Output example
One row per variant (real row from a test run with a reference price and cost):
{"productUrl": "https://www.allbirds.com/products/mens-strider-explore","variantId": "41334293889104","title": "Men's Strider Explore - Natural Black (Dark Grey Sole)","variantTitle": "8","sku": "A11768M080","barcode": "196942208243","price": 130,"currency": "USD","available": false,"compareAtPrice": null,"changes": ["BASELINE"],"previousPrice": null,"referencePrice": 150,"unitCost": 95,"priceGapPercent": -13.33,"minimumPriceForMargin": 135.72,"marginPercentAtCompetitorPrice": 26.92,"canMatchAtTargetMargin": false}
This Actor watches the products you list (1 to 50 per run); it does not crawl a whole store catalogue. It never changes prices or touches Shopify Admin.
Is there an API for competitor Shopify prices?
Shopify's own APIs don't cover other people's stores. The Admin API needs access granted by the
store owner, and the Storefront API needs a token the store issues. What every public Shopify store
does answer is its storefront product endpoint (/products/<handle>.js), with variants, prices and
availability. This Actor reads that endpoint and adds what a one-off request doesn't give you:
change labels against your last run (price drops, rises, restocks, sell-outs), currency checks and
the price you can match at your target margin.
| Option | Other stores | Change detection and margins | Price |
|---|---|---|---|
| Shopify Admin API | No, only stores that grant you access | No | Free |
| Shopify Storefront API | Only with a token from the store | No | Free |
Your own script on /products/<handle>.js | Yes | You write and host it | Your time |
| This Actor | Yes, any public store with the standard endpoint | Built in | $0.005 per product check, all variants included |
Use it from code, n8n, Make and AI agents
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("sauliusautomatesit/shopify-price-margin-monitor").call(run_input={"watchlist": [{"productUrl": "https://www.beardbrand.com/products/fox-hunt-mens-cologne"}]},max_total_charge_usd=0.1,)for row in client.dataset(run.default_dataset_id).iterate_items():print(row["title"], row["variantTitle"], row["price"], row["currency"], row["available"])
run.default_dataset_id is for apify-client 3.x (pip install apify-client); on 2.x write run["defaultDatasetId"].
JavaScript (npm install apify-client), with your own price and cost to get the margin check:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('sauliusautomatesit/shopify-price-margin-monitor').call({watchlist: [{productUrl: 'https://www.beardbrand.com/products/fox-hunt-mens-cologne',variantId: '62111906529650',referenceCurrency: 'USD',referencePrice: 55,unitCost: 35,minMarginPercent: 25,}],}, { maxTotalChargeUsd: 0.1 });const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const row of items) {console.log(row.title, row.price, row.currency, 'gap', row.priceGapPercent, '% can match:', row.canMatchAtTargetMargin);}
Works with the Apify node in n8n, the Apify module in Make, Zapier, and AI agents such as Claude, ChatGPT and Cursor through the Apify MCP server. MCP server URL for this Actor only:
https://mcp.apify.com/?tools=sauliusautomatesit/shopify-price-margin-monitor
FAQ
Can I get a competitor's Shopify prices without their API key? Yes. Public storefronts publish product prices; paste the product URL and the Actor reads them without a login or key.
How do I track Shopify price changes over time? Save the SNAPSHOT record of each run and pass
it as previousSnapshot next time. Rows come back labelled PRICE_DOWN, PRICE_UP, BACK_IN_STOCK or
OUT_OF_STOCK.
Does it work on any Shopify store? On public storefronts that keep Shopify's standard product endpoints open. Stores that block them fail explicitly and are not charged.
Can I get alerts when a price drops? Run it on an Apify schedule with previousSnapshot and onlyChanges: true, then send the dataset to Slack, email or Sheets with an Apify integration, n8n or Make.
What does the margin check do? With your unit cost and target margin it returns minimumPriceForMargin and whether matching the competitor still meets your margin.
Input example
{"watchlist":[{"productUrl":"https://www.beardbrand.com/products/fox-hunt-mens-cologne","variantId":"62111906529650","referenceCurrency":"USD","referencePrice":55,"unitCost":35,"minMarginPercent":25}],"previousSnapshot":[],"onlyChanges":false}
The price and cost in that example are illustrative inputs, not the store's costs. Leave them out for ordinary monitoring. A comparison requires an exact variantId and referenceCurrency. Without variantId, the check returns the product's available API sample, up to 250 variants. A variant in the URL query is recognised. You may provide locale paths such as /en-gb/products/example.
What you get
- One dataset row per observed variant: title, SKU, barcode, displayed price, currency, availability, source URL and observation time.
- Change labels: BASELINE, PRICE_DOWN, PRICE_UP, BACK_IN_STOCK, OUT_OF_STOCK or CURRENCY_CHANGED.
- Optional comparison: price gap, minimum price for your chosen margin, and margin at the competitor's displayed price.
- PRICE-REPORT: changes, margin warnings, currency mismatches and coverage.
- SNAPSHOT: portable state for your next check. SUMMARY records failed checks and spending limits.
The margin floor is unitCost / (1 - minMarginPercent / 100), rounded up to the next cent. Include all costs you need in unitCost and use a consistent tax basis. Shipping, discounts, subscriptions, fees and product equivalence are not verified. A price mismatch across currencies disables the comparison. Availability is the public storefront flag; it is not an inventory quantity or a guarantee of checkout availability.
Pricing
$0.005 per completed product check before plan discounts. One watchlist entry is one check, including unchanged checks and all returned variants for that entry. Ten checks cost $0.05005 at the base tier, including one start event. Failed or malformed checks have no product-check charge. Setting onlyChanges does not make the check free. Compute, proxy and storage usage during the run are included.
Product-check prices: FREE $0.005, Bronze $0.00475, Silver $0.0045, Gold/Platinum/Diamond $0.00425. Actor start (apify-actor-start) is $0.00005, once per allocated GB, minimum one. Default memory is 256 MB, so one start event. Set a maximum run cost to control spending. Ordinary downloads and storage outside the run may incur Apify usage.
Coverage and repeat runs
The tool reads the public Shopify Ajax product API and cart currency endpoint without login or account cookies. Stores that block or disable those endpoints fail explicitly. Missing products, failed requests and missing variants are not labelled out of stock. Source APIs expose up to 250 variants; a missing variant may lie outside that sample. No product-removal inference is made.
Supported currencies: USD, EUR, GBP, CAD, AUD, NZD, CHF, SGD, HKD, SEK, NOK, DKK, PLN, CZK, HUF, RON, BGN, TRY, BRL, MXN, ZAR and INR. Other currencies fail explicitly. Prices reflect the returned storefront market, not every country's offer.
Pass SNAPSHOT only after SUMMARY.partial is false. Retain the previous complete snapshot after an incomplete run. Baselines belong to your workflow, so concurrent runs do not overwrite shared history. The first run is a baseline, not evidence of a new product or recent price change. A run where every attempted check fails is marked FAILED.
Use Apify's API/MCP tabs to integrate, or schedule your saved input through Apify. Repeat-run setup is available in the downloadable workflow linked below. No alerts are emailed and no store prices are changed by this Actor.
Download the repeat-run workflow
Download the Python workflow and example watchlists (ZIP). Requires Python 3.10 or newer and your APIFY_TOKEN. No additional Python packages are needed.
The workflow runs a watchlist, exports CSV and JSON, and saves the next baseline only after a complete run. It includes a per-run spending cap and a resume command for interrupted downloads. See the included README for setup. Schedule the command with your existing scheduler if you want recurring checks.