← Health board

Shopify App & Theme Detector — Store Audit & Gap Finder

Detect the apps and theme any Shopify store runs, find the app categories it is missing, and get the store's name, location and contact email — for a single store or a whole prospect list.

70%golden-diff pass
Run it on Apify → verified nightly

Verification

70%golden-diff success
30canary runs
0days since last canary run

Output fields

Authoritative field set from the dataset schema.

FieldType
domainstring|null
is_shopifyboolean|null
store_namestring|null
store_descriptionstring|null
citystring|null
provincestring|null
countrystring|null
myshopify_domainstring|null
ships_to_countries_countinteger|null
shop_pay_installmentsboolean|null
localestring|null
contact_emailstring|null
emailsarray|null
phonesarray|null
socialsarray|null
shopify_plusboolean|null
theme_namestring|null
theme_basestring|null
theme_store_idinteger|null
app_categoriesarray|null
detected_appsarray|null
missing_categoriesarray|null
matches_criteriaboolean|null
product_countinteger|null
collection_countinteger|null
price_minnumber|null
price_maxnumber|null
currencystring|null
discount_ratenumber|null
new_products_30dinteger|null
products_json_accessibleboolean|null
first_seenboolean|null
apps_addedarray|null
apps_removedarray|null
product_count_deltainteger|null
source_urlstring|null

Sample row

{
  "domain": "allbirds.com",
  "is_shopify": true,
  "store_name": "Allbirds",
  "city": "Beverly Hills",
  "province": "California",
  "country": "US",
  "contact_email": "help@allbirds.com",
  "emails": [
    "help@allbirds.com"
  ],
  "phones": [
    "+1 (424) 363-8064"
  ],
  "socials": [
    {
      "platform": "instagram",
      "url": "https://www.instagram.com/allbirds"
    }
  ],
  "theme_name": "[DNAM Theme July 2026]",
  "theme_base": "allbirds-theme",
  "detected_apps": [
    {
      "name": "Yotpo",
      "category": "reviews"
    },
    {
      "name": "Redo",
      "category": "returns"
    },
    {
      "name": "Triple Whale",
      "category": "tracking"
    }
  ],
  "app_categories": [
    "returns",
    "reviews",
    "tracking"
  ],
  "has_reviews_app": true,
  "has_loyalty_app": false,
  "missing_categories": [
    "email",
    "sms",
    "popups",
    "search",
    "upsell",
    "loyalty",
    "subscription",
    "chat",
    "bnpl",
    "translation",
    "accessibility"
  ],
  "matches_criteria": true,
  "product_count": 356,
  "collection_count": 1346,
  "price_max": 165,
  "currency": "USD",
  "ships_to_countries_count": 1,
  "shop_pay_installments": true,
  "first_seen": true,
  "apps_added": [],
  "apps_removed": [],
  "source_url": "https://allbirds.com"
}

Inputs

FieldTypeReqDefaultDescription
domains array yes ["allbirds.com"] Shopify store domains or URLs to audit, e.g. 'allbirds.com'. Paste a list to bulk-audit a prospect list. We audit the domains you provide (we don't discover stores).
targetGaps array no — App categories that should be MISSING for a store to count as a lead — sets 'matches_criteria'. E.g. a reviews-app vendor sets ['reviews']. Categories: reviews, email, sms, popups, search, upsell, loyalty, subscription, chat, bnpl, returns, tracking, translation, accessibility.
includeContacts boolean no true When on (default), also return the store's contact email, phone and social links, read from its own contact and policy pages. This makes each store take a few seconds longer, so a long list runs noticeably slower. Turn it off for a fast tech-stack-only audit. Same price either way.
includeProducts boolean no false When off (default), return store signals only (fast, cheap — the lead-gen need). Turn on to also include the (slimmed) product catalog.
compareToPrevious boolean no true When on (default), diff each store against the previous run and report what changed — apps added/removed and product-count delta. Run on a schedule to track stores over time.
maxProductsPerStore integer no 1000 Cap on products sampled per store (bounds cost). Product count caps here for very large stores.
proxyConfiguration object no {"useApifyProxy":false} Optional, and off by default. Measured 2026-08-19 across 12 stores from inside an actor run: the platform's own IPs reached 27/27 store checks and Apify Proxy's datacenter pool matched them, while RESIDENTIAL was the only mode that lost a store. If a storefront refuses, the actor already retries it at the store's <handle>.myshopify.com origin, which is what actually recovers a refusal. Turn a proxy on only if that also fails.

Pricing

Pay per result (dataset-item) — no charge for empty runs.
Example: 1000 Shopify stores audited at $0.01/result ≈ $10.00.

FAQ

How do you detect a store's apps?

From public storefront markers (app scripts, app blocks, theme settings). No app install or merchant access is needed.

Which app categories do you cover?

Reviews, email, SMS, popups, search, upsell, loyalty, subscriptions, chat, buy-now-pay-later, returns, tracking pixels, translation and accessibility — about 100 apps in all.

Where do the contact details come from?

From the store's own contact-information, refund and privacy policy pages, which Shopify publishes for every store, and from its contact page when it has none. Only what the store publishes itself. Turn includeContacts off for a faster audit.

What can't it see?

Storefront-only data — never real inventory counts, sales, revenue, orders, or traffic (those are Admin-API-only).

How am I charged?

Pay-per-store audited. Non-Shopify or unreachable domains are free, and contact details cost nothing extra.

Can it monitor changes over time?

Yes — run on a schedule and it reports apps added/removed and the product-count delta since the last run.

How accurate is app detection?

Best-effort from storefront markers; some apps load server-side and can be missed. The signatures are checked against real storefronts and kept current by our maintenance loop.

Some stores won't load?

A few sit behind a CDN or WAF that refuses the custom domain — CloudFront and Vercel in our tests, not always Cloudflare. The actor automatically retries those at the store's <handle>.myshopify.com origin, which recovered every refused store we measured on 2026-08-19. No toggle, and no proxy needed.

Guides & use cases

Related actors