Shopify Product Stock & Price Monitoring
Track price and stock changes on any Shopify product page - competitors, suppliers, or your own catalog after a redeploy.
shopify-product-priceThe scenario
You source from a handful of Shopify brands that sell directly to consumers. When one of them drops a new colorway or marks a popular SKU back in stock, you want to know inside the hour, not the next day. Or - flipping it around - you run your own Shopify store and want to make sure that a recent theme deploy didn't accidentally hide the price on your top-selling product.
Either way the underlying need is the same: notice a structured change on a Shopify product page the moment it happens.
The problem
Shopify themes are conventional. The price, sale price, stock label, and title all live in predictable CSS classes - but those classes vary slightly from theme to theme, and from "Dawn" to a heavily customized template. You can't just hand someone a generic Shopify-watcher and have it work on every storefront.
What you actually need is one monitor per product, with selectors tuned to that store's theme, and a quiet-by-default delivery - fire only when something material changes.
How Verid solves it
The pre-built shopify-product-price template ships with a fallback selector chain that covers the common variants: [data-product-price], .product__price, .price__regular .price-item. You pass the product URL, optionally override the selectors for an unusual theme, and Verid handles the rest.
Use the template directly when the store's theme is standard. Drop down to a manual monitor when the theme is custom - same shape, just your selectors instead of the default chain.
Build the monitor
Extraction config
{
"method": "css",
"fields": {
"price": "[data-product-price], .product__price, .price__regular .price-item",
"sale_price": ".price__sale .price-item--sale",
"stock": ".product-form__inventory, [data-remaining-count]",
"title": "h1.product__title, h1.product-single__title"
}
}
The comma-separated selectors are tried in order; the first one that matches wins. This is what makes the same monitor work across Dawn, Debut, and most popular Shopify themes.
Predicate
{ "type": "any_field_changes" }
You generally want to know about any of these moving - price down, stock returning, title getting renamed for SEO. If you specifically only care about going from out-of-stock to in-stock, narrow it:
{ "type": "field_equals", "field": "stock", "value": "In stock" }
Create the monitor
Using the template (fastest):
curl -X POST https://api.verid.dev/v1/monitors/from-template/shopify-product-price \
-H "Authorization: Bearer vrd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Allbirds - Wool Runners",
"url": "https://www.allbirds.com/products/mens-wool-runners",
"deliveries": [{ "type": "email", "to": "buyer@example.com" }]
}'
Or via the SDK:
import { VeridClient } from '@verid.dev/sdk';
const client = new VeridClient({ apiKey: 'vrd_your_api_key' });
await client.monitors.createFromTemplate('shopify-product-price', {
name: 'Allbirds - Wool Runners',
url: 'https://www.allbirds.com/products/mens-wool-runners',
deliveries: [{ type: 'email', to: 'buyer@example.com' }],
});
What the webhook delivers
{
"id": "del_01H...",
"version": "2026-05-01",
"monitor_id": "9b1c…",
"run_id": "7e2a…",
"fired_at": "2026-05-08T12:00:00Z",
"diff": {
"fields_changed": ["sale_price", "price"],
"before": { "price": "$95.00", "sale_price": null, "stock": "In stock", "title": "Men's Wool Runners" },
"after": { "price": "$95.00", "sale_price": "$71.00", "stock": "In stock", "title": "Men's Wool Runners" }
}
}
In this delivery the regular price didn't move but a sale price appeared - a classic Shopify discount campaign.
Caveats & tips
- Variants are not a separate monitor. A Shopify product page shows one default variant at a time. To track size 9 vs size 10 individually, monitor each variant URL (Shopify appends
?variant=...) as its own monitor. - AJAX-loaded prices need browser mode. Some custom themes load price via JS after the initial HTML. If your monitor returns empty
pricefields on the first run, setfetch_mode: 'browser'on update. - Stock label varies by theme. "In stock" vs "Available" vs "Only 2 left" - predicates that use literal equality should match what your specific store actually outputs.
Related use cases
For pages outside the Shopify ecosystem, see competitor price tracking. For new-listing detection on a multi-product store, see Etsy shop new listings. And for the broader restock pattern, see restock alerts.
Related use cases
Ship this monitor today
5 monitors free, no credit card. Set up takes about a minute.
Get started free