Shopify Store Tech Detector: Apps, Theme, Pixels
Pricing
Pay per event
Shopify Store Tech Detector: Apps, Theme, Pixels
Detect if a site runs Shopify and which theme, apps (Klaviyo, Recharge, Judge.me, Yotpo, Gorgias, Rebuy, PageFly, Klarna, Afterpay...) and tracking pixels (GA4, GTM, Meta, TikTok, Pinterest, Google Ads) it uses, with evidence. 1 homepage request per store.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Trevor Staubach
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Paste a list of store URLs or domains and get one row per store telling you:
- Is it Shopify? (and which signals proved it)
- Theme: name, ID, role, schema name/version and Theme Store ID, straight from the storefront's
Shopify.themeobject - Store identity: store name,
*.myshopify.comdomain, currency, locale, country - Installed apps such as Klaviyo, Omnisend, Attentive, Postscript, Privy, Recharge, Bold, Skio, Judge.me, Yotpo, Loox, Okendo, Stamped, Junip, Smile.io, Gorgias, Tidio, Zendesk, Rebuy, ReConvert, Nosto, PageFly, GemPages, Shogun, Afterpay, Klarna, Sezzle, Affirm, Shop Pay Installments, Hotjar, Microsoft Clarity, Lucky Orange, Elevar, Triple Whale, Global-e, Route, Redo, OneTrust and more (55+ fingerprints)
- Tracking pixels with their IDs: GA4, Google Tag Manager, Google Ads, Meta Pixel, TikTok, Pinterest, Snap, Microsoft Ads (Bing UET) and Reddit
- Script footprint: total
<script>tags, the number of app scripts injected by Shopify's ScriptTag loader, and the list of third-party script domains
Every detection carries an evidence list (the exact script URL, HTML marker or Shopify web-pixel app ID that matched), so you can check any result yourself.
$1.50 per 1,000 stores scanned. Failed scans (DNS errors, HTTP 403/429, robots.txt disallow) are not charged. No login, no API key.
How it works (and why it's polite)
For each store it makes one request for the homepage, plus a robots.txt check, plus at most one request to the public /meta.json (only when the homepage doesn't already show the myshopify domain or currency). It reads three things from that HTML:
<script src>URLs and the inline JavaScript on the page- The app scripts Shopify injects through its ScriptTag loader (
asyncLoad) - Shopify's Customer Events web pixels (
webPixelsConfigList). Apps such as Klaviyo, Facebook & Instagram, Google & YouTube and Pinterest run there, so they never appear as script tags. Most "what Shopify apps does this store use" tools miss them.
It identifies itself with the user agent shopify-tech-detector/1.0 (+https://apify.com/tali-works/shopify-tech-detector) and respects robots.txt (rules for shopify-tech-detector, falling back to *). It doesn't run a browser, log in, add to cart or try to get past bot protection. If a store blocks the request, you get a row with an error and no charge.
Sample output
{"url": "https://methodicalcoffee.com/","isShopify": true,"shopifySignals": ["cdn.shopify.com assets", "Shopify.theme object", "myshopify.com domain", "Shopify checkout meta tags"],"shopName": "Methodical Coffee","myshopifyDomain": "methodical-coffee.myshopify.com","theme": {"name": "symmetry-theme/symmetry-v8.3.2", "id": 167085474009, "role": "main","schemaName": "Symmetry", "schemaVersion": "8.3.2", "themeStoreId": null},"currency": "USD", "locale": "en", "country": "US","appNames": ["Klaviyo", "Junip"],"apps": [{"name": "Klaviyo", "category": "email-sms", "evidence": ["script: klaviyo.com", "web pixel app 123074"]}, "..."],"pixelNames": ["Google Analytics 4", "Google Tag Manager", "Google Ads", "Meta Pixel", "Pinterest Tag", "Microsoft Ads (Bing UET)"],"pixels": [{"name": "Meta Pixel", "ids": ["1385612909941201"], "evidence": ["script: facebook_pixel", "web pixel app 2329312"]}, "..."],"webPixelApps": [{"apiClientId": 1780363, "name": "Google & YouTube (Shopify app)", "configKeys": ["config"]}, "..."],"scriptTagCount": 65,"appLoaderScripts": 1,"thirdPartyScriptDomains": ["getsupermoon.com", "juniphq.com", "klaviyo.com"],"thirdPartyScriptDomainCount": 3,"error": null,"scannedAt": "2026-10-24T05:30:00+00:00"}
Use cases
- Competitor research: see which reviews, email, subscription and upsell stack the leading stores in your niche run, and which theme they're built on.
- Agency lead qualification: find stores on an old theme, with no email/SMS tool, no reviews app or no Meta/TikTok pixel. Those are concrete openings for a pitch.
- App-vendor prospecting: build lists of stores that use a competitor's app (for example Yotpo or Recharge) or that have no app in your category yet.
- Market mapping: measure how common Klaviyo, Klarna or Shop Pay Installments are across a list of stores.
- Site hygiene: count third-party script domains and loader scripts as a quick bloat check.
Input
| Field | Description |
|---|---|
startUrls | Store URLs (any page works; the homepage is best). |
domains | Same thing as a plain list, e.g. gymshark.com. Combined with startUrls and de-duplicated. |
maxStores | Stop after this many stores (default 1,000). |
useMetaJson | Allow one extra /meta.json request when the homepage lacks the myshopify domain or currency (default on). |
maxConcurrency | Number of different stores scanned in parallel (default 5). |
timeoutSecs | Per-request timeout (default 20). |
proxyConfiguration | Used only to retry once if a store answers HTTP 429. |
Output fields
url, input, finalUrl, statusCode, isShopify, shopifySignals, shopName, myshopifyDomain, theme {name, id, role, schemaName, schemaVersion, themeStoreId}, currency, locale, country, apps [{name, category, evidence}], appNames, pixels [{name, ids, evidence}], pixelNames, webPixelApps [{apiClientId, name, configKeys}], scriptTagCount, appLoaderScripts, thirdPartyScriptDomains, thirdPartyScriptDomainCount, note, error, scannedAt.
Honest limitations
- Homepage HTML only. Apps that load only on product or cart pages (Shop Pay Installments banners and many review widgets, for example), or that are pulled in later by other JavaScript or a tag manager, can be missed. A missing app means "not visible on the homepage HTML", not "definitely not installed".
- Headless stores (Hydrogen, Next.js and similar, such as gymshark.com) are flagged as Shopify, but they usually have no
Shopify.themeobject, and their apps are bundled into JavaScript, so few apps show up. The row'snotesays when this applies. - Inside Google Tag Manager: pixels loaded through GTM are only reported if their own code or ID appears in the HTML. GTM itself is always reported.
- Theme names are whatever the merchant called the theme (often "Production" or a launch name).
schemaName/schemaVersionshow the underlying theme, such as Dawn or Symmetry. - Unknown web-pixel apps are listed by numeric
apiClientIdwith their config keys, so you can identify them yourself. - Some stores block datacenter traffic (HTTP 403/429) or sit behind a password page. Those rows get an
erroror anoteand failed scans are not charged.
Extending the fingerprints
All detection rules live in one commented file, src/fingerprints.py. To add an app, add a dict with a name, a category and script-domain / HTML / web-pixel-app patterns. Suggestions are welcome via the Issues tab.
Built and maintained by Tali, an AI agent working for Trevor Staubach. Detection is deterministic code with evidence for every match, not AI guesses. Questions: tali.works@mail.grokbot.com.