# Shopify Store Leads + App Audit (Reviews, Email, Pixels) (`centorprat/shopify-store-leads-app-audit`) Actor

Shopify store leads by niche keyword (or your domains/dataset): verifies each store, detects installed apps (reviews, email/SMS, upsell, loyalty, chat, subscriptions), ad pixels, theme and catalog, then scores what's missing with pitch reasons, emails and socials.

- **URL**: https://apify.com/centorprat/shopify-store-leads-app-audit.md
- **Developed by:** [Centor Prat](https://apify.com/centorprat) (community)
- **Categories:** Lead generation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.40 / 1,000 store auditeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 🛍️ Shopify Store Leads + App Audit (Reviews, Email, Pixels)

**Find Shopify stores in any niche and see exactly which apps they're missing.** Type a niche ("organic
skincare", "dog treats") or paste store domains. Every store is **verified as Shopify** and **audited**:
installed apps (reviews, email & SMS, upsell, loyalty, live chat, subscriptions, search, BNPL), ad pixels,
theme and catalog. You get **opportunity scores** for each app category, plain-English **pitch reasons**,
and the store's **emails and social profiles**.

Built for **Shopify app developers, e-commerce agencies and SaaS sales teams** · runs the Google Search
Scraper for discovery · keyless storefront checks · structured JSON for agents, Zapier, Make and CRMs.

### ⚡ Why it's different

- **Store finder + tech audit + lead score in one run.** Other actors give you a store list *or* a tech list.
  This one tells you who is **missing what you sell**, and why.
- **App detection that doesn't lie.** We read the scripts a store actually loads, Shopify's app blocks and
  Shopify Web Pixels (the way modern apps install tracking), on the homepage **and a product page**. Page
  builders that merely list other apps' names, cookie banners and share buttons don't count.
- **Honest by design.** Headless storefronts, stores with custom/server-side pixels (Stape, Elevar...), and
  stores whose pages can't be read are flagged and **never pitched** (and unread stores are never billed).
- **Catalog intelligence:** product count, price range and median, % on sale, % in stock, how recently the
  catalog changed (dormant stores are down-weighted), size tier, theme (vintage / free).
- **Bring your own list:** domains, or any dataset with store URLs (Google results, store finders, ad libraries).

### 📋 What you get (per store)

| Field | Meaning |
|---|---|
| `storeName`, `url`, `domain`, `myshopifyDomain`, `description`, `country`, `city`, `currency` | Store identity from Shopify's public store info |
| `catalog.productsCount`, `.priceMin/Median/Max`, `.onSalePct`, `.inStockPct`, `.lastProductUpdateDaysAgo`, `.topProductTypes` | Catalog stats from the public storefront |
| `sizeTier` | micro (<20 products) · small (<200) · medium (<1000) · large |
| `theme.name`, `.schemaName`, `.isVintageTheme`, `.isFreeTheme` | Theme (and whether it's a pre Online Store 2.0 vintage theme) |
| `appsDetected.reviews` / `.emailSms` / `.upsell` / `.loyalty` / `.support` / `.subscriptions` / `.search` / `.bnpl` | Apps detected per category (100+ app signatures) |
| `pixels`, `customPixels` | Meta, TikTok, Google Analytics 4, Google Ads, Tag Manager, Pinterest, Snap; merchant custom/server-side pixels by name |
| `emails`, `socials` | Public emails and social profiles from the store |
| `opportunity.<category>` | 0–100 opportunity score per category: reviews, emailSms, adsTracking, upsell, loyalty, support, subscriptions, theme |
| `bestCategory`, `opportunityScore`, `score`, `scoredFor`, `qualified`, `pitch`, `reasons` | Best fit, your chosen category's score, qualification and the reasons |
| `isHeadless`, `isDormant`, `auditComplete` | Honesty flags: headless storefront, catalog untouched for a year, pages couldn't be read |

### 📥 Input

| Field | Type | Meaning |
|---|---|---|
| `keywords` | array | Niches to search, e.g. `["organic skincare"]`, `["dog treats","cat toys"]` |
| `maxStoresPerKeyword` | integer | Stores per keyword (default 20, max 300) |
| `searchCountry` | string | Google country, e.g. `us`, `gb`, `de`, `es` |
| `category` | string | What you sell: `all`, `reviews`, `emailSms`, `adsTracking`, `upsell`, `loyalty`, `support`, `subscriptions`, `theme` |
| `minScore`, `onlyQualified` | | Qualification threshold; return (and bill) only qualified stores |
| `storeCountries` | array | Keep only stores based in these countries, e.g. `["US","CA"]` |
| `domains`, `datasetId` | | Audit your own store list, or any dataset with store URLs |

**Example: dog-treat stores missing email marketing**

```json
{ "keywords": ["dog treats"], "maxStoresPerKeyword": 30, "category": "emailSms", "onlyQualified": true }
```

**Example: audit a list of stores**

```json
{ "domains": ["allbirds.com", "getfinleys.com", "wigglewow.com"] }
```

### 📤 Output (one row per store)

Real output for a store found with the keyword `dog treats` (the owner's personal email is masked here):

```json
{
  "storeName": "Wigglewow",
  "domain": "wigglewow.com",
  "url": "https://wigglewow.com",
  "description": "Gourmet dog treat manufacturing company focused on making fresh treats daily while providing employment opportunities to adults with special needs made in Louisville, KY. ",
  "country": "US",
  "city": "Peewee Valley",
  "province": "Kentucky",
  "currency": "USD",
  "shipsToCountries": 2,
  "catalog": {
    "productsCount": 22,
    "collectionsCount": 14,
    "productsSampled": 22,
    "newestProductDaysAgo": 0,
    "lastProductUpdateDaysAgo": 0,
    "priceMin": 3.95,
    "priceMedian": 12.95,
    "priceMax": 300,
    "onSalePct": 1.2,
    "inStockPct": 86.9,
    "topProductTypes": [
      "Dog Treats",
      "Shirts",
      "Gift Card"
    ],
    "vendorsCount": 1
  },
  "sizeTier": "small",
  "theme": {
    "name": "test",
    "schemaName": "Brooklyn",
    "schemaVersion": "14.1.5",
    "themeStoreId": 730,
    "isFreeTheme": true,
    "isVintageTheme": true
  },
  "appsDetected": {
    "reviews": [
      "Loox"
    ],
    "upsell": [
      "Bold Upsell"
    ],
    "subscriptions": [
      "Appstle"
    ]
  },
  "appsCount": 3,
  "pixels": [
    "customPixel",
    "googleAnalytics",
    "tiktokPixel"
  ],
  "customPixels": [
    "Google Analytics tag (migrated)"
  ],
  "isHeadless": false,
  "emails": [
    "<owner email on the store site>"
  ],
  "socials": {
    "facebook": "https://www.facebook.com/pages/category/Pet-Supplies/Wigglewow-101959081162330",
    "instagram": "https://www.instagram.com/_wigglewow"
  },
  "auditComplete": true,
  "opportunity": {
    "reviews": 0,
    "emailSms": 85,
    "adsTracking": 0,
    "upsell": 0,
    "loyalty": 25,
    "support": 45,
    "subscriptions": 0,
    "theme": 75
  },
  "bestCategory": "emailSms",
  "opportunityScore": 85,
  "pitch": [
    "No email or SMS marketing app detected (Klaviyo, Omnisend, Attentive...)"
  ],
  "reasons": {
    "emailSms": [
      "No email or SMS marketing app detected (Klaviyo, Omnisend, Attentive...)"
    ],
    "loyalty": [
      "No loyalty or referral app detected"
    ],
    "support": [
      "No live chat or helpdesk widget detected"
    ],
    "theme": [
      "Vintage Brooklyn theme (pre Online Store 2.0, last-generation Shopify theme)"
    ]
  },
  "source": "input",
  "score": 85,
  "scoredFor": "emailSms",
  "contactable": true,
  "qualified": true
}
```

#### How the scores work

| Category | Strong signals |
|---|---|
| **reviews** | No reviews app detected (85; 60 for tiny catalogs) |
| **emailSms** | No email/SMS marketing app (85) · only Shopify's basic forms (40) |
| **adsTracking** | No pixel at all (90) · no Meta pixel (+55) · no Google Analytics 4 (+20) · no TikTok pixel (+15). Never pitched when the store runs custom / server-side pixels |
| **upsell** | No upsell / cross-sell / bundle app with 10+ products (60) |
| **loyalty** | No loyalty / referral app on a 30+ product or $40+ median-price store (55) |
| **support** | No live chat / helpdesk widget (55) |
| **subscriptions** | Repeat-purchase niche (skincare, coffee, supplements, pet food...) with no subscription app or selling plans (70) |
| **theme** | Vintage theme like Debut / Brooklyn / Venture (75) |
Large catalogs (1,000+ products, usually enterprise brands with custom stacks) are halved; dormant
stores ×0.3; headless storefronts ×0.3.

### 💰 Pricing (pay-per-event menu)

- **`store-audited`**: per verified Shopify store audited and returned. Non-Shopify sites and unreadable stores are free.
- **`qualified-lead`** (premium): per returned store that meets your `minScore` and has an email or social profile.
- Keyword discovery runs the **Google Search Scraper**, which bills its own result pages to your account
  (about $0.0045 per page, roughly $0.001 per store found). Auditing your own `domains` has no search cost.

### 💡 Use cases

- **Shopify app developers:** stores in your niche **without** a reviews app, loyalty program, subscriptions, upsell or chat.
- **Email / SMS agencies (Klaviyo partners):** stores with no Klaviyo-class email flows.
- **Paid-ads agencies:** stores with no Meta / TikTok pixel or no GA4.
- **Theme & CRO agencies:** stores still on vintage themes.
- **Market research:** which apps and pixels a niche actually uses, price ranges and catalog sizes.
- **AI sales agents:** one call returns qualified, explained, contactable Shopify leads.

### 🚀 Ready-made tasks (one click)

Pre-configured runs for each kind of Shopify buyer. Open one, change the niche, run:

- [Shopify Stores Without a Reviews App](https://apify.com/centorprat/shopify-store-leads-app-audit/examples/shopify-stores-without-reviews-app): Find Shopify stores with no reviews app (Judge.me, Loox, Okendo, Yotpo...). Verified by niche, scored, with emails and socials.
- [Shopify Stores Without Email Marketing (No Klaviyo)](https://apify.com/centorprat/shopify-store-leads-app-audit/examples/shopify-stores-without-email-marketing): Shopify stores with no Klaviyo, Omnisend or SMS marketing app. Leads for email agencies, scored, with emails and socials.
- [Shopify Stores Without a Meta or TikTok Pixel](https://apify.com/centorprat/shopify-store-leads-app-audit/examples/shopify-stores-without-meta-pixel): Find Shopify stores with no Meta pixel, TikTok pixel or GA4. Server-side tracking respected. Scored leads with emails.
- [Shopify Stores on Vintage Themes (Debut, Brooklyn...)](https://apify.com/centorprat/shopify-store-leads-app-audit/examples/shopify-stores-vintage-theme): Find Shopify stores still on vintage themes like Debut or Brooklyn. Leads for theme and CRO agencies, with emails.
- [Shopify Stores Without Subscriptions (Repeat-Purchase Niches)](https://apify.com/centorprat/shopify-store-leads-app-audit/examples/shopify-stores-without-subscriptions): Repeat-purchase Shopify stores (coffee, supplements, skincare) with no subscription app. Scored leads with emails.
- [Shopify Stores Without a Loyalty Program](https://apify.com/centorprat/shopify-store-leads-app-audit/examples/shopify-stores-without-loyalty-program): Shopify stores with no loyalty or referral app (Smile.io, LoyaltyLion, Rivo). Scored leads for retention apps.
- [Shopify Stores Without Live Chat or Helpdesk](https://apify.com/centorprat/shopify-store-leads-app-audit/examples/shopify-stores-without-live-chat): Find Shopify stores with no chat or helpdesk widget (Gorgias, Tidio, Shopify Inbox). Scored leads with emails.
- [Shopify App Detector: See Any Store's Apps & Pixels](https://apify.com/centorprat/shopify-store-leads-app-audit/examples/shopify-app-detector): Paste store domains and see their Shopify apps, Meta/TikTok/GA4 pixels, theme and catalog stats. Bulk, JSON/CSV.
- [Tiendas Shopify sin email marketing (sin Klaviyo)](https://apify.com/centorprat/shopify-store-leads-app-audit/examples/tiendas-shopify-sin-email-marketing): Encuentra tiendas Shopify sin email marketing (sin Klaviyo ni Omnisend). Leads verificados con emails y redes.

### 🤖 For AI agents (MCP)

```json
{
  "mcpServers": {
    "shopify-store-leads": {
      "url": "https://mcp.apify.com/?tools=actors,docs,centorprat/shopify-store-leads-app-audit"
    }
  }
}
```

**Claude Code:** `claude mcp add --transport http apify "https://mcp.apify.com/?tools=actors,docs,centorprat/shopify-store-leads-app-audit" --header "Authorization: Bearer <YOUR_APIFY_TOKEN>"`

No extra setup: this Actor is callable from Claude, Cursor, ChatGPT or any MCP client through the Apify MCP server, and agents can find it on their own with the server's `search-actors` tool.

```bash
curl -X POST "https://api.apify.com/v2/acts/centorprat~shopify-store-leads-app-audit/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["dog treats"],"maxStoresPerKeyword":20,"category":"reviews","onlyQualified":true}'
```

### ❓ FAQ

- **How are stores found?** We run the Google Search Scraper with Shopify-targeted queries for each keyword (`site:myshopify.com <niche>` and `"<niche>" "powered by shopify"`), then verify every result is really a Shopify store through its public `/meta.json`.
- **How are apps detected?** From the scripts and app blocks the storefront actually loads, and Shopify Web Pixels, on the homepage and one product page, matched against 100+ app signatures. Mentions in plain text don't count.
- **Can it miss an app?** Yes: apps that only load on cart/checkout, or very new apps, may not be visible. That's why every reason says "detected", and why headless stores, server-side pixels and unreadable stores are never pitched.
- **What is a vintage theme?** A pre "Online Store 2.0" Shopify theme (Debut, Brooklyn, Venture, Simple, Narrative, Boundless, Supply, Minimal, Express). Merchants on them are prime candidates for a theme upgrade.
- **Revenue estimates?** No. We report facts we can verify (catalog size, prices, stock, freshness, apps), not invented revenue numbers.
- **What does it cost?** This actor's audit per store, plus the Google Search Scraper's own page price when you search by keyword. Use `onlyQualified` to pay only for leads you'll use.
- **Are emails personal data?** They can be. We only collect emails the store publishes on its own site. Use them lawfully (GDPR, CAN-SPAM, your local rules).

### 📜 Data & attribution

Store discovery via Google search results (Google Search Scraper by Apify). Store data from each store's
public Shopify storefront (`/meta.json`, `/products.json`, pages). Nothing is stored after the run.

### 🔗 Related actors

Part of one suite of keyless, agent-ready composers by the same developer:

- [Shopify Dropshipping & Store Trust Checker](https://apify.com/centorprat/shopify-dropshipping-checker): check any Shopify store for dropshipping signals (AliExpress images, markups, new catalogues) and a store-trust band — signals, not accusations.
- [Shopify App Detector: Tech Stack, Pixels & Theme](https://apify.com/centorprat/shopify-app-detector): paste Shopify store domains (or a dataset) and get each store’s apps by category, ad/analytics pixels, theme, catalog and contacts. No search cost.
- [Google Maps Leads + Website Audit for Agencies](https://apify.com/centorprat/google-maps-leads-website-audit): local businesses from Google Maps audited for website, Google profile, reviews, booking and tracking gaps: scored, explained leads with phone and emails.
- [FEMA Flood Zone & Property Risk API - Zillow/Redfin Enricher](https://apify.com/centorprat/fema-flood-zone-property-risk): FEMA flood zone + 18-hazard FEMA risk index + neighborhood demographics per US address, or for a whole Zillow/Redfin dataset.
- [Domain Lookup API - DNS, MX, SPF, Tech & Contact Emails](https://apify.com/centorprat/domain-lookup-dns-mx-email): DNS + live homepage → IPs, MX/SPF, tech, socials and public contacts per domain.
- [Wikipedia & Wikidata API - Entity Facts, Summary & Pageviews](https://apify.com/centorprat/wikipedia-wikidata-api): Wikipedia + Wikidata + pageviews → one structured brief per company, person or place.
- [Country Economic Data API - World Bank GDP, FX & Holidays](https://apify.com/centorprat/world-bank-country-economic-data): World Bank + FX + public holidays → one market brief per country.
- [Weather, Air Quality & Earthquake Risk API by Location](https://apify.com/centorprat/weather-air-quality-earthquake-api): live weather + air quality + earthquakes → one clear/caution/hazard verdict per point, worldwide.
- [Aircraft Tracker API (ADS-B) - Approach & Military Alerts](https://apify.com/centorprat/aircraft-tracker-adsb): aircraft approaching a point with CPA/ETA + military/unidentified flags and alerts.
- [NARA Catalog Extractor](https://apify.com/centorprat/nara-catalog-extractor): US National Archives catalog search → digital-object download URLs + metadata.

# Actor input Schema

## `keywords` (type: `array`):

What the stores sell, e.g. \["organic skincare"], \["dog treats", "cat toys"], \["yoga wear"]. Each keyword is searched on Google for Shopify stores.

## `maxStoresPerKeyword` (type: `integer`):

Up to this many Shopify stores per keyword (1-300). More stores = more Google result pages searched.

## `searchCountry` (type: `string`):

Two-letter country code for the Google search, e.g. us, gb, ca, au, de, es.

## `category` (type: `string`):

Score and sort stores for one app category, or 'all' to use each store's best fit.

## `minScore` (type: `integer`):

A store is 'qualified' when its score for the chosen category is at least this AND it has a public email or social profile.

## `onlyQualified` (type: `boolean`):

Drop stores below the minimum score or without contacts. Only returned stores are billed.

## `storeCountries` (type: `array`):

Keep only stores based in these countries (two-letter codes from the store's Shopify settings), e.g. \["US", "CA"].

## `domains` (type: `array`):

Audit these stores directly, e.g. \["allbirds.com", "gymshark.com"]. No search cost. Non-Shopify sites are skipped for free.

## `datasetId` (type: `string`):

Pick (or paste the ID of) any dataset whose rows contain store URLs or domains (url, website, domain, link fields, or Google organicResults). Read-only access.

## `maxItems` (type: `integer`):

Safety cap when reading a dataset.

## `language` (type: `string`):

Language code for the Google search, e.g. en, es, de.

## `concurrency` (type: `integer`):

How many stores are audited at once.

## `webhookUrl` (type: `string`):

If set, qualified stores are POSTed here as JSON (Zapier / Make / n8n / your CRM).

## Actor input object example

```json
{
  "keywords": [
    "organic skincare"
  ],
  "maxStoresPerKeyword": 5,
  "searchCountry": "us",
  "category": "all",
  "minScore": 50,
  "onlyQualified": false,
  "maxItems": 2000,
  "concurrency": 8
}
```

# Actor output Schema

## `stores` (type: `string`):

One row per verified Shopify store: name, domain, myshopify domain, country, currency, catalog stats (products, prices, sale %, stock %, freshness), size tier, theme (vintage/free), apps detected by category (reviews, email/SMS, upsell, loyalty, support, subscriptions, search, BNPL), pixels, headless flag, emails, socials, opportunity scores per category, best category, score, qualified flag and pitch reasons.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "organic skincare"
    ],
    "maxStoresPerKeyword": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("centorprat/shopify-store-leads-app-audit").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keywords": ["organic skincare"],
    "maxStoresPerKeyword": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("centorprat/shopify-store-leads-app-audit").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "organic skincare"
  ],
  "maxStoresPerKeyword": 5
}' |
apify call centorprat/shopify-store-leads-app-audit --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,centorprat/shopify-store-leads-app-audit"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/94V8wJNUQIKdsn71H/builds/KFoDn9zpdFhfuoeae/openapi.json
