Shopify New Product Monitor - Competitor Launches
Pricing
from $2.00 / 1,000 new product reporteds
Shopify New Product Monitor - Competitor Launches
Watch any Shopify store on a schedule and get only the products it launched recently. Remembers what it already reported between runs, so a daily schedule alerts you once per product instead of resending the whole catalogue. Scanning is free - you pay only for new arrivals.
Pricing
from $2.00 / 1,000 new product reporteds
Rating
0.0
(0)
Developer
DONGMIN KIM
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Shopify New Product Monitor — Track Competitor Launches on a Schedule

Watch any set of Shopify stores and get only the products they just launched. Put it on a daily schedule and it tells you what your competitors shipped yesterday — not their whole catalogue, every morning, forever.
The part that actually matters
This actor remembers what it has already reported, in a named store that persists between runs. Run it daily and each new product reaches you exactly once.
That sounds obvious and it is easy to get wrong: Apify's default key-value store is scoped to a single run, so a monitor that keeps its history there silently forgets everything and re-alerts the entire back catalogue on every run. This one uses a named store, and the behaviour is covered by a test.
You can point several watchlists at different memory stores, or clear the store in the Console to start fresh.
Input
{"storeUrls": ["competitor-one.com", "competitor-two.com"],"withinDays": 7,"dateField": "published_at","onlyUnseen": true,"onSaleOnly": false,"maxProductsScanned": 2000}
- withinDays — for a daily schedule,
7is sensible: wide enough to survive a missed run, narrow enough not to flood you. - dateField —
published_atis when shoppers could first see it.created_atis when it was added, which can be much earlier for a planned drop. Usecreated_atif you want the earliest possible warning.
Every option
The same wording you see in the Apify console, with the JSON key for API and MCP callers.
| Option | What it does | Default |
|---|---|---|
Shopify stores to watch — storeUrls (required) | Bare domains or any URL on the store. Watch as many competitors as you like in one scheduled run. | — |
Consider new if launched within (days) — withinDays | Products older than this are ignored. For a daily schedule, 7 is a sensible window — it covers a missed run without flooding you. | 30 |
Date to judge by — dateField | published_at is when the store made it visible to shoppers. created_at is when it was first added, which can be much earlier for planned drops. | "published_at" |
Only report products not seen before — onlyUnseen | Remembers reported product IDs between runs, so a schedule alerts you once per product. Turn off to always emit everything in the window. | true |
Memory store name — memoryStoreName | Named key-value store holding the IDs already reported. Change it to run two independent watchlists, or clear that store in the Console to start alerting from scratch. | "shopify-new-arrivals-seen" |
Only new products already discounted — onSaleOnly | Narrow to launches that arrived with a compare-at markdown. | false |
Max products scanned per store — maxProductsScanned | The catalogue is read to find recent items. Raise for very large stores, lower to cut cost. You are only billed for the new products reported, never for scanning. | 2000 |
Concurrency — concurrency | Stores processed in parallel. Raise it when watching many competitors at once. | 3 |
Proxy — proxyConfiguration | Leave the default. | {"useApifyProxy":true} |
Output
Newest first, one row per new product — the same full product shape the store scraper delivers, plus two fields only a monitor can know.
{"storeDomain": "competitor-one.com","productId": 8123456789012,"title": "Wool Runner Mizzle","handle": "wool-runner-mizzle","url": "https://competitor-one.com/products/wool-runner-mizzle","vendor": "Allbirds","productType": "Shoes","tags": "new,mens,wool","createdAt": "2026-08-09T11:02:00-04:00","publishedAt": "2026-08-10T14:00:00-04:00","updatedAt": "2026-08-11T08:30:00-04:00","ageDays": 2,"firstSeenAt": "2026-08-12T17:20:04.113Z","minPrice": 135,"maxPrice": 135,"onSale": false,"inStock": true,"variantCount": 9,"availableVariantCount": 9,"imageUrl": "https://cdn.shopify.com/…","imageCount": 5,"options": [{ "name": "Size", "values": ["9", "10", "11"] }],"description": "Water-repellent wool.","variants": [{ "variantId": 1, "title": "9", "sku": "WRM-9", "price": 135, "available": true, "option1": "9" }]}
Every field
You are billed per new product delivered, so here is everything a row can contain. A field is absent when the store did not publish it.
| Field | What it is |
|---|---|
firstSeenAt | When this actor first reported the product. Only a monitor can know this; the store does not publish it. |
ageDays | Days between the product's date field and this run, so you can tell a same-day drop from a backfill. |
storeDomain | Which store the row came from, so a multi-store run reads without a join. |
productId | Shopify's numeric product id. It is also the key the run-to-run memory uses. |
title | Product title. |
handle | The URL slug — the stable key across renames. |
url | Canonical product URL. |
vendor | Brand as the store records it. |
productType | The store's own product type. |
tags | The store's tag string. |
createdAt | When the product was created in the store's admin. |
publishedAt | When it went live on the storefront. Usually the field you want Date field set to. |
updatedAt | Last edit of any kind. |
description | Body copy with HTML stripped. |
options | The option axes, each with name and values. |
imageUrl | First image. |
imageCount | How many images the product has. |
variantCount | Number of variants. |
availableVariantCount | How many are in stock. |
inStock | true when any variant is available. |
minPrice / maxPrice | Live price range at launch — the number that dates fastest, which is the point of catching it now. |
compareAtPrice | Highest compare-at price found. |
onSale | true when a compare-at price sits above the live price. A launch already on sale is worth knowing. |
discountPercent | That markdown as a whole-number percent. |
variants | Per-variant rows: variantId, title, sku, price, compareAtPrice, available, requiresShipping, grams, option1–option3. |
Who this is for
- Competitive intelligence teams — wire the dataset to Slack or email through a webhook and know about a launch within a day.
- Retail buyers — catch drops early on the stores you resell.
- Affiliate and content publishers — auto-publish a weekly roundup from a run that only ever returns what is new.
- Trend watchers — watch ten stores in a category and see what they all start stocking.
Common uses
- Competitor launch alerts — wire the dataset to Slack or email via an Apify webhook and know within a day.
- Trend spotting — watch ten stores in a category and see what they all start stocking.
- Retail buying — catch drops early on stores you resell.
- Content and affiliate sites — auto-publish "new this week" roundups.
- Launch archives — accumulate a dated record of everything a brand released.
Pricing
Pay per new product reported. Scanning costs almost nothing — reading a catalogue is billed at $0.00002 per run — the platform's $0.00001 minimum, once per GB, on 2 GB — and everything beyond that is charged only for the new arrivals it surfaces. On a steady daily schedule most runs report a handful of products, or none, and cost two thousandths of a cent.
Other Actors in this family
Same engines, same billing, no account or API key on any of them.
YouTube & video
- YouTube Scraper — No API Key, Any URL or Search — Any YouTube URL or search term in, videos out — with subtitles, comments and sponsor deals as add-ons.
- Download YouTube Subtitles in Bulk — SRT, VTT & Text — Bulk subtitles from videos, channels or playlists — text, SRT, VTT or RAG chunks.
- Export YouTube Comments to CSV — Replies and Likes — Every comment and reply thread, with likes, authors and creator flags.
- List Every Video on a YouTube Channel — Export to CSV — A channel's whole back catalogue plus a subscriber and RSS summary row.
- Find YouTube Sponsors — Brand Deals, Codes & Links — Which brands pay which creators, with the campaign link, the code and the timestamp.
- YouTube Search API — Bulk Results, No Quota — Many search terms at once, every result as a row, filtered before you are billed.
- Track Deleted YouTube Videos & Title Changes — What a channel quietly changed: deleted videos, rewritten titles, view velocity.
- YouTube Creator Email Finder & Sponsor Lookup — A channel list into leads: the published email, audience bands, and who already sponsors them.
- Export a YouTube Playlist to CSV — Every Video — Any playlist as a table, with each video position in it.
Search demand
- AnswerThePublic Alternative — Autocomplete Keyword API — One seed into hundreds of real keywords from Google, YouTube and Amazon autocomplete.
- Google Trends API — Today's Trending Searches, No Key — Today's trending searches by country, with traffic bands and the news behind them.
E-commerce
- Export Any Shopify Store's Products to CSV or JSON — Any Shopify catalogue: variants, SKUs, live prices, stock, images, collections.
- Shopify Store Email Finder — Qualified B2B Leads — A domain list into qualified leads: contact email, size, price band, and whether the shop still trades.
- Website Tech Stack & Email Finder for B2B Lists — Any domain list into leads: contact email, what the site runs on, and the marketing tags it carries.
Hiring
- Greenhouse, Lever & Ashby Job Scraper — No API Key — Paste a company domain, get its open roles from Greenhouse, Ashby, Lever or SmartRecruiters.
- Ghost Job Detector — Track Reposts, Closures & Edits — What changed on a careers page: opened, closed, quietly reposted, or a ghost job.
Run it from code
Nothing here needs a login to the source, only your Apify token.
HTTP — start a run and wait for the rows:
curl -X POST "https://api.apify.com/v2/acts/gganbukim~shopify-new-arrivals-monitor/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "content-type: application/json" \-d @input.json
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('gganbukim/shopify-new-arrivals-monitor').call(input);const { items } = await client.dataset(run.defaultDatasetId).listItems();
Python
from apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("gganbukim/shopify-new-arrivals-monitor").call(run_input=input)items = client.dataset(run["defaultDatasetId"]).list_items().items
Scheduled or event-driven — attach a schedule to run it on a cron, or a webhook to push each finished run into your own endpoint. It also connects through Apify's Zapier, Make, n8n and LangChain integrations, and is reachable from an MCP server if you are driving it from an agent.
Standby / API mode — the run above is synchronous: one call in, rows out, no polling. That is the shape to use if you are calling this per request rather than in a batch.
Errors, limits and what you are charged for
- You pay for delivered rows only. A row your filters removed, a page that failed, a retry — none of it is billed. Starting a run costs $0.00001: the platform minimum, charged once per gigabyte, and this Actor runs on 512 MB.
- A run that delivers nothing still costs the start fee and nothing else. If the input resolved to zero items, the run fails loudly with the reason rather than finishing green on an empty dataset.
- Blocking is handled by changing address, not by waiting. The Actor starts on cheap datacenter proxies and moves up only after a tier has actually been refused several times in a row, then drops back down once the cheap tier answers cleanly again. You are not paying for residential bandwidth that was never needed.
- Rate limits belong to the source, not to this Actor. Very large inputs are worked through in batches; the run reports how many items succeeded, were filtered, and failed, so a partial result is never presented as a complete one.
- Dataset retention follows your Apify plan. Export what you need, or push it out with a webhook, if you want it past that window.
Is this legal?
This Actor reads pages and public endpoints that anyone can open in a browser without an account. It does not log in, does not defeat a paywall, and does not touch anything behind authentication.
Scraping public data is broadly lawful in the US and the EU, and courts have repeatedly said so — but "public" is not the same as "unrestricted", and what you may then do with the data is a separate question from whether you may collect it. Personal data pulls in the GDPR and similar regimes whatever the source, so if your rows contain people, you need a lawful basis for keeping them.
Apify publishes a fuller treatment in Is web scraping legal? and an ethical scraping guide. None of this is legal advice; if the use is commercial and the data is personal, ask someone qualified.
Something wrong, or missing?
Open an issue on the Actor's Issues tab — it goes straight to the developer and is the fastest route. Include the run ID; it carries the input and the log, which is usually enough to reproduce the problem without another round trip.
Sources change without warning, and a field that quietly goes null is worth reporting even if the run succeeded. A broken parser looks exactly like a quiet day in the data until someone says so.
FAQ
Will I get blocked or rate-limited? It reads /products.json, the endpoint Shopify serves on every shop, on cheap datacenter proxies. Monitoring the same stores daily does not change that — the endpoint is built to be polled, and no login is involved.
Will the first run report everything? Yes — on the first run every product inside your date window is new to it. After that it only reports genuine arrivals. Set a small withinDays for the first run if you want a quiet start.
What if a run is interrupted? Only products actually reported are remembered, so the rest come through on the next run instead of being lost.
Can I watch many stores? Yes, in one run. Each store's history is tracked separately.
Does it detect price changes too? No — this one is about new products. Use the Shopify Store Scraper on a schedule and diff the results for price tracking.
Can I run it on a schedule? That is the point. Apify Schedules, webhooks, or the API. Also available over MCP for AI agents.
Is it legal to monitor a competitor's Shopify store? This reads the public
/products.json endpoint Shopify serves on every storefront — no login, nothing
bypassed. What a shop lists for sale is public commercial fact, and watching a competitor's
public catalogue is ordinary market research. Each store's own terms are a separate
contract question. Not legal advice.
How much does 1,000 new products cost? $2.00, plus $0.00002 for the run. Scanning is free — you are billed only for genuinely new arrivals, so a daily watch on a quiet store costs almost nothing.
Can I export the results to Excel or Google Sheets? Yes. Every run's dataset downloads as CSV, Excel, JSON, XML or RSS from the Storage tab, or straight from the API if you want a live link a spreadsheet can pull.
Can I connect it to Zapier, Make or n8n? Yes — Apify publishes integrations for all three, plus webhooks that fire when a run finishes. A common setup is a schedule here and a webhook into your own database or Slack.
Do I need to write code? No. Fill the form in the console and press Start. If you do want code, the Apify client libraries for Python and JavaScript call this the same way, and it is available over MCP so an AI agent can call it directly.

