What the detector reads
Every lookup reads only what the store sends to any visitor, in this order, and never more than 6 pages:
/robots.txt, first. If it tells automated tools to stay off the homepage, the detector stops there and says so. It also shows which search and AI crawlers the file lets in.- The homepage, for the Shopify signals, the theme object, the apps and the Organization markup.
/products.json?limit=30, Shopify's public product feed, for catalog field coverage./llms.txt, to see whether it exists and who wrote it.- One product's
/products/<handle>.json, for barcodes and image alt text. - That product's page, for its Product JSON-LD.
Steps 3 to 6 only run for Shopify stores that are open to the public. Each one fails on its own: if a store switches off its product feed or blocks one path, that check shows as skipped with the reason and the rest still run. Requests go out as ShopifyRankedBot/1.0, time out after 8 seconds, stop reading at 3 MB and follow at most 3 redirects. A result is kept for 6 hours, so checking the same store twice doesn't hit it twice.
Find a store's theme by hand
You don't need a tool for the basic answer. Open the store, view the page source (Ctrl+U, or Cmd+Option+U on a Mac) and search for Shopify.theme. Stores running an Online Store theme print one line like this. It's the real line from Shopify's own Dawn demo store4:
Shopify.theme = {"name":"Dawn","id":129690763353,"schema_name":"Dawn","schema_version":"15.0.0","theme_store_id":887,"role":"main"};
| Field | What it means | Can it be changed? |
|---|---|---|
name | The name this copy of the theme has in the store's theme library. | Yes, freely. Stores name copies after sales, releases and dates. |
schema_name | The theme's own name, from theme_info in config/settings_schema.json, where every theme declares its name and version2. | Only by editing theme code. Most stores never touch it. |
schema_version | The theme version the copy is based on, from the same file. | Only by editing theme code. |
theme_store_id | The theme's ID in the Shopify Theme Store. Shopify's API docs say it's null when the theme wasn't installed from the Theme Store1. | No. It comes with the install. |
role | main for the published theme. Previews show other roles. | Changes when another theme is published. |
Read theme_store_id first and look it up in the ID table below. If it's null, the theme didn't come from the Theme Store: it's a custom build, a theme bought elsewhere, or a copy a developer uploaded, pushed with Shopify CLI or connected from GitHub. Then schema_name is your best clue. A null ID with schema_name "Dawn" is a Dawn copy that a developer installed by hand, which is common on bigger stores.
Why renamed themes fool detectors
A detector that reads only name, or matches file names, reports whatever the merchant called the copy. On 2026-09-16 knix.com's live theme was named "Post Summer Sale - (US|2026.09.10) Release 4.21.1" and its schema_name said "Knix (v4.21.1)", yet its theme_store_id was 887: Dawn. cotopaxi.com was the same story ("Cotopaxi", ID 887). In the 105 Online Store homepages we sampled that day, 12 carried a Theme Store ID, 9 of those 12 had been renamed and 3 had a rewritten schema_name too. The sample was mostly large DTC brands, so it leans towards custom builds, but the order of evidence holds for any store: ID first, then schema_name, then name.
Some things can't be read from the page at all. A heavily customised Dawn with a new schema_name and no Theme Store ID looks exactly like a from-scratch build. When that happens the detector says it can't tell rather than guessing.
How to tell if a site is on Shopify
A Shopify storefront gives itself away in its response headers and its page source. The detector counts a site as Shopify when it sees one strong signal, or at least two weak ones:
- Strong: a
powered-by: Shopifyresponse header4, aShopify.shop = "…myshopify.com"line, theShopify.themeobject, or a theme ID in theserver-timingheader. - Weak: assets under
/cdn/shop/or oncdn.shopify.com, theshopify-digital-walletmeta tag,_shopify_ycookies, theShopifyAnalyticsobject. One weak signal alone isn't enough: any site can embed a Shopify Buy Button and load an image from Shopify's CDN.
Two cases need care. A headless store runs Shopify behind its own front end, often Hydrogen on Shopify's Oxygen hosting, which answers with powered-by: Shopify, Oxygen, Hydrogen. It's Shopify, but there's no Online Store theme to find and no public product feed. A password-protected store redirects everyone to /password, so only the lock screen is public and the detector stops there.
How app detection works, and what it can't see
An app shows up only if it puts code on the storefront. The detector accepts four kinds of evidence and prints the one it found next to each app:
- A script, stylesheet, iframe or pixel loaded from the app's own domain, such as
static.klaviyo.com. Plain links don't count: a "Powered by" link isn't an install. - Shopify's own
BEGIN app block: shopify://apps/<handle>comment, which Online Store 2.0 themes print around every app block and app embed. - A theme app extension file under
cdn.shopify.com/extensions/…/<handle>. - A Shopify web pixel whose settings name the vendor, or an inline call such as
fbq('init', …).
It can't see apps that never touch the storefront: inventory, shipping labels, accounting, most back-office tools. It also misses checkout-only extensions and anything that loads only after a cookie-consent click. App blocks it doesn't recognise are listed by their handle, which is the name the app's developer gave it and not always the brand name. The detector recognises 95 apps and tags, each signature checked on 2026-09-16 against live store pages or the vendor's install docs:
- Reviews
- Judge.me, Okendo, Loox, Stamped, Bazaarvoice, Junip, REVIEWS.io, Trustpilot
- Reviews & loyalty
- Yotpo
- Email & SMS
- Klaviyo, Omnisend, Attentive, Postscript, Recart, Mailchimp, PushOwl
- Support & chat
- Gorgias, Tidio, Gladly, Kustomer, Richpanel, Zendesk, Re:amaze
- Subscriptions
- Recharge, Skio, Ordergroove
- Loyalty
- Smile.io, LoyaltyLion, Rivo, Inveterate
- Upsell & personalisation
- Rebuy, Nosto, Dynamic Yield
- A/B testing
- Intelligems, Shoplift, Optimizely, Convert, AB Tasty, Visually
- Page builder
- PageFly, GemPages
- Search & filters
- Boost AI Search & Filter, Searchanise, Klevu, Algolia, Searchspring, Doofinder
- Buy now, pay later
- Afterpay, Klarna, Affirm, Sezzle
- Analytics & pixels
- Google tag / Tag Manager, Meta Pixel, TikTok Pixel, Pinterest Tag, Snap Pixel, Reddit Pixel, Microsoft Clarity, Hotjar, Heap, Elevar, Triple Whale, Northbeam, Littledata, Polar Analytics
- Privacy & consent
- OneTrust, Consentmo, Pandectes, Cookiebot, Osano, Termly
- Accessibility
- accessiBe, UserWay
- Shipping & returns
- Route, Loop Returns, Redo, AfterShip, EcoCart
- Video & UGC
- Tolstoy, Videowise, Firework
- Wishlist
- Swym Wishlist Plus, Wishlist King
- Fraud prevention
- Signifyd, NoFraud
- Affiliates & creators
- impact.com, ShareASale, Refersion, Superfiliate, ShopMy
- International
- Global-e, Weglot
- Quizzes & forms
- Octane AI, Hulk Form Builder, Powerful Form Builder
The AI-readiness checks
The top-ranking theme detectors we tried stop at the theme name. This one also reads the public data AI shopping tools can read, and grades it. The field list comes from Shopify's guidance on the product details AI platforms consider5. The pass lines are ours and are shown with each result.
| Check | What it measures | Pass line | How to fix |
|---|---|---|---|
| Crawler access | Whether robots.txt lets Googlebot, Bingbot, OAI-SearchBot, Claude-SearchBot, Claude-User, PerplexityBot read the homepage and a product page91011. Matching follows RFC 930913. | All allowed. Blocking Googlebot or Bingbot is a fail. | AI crawlers |
| Indexable homepage | No noindex in the meta robots tag or X-Robots-Tag header. | No noindex. | Indexing |
| Product JSON-LD | Product or ProductGroup markup on the sampled product page, with offers and brand. Google requires offers and recommends brand and gtin7. | Product with offers and brand. Missing gtin is a warning. | Product schema, GTIN |
| Organization JSON-LD | Organization (or a subtype such as OnlineStore) on the homepage, where Google recommends it8. | Present. | Organization schema |
| Catalog minimums | Share of up to 30 products with a title, at least 1 image and a price above zero, the product rules Shopify Catalog lists6. | 100%. Under 80% is a fail. | Catalog eligibility |
| Type, vendor, tags | Share of sampled products with each field filled in. | 90% each. Under 50% is a fail. | Catalog product fields |
| Descriptions | Share with a description of 50 words or more. Shopify asks for "clear, accurate, and detailed" descriptions; 50 words is our line. | 80%. Under 40% is a fail. | Descriptions for AI |
| SKUs | Share of variants with a SKU. | 90%. | Product variants |
| Barcodes | Variants of one sampled product carrying a GTIN with a valid check digit. The public product feed leaves barcodes out; the single-product JSON includes them. | Every variant. | Barcodes and GTINs |
| Image alt text | Images of the sampled product with alt text. Also only in the single-product JSON. | 90%. | Alt text |
| llms.txt | Whether the file exists and whether the store wrote it. Reported, not scored: llms.txt is still a proposal14. | None. | llms.txt |
Training crawlers (GPTBot, ClaudeBot, Google-Extended, Applebot-Extended, CCBot, meta-externalagent, Amazonbot) are listed in every result but never scored. Blocking them is a content-rights choice with no search cost; Google says Google-Extended "does not impact a site's inclusion in Google Search"12.
One thing changed recently. On 2026-09-16, stores that hadn't customised robots.txt served a default file that opens with comments pointing AI agents to /agents.md and to Universal Commerce Protocol endpoints, and /llms.txt returned an "Agent Instructions" file the merchant never wrote4. The detector labels that file as Shopify's default so a store doesn't get credit for it.
Popular Shopify themes and their Theme Store IDs
Every ID below was read from the theme's own page on themes.shopify.com on 2026-09-163, together with its developer and list price that day. The detector knows all 337 themes the Theme Store listed. Third-party Theme Store themes carry an ID too (Prestige is 855, Focal 714), even though Shopify's API docs describe the ID as belonging to Shopify-made themes.
| Theme | Theme Store ID | Developer | Price |
|---|---|---|---|
| Dawn | 887 | Shopify | Free |
| Horizon | 2481 | Shopify | Free |
| Refresh | 1567 | Shopify | Free |
| Sense | 1356 | Shopify | Free |
| Craft | 1368 | Shopify | Free |
| Studio | 1431 | Shopify | Free |
| Taste | 1434 | Shopify | Free |
| Crave | 1363 | Shopify | Free |
| Colorblock | 1499 | Shopify | Free |
| Ride | 1500 | Shopify | Free |
| Origin | 1841 | Shopify | Free |
| Publisher | 1864 | Shopify | Free |
| Spotlight | 1891 | Shopify | Free |
| Trade | 2699 | Shopify | Free |
| Theme | Theme Store ID | Developer | List price |
|---|---|---|---|
| Be Yours | 1399 | RoarTheme | $350 |
| Broadcast | 868 | Presidio | $420 |
| Empire | 838 | Pixel Union | $360 |
| Focal | 714 | Maestrooo | $320 |
| Impact | 1190 | Maestrooo | $400 |
| Impulse | 857 | Archetype Themes | $500 |
| Motion | 847 | Archetype Themes | $420 |
| Pipeline | 739 | Groupthought | $360 |
| Prestige | 855 | Maestrooo | $400 |
| Symmetry | 568 | Clean Canvas | $420 |
| Warehouse | 871 | Maestrooo | $320 |
What we log
For each store looked up we keep one line per day: the date, the store's domain and what the detector found (platform, theme, recognised apps, readiness numbers). That builds an aggregate picture of which themes and apps Shopify stores use, which we plan to publish as statistics. We don't store or log your IP address, and the lookup isn't tied to you in any way. Rate limits (10 lookups a minute, 100 a day) are counted in memory against a one-way hash of your connection's address and forgotten within a day. Details are in the privacy policy.
FAQ
Why does it say "custom theme"?
The store has no Theme Store ID and its schema_name doesn't match any theme on the Theme Store. That's a theme built for the brand, one bought outside the Theme Store, or a Theme Store theme whose name was rewritten. Most large brands in our sample fell in this group.
Can it detect the theme of a Hydrogen or other headless store?
It can tell you the store runs on Shopify, but there's no theme to report: a headless front end replaces the Online Store theme. Headless stores also don't serve Shopify's public product feed, so the catalog checks are skipped.
Why is an app I know the store uses missing?
Either it doesn't load code on the homepage (back-office apps, checkout-only extensions, apps used only on product or cart pages), it loads only after a consent click, or it isn't in our signature list yet. Unrecognised app blocks are still listed by handle under "Other app blocks".
Does the store find out I checked it?
Our requests reach the store like any visit and appear in its logs as ShopifyRankedBot/1.0 with a link back to this page. They don't carry anything about you, and we don't contact the store.
Why were the catalog checks skipped?
Usually because /products.json didn't answer: some stores switch it off, headless stores don't have it, and password-protected stores hide it. The result says which one.
The result shows a different domain from the one I typed. Why?
The store redirected us. Some stores send visitors to a regional storefront by location, and our server is in Europe, so you may see a different market's store than we did. The result names the storefront it actually read.
Is the theme price current?
It's the list price themes.shopify.com showed on 2026-09-16. Developers change prices, so check the theme's page before you buy.