Shopify Store Report — Catalog, Pricing, Discounts & Growth
Pricing
from $10.50 / 1,000 stores
Shopify Store Report — Catalog, Pricing, Discounts & Growth
Profile any Shopify store in one row: catalog size, price range, how much of it is discounted right now, stock depth, how many products launched in the last 30 days, assortment mix and theme.
Pricing
from $10.50 / 1,000 stores
Rating
0.0
(0)
Developer
tidyfeed
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Paste a store address. Get one row that tells you how that business is actually trading.
Catalog size, price range, how much of it is discounted right now, how deep those discounts run, how much is still in stock, and how many products they launched in the last 30 days. Paste a list of competitors and profile them all in a single run.
No API key. No login. No proxies. Nothing estimated.
What one row tells you
Two real stores, both read on 21 August 2026:
| allbirds.com | deathwishcoffee.com | |
|---|---|---|
| Products | 291 | 148 |
| Median price | $91 | $33 |
| % of catalog on sale | 53.3% | 18.2% |
| Average discount | 41.5% | 37.5% |
| % of variants in stock | 11.8% | 88.2% |
| New products, last 30 days | 0 | 5 |
| New products, last 90 days | 0 | 20 |
| Catalog age | 7.8 years | 12.8 years |
Read the first column: half the catalog marked down, discounts averaging 41%, nine variants in ten sold out, and nothing new launched in three months. Read the second: light discounting, shelves full, a steady trickle of new products.
Same category, same country, completely different trading positions — and you can see it in one line without opening a single product page.
Run the same two stores today and the numbers will have moved: three days after that snapshot Allbirds had ended the sale and sat at 0.3% discounted. That movement is the whole point of running this on a schedule.
What you get
One row per store.
| Group | Columns |
|---|---|
| Catalog | productCount, variantCount, avgVariantsPerProduct, avgImagesPerProduct |
| Pricing | priceMin, priceMedian, priceMax |
| Discounting | productsOnSale, percentOnSale, avgDiscountPercent, maxDiscountPercent |
| Stock | variantsInStock, percentInStock |
| Momentum | productsAdded30d, productsAdded90d, newestProductAt, oldestProductAt, catalogAgeDays |
| Assortment | topVendors, vendorCount, topProductTypes, productTypeCount |
| Storefront | themeName, socialInstagram, socialFacebook, socialTiktok, socialYoutube, analyticsGa4, analyticsGtm, detectedTools |
| Provenance | feedSource, usesCustomStorefront, catalogTruncated, status, scannedAt |
Nothing here is estimated
Every number is computed from the catalog the store publishes itself, then shown to you. There is no revenue model, no traffic guess, no risk score invented from a formula.
That is a deliberate limit, and it is the point: you can verify any figure in this report by opening the store yourself. A field this actor cannot read — a theme a headless storefront does not expose, a pixel loaded server-side — comes back blank rather than filled in with a guess.
What it costs
One charge per store profiled. A store that returns nothing is not billed.
Reading a store means walking its entire catalog, not sampling the front page — a 1,300-product store is 1,300 products of arithmetic behind that single row.
Typical uses
- Competitor screening — profile 50 stores, sort by discount depth or launch rate, then look closely at the three that matter.
- Sale-season watch — schedule it weekly and watch
percentOnSaleandavgDiscountPercentmove across a whole category. - Sourcing and partnerships — find stores that are actually launching product rather than clearing stock.
- Lead qualification — catalog size, price band and assortment tell you in one row whether a store is worth a pitch.
- Feeding an AI agent — callable over the API and through MCP, so an assistant can profile a store mid-task.
Input
| Field | What it does |
|---|---|
| Shopify store URLs | One or more addresses. A bare domain, a homepage, a product page or a .myshopify.com address all work. |
| Max products to read per store | How deep to read each catalog before summarising. Default 3000, which covers almost every store outright. Runs that hit the cap are flagged as catalogTruncated. |
| Include theme, socials and marketing tools | Reads the storefront page for theme, social profiles, analytics IDs and recognisable marketing apps. On by default. |
{"storeUrls": ["allbirds.com", "deathwishcoffee.com", "rothys.com"],"maxProductsScanned": 3000}
How it works
Shopify serves a public product feed at /products.json on every storefront. This actor walks that feed 250 products at a time, computes the profile from the whole catalog, and reads the storefront page once for theme and marketing signals.
Headless storefronts are followed to their real shop. A growing number of brands run a custom front end on their own domain, so brand.com/products.json answers with a web page instead of a feed. This actor reads the shop address the site publishes in its own markup and profiles the catalog from there — the row is marked usesCustomStorefront so you know.
Because it uses the store's own public feed it needs no proxies, and it does not break when a theme changes.
Honest limits
Worth knowing before you run it:
- Stock figures are what the feed publishes, from the United States. Shopify exposes an in-stock/out-of-stock flag per variant, never a quantity — and for stores running separate regional markets, that flag reflects the market the request lands in. Runs here originate from US servers, so stock reads as a US shopper sees it. Measured: one store reported 46.6% of variants in stock from the US and 0.1% from Asia on the same day. Price, discount, catalog and momentum figures are unaffected.
- Currency is not published in the feed, so prices are reported as plain numbers in the store's own currency.
- Theme, analytics IDs and marketing tools are best-effort. Modern storefronts load a lot of this server-side or through Shopify's pixel API, where it simply is not visible. Blank means "not readable", not "not used".
- Launch dates come from the publish date, not the admin date. Shopify stores two timestamps per product:
created_at, when the record was made in the admin, andpublished_at, when it actually appeared in the shop. Brands often create records months ahead. Measured 9 September 2026 on gymshark.com's first 750 products: 421 were published in the previous 30 days and 0 were created in them. Only the publish date describes what a shopper saw appear, so that is the one used here. productsAdded30dcounts catalog records, not restocks. A product re-published or migrated will look new.- A truncated scan leaves the launch figures empty on purpose. If the run stops at your product cap, or a storefront cuts it off partway,
productsAdded30d,productsAdded90d,newestProductAt,oldestProductAtandcatalogAgeDayscome back blank andcatalogTruncatedistrue. The feed's order is the store's own and it is not consistent between them: a 600-product cap reported 0 recent launches for one store and 600 of 600 for another on the same day. A number drawn from part of a catalog would not describe the store, so none is given. Raise the cap to fill them in — the price, stock and assortment figures still describe what was read. statussays whether the figures can be trusted.okmeans the whole published catalog was read, or exactly the cap you set. Anything else names what stopped it, such asPartial scan — stopped at page 7 — Blocked by the storefront's bot protection (HTTP 429).- Password-protected, pre-launch and feed-disabled stores return nothing, with a per-store reason in the
statuscolumn. - A few brand domains sit behind bot protection. Those are reported rather than failing the run; the store's
.myshopify.comaddress usually works in their place.
Scheduling
Trading positions move. Schedule this weekly against a list of competitors and each run stores a dated snapshot — discount depth and launch rate over time is the shape of a category, and this is all it takes to record it.
Changelog
9 September 2026 — build 1.0.7. Two corrections to figures published since launch on 21 August 2026:
- Launch-date fields used the wrong timestamp.
productsAdded30d,productsAdded90d,newestProductAt,oldestProductAtandcatalogAgeDayswere computed fromcreated_at(the admin record date) instead ofpublished_at(the date the product went live). On stores that prepare products ahead of release this under-counted launches — in one measured case reporting 0 where 421 was correct. Runs made before this build should not be relied on for these five fields. - Interrupted scans were reported as
ok. A scan cut off by bot protection now reportsPartial scan — …instatus, setscatalogTruncatedtotrue, and leaves the five launch-date fields empty rather than reporting a figure drawn from part of the catalog.
Price, discount, stock and assortment figures were unaffected.
Legal
This actor reads only data that a Shopify store publishes publicly, at addresses the store itself serves to anyone. It collects no personal data, requires no login, and bypasses no access control. You remain responsible for how you use the exported data.
Questions, or a store that behaves oddly? Open an issue on the actor — issues are read and answered.