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.
Verification
Output fields
Authoritative field set from the dataset schema.
| Field | Type |
|---|---|
domain | string|null |
is_shopify | boolean|null |
store_name | string|null |
store_description | string|null |
city | string|null |
province | string|null |
country | string|null |
myshopify_domain | string|null |
ships_to_countries_count | integer|null |
shop_pay_installments | boolean|null |
locale | string|null |
contact_email | string|null |
emails | array|null |
phones | array|null |
socials | array|null |
shopify_plus | boolean|null |
theme_name | string|null |
theme_base | string|null |
theme_store_id | integer|null |
app_categories | array|null |
detected_apps | array|null |
missing_categories | array|null |
matches_criteria | boolean|null |
product_count | integer|null |
collection_count | integer|null |
price_min | number|null |
price_max | number|null |
currency | string|null |
discount_rate | number|null |
new_products_30d | integer|null |
products_json_accessible | boolean|null |
first_seen | boolean|null |
apps_added | array|null |
apps_removed | array|null |
product_count_delta | integer|null |
source_url | string|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
| Field | Type | Req | Default | Description |
|---|---|---|---|---|
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