Shopify App Detector: Tech Stack, Pixels & Theme
Pricing
from $3.40 / 1,000 store detecteds
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
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.comanswers in one request, for agents and pipelines.
๐ What you get (per store)
| Field | What it is |
|---|---|
apps | Every detected app: name, category, confidence (high / medium), evidence, appHandle, known |
appsDetected | The 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, appCategories | How many apps and which categories |
customApps | Private or custom apps built for this brand (a sign of in-house dev budget) |
estimatedMonthlyAppSpend | pointUsd, lowUsd, highUsd, topCostApps with each app's list-price range, and the basis |
stackTier | starter / growth / scale / enterprise, from spend and enterprise vendors |
enterpriseSignals | Enterprise vendors (Bazaarvoice, Global-e, Dynamic Yield, Signifyd...), custom apps, headless, many languages |
gaps, pitch | Missing revenue categories with a 0-100 opportunity score and the reasons |
pixels | Meta, TikTok, Google Ads, GA4, GTM, Pinterest, Snap, Microsoft UET, Reddit, X, LinkedIn, plus custom/server-side pixels |
theme | Name, base theme, version, source (free-theme-store / paid-theme-store / custom-or-third-party), vintage flag |
catalog | Products, collections, price min/median/max, % on sale, % in stock, newest product, top product types |
| Store profile | Name, myshopify domain, country/city, currency, Shop Pay, headless flag, languages |
| Contacts | Public emails and social profiles |
changes | With a history store: appsAdded, appsRemoved, pixelsAdded/Removed, themeChanged, productsDelta, summary |
๐ฅ Input
| Field | What it does |
|---|---|
domains | Stores to profile, e.g. ["allbirds.com", "gymshark.com"]. Storefront domains, not admin URLs. |
datasetId | Any dataset whose rows contain store URLs (url, website, domain, link, or Google organicResults). Read-only. |
requireApps | Keep only stores using any of these apps, e.g. ["Klaviyo"]. Matches names or app handles. |
excludeApps | Drop stores using any of these apps (e.g. your own app). |
missingCategories | Keep only stores with no app in these categories, e.g. ["loyalty"]. |
requireCategories | Keep only stores that have these categories, e.g. ["subscriptions"]. |
minEstimatedAppSpend | Keep only stores whose estimated app spend is at least this many USD/month. |
storeCountries | Keep only stores based in these countries, e.g. ["US", "CA"] (checked first, filtered stores are free). |
historyStore | A key-value store for snapshots: turns on change tracking. |
onlyChanged | With a history store, return only stores whose stack changed. |
includeEvidence | Attach the proof per app (default on). |
concurrency, maxItems, webhookUrl | Speed, 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.
minEstimatedAppSpendplusstackTierseparate 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)
- What Apps Does a Shopify Store Use?: paste domains, get every app, pixel, theme and catalog stat per store.
- Shopify Tech Stack Lookup (Bulk Domains): bulk tech-stack profile for a list of stores or a dataset of URLs.
- Shopify Pixel & Theme Detector: which pixels (Meta, TikTok, Google Ads, GA4) and theme each store runs.
- Find Shopify Stores Using Klaviyo: keep only the stores in your list that run Klaviyo.
- Shopify App Spend Estimator: estimated monthly app spend and the costliest apps per store.
- Shopify Stores Without a Loyalty App: stores that have no loyalty or referral program yet.
๐ 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 ApifyClientclient = 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.
๐ Related actors
- Local Business Software Detector: POS, Booking & Ordering: which POS, ordering, booking, practice or field-service software a local business runs, with gaps and contacts.
- SaaS Stack & Email Provider Detector: M365, Okta, HubSpot: a company's email provider, security gateway, SSO and verified SaaS from its domain or a work email.
- WordPress Plugin Detector: Plugins, Versions & WooCommerce: every plugin a WordPress site runs, checked against wordpress.org (outdated, removed for security), plus WooCommerce facts.
- Shopify Dropshipping & Store Trust Checker: check any Shopify store for dropshipping signals (AliExpress images, markups, new catalogues) and a store-trust band โ signals, not accusations.
- Shopify Store Leads + App Audit: find Shopify stores by niche keyword, scored for the apps they are missing, with emails and socials.
- Google Maps Leads + Website Audit for Agencies: local businesses from Google Maps audited for website, Google profile, reviews, booking and tracking gaps.
- Domain Lookup API - DNS, MX, SPF, Tech & Contact Emails: DNS + live homepage โ IPs, MX/SPF, tech, socials and public contacts per domain.
- Wikipedia & Wikidata API - Entity Facts, Summary & Pageviews: Wikipedia + Wikidata + pageviews โ one structured brief per company, person or place.
- FEMA Flood Zone & Property Risk API - Zillow/Redfin Enricher: FEMA flood zone + 18-hazard risk index + neighborhood demographics per US address.
- Country Economic Data API - World Bank GDP, FX & Holidays: World Bank + FX + public holidays โ one market brief per country.
- Weather, Air Quality & Earthquake Risk API by Location: live weather + air quality + earthquakes โ one verdict per point.
- Aircraft Tracker API (ADS-B) - Approach & Military Alerts: aircraft approaching a point with CPA/ETA + military/unidentified flags.
- NARA Catalog Extractor: US National Archives catalog search โ digital-object download URLs + metadata.