Shopify App Detector: Tech Stack, Pixels & Theme avatar

Shopify App Detector: Tech Stack, Pixels & Theme

Pricing

from $3.40 / 1,000 store detecteds

Go to Apify Store
Shopify App Detector: Tech Stack, Pixels & Theme

Shopify App Detector: Tech Stack, Pixels & Theme

Profiles any Shopify store: every installed app with evidence (400+ known apps in 30 categories plus any app block), pixels, theme, catalog, estimated monthly app spend, missing categories and contacts. Filter to stores using or lacking an app; track installs/removals. Domains or a dataset.

Pricing

from $3.40 / 1,000 store detecteds

Rating

0.0

(0)

Developer

Centor Prat

Centor Prat

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

10 hours ago

Last modified

Share

Paste Shopify store domains (or a dataset of store URLs) and see every app each store runs, with the proof for each one. You also get the ad/analytics pixels, the theme, catalog stats, an estimate of monthly app spend, the app categories the store is missing, public contacts and, if you schedule it, which apps were installed or removed since the last run. It reads only Shopify's public endpoints and the storefront: no keyword search, no paid child actor, about 3 seconds for a few stores.

โšก Why it's different

  • Finds the long tail, not just the big names. 400+ known apps in 30 categories, plus any app that renders a theme app block: Shopify marks every app block with shopify://apps/<app-handle>, and the detector reads those markers directly. Apps it has never seen are still reported by name.
  • Every app comes with evidence. The app block, script URL, app-embed asset or widget that proves it, and a confidence level. No guesses from page text: content links, cookie-banner vendor lists and blog posts are ignored.
  • Estimated monthly app spend. Each detected app's public plan prices, scaled by catalog size, give a low / likely / high range and the costliest apps. It's labelled as an estimate, not the store's bill.
  • Built for prospecting. Missing categories ("no loyalty app", "no SMS"), pitch lines, a stack tier (starter / growth / scale / enterprise), enterprise signals and public emails and socials.
  • "Who uses X" from any list. Filter any store list or dataset down to the stores that run an app (requireApps: ["Klaviyo"]), lack one (excludeApps) or miss a whole category (missingCategories).
  • Change tracking. Pick a history store, schedule it weekly, and get back only the stores that installed or removed an app, changed pixels or switched theme. That's the moment a store is open to switching.
  • Instant API (Standby). GET https://centorprat--shopify-app-detector.apify.actor/?domain=allbirds.com answers in one request, for agents and pipelines.

๐Ÿ“‹ What you get (per store)

FieldWhat it is
appsEvery detected app: name, category, confidence (high / medium), evidence, appHandle, known
appsDetectedThe same apps grouped by category (reviews, emailSms, upsell, loyalty, support, subscriptions, search, bnpl, returns, shipping, analytics, abTesting, pageBuilder, affiliates, ugcVideo, consent, ... 30 in all)
appsCount, appCategoriesHow many apps and which categories
customAppsPrivate or custom apps built for this brand (a sign of in-house dev budget)
estimatedMonthlyAppSpendpointUsd, lowUsd, highUsd, topCostApps with each app's list-price range, and the basis
stackTierstarter / growth / scale / enterprise, from spend and enterprise vendors
enterpriseSignalsEnterprise vendors (Bazaarvoice, Global-e, Dynamic Yield, Signifyd...), custom apps, headless, many languages
gaps, pitchMissing revenue categories with a 0-100 opportunity score and the reasons
pixelsMeta, TikTok, Google Ads, GA4, GTM, Pinterest, Snap, Microsoft UET, Reddit, X, LinkedIn, plus custom/server-side pixels
themeName, base theme, version, source (free-theme-store / paid-theme-store / custom-or-third-party), vintage flag
catalogProducts, collections, price min/median/max, % on sale, % in stock, newest product, top product types
Store profileName, myshopify domain, country/city, currency, Shop Pay, headless flag, languages
ContactsPublic emails and social profiles
changesWith a history store: appsAdded, appsRemoved, pixelsAdded/Removed, themeChanged, productsDelta, summary

๐Ÿ“ฅ Input

FieldWhat it does
domainsStores to profile, e.g. ["allbirds.com", "gymshark.com"]. Storefront domains, not admin URLs.
datasetIdAny dataset whose rows contain store URLs (url, website, domain, link, or Google organicResults). Read-only.
requireAppsKeep only stores using any of these apps, e.g. ["Klaviyo"]. Matches names or app handles.
excludeAppsDrop stores using any of these apps (e.g. your own app).
missingCategoriesKeep only stores with no app in these categories, e.g. ["loyalty"].
requireCategoriesKeep only stores that have these categories, e.g. ["subscriptions"].
minEstimatedAppSpendKeep only stores whose estimated app spend is at least this many USD/month.
storeCountriesKeep only stores based in these countries, e.g. ["US", "CA"] (checked first, filtered stores are free).
historyStoreA key-value store for snapshots: turns on change tracking.
onlyChangedWith a history store, return only stores whose stack changed.
includeEvidenceAttach the proof per app (default on).
concurrency, maxItems, webhookUrlSpeed, dataset cap, and a webhook that receives the results.

Example: find a competitor's customers in a store list

{
"datasetId": "<your store-finder dataset>",
"requireApps": ["Yotpo"],
"storeCountries": ["US"]
}

Example: weekly install/removal alerts on 50 stores

{
"domains": ["allbirds.com", "gymshark.com", "deathwishcoffee.com"],
"historyStore": "<pick a key-value store>",
"onlyChanged": true,
"webhookUrl": "https://hooks.zapier.com/..."
}

๐Ÿ“ค Output (one row per store, shortened)

{
"storeName": "Death Wish Coffee",
"url": "https://deathwishcoffee.com",
"country": "US", "currency": "USD",
"appsCount": 15,
"apps": [
{"name": "Klaviyo", "category": "emailSms", "confidence": "high", "appHandle": "klaviyo-email-marketing-sms",
"evidence": ["app block shopify://apps/klaviyo-email-marketing-sms",
"https://static.klaviyo.com/onsite/js/q6rhjr/klaviyo.js?company_id=q6rhjr"]},
{"name": "Rebuy", "category": "upsell", "confidence": "high",
"evidence": ["app block shopify://apps/rebuy-personalization-engine"]}
],
"appsDetected": {
"reviews": ["Bazaarvoice"], "emailSms": ["Klaviyo", "Postscript"], "upsell": ["Rebuy"],
"loyalty": ["Smile.io"], "support": ["Gorgias"], "subscriptions": ["Ordergroove"],
"fraud": ["EasyLockdown", "MinMaxify order limits", "NoFraud (Wyllo)"],
"channels": ["Amazon Buy Now button", "MNTN (connected TV ads)", "StackAdapt", "The Trade Desk"],
"discounts": ["GovX ID"]
},
"estimatedMonthlyAppSpend": {
"pointUsd": 2902, "lowUsd": 1660, "highUsd": 5389,
"topCostApps": [{"app": "Bazaarvoice", "estUsdPerMonth": 1400, "listRangeUsd": [1000, 5000]},
{"app": "Ordergroove", "estUsdPerMonth": 750, "listRangeUsd": [500, 3000]}]
},
"stackTier": "scale",
"enterpriseSignals": ["Bazaarvoice"],
"pixels": ["googleAds", "googleAnalytics", "googleTagManager", "metaPixel", "microsoftUet", "tiktokPixel", "customPixel"],
"theme": {"name": "deathwish-shopify-20/production", "schemaName": "Dawn", "source": "free-theme-store"},
"sizeTier": "small", "priceMedian": 35.49,
"topProductTypes": ["Coffee", "Apparel", "Coffee Bundle", "Accessories", "Mugs"],
"emails": ["hey@deathwishcoffee.com"],
"auditComplete": true
}

With change tracking, each row also has:

"changes": {"appsAdded": ["Skio"], "appsRemoved": ["Recharge"], "themeChanged": {"from": "Old Theme", "to": "Production"},
"productsDelta": 7, "hasChanges": true, "summary": "installed Skio; removed Recharge; theme Old Theme -> Production"}

๐Ÿ’ฐ Pricing (pay-per-event)

  • Store detected: $0.004 per verified Shopify store fully profiled. That's $4 per 1,000 stores.
  • Free: non-Shopify domains, stores whose pages can't be read, and stores dropped by storeCountries.
  • App, category and spend filters run after the profile, so every profiled store is billed even if a filter leaves it out. Pre-filter big lists by country to save.

๐Ÿ’ก Use cases

  • App vendors: displacement lists. Feed any store list, keep the stores on a competitor's app, then watch for removals.
  • Agencies: audit before the pitch. Full stack, estimated spend, missing categories and contacts in one row.
  • Sales teams: qualify by budget. minEstimatedAppSpend plus stackTier separate hobby stores from brands that pay for software.
  • Investors and analysts: market sizing. Install footprints per category across a market.
  • Competitive intelligence. Know the day a rival adds Recharge, drops Klaviyo or switches theme.
  • Enrichment. Profile the output of any store-finder, ad-library or Google Search run (pass its datasetId).

๐Ÿš€ Ready-made tasks (one click)

๐Ÿ”Œ API, Standby and agents

Instant lookup (Standby): one HTTP request, JSON back, $0.004 per store.

curl "https://centorprat--shopify-app-detector.apify.actor/?domain=allbirds.com&token=<YOUR_APIFY_TOKEN>"
curl "https://centorprat--shopify-app-detector.apify.actor/?domains=gymshark.com,allbirds.com&requireApps=Klaviyo&includeEvidence=false&token=<YOUR_APIFY_TOKEN>"

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("centorprat/shopify-app-detector").call(run_input={"domains": ["allbirds.com", "gymshark.com"]})
for store in client.dataset(run["defaultDatasetId"]).iterate_items():
print(store["storeName"], store["appsCount"], store["estimatedMonthlyAppSpend"]["pointUsd"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('centorprat/shopify-app-detector').call({ domains: ['allbirds.com'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

MCP (Claude, Cursor, any MCP client)

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=actors,docs,centorprat/shopify-app-detector"
}
}
}

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

โ“ FAQ

How does it know an app is installed? From what the storefront actually loads: Shopify's own shopify://apps/<handle> app-block markers, the app's script and asset URLs (including ScriptTag loaders and app-embed extension assets), the app's widget containers in the theme, and Shopify's web-pixel configuration. Every app in the output lists the evidence.

Can it see apps that never touch the storefront? No. Back-office apps (inventory, accounting, ERP) leave no public trace. It detects what a shopper's browser loads, which covers reviews, email/SMS, upsell, loyalty, chat, subscriptions, search, returns, tracking, analytics, A/B testing and the rest.

How accurate is the spend estimate? It's a planning number, not a bill. Each app's public plan-price range is scaled by catalog size; usage fees, per-order fees and negotiated contracts aren't included. Use it to rank and segment stores, not to quote a price.

What does "unknown" mean on an app? The store runs an app with a theme app block that isn't in our database yet. You still get its name (from the app handle) and a guessed category.

How does change tracking work? The first run with a history store saves a snapshot per store. Later runs compare against it and report apps installed or removed, pixel and theme changes, and catalog growth, then save the new snapshot. Schedule it weekly.

Is it billed when a filter drops a store? Yes. The store was fully profiled. Country filtering happens before profiling, so it's free.

Headless stores? Flagged with isHeadless: true. Their custom front-ends often hide apps, so the list can be partial.

How fast is it? About 2-4 seconds per store, 8 stores in parallel by default (up to 16).

Is it legal? It reads public pages and Shopify's public /meta.json and /products.json, like a browser. No login, no private data, no checkout.

Output formats? JSON, CSV, Excel, XML or HTML from the dataset, or straight from the Standby endpoint.

๐Ÿ“œ Data & attribution

Reads only publicly available Shopify endpoints and storefronts. No login, no private data. App names are trademarks of their owners; prices are public list prices used for estimates only.