If you sell an app, a service or a wholesale product to online stores, the useful list is rarely "all Shopify stores". It is something like "UK skincare stores that already send email with Klaviyo but have no subscription app". This post builds exactly that list in two API calls, with real numbers from a run made on 13 November 2026.
Both steps use public data only: no login, no browser, no bot-protection tricks.
Step 1: pick stores by country and niche
Shopify Store Finder searches a database of 57,202 Shopify stores that appear in two open popularity lists (Chrome UX Report and Majestic Million). You filter by country, currency, keywords, domain extension, traffic rank and catalog size. Results come back ordered by popularity, so the first rows are the stores with the most traffic.
curl -X POST "https://api.apify.com/v2/acts/storesignal~shopify-store-finder/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"maxResults": 40,
"countries": ["GB"],
"keywords": ["skincare", "skin care"],
"minProducts": 20,
"maxProducts": 2000
}'
The database has 4,296 stores registered in the United Kingdom. 96 of them mention skincare in their name, description or domain, and 83 fit the catalog range above. The run returns the top 40 in about two seconds, because the Actor filters a bundled file and makes no network requests.
One record from that run:
{
"domain": "upcirclebeauty.com",
"url": "https://upcirclebeauty.com",
"trafficRank": 500000,
"name": "UpCircle Beauty",
"country": "GB",
"currency": "GBP",
"city": "London",
"productCount": 134,
"dataUpdatedAt": "2026-11-13"
}
trafficRank is the Chrome UX Report bucket: 500000 means the store is among the 500,000 most visited sites. productCount lets you drop both the tiny shops and the giant catalogs before you spend anything on enrichment.
Step 2: add installed apps and contacts
Pass the domain values to Shopify Store Intelligence. It reads each store's public pages and returns detected apps, public contact addresses and social profiles.
from apify_client import ApifyClient
client = ApifyClient("<APIFY_TOKEN>")
found = client.actor("storesignal/shopify-store-finder").call(run_input={
"maxResults": 40,
"countries": ["GB"],
"keywords": ["skincare", "skin care"],
"minProducts": 20,
"maxProducts": 2000,
})
domains = [s["domain"] for s in client.dataset(found["defaultDatasetId"]).iterate_items()]
analyzed = client.actor("storesignal/shopify-store-intelligence").call(run_input={
"storeUrls": domains,
"maxProductsPerStore": 0,
"proxyConfiguration": {"useApifyProxy": True},
})
stores = [
s for s in client.dataset(analyzed["defaultDatasetId"]).iterate_items()
if s["status"] == "ok"
]
maxProductsPerStore: 0 skips the catalog statistics, which this segment does not need. In our run 39 of the 40 stores returned ok and one was blocked (blocked stores are not charged).
Step 3: cut the segment
What the 39 stores run:
| App | Stores |
|---|---|
| Klaviyo | 32 |
| Gorgias | 16 |
| Judge.me | 14 |
| Trustpilot | 14 |
| Yotpo | 13 |
| Triple Whale | 13 |
| LoyaltyLion | 10 |
| Recharge | 9 |
The segment is a few lines of plain Python:
SUBSCRIPTIONS = {"Recharge", "Skio", "Ordergroove", "Bold", "Smartrr"}
segment = [
s for s in stores
if "Klaviyo" in s["apps"] and not SUBSCRIPTIONS & set(s["apps"])
]
with_email = [s for s in segment if s["contacts"]["emails"]]
In this run the segment is 16 stores, and 12 of them publish a contact email. Swap the two conditions for your own case. "Has a reviews app but no loyalty program" or "uses Gorgias, so support volume is real" are the same two lines.
A trimmed record from the segment:
{
"domain": "upcirclebeauty.com",
"storeName": "UpCircle Beauty",
"status": "ok",
"contacts": { "emails": ["hello@upcirclebeauty.com"] },
"apps": ["GemPages", "Google Tag Manager", "Klaviyo", "Microsoft Clarity", "Shopify Shop App", "Triple Whale", "Zipify"]
}
What this run cost
Both Actors are pay per result: $0.003 per store returned by the finder and $0.008 per successfully analyzed store. 40 stores listed and 39 analyzed is $0.43. The Apify free plan includes $5 of monthly credit, which covers about 450 stores through both steps.
Limits worth knowing
- The database is not every Shopify store. It holds stores that appear in the two popularity lists, so it leans toward stores with real traffic. Stores behind Cloudflare or another proxy are not detected.
- App detection reads the homepage HTML. An app that loads only at checkout or after a click is missed, so "no subscription app" means "none visible on the homepage". Check the store before you write to it.
- Keywords are substrings, so a store that mentions skincare once in its description also matches. Read the names before you send anything.
- The addresses returned are public company contacts. Whether you may email them depends on the rules that apply to you and the recipient (GDPR and ePrivacy in the EU and UK, CAN-SPAM in the US).
Have a list of domains instead of a niche? The first guide covers that direction: any domain list in, contacts and tech stack out.
Top comments (0)