Nino Ventures · 2026-10-31

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:

  1. Build a list of candidate store domains
  2. Detect the apps, theme and stack of every store in bulk
  3. Filter for the app you care about
  4. Turn on monitoring to catch installs and uninstalls
  5. 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:

Step 1: Build a list of candidate stores

The detector analyzes the domains you give it, so start with a list. Good sources:

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:

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.

  1. Enable Monitoring mode and set a Monitoring storage name (for example reviews-competitors).
  2. Run once to save a baseline.
  3. Schedule the Actor daily or weekly with the same store list.
  4. 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:

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