Cartiq store report

gymshark.com

Agent readiness overview

Store readiness score

42/ 100
Grade DPartially invisible

Questions answerable

0 of 6 answerable

Enough answered to establish a reliable score.

Top issue

Your product pages have no structured data

−6 pts at risk

Category breakdown

A color-coded view of every scoring area.

  • AStructured product data
    0/25
  • BCatalog & feed availability
    15/15
  • CAgent access policy
    14/20
  • DCommerce signals
    2/15
  • EProtocol & checkout readiness
    6/10
  • FNon-JS accessibility
    4/10
  • GIdentity & trust
    1/5

Product checks were read from https://us.checkout.gymshark.com/products/gift-card, found in your product sitemap.

What to fix first

All findings, grouped by priority.

Critical

3
  • CriticalYour product pages have no structured dataA1−6 ptsView fix

    AI shopping assistants cannot tell what you sell, so your products never appear when a shopper asks for recommendations in your category.

    No JSON-LD blocks found on the product page

    How to fix

    0. Replace every YOUR_ value before publishing — the snippet parses as-is, but the values are not yours. 1. Add a Product JSON-LD block to every product page, inside a <script type="application/ld+json"> tag in the page head. 2. On Shopify, most modern themes include this — check Online Store → Themes → Edit code → sections/product-template.liquid, or install a structured-data app. 3. On WooCommerce, structured data ships by default; if it is missing, an SEO plugin such as Yoast or Rank Math will emit it. 4. Validate the result at validator.schema.org before re-scanning.

    ›Show code
    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "Product",
      "name": "Merino Runner",
      "description": "A breathable everyday running shoe made from responsibly sourced merino wool.",
      "sku": "MR-42-GRY",
      "brand": { "@type": "Brand", "name": "Your Brand" },
      "image": ["https://cdn.example.com/merino-runner.jpg"],
      "offers": {
        "@type": "Offer",
        "price": "YOUR_PRICE",
        "priceCurrency": "YOUR_CURRENCY",
        "availability": "https://schema.org/InStock"
      }
    }
    </script>
  • CriticalProduct name and price are not readable without JavaScriptF1−6 ptsView fix

    Many agents never run JavaScript, so a page that only shows its price after the browser renders it looks like an empty page to them.

    name source: none, price source: none (page appears to require JavaScript)

    How to fix

    1. Render the product name and price in the HTML your server sends, not only in the JavaScript bundle. 2. Add microdata attributes to the visible elements so the values are machine-readable as well as human-readable. 3. Check by viewing source, or running curl, rather than by using browser dev tools — dev tools show the page after JavaScript has run. 4. Note that JSON-LD alone does not satisfy this check: it proves a machine can read your price, not that a text-only agent can see the page at all.

    ›Show code
    <h1 itemprop="name">Merino Runner</h1>
    <span itemprop="price" content="98.00">$98.00</span>
  • CriticalPrice is missing from your structured dataA2−5 ptsView fix

    An assistant that cannot read your price will skip your product whenever a shopper compares options or filters by budget.

    price=missing, priceCurrency=missing

    How to fix

    0. Replace every YOUR_ value before publishing — the snippet parses as-is, but the values are not yours. 1. Add an offers block to your Product JSON-LD with both price and priceCurrency. 2. Give price as a plain number in quotes with no currency symbol and no thousands separator: "98.00", not "$98". 3. Use the three-letter ISO code for priceCurrency: USD, EUR, GBP. 4. If you sell in several currencies, emit the price for the currency the page is being served in.

    ›Show code
    "offers": {
      "@type": "Offer",
      "price": "YOUR_PRICE",
      "priceCurrency": "YOUR_CURRENCY",
      "url": "https://yourdomain.com/products/merino-runner"
    }

High

8
  • HighShipping details are not in your structured dataD1−4 ptsView fix

    Shoppers increasingly ask assistants what delivery will cost before they click, and a store that cannot answer is filtered out at that moment.

    No shipping policy in structured data, at offer or organization level

    How to fix

    0. Replace every YOUR_ value before publishing — the snippet parses as-is, but the values are not yours. 1. Publish it once for the whole store, not per product. Add hasShippingService to your Organization block — on Shopify that is one snippet in theme.liquid, and every product page inherits it. 2. State the rate and the regions you ship to. YOUR_SHIPPING_RATE is a number as a string — "0" for free shipping. YOUR_COUNTRY is a two-letter code such as GB or DE. 3. Include delivery time where you can — assistants use it to answer "will it arrive by Friday". Handling time is how long before you dispatch; transit time is how long the carrier takes. 4. Only add shippingDetails to an individual offer where that product genuinely differs — oversized items, or a region you do not ship it to. Either placement earns these points.

    ›Show code
    "@type": "Organization",
    "name": "YOUR_STORE_NAME",
    "hasShippingService": {
      "@type": "ShippingService",
      "shippingConditions": {
        "@type": "ShippingConditions",
        "shippingRate": { "@type": "MonetaryAmount", "value": "YOUR_SHIPPING_RATE", "currency": "YOUR_CURRENCY" },
        "shippingDestination": { "@type": "DefinedRegion", "addressCountry": "YOUR_COUNTRY" },
        "transitTime": { "@type": "QuantitativeValue", "minValue": "YOUR_TRANSIT_DAYS_MIN", "maxValue": "YOUR_TRANSIT_DAYS_MAX", "unitCode": "DAY" },
        "handlingTime": { "@type": "QuantitativeValue", "minValue": "YOUR_HANDLING_DAYS_MIN", "maxValue": "YOUR_HANDLING_DAYS_MAX", "unitCode": "DAY" }
      }
    }
  • HighReturn policy is not in your structured dataD2−4 ptsView fix

    Return terms are one of the last things a shopper checks before buying, and an assistant that cannot quote yours will recommend a competitor whose terms it can.

    No return policy in structured data, at offer, product or organization level

    How to fix

    0. Replace every YOUR_ value before publishing — the snippet parses as-is, but the values are not yours. 1. Publish it once for the whole store, not per product. Add hasMerchantReturnPolicy to your Organization block — on Shopify that is one snippet in theme.liquid, and every product page inherits it. Adding it to each offer also earns these points, but it is more work and drifts out of date. 2. Set YOUR_RETURN_DAYS to your real window and YOUR_RETURN_FEES to one of https://schema.org/FreeReturn, https://schema.org/ReturnShippingFees or https://schema.org/RestockingFees. If you do not accept returns, use returnPolicyCategory https://schema.org/MerchantReturnNotPermitted and drop the days field. 3. Make it match your published policy page exactly — a mismatch is worse than no markup, because an assistant will quote the markup. 4. Add it to an individual offer only where that product genuinely differs — final sale items, or a shorter window.

    ›Show code
    "@type": "Organization",
    "name": "YOUR_STORE_NAME",
    "hasMerchantReturnPolicy": {
      "@type": "MerchantReturnPolicy",
      "applicableCountry": "YOUR_COUNTRY",
      "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
      "merchantReturnDays": "YOUR_RETURN_DAYS",
      "returnMethod": "https://schema.org/ReturnByMail",
      "returnFees": "YOUR_RETURN_FEES"
    }
  • HighNo agentic commerce protocol support detectedE1−4 ptsView fix

    Agents that can complete a purchase without handing the shopper back to your checkout convert far better, and right now yours cannot be bought from that way.

    No ACP, UCP, MPP or x402 markers found

    How to fix

    1. Review the emerging agentic commerce protocols — ACP, UCP, MPP and x402 — and pick the one your platform supports. 2. Advertise support with a meta tag or response header so agents can detect it without guessing. 3. This is early; being among the first stores to support it is the point, and most of your competitors have not.

    ›Show code
    <meta name="agentic-commerce" content="acp-version=1" />
  • HighStock availability is not machine-readableA3−3 ptsView fix

    Assistants drop products they cannot confirm are in stock, so yours get left out of recommendations even when they are on the shelf.

    No availability value

    How to fix

    0. Replace every YOUR_ value before publishing — the snippet parses as-is, but the values are not yours. 1. Add an availability field to your offers block. 2. Use a schema.org value, not free text: InStock, OutOfStock, PreOrder, BackOrder or SoldOut. 3. Keep it in sync with your real inventory — a product permanently marked InStock while out of stock erodes trust with the agents that cache it.

    ›Show code
    "offers": {
      "@type": "Offer",
      "price": "YOUR_PRICE",
      "priceCurrency": "YOUR_CURRENCY",
      "availability": "https://schema.org/InStock"
    }
  • HighYour products carry no unique identifierA4−3 ptsView fix

    Without a GTIN, MPN or SKU an assistant cannot match your listing to the same product sold elsewhere, so you silently lose the price comparisons you would often win.

    sku=false, gtin=false, mpn=false

    How to fix

    0. Replace every YOUR_ value before publishing — the snippet parses as-is, but the values are not yours. 1. Add gtin13 (or gtin8/gtin12/gtin14) if your products have a barcode — this is the strongest identifier. 2. If you manufacture the product yourself, add mpn instead. 3. Add sku in all cases; it is the weakest of the three but better than nothing. 4. On Shopify, the barcode field maps to gtin and is often left blank at import — check a few products.

    ›Show code
    "sku": "YOUR_SKU",
    "gtin13": "YOUR_GTIN13",
    "mpn": "YOUR_MPN"
  • HighAI shopping agents are blocked or not explicitly welcomedC2−3 ptsView fix

    Every agent you block is an entire storefront that cannot see you at all, and agents you have not explicitly welcomed may crawl you less often than competitors who have.

    12 of 12 agents allowed, 0 explicitly welcomed

    How to fix

    1. Remove any Disallow rule that applies to the shopping agents listed in your report. 2. Add an explicit Allow group for each agent you want to reach your catalogue — being explicit is worth more than staying silent. 3. Keep blocking genuinely unwanted crawlers; this is about the agents that bring shoppers, not about opening your site to everything. 4. Re-check after any WAF or CDN change, since those often inject their own rules.

    ›Show code
    User-agent: GPTBot
    Allow: /
    
    User-agent: OAI-SearchBot
    Allow: /
    
    User-agent: ChatGPT-User
    Allow: /
    
    User-agent: ClaudeBot
    Allow: /
    
    User-agent: Claude-User
    Allow: /
    
    User-agent: PerplexityBot
    Allow: /
    
    User-agent: Perplexity-User
    Allow: /
    
    User-agent: Google-Extended
    Allow: /
    
    User-agent: Applebot-Extended
    Allow: /
    
    User-agent: Amazonbot
    Allow: /
    
    User-agent: meta-externalagent
    Allow: /
    
    User-agent: Bytespider
    Allow: /
  • HighYour homepage blocks automated visitorsC5−3 ptsView fix

    Bot protection is turning away the assistants shoppers use to find stores like yours, so you are invisible to them no matter how good the rest of your setup is.

    Homepage status 200

    How to fix

    1. Check your CDN or WAF bot rules — Cloudflare Bot Fight Mode and similar features challenge well-behaved crawlers by default. 2. Allow known shopping and AI crawler user-agents through without a JavaScript or CAPTCHA challenge. 3. Keep rate limiting; it is challenge pages, not throttling, that make a store unreadable. 4. Verify with a plain curl request that your homepage returns real HTML and not an interstitial.

  • HighShipping and returns pages are missing or unreachableD3−3 ptsView fix

    Assistants asked about delivery or returns will say they do not know, which reads to a shopper as a store that is hiding something.

    Shipping page reachable: false, returns page reachable: false

    How to fix

    1. Publish separate shipping and returns pages at stable URLs. 2. Link them from your homepage footer using plain wording — "Shipping" and "Returns" rather than an icon or a JavaScript-only accordion. 3. Make sure both pages are crawlable and not blocked in robots.txt.

Medium

5
  • MediumBrand is missing from your product dataA5−2 ptsView fix

    Shoppers who ask an assistant for your brand by name will not be matched to your products.

    How to fix

    1. Add a brand field to your Product JSON-LD. 2. Use the object form with @type Brand rather than a bare string — it is unambiguous and better supported. 3. Use the same spelling everywhere, including your Organization markup and og:site_name.

    ›Show code
    "brand": {
      "@type": "Brand",
      "name": "Your Brand"
    }
  • MediumProduct images are missing or use relative URLsA6−2 ptsView fix

    A product card without a working image gets far fewer clicks, and relative image paths usually fail to load once an assistant renders your product outside your site.

    0 image(s), absolute URL present: false

    How to fix

    1. Add an image field listing at least one image. 2. Use absolute URLs beginning with https:// — a path like /images/shoe.jpg will not resolve for an agent. 3. List several images where you have them; assistants often pick the best fit for their layout.

    ›Show code
    "image": [
      "https://cdn.example.com/merino-runner-front.jpg",
      "https://cdn.example.com/merino-runner-side.jpg"
    ]
  • MediumProduct description is missing or too shortA7−2 ptsView fix

    Assistants read the description to decide whether your product matches what the shopper actually asked for, and a thin one loses those matches to competitors.

    Description is 0 characters

    How to fix

    1. Add a description field of at least a couple of sentences — 50 characters is the floor, not the target. 2. Describe material, fit, use case and what makes it different, in plain language. 3. Do not paste keyword lists; assistants read this as prose and keyword stuffing reads as low quality.

    ›Show code
    "description": "A breathable everyday running shoe made from responsibly sourced merino wool, built for comfort over long distances. Machine washable, available in four colourways."
  • MediumStock status is not exposed at product levelD4−2 ptsView fix

    Assistants cannot tell a shopper whether an item is available right now, so they steer the shopper to a store that can.

    No machine-readable stock status

    How to fix

    1. Emit availability on every offer, including each variant. 2. Update it as stock changes rather than on a nightly job — agents cache what they read. 3. Use OutOfStock honestly; marking sold-out items InStock leads assistants to distrust your whole catalogue.

    ›Show code
    "availability": "https://schema.org/InStock"
  • MediumNo Organization markup for your brandG1−2 ptsView fix

    Assistants have nothing authoritative to cite about who you are, so they describe your brand from whatever they can piece together elsewhere.

    No Organization JSON-LD

    How to fix

    1. Add an Organization JSON-LD block to your homepage. 2. Include name and a logo URL at minimum; add contactPoint and sameAs links to your social profiles where you have them. 3. Use an absolute HTTPS URL for the logo.

    ›Show code
    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "Organization",
      "name": "Your Brand",
      "url": "https://yourdomain.com",
      "logo": "https://cdn.example.com/logo.png",
      "contactPoint": {
        "@type": "ContactPoint",
        "contactType": "customer service",
        "email": "support@yourdomain.com"
      }
    }
    </script>

Low

4
  • LowNo ratings or reviews in your structured dataA8−1 ptsView fix

    Assistants routinely rank results by rating, and a product with none is usually ordered below competitors that have one.

    How to fix

    0. Replace every YOUR_ value before publishing — the snippet parses as-is, but the values are not yours. 1. Add aggregateRating with your real average score and review count. 2. Add individual review entries where you have them. 3. Only publish ratings you actually collected — fabricated review markup is a policy violation with every major platform. 4. Most review apps (Shopify: Judge.me, Okendo, Loox; WooCommerce: built-in reviews) emit this automatically once enabled.

    ›Show code
    "aggregateRating": {
      "@type": "AggregateRating",
      "ratingValue": "YOUR_RATING_VALUE",
      "reviewCount": "YOUR_REVIEW_COUNT"
    }
  • LowProduct variants are not exposedA9−1 ptsView fix

    A shopper asking an assistant for a specific size or colour cannot be told you stock it.

    No variants declared — one offer, and no hasVariant, variesBy or isVariantOf

    How to fix

    0. Replace every YOUR_ value before publishing — the snippet parses as-is, but the values are not yours. 1. Expose each variant as its own offer inside an offers array, or use hasVariant with ProductGroup. 2. Give each variant its own sku, price and availability. 3. If your product genuinely has a single variant, this check will not pass and that is expected — it costs 1 point and is documented on our methodology page.

    ›Show code
    "offers": [
      { "@type": "Offer", "sku": "YOUR_SKU_SIZE_1", "price": "YOUR_PRICE", "priceCurrency": "YOUR_CURRENCY", "availability": "https://schema.org/InStock" },
      { "@type": "Offer", "sku": "YOUR_SKU_SIZE_2", "price": "YOUR_PRICE", "priceCurrency": "YOUR_CURRENCY", "availability": "https://schema.org/OutOfStock" }
    ]
  • LowNo contact information is discoverableG3−1 ptsView fix

    A shopper asking an assistant how to reach you gets nothing, which reads as an untrustworthy store and costs you the sale.

    mailto: false, tel: false, contact page: false

    How to fix

    1. Publish a contact page and link it from your homepage footer. 2. Include a real email address as a mailto: link, and a phone number as a tel: link if you have one. 3. Add contactPoint to your Organization markup so it is machine-readable as well.

    ›Show code
    <a href="mailto:support@yourdomain.com">support@yourdomain.com</a>
    <a href="tel:+15550100">+1 555 0100</a>
  • LowYour brand name is inconsistent across the pageG4−1 ptsView fix

    When your Organization name, og:site_name and page title disagree, assistants cannot confidently decide what your brand is actually called.

    Organization.name=none, og:site_name=none

    How to fix

    1. Pick one canonical spelling of your brand name, including capitalisation and any suffix such as Ltd or Co. 2. Use it identically in Organization.name, og:site_name and the title tag. 3. Check your theme settings and SEO plugin separately — they often store the name in two different places.

    ›Show code
    <title>Merino Runner — Your Brand</title>
    <meta property="og:site_name" content="Your Brand" />
    <!-- Organization JSON-LD -->
    "name": "Your Brand"

Report at a glance

What this means for gymshark.com

high confidence

This score reflects how much useful store information Cartiq could read from public pages. The fastest path to a stronger recommendation is to fix the highest-priority gaps below, not to chase a mystery number.

Evidence captured 2026-10-16 02:17 UTC · scan version 10 · public pages only.

Share this assessment

Download a polished image of this exact scan for X, LinkedIn, or Facebook.

A 1200 × 675 PNG using this scan’s current results.

Download the complete assessment

This report is generated from the exact gymshark.com scan shown on this page — including every stored finding, recommendation, category result, and scan date.

Complete category breakdown, findings, and store-specific fixes.

Scan your own store

Free, no account, about twenty seconds.

Where this score comes from

  • 20From your platformShopify provides these
  • 22From your storethis is what you control
  • +56Available to youwithout changing platform

The fixes below include customer reviews and product variants, which this total leaves out. We cannot tell from outside whether those apply to your product, so we do not promise points we are not certain you can win. Fixing them still raises your score.

Your score is 42 out of 100. Points from your platform are real — an agent genuinely reads those stores more easily — but you did not have to do anything to earn them, and you cannot lose them without moving. The fixes below are the ones that are yours.

Can an AI answer this?

0 of 6 answerable

  • A2How much does it cost?Missing
  • A3Is it in stock?Missing
  • D1What does shipping cost?Missing
  • D2Can I return it?Missing
  • A8What do other buyers think?Missing
  • A9Which size or colour?Missing

This is whether the data needed to answer exists on your product page in a machine-readable form. We do not test ChatGPT, Perplexity or any other assistant, so it does not say how one of them would actually answer.

Verify a fix

Fix an issue on your store, then run a new scan to compare the two real scan results. Rescans are limited to once per store per hour.

Rescan verification

Latest scan compared with the previous scan for the same store. No result is estimated or re-scored here.

scan version 10
Before
42/100 · Grade D
2026-10-08 06:04 UTC
After
42/100 · Grade D
2026-10-16 02:17 UTC

Fixed findings

No previous finding disappeared in the latest scan.

Remaining issues

20 findings remain in the latest scan.

  • Your product pages have no structured dataA1 · critical−6
  • Product name and price are not readable without JavaScriptF1 · critical−6

Score change: 0 points (42 → 42). No new finding appeared in the latest scan.

Compare with another store

Scanned 2026-10-16 02:17 UTC · scan version 10 · confidence high · TTFB 203ms (not scored)

Scored from public data only. Cartiq has no affiliation with gymshark.com. How we score