Shopify Store Leads — Catalog Size, Apps, Contacts avatar

Shopify Store Leads — Catalog Size, Apps, Contacts

Pricing

from $4.50 / 1,000 qualified stores

Go to Apify Store
Shopify Store Leads — Catalog Size, Apps, Contacts

Shopify Store Leads — Catalog Size, Apps, Contacts

Find and qualify Shopify stores, or enrich domains you own. Each lead returns catalog size, price band, theme, installed apps, published policies, new products a month, emails, phones and socials. Filter by country, category, keyword, size, ships-to, price or apps. You pay only for rows you keep.

Pricing

from $4.50 / 1,000 qualified stores

Rating

0.0

(0)

Developer

Richard Feng

Richard Feng

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Shopify store leads with the numbers you need to qualify them — not just a domain and an email address.

Most Shopify lead lists tell you a store exists and hand you an email address. This one also tells you how big the store is, what it runs, and whether it is still trading — the product count, the price band, the theme, the installed apps, how many new products it publishes a month, and how many days since the merchant last published one.

Use it two ways, or both in one run:

  • Discover stores you don't know yet — filter by country, product category, keyword, catalog size or how recently the store published.
  • Enrich domains you already have — paste them in and get the full profile back.

You are never charged for a store a filter rejected. You pay for rows you keep.

How to use it

  1. Open the Actor and click Try for free.
  2. To profile stores you already know, paste their domains into Store URLs — one per line, gorjana.com or https://gorjana.com both work.
  3. To find new stores instead, leave Store URLs empty and set the filters: Countries, Product category, Keyword, Minimum products or Published a product within (days).
  4. Set Maximum stores to cap how many rows the run can return — this is the hard cap on what the run can charge you.
  5. Click Start, then download the results from the Storage tab as JSON, CSV, Excel or XML — or pull them from the API.

A run with the default input finishes in well under a minute. Start small, check the rows look how you expect, then raise Maximum stores.

Input

Everything is optional. With no input at all, the Actor discovers stores using its built-in seed list.

FieldTypeDefaultWhat it does
storeUrlsarrayDomains to profile. Set this and discovery is skipped entirely.
querystringKeyword matched against store name, description and domain.
categorystringProduct category, matched against the store's own product types.
countriesarrayTwo-letter country codes, e.g. ["US","GB"].
minProductsintegerSkip stores with fewer products than this.
maxProductsintegerSkip stores with more products than this.
activeWithinDaysintegerOnly stores that published a product this recently.
excludeKeywordsarrayDrop stores matching any of these words.
shipsToCountriesarrayOnly stores shipping to at least one of these countries.
minAvgPriceintegerMinimum average product price, in minor units — 5000 is 50.00.
maxAvgPriceintegerMaximum average product price, in minor units.
inStockOnlybooleanfalseOnly stores with something actually in stock.
hasAppsarrayOnly stores running these apps, by handle — klaviyo, judge-me, okendo.
appMatchModestringanyWhether hasApps means any of them or all of them.
excludeAppsarrayDrop stores running any of these apps — find stores that have not installed a competitor yet.
hasSocialsarrayOnly stores linking at least one of these networks — instagram, tiktok, facebook.
requireEmailbooleanfalseOnly stores that publish a business email address.
requirePhonebooleanfalseOnly stores that publish a phone number.
maxItemsinteger100Maximum stores to return. The hard cap on what the run can charge. To cap spend in currency instead, set Maximum total charge in the run options — the platform enforces it.
includeCatalogbooleantrueProduct/collection counts, price band, types, vendors.
includeContactsbooleantrueBusiness emails, phones and social profiles.
includeTechStackbooleantrueTheme, installed apps, accepted card brands.
useSeedbooleantrueStart discovery from the built-in list of verified stores.
ccIndexstringPin a specific Common Crawl index. Leave empty for the newest.
proxyobjectApify ProxyLeave this on — see the FAQ.

Find active US jewellery stores with a real catalog

{ "countries": ["US"], "category": "jewelry", "minProducts": 50, "activeWithinDays": 90, "maxItems": 500 }

Find mid-market stores that ship to you, are trading, and can be contacted

{ "shipsToCountries": ["US"], "minAvgPrice": 5000, "maxAvgPrice": 30000, "inStockOnly": true, "requireEmail": true, "maxItems": 200 }

Find stores already running an app you integrate with

{ "hasApps": ["klaviyo", "okendo"], "hasSocials": ["instagram"], "countries": ["US", "GB"], "maxItems": 200 }

Profile stores you already know

{ "storeUrls": ["gorjana.com", "allbirds.com"], "maxItems": 10 }

Output

One row per store. Real output, trimmed for length:

{
"url": "https://www.gorjana.com/",
"domain": "www.gorjana.com",
"myshopifyDomain": "gorjana.myshopify.com",
"name": "gorjana",
"description": "Complete your look with jewelry designed to layer...",
"country": "US",
"province": "California",
"city": "Laguna Beach",
"currency": "USD",
"languages": ["en"],
"shipsToCountries": ["AC", "AD", "AE", "..."],
"catalog": {
"productCount": 991,
"collectionCount": 573,
"priceMin": 3000,
"priceMax": 599000,
"priceAvg": 17746,
"pricedFrom": 250,
"productTypes": ["Anklets", "Bracelets", "Earrings", "Necklaces", "Rings"],
"vendors": ["Fine", "Layering Set", "Spring 2026 Fashion"],
"sizeBand": "large"
},
"activity": {
"newestProductUTC": 1789392506,
"oldestProductUTC": 1767224138,
"daysSinceLastProduct": 0,
"isActive": true,
"productsPerMonth": 29.7
},
"theme": { "name": "[RELEASE] 5.1.0 | Fixed 2", "id": 163612524675, "version": "" },
"apps": [{ "handle": "klaviyo", "name": "Klaviyo" }, { "handle": "okendo", "name": "Okendo" }],
"policies": [],
"announcementBarText": null,
"cardBrands": ["visa", "master", "american_express", "discover"],
"offersShopPayInstallments": true,
"contacts": {
"emails": ["customercare@gorjana.com"],
"phones": [],
"socials": {
"instagram": "http://instagram.com/gorjana",
"tiktok": "https://www.tiktok.com/@gorjana",
"facebook": "https://www.facebook.com/gorjanabrand",
"youtube": "https://www.youtube.com/@gorjanabrand",
"x": "https://twitter.com/gorjana_brand"
}
},
"discoveredVia": "input",
"scrapedUTC": 1789450857
}

Two conventions worth knowing: prices are integers in minor units, so 17746 means $177.46, and timestamps are epoch seconds.

productsPerMonth is what separates a store publishing 30 products a month from one that published its last 30 over four years — isActive calls both of them active.

policies is empty for this store because gorjana links its policies as ordinary pages rather than at Shopify's canonical /policies/… URLs, which is worth knowing before you filter on it. Across a sample of ordinary stores about eight in ten use the canonical form and return a list like ["refund-policy", "shipping-policy", "terms-of-service"] — but large direct-to-consumer brands mostly do not: of nine well-known ones checked, one published canonical policy URLs. Read an empty list as "not published at the canonical URL", never as "this store has no refund policy".

announcementBarText is the storefront's announcement bar, verbatim and in whatever language the merchant wrote it in — "FREE SHIPPING FOR ORDERS OVER £70", "DESCUENTO DEL 10% PARA COMPRAS SUPERIORES A 80€",

"Final Sale. No Returns or Exchanges."
It tells you what the store is promoting right now, which is the difference between a shop that is trading and one that is merely online. Null for gorjana, and for about four stores in ten.

What this Actor does not do

Stated up front so you can judge fit before paying.

  • The price band is a sample, not a census. Computed from up to 250 products; catalog.pricedFrom tells you how many were used. Product and collection counts are exact — the store reports those itself.
  • App detection sees the public storefront only. A purely back-office app with no asset on the page is invisible. A detected app is real; an undetected one is not proof of absence.
  • Contacts are business addresses, not people. It keeps role addresses (info@, support@, sales@) and drops anything shaped like a person's name. No named individuals, job titles or LinkedIn profiles — only what the business publishes about itself.
  • Discovery finds stores through their .myshopify.com address. Roughly half have a custom domain configured; a store only ever crawled at its custom domain may not be discoverable, though you can always profile it directly via storeUrls.
  • policies counts Shopify's canonical policy pages only. A store that hand-builds a /pages/refund-policy instead is reported as having none. Empty means "not published at the canonical URL", not "this store has no refund policy".
  • announcementBarText is the bar's text, not a parsed promotion. There is no free-shipping threshold, discount percentage or promo-code field, and that is measured, not an omission: the copy is written in the store's own language, so an English pattern would report every non-English store as running no promotion — and a percent-off pattern run over a storefront matches product prices, not promotions. You get the sentence; read it yourself. How much of a rotating bar you get depends on the theme. Where each slide sits in its own element you get one message; where the theme puts them all in one element you get them all, joined — tentree.com returns
    "FREE SHIPPING ON ORDERS OVER $100 FREE SHIPPING ENDS MONDAY. CODE: FREESHIP DEEPEST DISCOUNTS: 30-50% OFF SHOP NOW EVERY ITEM PLANTS 10 TREES"
    , which is four promotions at once. Where a theme splits one message across nested elements you get the innermost piece. Null means the store has no bar, or fills it in after the page renders.
  • productsPerMonth is measured over the sampled window. For a store with more products than the sample it is the recent rate; for a smaller store it is the lifetime average. It is null when the sample is too thin to support a rate.
  • The price filters compare each store in its own currency. minAvgPrice is matched against the store's own prices, so a run spanning several currencies is comparing numbers, not value. Pair them with countries when that matters.
  • Stores that don't answer are skipped, not guessed at — and cost you nothing.

Works well with

ActorUse it for
Shopify ScraperProducts and collections from a store this Actor found. The natural next step: qualify the store here, then pull its catalog there.
Schema Markup Scraper & SEO AuditorAudit the structured data and SEO of any store in your list.

FAQ

Do I need to configure the proxy? No — leave it on the default. Shopify limits requests per IP address, so the Actor rotates through Apify Proxy automatically. Turning the proxy off makes every store share one address and get refused together.

Is scraping these stores legal? Everything returned is data the store publishes openly on its own storefront for anyone to read — no login, no paywall, nothing personal. Contacts are limited to business role addresses the merchant chose to publish. You are responsible for how you use the output, including under GDPR, CAN-SPAM and local marketing rules.

How many stores can I get? As many as maxItems allows. For large runs, raise it and let the run work through the candidates; the Actor stops as soon as it has stored what you asked for.

Can I get results automatically? Yes. Schedule the Actor, or call it from the Apify API, or connect it to Make, Zapier, Slack, Google Sheets and the other Apify integrations. Results can also be pushed to a webhook when a run finishes.

Why are some fields empty? Not every store publishes everything. A store with no public email returns an empty contacts.emails rather than a guess. Empty means "not published", not "not checked".

Can you add a field or a filter? Yes — open an issue on the Actor and describe what you need.