Shopify Price & Stock Monitor + Store Intelligence
Pricing
from $2.00 / 1,000 store intelligence records
Shopify Price & Stock Monitor + Store Intelligence
Monitor public Shopify product prices and availability across runs, export catalog data, and inspect store technology. Persistent watchlists and coverage-aware comparisons support repeat competitor research.
Pricing
from $2.00 / 1,000 store intelligence records
Rating
0.0
(0)
Developer
Inus Grobler
Maintained by CommunityActor stats
1
Bookmarked
10
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Shopify Store Intelligence: Products, Prices and Sales Opportunities
Analyze public Shopify storefronts to extract products, pricing, discounts, tech stack, social links, public business contact info, and opportunity scores for lead generation, competitor monitoring, and e-commerce research.
Use it as a Shopify store analyzer, Shopify lead finder, Shopify product scraper, Shopify competitor monitoring tool, and Shopify tech stack research actor.
What this actor does
- Detects whether a public storefront is likely Shopify.
- Returns one clean store intelligence record per valid store.
- Analyzes public product catalogs, prices, discounts, variants, collections, and availability.
- Detects visible Shopify apps and e-commerce tools from public storefront evidence.
- Scores agency, CRO, SEO, email/SMS, reviews, subscription, app-sales, and competitor-monitoring opportunities.
- Optionally outputs one row per public product.
- Optionally extracts public business contact information when visibly published.
- Monitors product, price, discount, availability, collection, and tech-stack changes across runs.
Who should use it
- Shopify agencies
- CRO and SEO agencies
- Paid ads agencies
- Shopify app sales teams
- E-commerce consultants
- DTC brands monitoring competitors
- Lead generation teams
- E-commerce investors and acquirers
- Market researchers
Use cases
- Find Shopify agency leads.
- Build Shopify store lead lists.
- Find Shopify app sales prospects.
- Monitor competitor products and prices.
- Track discounts and availability.
- Analyze Shopify tech stacks.
- Research DTC brands.
- Audit e-commerce stores for CRO and SEO opportunities.
- Monitor product catalog changes.
Run it in 30 seconds
Paste one or more Shopify store URLs:
{"storeUrls": ["https://colourpop.com"]}
That is enough for store opportunity analysis.
The input form is intentionally short. analysisType controls the extra behavior automatically:
storeOpportunitiesreturns store profiles: one row per Shopify store.productCatalogreturns a product list: one row per public product, with product fields as separate columns.agencyLeadsincludes visibly published public business contact fields.competitorMonitoringcompares against the previous run.
To get a list of products, choose Product list - one row per product in the input form, or set "analysisType": "productCatalog" in the API input.
Input examples
Agency lead scoring:
{"analysisType": "agencyLeads","storeUrls": ["https://colourpop.com","https://www.tentree.com"]}
Competitor price monitoring:
{"analysisType": "competitorMonitoring","storeUrls": ["https://colourpop.com"]}
Product list, one row per product:
{"analysisType": "productCatalog","storeUrls": ["https://colourpop.com"],"maxProductsPerStore": 500}
Output examples and dataset views
The actor has two main output shapes:
- Store profiles: one row per store, with flat lead, catalog, pricing, tech-stack, and opportunity fields.
- Product list: one row per product, with flat product columns such as
productTitle,productUrl,minVariantPrice,isDiscounted,available, andfeaturedImage.
The default store-profile output is one row per store, with important flat fields for CSV/Excel plus nested intelligence fields.
{"recordType": "store","storeDomain": "example-store.com","storeName": "Example Store","platform": "Shopify","platformConfidence": 0.98,"productCountEstimate": 428,"productsAnalyzed": 10,"averagePrice": 38.4,"discountedProductsPercent": 22.5,"reviewApp": "Judge.me","emailMarketing": "Klaviyo","overallOpportunityScore": 86,"agencyFitScore": 91,"topOpportunityTitle": "Subscription opportunity","estimatedStoreSize": "medium"}
Product-list mode outputs product records as the main dataset rows. Each product has separate spreadsheet columns for title, handle, URL, vendor, product type, tags, prices, compare-at prices, discount status, availability, variant counts, images, and source route. The full nested product object is also kept for API users who want the complete structure.
Monitoring keeps persistent history for the same stateKey watchlist across separate runs. Use different names for independent watchlists and avoid overlapping runs for the same watchlist. The first run establishes a baseline; later runs compare it. A product missing from a capped or partial sample is not reported as removed. Removal detection requires complete catalogs in both snapshots. Observed variant price and availability changes include the variant ID.
If a dataset-write response is uncertain, automatic monitoring replay stops to avoid duplicate billing. Inspect the previous Dataset before explicitly using resetState: true to create a fresh baseline. Confirmed changes from a spending-limited comparison are remembered until its baseline can be advanced.
Monitoring mode outputs change records for new products, removed products, price changes, availability changes, discount changes, new or removed collections, and visible tech-stack changes.
The Apify Output tab includes focused dataset views:
- Store overview: one-row-per-store lead intelligence.
- Agency leads: scores, public contact fields, and social links.
- Product rows: one row per product with spreadsheet-friendly product columns.
- Monitoring changes: price, product, availability, collection, and app changes.
- Run health: warnings, validation, cost, and charge counters.
Recommended public example tasks:
| Task | Input focus | Best for |
|---|---|---|
| Shopify agency lead scoring | analysisType: "agencyLeads" with 2-5 store URLs | Agencies and consultants qualifying prospects |
| Shopify product catalog export | analysisType: "productCatalog" and maxProductsPerStore | Product research, CSV exports, price analysis |
| Shopify competitor monitoring | analysisType: "competitorMonitoring" | Scheduled product, price, discount, and app-change tracking |
Store opportunity scores explained
Scores are deterministic and evidence-based. The actor does not claim revenue, traffic, conversion rate, or inventory quantity unless publicly visible.
overallOpportunityScore: combined B2B usefulness score.agencyFitScore: active store, meaningful catalog, public contact routes, and lead quality.croOpportunityScore: review gaps, discounting, policy/page gaps, upsell gaps, and product metadata.seoOpportunityScore: product/page coverage, blog/content signals, metadata, and schema evidence.emailSmsOpportunityScore: catalog size, DTC fit, discounts, and missing visible email/SMS tools.reviewsOpportunityScore: product pages with no visible review app or widget.subscriptionOpportunityScore: replenishable categories without a visible subscription app.appSalesOpportunityScore: Shopify fit, active store signals, and missing competing app category.competitorMonitoringValueScore: catalog size, discounting, and public price/availability data.
Tech-stack detection
The actor detects common storefront tools from public scripts, DOM markers, app snippets, CSS classes, globals, and visible widgets.
Examples include Judge.me, Loox, Yotpo, Okendo, Klaviyo, Omnisend, Attentive, Postscript, Recharge, Skio, Gorgias, Zendesk, Rebuy, Google Tag Manager, Meta Pixel, TikTok Pixel, Shop Pay, Klarna, Algolia, Searchspring, and more.
Tech-stack detection is based on public storefront evidence and may be partial when a store hides scripts, blocks bots, or loads apps only after user interaction.
Public contact info
Public contact extraction is disabled by default.
When enabled, the actor only extracts visibly published business contact details such as generic support, info, hello, or sales emails, public phone numbers, contact page URLs, and about page URLs. It does not submit forms and does not collect private customer data.
Pricing
Pricing is pay-per-event. You are charged only for valid useful records:
- Store records:
$2.00 per 1,000valid Shopify store intelligence records. - Product records:
$1.50 per 1,000valid public product rows in Product list mode. - Change records:
$1.00 per 1,000valid monitoring change records.
What counts as a paid result:
- A valid
storerecord with Shopify detected and statusokorpartial. - A valid
productrecord when product row output is enabled. - A valid
changerecord when monitoring detects a real public change.
What is not charged:
- Run summaries
- Warnings
- Invalid inputs
- Skipped stores
- Blocked stores
- Non-Shopify records
- Duplicate records
- Malformed records
- Products that are unchanged during monitoring
Pricing is based on measured Apify benchmark runs for store and product records. The default store analysis profile was cost-optimized after testing 512 MB, 1024 MB, and 2048 MB configurations. Change-record pricing is provisional until larger real monitoring-change volume is available.
The actor uses explicit pay-per-event records. Run summaries, warnings, skipped stores, and non-Shopify records are not charged as default dataset items.
Pricing and cost tips
- Basic store analysis is the cheapest mode.
- The default analyzes up to 10 public products per store to keep costs low.
- Product rows increase output volume and runtime.
- Higher
maxProductsPerStorevalues increase runtime. - Competitor monitoring is best for scheduled recurring runs.
- Browser fallback is disabled by default to keep runs cheap.
- Leave public contact extraction off unless you need visible business contact fields.
API examples
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('thescrapelab/shopify-store-opportunity-intelligence').call({storeUrls: ['https://colourpop.com'],analysisType: 'storeOpportunities'});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("thescrapelab/shopify-store-opportunity-intelligence").call(run_input={"storeUrls": ["https://colourpop.com"],"analysisType": "storeOpportunities",})if run is None:raise RuntimeError("Actor call returned no run or storage metadata")items = client.dataset((run["defaultDatasetId"] if isinstance(run, dict) else run.default_dataset_id)).list_items().itemsprint(items)
cURL:
curl "https://api.apify.com/v2/acts/thescrapelab~shopify-store-opportunity-intelligence/runs?token=$APIFY_TOKEN" \-H "content-type: application/json" \-d '{"storeUrls":["https://colourpop.com"],"analysisType":"storeOpportunities"}'
CSV and exports
Use the default one-row-per-store output for lead lists, agency prospecting, app prospecting, and competitor summaries.
Choose productCatalog when you want one row per product for product catalog exports, price tracking, or product research. In this mode, store profile records are not mixed into the main business output; product rows are the primary result.
The main store row includes CSV-friendly fields such as storeDomain, storeName, productCountEstimate, productsAnalyzed, averagePrice, discountedProductsPercent, reviewApp, emailMarketing, overallOpportunityScore, agencyFitScore, topOpportunityTitle, and estimatedStoreSize.
Product rows include CSV-friendly fields such as storeDomain, productId, productHandle, productTitle, productVendor, productType, productUrl, currency, minVariantPrice, maxVariantPrice, compareAtPriceMin, compareAtPriceMax, isDiscounted, discountPercent, available, availableVariants, totalVariants, featuredImage, sourceType, and sourceScrapedAt.
Competitor monitoring and change detection
Use:
{"analysisType": "competitorMonitoring","storeUrls": ["https://colourpop.com"]}
The first run stores a compact public state. Later runs compare against that state and output change records only when public product, pricing, availability, discount, collection, metadata, or visible app signals change.
Limitations
- Some stores disable public product JSON.
- Some stores block bots or hide data behind JavaScript.
- Exact revenue, traffic, conversion rate, and inventory are not available unless publicly visible.
- Product counts may be estimates.
- Tech-stack detection is based on public storefront evidence.
- Browser fallback costs more and is disabled by default.
- Public contact extraction only works when business contact details are visibly published.
- This actor is not affiliated with Shopify.
Privacy and compliance
This actor uses public storefront data only.
It does not:
- Access Shopify Admin
- Use Shopify Admin API
- Attempt login
- Scrape checkout
- Add items to cart
- Submit forms
- Scrape customer data
- Collect private information
- Solve CAPTCHAs
- Bypass access controls
- Use paid third-party enrichment APIs
FAQ
Is this a Shopify Admin API tool?
No. It analyzes public Shopify storefronts only.
Does it scrape private customer data?
No. It does not scrape customer accounts, checkout, carts, payment pages, private reviews, or private customer data.
Can it monitor price changes?
Yes. Use competitor monitoring to compare products, prices, discounts, availability, collections, and visible app signals across runs.
Can it output one row per product?
Yes. Choose Product list - one row per product in the input form, or set "analysisType": "productCatalog". The actor will output product records with separate product, price, discount, availability, and image columns.
Does it work without proxies?
Yes. The default public input does not require proxy setup. Advanced API users can still pass proxy configuration if they have a specific need.
Why are some stores partial?
Some stores block public routes, disable product JSON, load data through JavaScript, or expose only limited public information.
Why are product counts sometimes estimates?
Shopify stores do not always publish exact catalog counts. The actor estimates from public JSON routes, sitemaps, collections, and sampled product pages.
What does opportunity score mean?
It is a deterministic B2B usefulness score based on visible public evidence such as catalog size, app gaps, policy pages, social links, pricing signals, product data, and contact routes.
Can I use it for Shopify agency lead generation?
Yes. Use agency lead scoring to prioritize stores worth pitching for CRO, SEO, retention, ads, tech stack, content, or catalog work.
Can I use it for Shopify app sales prospecting?
Yes. The actor detects visible app categories and highlights stores where a competing app category was not detected.
Selected-product price and stock watchlists
Use analysisType: "productWatchlist" with productUrls to monitor up to ten selected HTTPS product pages per store (1,000 URLs total). Include storeUrls as usual. Reuse the same stateKey for repeat checks and run that watchlist serially. This focused workflow avoids scanning the entire catalog.
{"analysisType":"productWatchlist","storeUrls":["https://your-store.com"],"productUrls":["https://your-store.com/products/example"],"stateKey":"competitors","minPriceChangePercent":2,"watchChangeTypes":["price","availability"]}
Each successfully parsed product returns a product record containing structured offers, published prices, currency and availability. CHANGES.csv contains flat old/new price and stock evidence. WATCHLIST_SUMMARY reports coverage, failures and observation times. A first observation creates a baseline. Later comparisons match stable offer identities; unknown or missing products are not treated as removals. A currency change establishes a new comparison baseline and creates no price/stock alert. The price threshold filters price changes; availability alerts are selected separately.
The workflow requires public Shopify identity and complete structured product offers with price, currency and availability. Pages without those fields are reported as incomplete and receive no product event. Some themes or variant structures are unsupported; check the summary before relying on zero alerts. Locale paths and currency/country context remain separate; tracking and variant-selection query parameters are removed because the check covers the product's published offers.
Pricing follows the active run snapshot. Before the new store-check event activates, existing product/change events apply. When monitored-store-check is active, productWatchlist costs $0.030 per fully completed store check covering up to ten selected products, including unchanged successful checks. It replaces product/change/store events within that workflow; incomplete stores have no store-check event. The memory-dependent run-start event remains additional. CSV/coverage summaries have no custom event. Existing analysis modes and their billing remain available. Spending limits can produce partial delivery; repeat the same input/watchlist to finish confirmed pending output. An uncertain missing delivery stops for inspection rather than risking a repeat paid write.
Read a selected-product watchlist
Choose Selected products for observed price ranges, currency, stock, offer coverage and timestamps. Choose Watchlist coverage, or open Selected-product coverage and freshness, to see completed, failed and unattempted products. Table views select columns from the mixed dataset; use the coverage summary for per-product outcomes.
baseline: the first successful observation; no change is asserted.comparable: a prior same-currency observation is available. An unchanged check remains a completed observation.currency_rebased: the currency context changed; the Actor starts a new comparison context without reporting a price or stock change.- Incomplete source or delivery coverage is explicit. A failed fetch is not an out-of-stock or removed-product claim.
For a quick Console example, set analysisType to productWatchlist, use the same stateKey on later runs and supply the store and selected product URLs. Run the same watchlist serially.
{"storeUrls":["https://colourpop.com"],"analysisType":"productWatchlist","productUrls":["https://colourpop.com/products/magical-skies-shadow-palette-and-brush-set"],"stateKey":"my-competitor-products","minPriceChangePercent":2}
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("thescrapelab/shopify-store-opportunity-intelligence").call(run_input={"storeUrls": ["https://colourpop.com"],"analysisType": "productWatchlist","productUrls": ["https://colourpop.com/products/magical-skies-shadow-palette-and-brush-set"],"stateKey": "my-competitor-products",})for item in client.dataset((run["defaultDatasetId"] if isinstance(run, dict) else run.default_dataset_id)).iterate_items():if item.get("recordType") == "product":print(item["productUrl"], item.get("comparisonStatus"), item.get("offers"))
Sources must publish usable public Shopify product metadata. Coverage depends on the storefront, locale and currency; inventory quantities are not inferred. Current product/change event prices still apply. There is no additional completed-store fee.
Pricing activation and spending limits
New event pricing takes effect on the date shown in the Pricing tab. During any notice period, existing pricing continues. Runs use the pricing snapshot taken at startup; a running job does not switch event prices mid-run. Completed checks may be charged when their source facts are unchanged. Set a sufficient maximum run charge for a complete billable unit plus the memory-dependent start event; smaller limits return explicit partial coverage. Existing builds pinned by API clients retain their original event routing, so use the current default build for the updated workflow.