Track Product Prices Across E-Commerce Sites (2026 Guide)
Monitor product prices across Amazon, Shopify, and any e-commerce site with structured data. Automated daily price snapshots with pay-per-result pricing.

Thirdwatch's Price Tracker extracts current prices, availability, and product metadata from any e-commerce site — Amazon, Shopify stores, and any storefront using JSON-LD or OpenGraph markup. Pass an array of product URLs, get structured price data back. Built for growth teams running competitive pricing analysis, ops teams monitoring supplier catalogs, and procurement teams tracking purchase-timing windows across dozens of stores simultaneously.
Why track product prices across e-commerce sites
Pricing in e-commerce is dynamic by design. According to a 2024 Profitero study, the average product on Amazon changes price 2.5 times per day, and major retailers adjust up to 30% of their catalog weekly. For growth and ops teams, the question is not whether prices change — it is whether you see the changes before your customers or competitors do.
The job-to-be-done is straightforward. A growth lead at a DTC brand tracks 200 competitor SKUs daily to adjust their own pricing within 24 hours of a competitor move. A procurement manager monitors supplier pricing across 5 wholesale sites to time bulk purchases at seasonal lows. An ops team at a marketplace watches seller pricing across categories to flag MAP violations. A product analyst tracks availability alongside price to detect restocking patterns. All reduce to product URLs + scheduled cadence + structured output with price, currency, availability, and platform detection.
The Price Tracker handles platform detection automatically. Amazon product pages, Shopify storefronts, and any site embedding structured data (JSON-LD, OpenGraph, meta price tags) all resolve to the same clean output schema — no per-site configuration needed.
How does this compare to the alternatives?
Three approaches for getting product price data into a pipeline:
| Approach | Coverage | Reliability | Setup time | Maintenance |
|---|---|---|---|---|
| Enterprise price-intelligence SaaS (Prisync, Competera, Intelligence Node) | Wide but vendor-curated | High | Weeks (onboarding + catalog mapping) | Vendor-managed, high annual contract |
| DIY scraping (Scrapy, Puppeteer, custom scripts) | Any site you build for | Variable (breaks on site changes) | Days to weeks per site | You maintain every parser |
| Thirdwatch Price Tracker | Amazon + Shopify + any JSON-LD/OG site | Production-tested multi-platform extraction | 5 minutes | Thirdwatch tracks site changes |
Enterprise SaaS bundles analytics dashboards with data collection. The Price Tracker actor page gives you the raw data layer at pay-per-result pricing — most teams build their own dashboards or feed data into existing BI tools for a fraction of the SaaS cost.
How to track product prices in 5 steps
Step 1: How do I set up authentication?
Sign in at apify.com (free tier, no credit card), open Settings, then Integrations, and copy your personal API token. Every example below assumes the token is in APIFY_TOKEN:
export APIFY_TOKEN="apify_api_xxxxxxxxxxxxxxxx"
pip install apify-clientStep 2: How do I run a price check on multiple products?
Pass product URLs from any supported site. The actor auto-detects the platform.
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("thirdwatch/price-tracker").call(run_input={
"urls": [
"https://www.amazon.com/dp/B09V3KXJPB",
"https://www.amazon.com/dp/B0BSHF7WHW",
"https://gymshark.com/products/vital-seamless-leggings",
"https://www.allbirds.com/products/mens-tree-runners",
"https://www.target.com/p/instant-pot-duo-7-in-1/-/A-87654321",
],
"maxRetries": 3,
"proxyCountry": "US",
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
for item in items:
status = "available" if item["availability"] == "In Stock" else "unavailable"
print(f"{item['productName']}: {item['currency']} {item['price']} ({status})")The urls array accepts any mix of Amazon, Shopify, and generic e-commerce URLs. The actor returns one record per URL with platform auto-detection.
Step 3: How do I build a daily price snapshot pipeline?
Store snapshots with timestamps to track price movements over time.
import json, datetime, pathlib
ts = datetime.datetime.utcnow().strftime("%Y-%m-%d")
snapshot = {"timestamp": ts, "products": items}
outdir = pathlib.Path("price_snapshots")
outdir.mkdir(exist_ok=True)
outdir.joinpath(f"prices-{ts}.json").write_text(json.dumps(snapshot, indent=2))
print(f"Snapshot saved: {len(items)} products at {ts}")Schedule the actor on Apify's scheduler at daily cadence (0 8 * * *) and snapshots accumulate without manual intervention.
Step 4: How do I detect price changes between snapshots?
Compare today's snapshot against yesterday's to surface meaningful movements.
import pandas as pd
today = pd.DataFrame(items)
yesterday = pd.read_json("price_snapshots/prices-2026-05-25.json")
yesterday = pd.DataFrame(yesterday["products"].tolist())
merged = today.merge(yesterday, on="url", suffixes=("_now", "_prev"))
merged["price_change"] = merged["price_now"] - merged["price_prev"]
merged["pct_change"] = (merged["price_change"] / merged["price_prev"] * 100).round(1)
movers = merged[merged["pct_change"].abs() >= 3.0].sort_values("pct_change")
print(f"{len(movers)} products with 3%+ price change:")
print(movers[["productName_now", "price_prev", "price_now", "pct_change"]])A 3% threshold filters out micro-fluctuations from rounding and currency conversion. Adjust the threshold based on your category — electronics move 5-15% in drops, while FMCG rarely moves more than 2%.
Step 5: How do I track availability alongside price?
The availability field flags stock status, which is critical context for pricing decisions.
stockouts = [p for p in items if p["availability"] == "Out of Stock"]
restocked = [p for p in items if p["availability"] == "In Stock"
and p["url"] in previous_oos_urls]
if stockouts:
print(f"WARNING: {len(stockouts)} products now out of stock")
if restocked:
print(f"RESTOCKED: {len(restocked)} products back in stock — check for price changes")Out-of-stock to in-stock transitions frequently coincide with price increases. Tracking both signals together gives ops teams a 24-48 hour window to act.
Sample output
A typical price check returns records like these. Three records weigh approximately 1 KB.
[
{
"url": "https://www.amazon.com/dp/B09V3KXJPB",
"productName": "Apple AirPods Pro (2nd Generation)",
"price": 189.99,
"currency": "USD",
"availability": "In Stock",
"brand": "Apple",
"rating": 4.7,
"platform": "amazon",
"success": true
},
{
"url": "https://gymshark.com/products/vital-seamless-leggings",
"productName": "Vital Seamless 2.0 Leggings",
"price": 52.00,
"currency": "USD",
"availability": "In Stock",
"brand": "Gymshark",
"rating": 4.5,
"platform": "shopify",
"success": true
},
{
"url": "https://www.allbirds.com/products/mens-tree-runners",
"productName": "Men's Tree Runners",
"price": 98.00,
"currency": "USD",
"availability": "In Stock",
"brand": "Allbirds",
"rating": 4.6,
"platform": "shopify",
"success": true
}
]The platform field tells you which extraction strategy resolved. success: true confirms clean extraction; success: false with partial data means the site returned a page but structured data was incomplete — useful for flagging URLs that need manual review.
Common pitfalls
Three things go wrong in production price-tracking pipelines. Currency inconsistency — if your URL list spans multiple country-specific storefronts (amazon.com vs amazon.co.uk), the returned currency field will vary. Always group analysis by currency or convert to a base currency before computing cross-store comparisons; mixing USD and GBP prices in the same rank table produces misleading competitive intelligence. Variant pricing — many product URLs resolve to a default variant (size, color) whose price differs from the variant your customer actually buys. The actor returns the price shown on the canonical URL; for variant-specific tracking, use the exact variant URL from the product page. Stale availability signals — some retailers show "In Stock" on product pages even when fulfillment is delayed 2-4 weeks. The actor reports what the page states; cross-reference with delivery-date estimates if stock freshness matters for your use case.
A fourth pattern worth flagging: promotional pricing and coupon-gated discounts. Some sites display a pre-coupon price in structured data but show a lower price visually after applying an auto-coupon. The actor extracts from structured data (JSON-LD, OG tags), which is typically the list price before promotions. For coupon-dependent pricing, track the base price as the floor and layer in coupon intelligence separately. A fifth consideration: rate limiting on high-volume URL lists. The actor handles retries internally via the maxRetries parameter, but passing 500+ URLs from the same domain in a single run may trigger the retailer's rate limiter. Split large same-domain batches into runs of 50-100 URLs with a few minutes between runs.
Related use cases
Frequently asked questions
Which e-commerce sites does the Price Tracker support?
The actor supports Amazon, any Shopify-powered store, and any site that embeds product data in JSON-LD, OpenGraph, or standard meta tags. This covers the vast majority of modern e-commerce platforms including WooCommerce, BigCommerce, Magento, and custom storefronts. The actor auto-detects the platform and applies the best extraction strategy for each URL.
How often should I run price snapshots?
For competitive monitoring, daily snapshots catch most meaningful price changes. For time-sensitive categories like electronics or flash-sale products, every 6 hours is ideal. Weekly cadence is sufficient for stable categories like furniture or industrial supplies. Use Apify's built-in scheduler to automate cadence without any infrastructure.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.