Shopify Variant Price & Stock Changes
Pricing
$1.00 / 1,000 shopify variant observations
Shopify Variant Price & Stock Changes
Monitor known public Shopify products at variant level. Compare prices, compare-at prices and purchasability with a prior snapshot, with currency checks and honest coverage reports.
Pricing
$1.00 / 1,000 shopify variant observations
Rating
0.0
(0)
Developer
Nathaniel Standridge
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Track price changes and public availability for known Shopify products. Each delivered variant includes its current price, compare-at price, currency, availability, and an explicit comparison with your previous snapshot. Use it for recurring competitor checks and catalog monitoring.
Start with a watchlist
Supply 1–30 public HTTPS product URLs in productUrls, for example a URL ending in /products/your-product-handle. Locale paths such as /en-ca/products/your-product-handle are preserved. Collection URLs, headless storefronts without the Shopify Ajax API, password-protected shops, authenticated prices, and currency or country query overrides are unsupported. Use the final storefront hostname; redirects are reported instead of followed.
On your first run, leave previousSnapshot empty. Export the dataset as JSON after the run. On the next run, paste those rows into previousSnapshot to compare matching variant IDs within the same storefront and locale context. The Actor does not automatically fetch previous runs or schedule itself.
Output and comparison
One dataset row represents one current, validated variant. priceRaw and compareAtPriceRaw preserve the exact Shopify Ajax integer amounts; price and compareAtPrice divide those values by 100 as decimal strings. No currency conversion is performed. Currency comes from the same locale's read-only cart.js response; its temporary anonymous session cookies are reused only for that product request and never saved.
changed: at least one of price, compare-at price or availability differs;changesgives field names and before/after values.unchanged: those three fields match a valid older observation in the same context and currency.first_seen: no matching prior row was supplied. This does not mean a newly launched product or variant.unknown: currency is unavailable, the baseline is malformed, duplicated, not older, or uses another context/currency. No change is invented.
available is Shopify's public purchasable flag. It is not an inventory quantity, reservation or guarantee of stock. Backorders, selling plans, discounts, shipping, taxes and checkout rules can affect what a buyer can purchase. Subscription prices are not compared. Rows disclose requiresSellingPlan when the source provides it.
Missing variants are never labeled removed. Failed sources produce no variant rows and no per-row charges. The separate OUTPUT report lists every input, failure code, coverage warning and delivery count. A valid empty product produces a complete empty result. Invalid variants are omitted and make coverage partial. Shopify limits this API to 250 variants; a response at that ceiling is explicitly marked potentially truncated.
Limits and billing
The default is 500 variants and 120 seconds of work. Maximums are 2,000 variants and 180 seconds, with a hard 20-second budget for each product's currency/product fetch. Keep the platform timeout at least 120 seconds above the work budget. Public Ajax GETs make at most three attempts for temporary network failures or HTTP 429, 500, 502, 503 and 504. Retries wait at least 1 then 2 seconds, respect a longer Retry-After, and stop when the remaining budget cannot accommodate that wait. A currency lookup with an outstanding server-requested pause stops that product rather than immediately requesting another endpoint on the same shop. Currency retries and socket timeouts use at most 8 seconds or half the remaining budget, whichever is smaller; a slow DNS lookup or streamed body can consume more, within the shared hard limit. Missing products, denied access, recognized access challenges, redirects and invalid responses are reported without retries or bypasses. Only documented public Ajax GET endpoints are requested; no cart updates, login or checkout operations occur.
Price: $1 per 1,000 delivered variant rows ($0.001 per row), including unchanged and currency-unknown observations. No startup fee or charge for source failures. Set Apify's maximum charge to control spend. Each row uses only Apify's native dataset-item billing event.
The result plan is frozen before delivery. Dataset writes disable automatic retries, retain a pending checkpoint and reconcile already delivered IDs on restart. An ambiguous unconfirmed write stops rather than risking duplicate rows or charges. Resuming the same run continues the original observation; start a new run for fresh data.
Data scope and reliability
The observation is the anonymous public storefront view from the Actor's network location, not a chosen buyer country or authenticated market. The locale URL and currency are part of the comparison checks; even matching currency does not establish identical tax or discount treatment over time. Reported changes are differences between observations, not proof of a global seller price edit. Regional market rules can change prices even when the URL and currency match. Product and currency requests are close together, not an atomic store snapshot. Protect the previous snapshot as your own business data.
Official references: Ajax Product API, Ajax Cart API, Ajax requirements and limits, Shopify monetary units.
Development
Run uv run python -B -m unittest discover -s tests -v inside this Actor directory. Dependencies and the Docker base are pinned. Tests cover compatible/incompatible comparisons, malformed sources, bounds, SSRF protection, deadlines, result caps, lost write responses, restart reconciliation and the actual pinned cloud client's retry behavior.