Every store gets the bottom of the stack. Almost none reach the top.
Each bar is one layer an AI shopping agent relies on, and every bar is on the same scale: the share of stores that have it. Shopify gives every store the bottom four layers. The layers above them are up to the merchant, and each one up is rarer. The top layer is Shopify's: its UCP catalog returned no barcodes for any store, even where the barcodes were filled in.
Show as table
Layers from the product pages come from up to five pages per store. Product type, category, filled-in barcodes and alt text come from the follow-up pass (up to three products per store). For a traffic group or theme, those four layers count the 38,055 stores we could match to the follow-up pass, and the all-stores tick is computed the same way, so it can differ from the report's figures by about a point. Theme slices use stores that report a Theme Store theme ID; themes with fewer than 100 such stores are left out.
The full report
We read the public pages of 40,746 live Shopify stores the way an AI shopping agent would: robots.txt, Shopify's agent files, the UCP profile and up to five product pages per store. We also graded the demo store of every theme on Shopify's Theme Store and 17,607 stores confirmed to have reviewed an SEO, metafield or bulk editor app (37,384 counting likely matches). Shopify's defaults open the door for nearly everyone. What separates stores is the product data on the page.
Terms used in this study
- AI crawler
- A bot that reads web pages for an AI company. We checked 12 in three groups: search bots that build AI search results, user-fetch bots that open a page when a person asks an assistant about it, and training bots that collect pages for model training.
- robots.txt
- The file at the root of a site that tells bots which pages they may read.
- JSON-LD
- A block of structured data in a page's code that states product facts (name, price, availability and so on) in a fixed format machines read without guessing. Shopify themes print it on product pages.
- Microdata
- An older way to mark up the same facts inside the page's HTML. We report it but grade only JSON-LD.
- GTIN
- The product's barcode number (UPC, EAN or ISBN). Shopify stores it in each variant's Barcode field.
- additionalProperty
- The schema.org field for any product fact that has no field of its own, written as name and value pairs such as "Fabric: linen" or "Fit: relaxed". It is how a page hands an agent the details that tell similar products apart.
- agents.md and llms.txt
- Text files Shopify serves on every store to tell AI agents what the store offers and how to reach it.
- UCP
- Universal Commerce Protocol, the standard Shopify and Google introduced in 2026 for agents to search, build carts and check out. A store's UCP profile lists what it supports. MCP is the connection agents use to call it.
- Theme Store
- Shopify's catalog of themes. Each theme has a demo store run by its maker, which shows what the theme prints before a merchant adds anything.
- Product block
- One Product (or ProductGroup, Shopify's way of grouping a product's variants) object in a page's JSON-LD. A page should have one per product; a second one usually comes from an app.
- Malformed JSON-LD
- A JSON-LD block with a syntax error, which machines skip entirely.
- Showcase stores
- The live stores a theme's Theme Store page lists under "Stores using this theme".
- Tranco and Common Crawl
- Tranco is a public ranking of the top websites by traffic. Common Crawl is a public archive of the web; we used it to find myshopify.com stores outside the ranking, which are mostly small.
- 95% range
- The range the true share most likely falls in, given how many stores a number is based on. Small groups have wide ranges.
Shopify's defaults leave the door open
Almost no store blocks AI crawlers. Only 0.6% of stores block any of the 12 we checked, and only 0.1% block a search or user-fetch bot such as OAI-SearchBot, PerplexityBot or ChatGPT-User. The few blocks that exist target training crawlers, mostly CCBot and GPTBot. 3.7% of stores name an AI crawler in robots.txt at all, and most of those block none of them.
Shopify's agent files are just as uniform. 99.5% of stores serve /agents.md and 99.6% serve /llms.txt; 98.5% use Shopify's default template. All but 8 of the stores we graded returned a valid UCP profile at /.well-known/ucp with the same 10 capabilities (checkout, cart, catalog search and lookup among them), and every profile lists an MCP endpoint. 1.1% of stores customized agents.md, and 0.2% dropped the links to UCP and MCP along the way. We read these files; we did not call the MCP endpoint or run a search through it.
Our view: this is good news for merchants, and it also means none of it sets a store apart. When every store answers the same way at the door, the product pages are where a store can stand out.
Show as table
Product data is where stores split
We graded up to five random product pages per store on nine facts an agent needs to recommend a product: name, description, image, price, currency, availability, brand, SKU and GTIN. Each fact is worth one ninth of a page's grade, a page with no Product JSON-LD scores 0, and a store's grade is the average of its pages.
The median store scores 89: its pages typically miss one of the nine facts. On pages missing exactly one fact, that fact is the GTIN 95% of the time. Only 14% of stores score a perfect 100. At the other end, 12.6% print no Product JSON-LD at all. Just over half of those (57%) describe products in older microdata markup instead; the rest have no structured product data we could find.
Show as table
The facts that tell products apart are the ones missing
The average store prints name, price and availability on about 85% of its product pages. The identifiers that let an agent match an exact product are far rarer: a GTIN on 25% of pages and a SKU on 66%.
{ "@type": "Product", "name": "Linen Shirt", "image": "https://cdn.shopify.com/...", "brand": { "name": "Example Co" }, "offers": { "price": "68.00", "priceCurrency": "USD", "availability": "https://schema.org/InStock" }, "sku": missing on 34% of pages "gtin": missing on 75% of pages "additionalProperty": missing at 96.5% of stores }
Show as table
67.5% of stores have no GTIN in their structured data on any sampled page, and only 16.8% have one on every page. On 78,011 of the 200,618 pages we graded (39%), the GTIN was the only fact missing.
Almost no store describes what its products are like
The nine graded facts say what a product is called and what it costs. They do not say what it is made of, how it fits or who it is for, which is what a shopper asks an assistant ("a linen shirt for summer that runs large"). schema.org gives pages two ways to say it: named fields such as color, size and material, and additionalProperty, a list of name and value pairs for anything else.
Only 3.5% of stores (1,433) put any additionalProperty on a product page, 4.0% of the stores that print Product JSON-LD at all, and 2.0% on every page we sampled. For 1,343 of them it is on the product itself; the rest have it only on the price offers. Nearly all of them (1,425) fill in values. The typical store lists 2 or 3 properties per page; 30% list 5 or more. The named attribute fields are just as rare: 5.2% of stores use any of color, size, material, pattern, gender or age group. Counting both ways, 6.7% of stores give an agent any attribute detail. None put additionalProperty in microdata instead.
The detail does not come from themes. Only 1 of the 345 theme demo stores we graded prints additionalProperty, so the stores that have it added it with an app or their own code. The property names point the same way: alongside shopper facts such as size, color, material and fabric, common names include item_group_id and title, which are field names from Google Shopping product feeds, and tags, Shopify's own product tags copied over as they are. 5,062 different property names appear across the 1,433 stores.
Show as table
We also counted every other key stores put on their Product and Offer blocks. A few go beyond the nine graded facts often: a product category on 38.8% of stores, star ratings on 17.3% and a manufacturer part number on 14.9%. The rest are rare.
High-traffic stores are further along here too: 6.5% of stores among the top 100,000 websites use additionalProperty, against 0.8% of stores found only through Common Crawl. Shopify's category metafields (the attribute fields in each product's category section in the Shopify admin) hold exactly these details; the gap is getting them from the admin into the page.
The theme sets the floor, and a few themes leave it at zero
We graded the demo store of all 346 themes on Shopify's Theme Store (345 answered) and every store that reports a Theme Store theme ID. On the demos, 339 of 345 print Product JSON-LD and the average demo grade is 80. The 6 themes whose own demo prints none are Fashionopolism, Retina, Responsive, Maximize, Loft and Force, and stores on most of them print none either: 77% of Retina stores, 71% of Responsive and 55% of Fashionopolism lack Product JSON-LD, so their averages fall to between 13 and 57.
Most other themes sit close together. Among the 104 themes with 20 or more stores, the middle half average between 77 and 86. All 24 free themes average 78 to 90, with at most 5.1% of stores lacking Product JSON-LD. The best paid themes, such as Stretch, Pinnacle, Warehouse and Hyper, average above 91 because their stores print SKU and GTIN more often. A demo rarely shows a GTIN (32 of 345 demos have one), since demo products have no barcodes; in stores, the GTIN depends mostly on whether the merchant fills in the Barcode field.
For other low themes the problem is an old version. Theme makers added Product JSON-LD in later releases, and stores that never updated still print none: 90% of stores on Blockshop 5 and 6 lack it against at most 14% on Blockshop 10, 12 and 13, and Testament 6 and 7, District 2, Flow 16 to 31 and Icon 7 show the same pattern, while their current versions print it. Updating a theme is a free fix that many stores have not made.
Stores still on Shopify's older free themes, which are no longer on the Theme Store (Supply, Minimal, Simple, Brooklyn, Narrative, Venture and others), are furthest behind: 93.6% of the 1,089 stores that kept those theme names print no Product JSON-LD, and their average grade is 5. Debut, the most common older theme, does better (911 stores, 19.9% without, average 61).
Every theme on the Theme Store
The table lists all 346 themes. Its numbers come from the 17,936 main-sample stores that report a Theme Store ID, plus 675 showcase stores. Another 10,260 main-sample stores run a theme whose internal name matches a Theme Store theme but report no ID, usually copies or themes built on one (many report "Dawn"); the table shows how many per theme but leaves them out of the averages. 12,550 run a custom or retired theme. 211 themes have 5 or more stores and get averages; averages from 5 to 19 stores are in grey because they can swing with one store. 89 themes have 1 to 4 stores and 46 had none we could find, which leaves their demo grade as the only number.
Stores that review SEO and catalog apps have better product data, and more duplicate Product blocks
We collected the 1,862 apps the App Store lists in three categories: Search engine optimization, which also lists product review apps, and Metafields and Bulk editor, the two categories Datify itself is listed in. We read the 75,302 reviews those apps show. A review gives the store's name and country but not its web address, so we looked for each store under the address Shopify builds from its name and kept it only when the store's own name and country matched the review. 17,607 graded stores matched that way, and the numbers below use them.
The fair comparison is with stores of similar traffic. 1,099 of these stores rank between 100,001 and 1 million in Tranco, and against the 26,266 stores in that band that reviewed none of these apps they do better on every graded measure: average grade 84.6 against 80.1, 5.5% without Product JSON-LD against 9.0%, and 49.1% with no GTIN against 61.2%. They also use attributes and additionalProperty about twice as often. What gets worse is duplicates: 27.7% have a product page with two or more Product blocks, against 16.9% (malformed blocks are also slightly more common, 6.6% against 5.5%). Usually that is the theme's block plus a second one added by an app (SEO or reviews). Two blocks for one product can disagree on price or availability, and agents have to pick one.
Show as table
Most reviewer stores (16,345) are outside the Tranco top million and were not in Common Crawl's list, so they have no traffic group of their own. They average 77.0, with 10.7% lacking Product JSON-LD and 24.9% printing duplicate blocks; the closest group in the main sample, stores found through Common Crawl, averages 62.9, but that group also holds test and abandoned stores, so we do not read much into the gap. Stores that reviewed two or more SEO category apps go furthest: average grade 82.5, 14.7% with attributes, 11.3% with additionalProperty and 33.6% with duplicate Product blocks. Reviews from the last 12 months come from stores averaging 80.7, against 76.9 for older reviews. Star ratings barely matter: reviews with 5 stars come from stores averaging 78.5 and those with 1 star from stores averaging 75.9.
These are stores that chose to install and review an app, so the comparison shows what those stores look like, not what an app does to a store. Stores that review apps may simply be more active merchants. Adding the 19,777 stores found through a guessed web address changes no conclusion.
Small stores are furthest behind
Our three source groups give high-traffic and low-traffic stores each their own number. Stores among the top 100,000 websites average 81.6 and only 7.8% lack Product JSON-LD; 21.4% score 100. Stores found only through the Common Crawl web archive, nearly all outside the top million sites, average 63.1, 22.9% lack Product JSON-LD and only 3% score 100. This group also holds more test and abandoned stores than the ranked groups.
Show as table
One store in eight has real GTINs its product pages leave out
The findings above read what the product page tells an agent. On October 13 and 14 we went back to the same stores to read what they have filled in behind the page, from two public sources: each product's /products/<handle>.js file, which Shopify serves for every product and which includes each variant's barcode, and the store's own UCP catalog (/api/ucp/mcp), which AI agents call to look up products. We read the same products we graded before, up to 3 per store, for 40,419 stores.
41.3% of stores have a valid GTIN in Shopify's Barcode field on at least one of those products, while 30.8% print any GTIN in the page's structured data. 13.1% of stores, about one in eight, have a valid GTIN on a product whose structured data leaves it out. The barcode is already in the store; it just never reaches the JSON-LD that agents read. A further problem: of the stores that fill in the Barcode field, 32.2% have at least one code that is not a valid GTIN, usually an internal stock number or a "0", which an agent cannot match to anything.
Shopify's product category (the standard taxonomy category every product can have) is set on the sampled product at 60.7% of the 40,161 stores whose UCP catalog answered; for the rest the catalog says Uncategorized or returns no category. UCP returns the category along with the title, description, price, SKU, images, collections and variant options such as Color and Size. To our calls it returned no barcodes and no metafields for any store, including stores whose barcodes are filled in. So an agent that relies on UCP alone gets no GTIN and none of the category metafields (such as material or fit); it would have to read the page or the .js file for the barcode.
Show as table
The gap between filled in and printed is widest among the busiest stores: 17.1% of stores in the top 100,000 sites have a valid GTIN their structured data leaves out. Among product categories with at least 300 stores, pet supplies (20.9%), hardware (17.9%) and health and beauty (16.6%) stores are the most likely to have GTINs that are filled in but left out.
Fix the product page, not the plumbing
- Leave Shopify's robots.txt, agents.md and UCP defaults in place unless you have a reason to change them. If you customize agents.md, keep the UCP and MCP links.
- Fill in the Barcode field on each variant with the real GTIN, not an internal code. It is the most common missing fact by far: on 39% of the pages we graded it was the only one. If it is already filled in, check that the product page prints it; for 13.1% of stores it is filled in but never reaches the page.
- Set each product's Shopify category. Shopify's UCP catalog passes it to AI agents, and 39% of stores have none set on the products we sampled.
- Get attributes such as color, size, material and fit into the page's structured data, as named fields or additionalProperty, not only into the description text. Themes do not do this on their own; it takes theme code or an app.
- If you add JSON-LD with an app, check that the page ends up with one Product block, not the theme's plus the app's.
- Update the theme to its latest version. Older versions of several paid themes print no Product JSON-LD and their current versions do.
- If the store runs Fashionopolism, Retina, Responsive, Maximize, Loft or Force, or an older free theme such as Supply, Minimal or Brooklyn, its product pages most likely print no Product JSON-LD. Moving to a current theme or adding JSON-LD fixes that.
How we measured
On October 12 and 13, 2026 we tried 44,900 candidate stores and graded 40,746. We only read public pages, as any visitor or AI agent can: no logins, forms, carts or checkouts, and no contact with any store. Our crawler identified itself as DatifyResearch/1.0, followed each store's robots.txt and Crawl-delay, made one request at a time per store at least one second apart, and sent 501,897 requests in total, about 11 per store tried. It graded 200,618 product pages. Stores that refused or timed out were tried once more at a lower rate.
The candidates are every site among the Tranco top 1 million (list ID 4672X) whose DNS points at Shopify (31,046 sites) and every myshopify.com address in Common Crawl's CC-MAIN-2026-39 index (13,854). That is everything those two sources give, so 40,746 is the most this method reaches; older Common Crawl indexes would add more small stores. Counting theme and app reviewer stores as well, we graded about 76,600 stores. Every store also had to show Shopify's markers on its home page. Final counts: 874 graded stores in the top 100,000, 28,648 in ranks 100,001 to 1,000,000 and 11,224 found through Common Crawl.
Theme Store: the 346 themes come from the Theme Store's sitemap. For each, we graded the demo store the listing shows and the stores in its "Stores using this theme" list (820 graded); the latter only add to the theme table, never to the main sample. 16 theme demo stores found among the candidates were graded but removed from the main sample, which is why 40,762 graded stores give a main sample of 40,746.
App reviewers: the App Store listed 1,173, 178 and 541 apps in the three categories, and we collected 1,172, 178 and 539 (3 cards moved between pages while we read them), 1,862 distinct apps in all; 1,084 of them had no reviews. We read 75,302 reviews against about 108,700 ratings the apps show. The App Store lists at most 10,000 reviews per app, so for the one app with more than that (48,393 ratings) we read each star rating separately and reached 14,450. We looked up 65,010 unique store name and country pairs, and 39,382 of them (61%) led to a store whose name and country matched, which gave 39,158 stores (several names can lead to one store). 18,842 matched through the address Shopify builds from the store's name or a name that is itself a web address, and 20,316 through a guessed .com or country domain. In a hand check of 100 matches from a pilot run, checked against each store's own pages, all 41 found through the name-built address were the same business; of the 59 found through a guessed domain, 49 were the same and 10 unclear. That is why the comparison uses the first group. 2,675 reviewer stores were already in the main sample and were graded once.
Product data behind the page (Finding 8): we revisited the 40,746 stores on October 13 and 14, read robots.txt again, and fetched up to 3 of the same products' .js files and, for the first product, one UCP catalog get_product call, using the example agent profile from Shopify's documentation. 40,419 stores had at least one readable product file and 40,161 answered the UCP call. A barcode counts as a valid GTIN when it has 8, 12, 13 or 14 digits and a correct GS1 check digit.
Limits
- Category metafields (such as material, fit or pattern) have no public source outside the page, so Finding 8 cannot say how many stores fill them in. Variant options such as Color and Size are public through the
.jsfile and UCP but were not counted. The UCP numbers come from one anonymous call per store, which returns the product's default variant; an agent with a signed profile might be shown more fields. - This covers Shopify stores that rank among the top million sites or appear in Common Crawl, not every Shopify merchant. Headless stores on their own hosting and stores behind another CDN are missed.
- 134 stores refused our requests both times we tried, and 164 did not answer; these are most likely stores whose bot protection turns away traffic from cloud servers.
- The grade checks whether a fact is in the JSON-LD, not whether it is correct or visible elsewhere on the page. It reads the page's HTML and does not run JavaScript; many AI crawlers do not run it either. When a page has several Product blocks, a fact counts if any of them has it, and additionalProperty counts entries on the product, its variants and their offers.
- The theme table relies on the theme ID a store reports. Copies and heavily edited themes that drop the ID are in the 10,260 stores matched by internal name only, which the table leaves out.
- The app reviewer group covers only stores that left a review, and only those whose name leads to their store; renamed stores are missed, and about 4 in 10 reviewing stores could not be found. A review shows a store installed the app at some point, not that it still uses it. Per-app results are not published.
- Robots.txt shows what a store allows, not what its bot protection does. We did not send requests as each AI crawler.
- Shopify changed the default agents.md text on October 13, partway through the app reviewer scan. The main sample was read before the change, so its agents.md numbers describe the earlier template.
- The Common Crawl group includes test and abandoned stores. Most drop out as password pages or stores with no products, but some that remain may be inactive.
- A 50-store hand check with a separate parser (10 per traffic group, 10 theme demos, and 10 picked for additionalProperty or several Product blocks) matched the scanner on every value for 47 stores. One page had changed since the scan, one held an empty JSON-LD block the scanner skips rather than counting as malformed, and one had additionalProperty entries on its offers, which the scanner counts and the check did not.
- This is one snapshot. Shopify changes its defaults often, and the agent files and UCP profile are less than a year old.