How to find Shopify stores using a specific app (and turn it into a lead list)
If you sell to Shopify merchants, as an app developer, an agency or a freelancer, the best lead is a store that already uses a tool like yours, or just stopped using it. A store running a competitor's reviews app has a reviews budget. A store that uninstalled it last week is actively looking.
This guide shows a repeatable workflow:
- Build a list of candidate store domains
- Detect the apps, theme and stack of every store in bulk
- Filter for the app you care about
- Turn on monitoring to catch installs and uninstalls
- Use the data responsibly
We'll use the Shopify App & Theme Detector on Apify. It costs $0.005 per analyzed store ($5 per 1,000), and non-Shopify, unreachable and duplicate domains are free.
How app detection works (and its limits)
Shopify apps leave fingerprints in a store's public storefront: script tags from the app's CDN (for example klaviyo.com, judge.me, rechargecdn.com), theme app extension "app embeds", and web pixels. The detector loads each store's public homepage and matches it against 130+ app signatures. It also auto-detects app embeds, even for apps that aren't in the signature list.
Limits to keep in mind:
- Back-office apps are invisible. Apps that never touch the storefront (accounting, inventory, some fulfillment tools) can't be detected from outside. No tool can see them without store access.
- Some apps only load on product or cart pages. Homepage detection catches the vast majority of marketing, reviews, subscription, upsell and support apps, but not 100%.
- Password-protected and blocked stores are reported as such, and you aren't charged for them.
Step 1: Build a list of candidate stores
The detector analyzes the domains you give it, so start with a list. Good sources:
- Your niche. Brands in "sustainable fashion", "coffee" or "pet supplies" from marketplace lists, award lists, Instagram shops and "best X brands" articles. Many DTC brands run on Shopify.
- Search engines. Queries like
"powered by shopify" coffeeorsite:myshopify.com <niche>surface stores in a niche. - Your existing CRM or a purchased company list. Enrich domains you already have.
- Public datasets. Common Crawl or open e-commerce domain lists, if you want large volumes.
Don't worry about cleaning the list. Non-Shopify domains come back as isShopify: false and cost nothing.
Step 2: Detect apps in bulk
No code: open the Actor page, paste domains into Store URLs or domains and click Start. A typical store takes 1–3 seconds. Download the result as CSV, Excel or JSON.
With code (Node.js, npm i apify-client):
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("ninoventures/shopify-app-tech-detector").call({
stores: ["allbirds.com", "tentree.com", "deathwishcoffee.com", "colourpop.com"],
countProducts: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, "stores analyzed");
Python (pip install apify-client):
from apify_client import ApifyClient
import os
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("ninoventures/shopify-app-tech-detector").call(
run_input={"stores": ["allbirds.com", "tentree.com"], "countProducts": True}
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
Each row looks like this (shortened):
{
"domain": "www.allbirds.com",
"isShopify": true,
"status": "ok",
"storeName": "Allbirds",
"country": "US",
"currency": "USD",
"theme": { "name": "[DNAM Theme July 2026]", "isCustomTheme": true },
"appCount": 5,
"apps": [
{ "name": "Attentive", "category": "Email & SMS marketing", "evidence": "attn.tv" },
{ "name": "Redo", "category": "Returns & shipping protection", "evidence": "getredo.com" }
],
"appCategories": ["Analytics & CRO", "Email & SMS marketing", "Returns & shipping protection"],
"productCount": 356,
"priceRange": { "min": 0.8, "max": 165 },
"contactEmail": "help@allbirds.com",
"socialLinks": { "instagram": "https://www.instagram.com/allbirds" }
}
Step 3: Filter for the app you care about
Say you build a reviews app and want stores that use Judge.me or Yotpo, sell in USD and have a real catalog:
const TARGET_APPS = ["Judge.me", "Yotpo"];
const leads = items
.filter((s) => s.isShopify && s.status === "ok")
.filter((s) => s.apps?.some((a) => TARGET_APPS.includes(a.name)))
.filter((s) => s.currency === "USD" && (s.productCount ?? 0) >= 50)
.map((s) => ({
store: s.storeName,
domain: s.domain,
uses: s.apps.filter((a) => TARGET_APPS.includes(a.name)).map((a) => a.name).join(", "),
products: s.productCount,
theme: s.theme?.name,
instagram: s.socialLinks?.instagram ?? "",
}));
console.table(leads);
Other useful filters:
- By category, not brand:
s.appCategories.includes("Subscriptions")finds every store with any subscription app. - Gaps: stores with a high
productCountbut no reviews app are prospects for one. - Stack fit:
theme.isCustomThemesignals a bigger brand with a dev team. A Theme Store theme signals a smaller merchant. - Catalog size and price range to estimate store size and AOV.
Step 4: Monitor installs and uninstalls (the best signal)
A static list tells you who uses an app. Changes tell you who is deciding right now.
- Enable Monitoring mode and set a Monitoring storage name (for example
reviews-competitors). - Run once to save a baseline.
- Schedule the Actor daily or weekly with the same store list.
- Enable Output only stores with changes to get a pure change feed. You're not charged for unchanged stores.
Every changed row then includes:
"monitoring": {
"appsInstalled": ["Rebuy"],
"appsRemoved": ["Privy"],
"themeChanged": null,
"hasChanges": true
}
Pipe that into Slack, Google Sheets, Make, Zapier or a webhook through Apify integrations, and you get an alert the day a store drops your competitor.
Step 5: Use the data responsibly
The detector only reads public storefront pages, the same thing any visitor's browser sees. It respects robots.txt if you enable that option, and it doesn't log in anywhere. How you use the results is up to you:
- Outreach rules differ by country. B2B email to companies is regulated by laws like GDPR and ePrivacy in the EU/UK and CAN-SPAM in the US. Use public business addresses, be relevant, identify yourself and make opting out easy.
- Lead with value. "I noticed you recently switched reviews apps, here's a migration guide" works far better than a generic pitch.
- Don't hammer stores. Reasonable concurrency is the default.
Cost example
| Volume | Cost |
|---|---|
| 1,000 stores | $5 |
| 10,000 stores | $50 |
| Weekly monitoring of 2,000 stores (changes only) | You pay only for stores analyzed, and unchanged stores are skipped when Output only stores with changes is on |
Apify's free plan includes monthly credits, enough to try this on about a thousand stores at no cost.
Try it: Shopify App & Theme Detector + App Install Monitor on Apify