vincerocollective.com
Audited 6 days ago· shopify
Agent-readiness across all five AI commerce surfaces.
Surfaces — click to filter
14 failing · 8 not checked · 22 shown
8 checks couldn't run on this store — each is listed below with the reason. Your score reflects only what we could verify.
Enforce HTTPS sitewide and ship a Strict-Transport-Security header with max-age ≥ 6 months
Why this matters: AI agents and payment flows refuse plain HTTP; weak HSTS is treated as effectively no HSTS by trust-and-safety scanners.
Findings (1)
Confirmed the homepage is HTTPS (status 200), probed http://vincerocollective.com/ for redirect behaviour, and parsed the Strict-Transport-Security header (value: "max-age=7889238").
How: URL scheme + homepage status check, an http://host/ redirect probe through politeFetch, and a Strict-Transport-Security max-age parse (RFC 6797; ≥ 180-day threshold).
- HSTS max-age is below the 6-month minimumCRITICAL
/parsed max-age = 7889238s (need ≥ 15552000s = 180 days)
What we found
max-age=7889238What we expected
Strict-Transport-Security: max-age=31536000; includeSubDomainsBump
max-ageto at least 15552000 (180 days). 31536000 (1 year) is required for preload-list inclusion.
Surface brand attribution on every PDP
Why this matters: Brand on every product is a primary agent filter and a required feed field.
Findings (10)
Checked 20 sampled product pages for brand attribution via Product JSON-LD or visible HTML signals (10 attributed, 50%).
How: On each PDP, accept brand attribution from either (a) extractBrand on the first Product JSON-LD node OR (b) an HTML brand signal (OG product:brand, brand meta, og:brand, Microdata itemprop="brand").
Coverage
10/20 · 50%
- No brand attribution on this PDP (neither JSON-LD
brandnor OG/Microdata)HIGH× 10Add
brandto the Product JSON-LD or a<meta property="product:brand">tag.Affected (10)
- /products/micro-cuban-chain-necklace-2-2mm-stea…
- /products/parts-22mm-modern-steel-gunmetal-link…
- /products/spiritual-bead-cross-bracelet-4mm-bla…
- /products/tennis-bracelet-gold
- /products/collectors-bundle-inception-edition-b…
- /products/collectors-bundle-inception-edition-r…
- /products/collectors-bundle-inception-edition-b…
- /products/the-serpentine-bracelet-rose-gold-sta…
- /products/collectors-bundle-quasar-edition
- /products/collectors-bundle-livewire-edition
Populate gtin on every branded Product node
Why this matters: GTINs let agents match your product to the same item elsewhere; without them you lose cross-catalog matching.
Findings (11)
Checked 20 sampled product pages for a GTIN in the Product JSON-LD (9 carry a valid GTIN, 45%).
How: Extract gtin / gtin8 / gtin12 / gtin13 / gtin14 from the first Product JSON-LD node on each PDP; validate digit length.
Coverage
9/20 · 45%
- No valid GTIN on this product pageHIGH× 10
Populate gtin/gtin8/gtin12/gtin13/gtin14 with the manufacturer's barcode.
Affected (10)
- /products/micro-cuban-chain-necklace-2-2mm-stea…
- /products/parts-22mm-modern-steel-gunmetal-link…
- /products/spiritual-bead-cross-bracelet-4mm-bla…
- /products/tennis-bracelet-gold
- /products/collectors-bundle-inception-edition-b…
- /products/collectors-bundle-inception-edition-r…
- /products/collectors-bundle-inception-edition-b…
- /products/the-serpentine-bracelet-rose-gold-sta…
- /products/collectors-bundle-forged-carbon-fathe…
- /products/collectors-bundle-quasar-edition
…and 1 more
Make every MerchantReturnPolicy node satisfy Option A or Option B
Why this matters: A policy node missing both shapes is invisible to agents — they can't render it, link to it, or quote your return terms.
Findings (11)
Inspected 20 MerchantReturnPolicy nodes across 10 PDPs (0 satisfy Option A or B, 0%).
How: For each PDP, walk every hasMerchantReturnPolicy node (Product or Offer level) and require either (applicableCountry + returnPolicyCategory) OR a syntactically-valid merchantReturnLink URL.
Coverage
0/20 · 0%
- MerchantReturnPolicy node fails Option A and Option BHIGH× 10
Add (applicableCountry + returnPolicyCategory) or merchantReturnLink to this policy node.
Affected (10)
- /products/built-different-the-wolf-stealthnode missing Option A or B (lacks: applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /products/built-different-the-wolf-stealthnode missing Option A or B (lacks: applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /products/built-different-the-lion-stealthnode missing Option A or B (lacks: applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /products/built-different-the-lion-stealthnode missing Option A or B (lacks: applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /products/crucifix-pendant-stealthnode missing Option A or B (lacks: applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /products/crucifix-pendant-stealthnode missing Option A or B (lacks: applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /products/cross-pendant-stealthnode missing Option A or B (lacks: applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /products/cross-pendant-stealthnode missing Option A or B (lacks: applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /products/collectors-bundle-forged-carbon-fathe…node missing Option A or B (lacks: applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /products/icon-forged-carbon-pinknode missing Option A or B (lacks: applicableCountry (ISO alpha-2), merchantReturnLink (URL))
…and 1 more
Emit shippingDetails (OfferShippingDetails) on Offer JSON-LD
Why this matters: Without shippingDetails, AI agents fall back to vague defaults — they can't quote your rates, destinations, or delivery windows in shopping cards.
Findings (10)
Inspected shippingDetails on Product/Offer JSON-LD across 10 sampled PDPs (0 present, 0%).
How: On each PDP, locate the Product JSON-LD node and check for shippingDetails (single object or array) at Product or Offer level. Pass band ≥ 85% coverage.
Coverage
0/10 · 0%
- Offer JSON-LD missing
shippingDetailsHIGH× 10Add OfferShippingDetails with shippingRate, shippingDestination, and deliveryTime.
Affected (10)
- /products/built-different-the-wolf-stealth
- /products/built-different-the-lion-stealth
- /products/crucifix-pendant-stealth
- /products/cross-pendant-stealth
- /products/collectors-bundle-forged-carbon-fathe…
- /products/icon-forged-carbon-pink
- /products/icon-forged-carbon-blue
- /products/icon-automatic-quesar-edition
- /products/birthstone-bracelet-may-6mm
- /products/chrono-limited-edition-quasar-edition
Add every required top-level key to the UCP profile
Why this matters: A profile missing one of the four required keys is treated as non-conformant — agent runtimes fall back to default behaviour and may skip the merchant.
Findings (1)
Profile is missing required key(s): signing_keys.
How: Read the profile root (or top-level ucp wrapper) and verify the presence of version, services, capabilities, and signing_keys keys.
- Required top-level key
signing_keysis missingHIGHWhat we expected
Add a top-level "signing_keys" field to the JSON document (empty array/object is fine).Set
signing_keysat the root of the JSON document.
Publish a Product JSON-LD block on every PDP
Why this matters: Product JSON-LD is how agents identify the canonical product entity without running JavaScript.
Findings (10)
Parsed JSON-LD on 20 sampled product pages for a Product node (10 found, 50%).
How: Walk each sampled PDP's parsed jsonLdBlocks, flatten @graph containers, and count the page as passing if any node has @type Product / ProductGroup / IndividualProduct / ProductModel.
Coverage
10/20 · 50%
- No Product JSON-LD on this PDPHIGH× 10
Add a
<script type="application/ld+json">block with@type: Productto the PDP<head>.Affected (10)
- /products/micro-cuban-chain-necklace-2-2mm-stea…
- /products/parts-22mm-modern-steel-gunmetal-link…
- /products/spiritual-bead-cross-bracelet-4mm-bla…
- /products/tennis-bracelet-gold
- /products/collectors-bundle-inception-edition-b…
- /products/collectors-bundle-inception-edition-r…
- /products/collectors-bundle-inception-edition-b…
- /products/the-serpentine-bracelet-rose-gold-sta…
- /products/collectors-bundle-quasar-edition
- /products/collectors-bundle-livewire-edition
Skipped — the runner did not surface transport metadata
Context: If your UCP profile says `no-cache`, agent runtimes re-fetch on every interaction — brittle at scale and prone to rate-limit failures.
Why this was skipped
Wanted to inspect the UCP profile's Cache-Control header, but the runner did not surface transport metadata.
How: Parse the Cache-Control header on the /.well-known/ucp response; require public, max-age ≥ 60, and no no-store/no-cache/private.
- Transport metadata not available — runner update pendingLOW
This check activates once the runner (Task I1) populates ctx.wellKnownUcp.cacheControl.
Skipped — Profile declares no signing_keys; JWK validation has no entries to evaluate.
Context: Malformed JWK entries are rejected silently by agents — signed payloads cannot be verified and the merchant loses trust signal.
Why this was skipped
Profile declares no signing_keys; JWK validation has no entries to evaluate.
How: Walk signing_keys[] and validate each entry per RFC 7517 §4.1 (kty required) + RFC 7518 §6 (kty-specific required parameters). kid is OPTIONAL per RFC 7517 §4.5 and not enforced here.
Add includeSubDomains to your Strict-Transport-Security header
Why this matters: Without includeSubDomains, an HTTP subdomain (staging, mail, …) can be used to attack the apex's cookies.
Findings (1)
Inspected the homepage Strict-Transport-Security header ("max-age=7889238") and the includeSubDomains directive is absent.
How: Parse the homepage Strict-Transport-Security header for the includeSubDomains directive (RFC 6797 §6.1.2).
- HSTS header is missing the includeSubDomains directiveMEDIUM
What we found
max-age=7889238What we expected
Strict-Transport-Security: max-age=31536000; includeSubDomainsAppend
; includeSubDomainsto your STS header once every subdomain you operate supports HTTPS.
Add an Organization (or OnlineStore) JSON-LD block to your homepage with a contactPoint
Why this matters: Organization markup with a contactPoint tells AI agents who you are and how a shopper can reach you for support.
Findings (1)
Parsed the homepage JSON-LD looking for an Organization/OnlineStore node with a contactPoint, but no Organization-class node is present.
How: Parse homepage <script type="application/ld+json"> blocks, flatten @graph, and look for an Organization/OnlineStore/Store node with a contactPoint carrying email or telephone.
- No Organization/OnlineStore JSON-LD on homepageMEDIUM
What we expected
<script type="application/ld+json">{"@context":"https://schema.org","@type":"OnlineStore","name":"Example Store","url":"https://example.com","contactPoint":[{"@type":"ContactPoint","contactType":"customer service","email":"support@example.com"}]}</script>Add an Organization (or OnlineStore) JSON-LD block in the homepage
<head>with a contactPoint.
Skipped — No MerchantReturnPolicy node carried a `merchantReturnLink` URL, so reachability has nothing to evaluate.
Context: A broken return-link makes Option B policies invisible — agents can't render or follow the link.
Why this was skipped
No MerchantReturnPolicy node carried a merchantReturnLink URL, so reachability has nothing to evaluate.
How: Collect every unique merchantReturnLink URL across all MerchantReturnPolicy nodes; probe each once via politeFetch (failSoft). 2xx counts as reachable.
Skipped — No MerchantReturnPolicy node carried `applicableCountry`, so the ISO-code check has nothing to evaluate.
Context: A non-ISO country is dropped silently; the policy looks present but never reaches the merchant-listing rich result.
Why this was skipped
No MerchantReturnPolicy node carried applicableCountry, so the ISO-code check has nothing to evaluate.
How: On each MerchantReturnPolicy node where applicableCountry is set, extract every candidate string and require every one to match /^[A-Z]{2}$/i.
Skipped — No OfferShippingDetails node carried `shippingDestination`, so the DefinedRegion check has nothing to evaluate.
Context: Without a valid destination region, your shipping rate has no scope — Google can't decide whether to render it for a given shopper's country.
Why this was skipped
No OfferShippingDetails node carried shippingDestination, so the DefinedRegion check has nothing to evaluate.
How: On each OfferShippingDetails node where shippingDestination is set, require it to be a DefinedRegion (or array) and every entry to carry addressCountry matching /^[A-Z]{2}$/i.
Skipped — No OfferShippingDetails node carried `shippingRate`, so the MonetaryAmount check has nothing to evaluate.
Context: An invalid rate object is silently dropped; agents can't quote your shipping cost in shopping cards.
Why this was skipped
No OfferShippingDetails node carried shippingRate, so the MonetaryAmount check has nothing to evaluate.
How: On each OfferShippingDetails node where shippingRate is set, require an object with numeric value/maxValue (typed or numeric string) and a 3-letter ISO 4217 currency.
Skipped — Profile declares no capabilities; required-field checks have nothing to evaluate.
Context: Capabilities missing version/spec/schema can't be matched against agent support tables — agents skip them silently.
Why this was skipped
Profile declares no capabilities; required-field checks have nothing to evaluate.
How: For each capabilities[] entry, require non-empty string values for version, spec, and schema.
Add preload to your Strict-Transport-Security header and submit to hstspreload.org
Why this matters: HSTS preload-list inclusion is the strongest downgrade protection available — first-time visits are protected too.
Findings (1)
Inspected the homepage Strict-Transport-Security header ("max-age=7889238") and the preload directive is absent.
How: Parse the homepage Strict-Transport-Security header for the preload directive (hstspreload.org vendor extension to RFC 6797).
- HSTS header is missing the preload directiveLOW
What we found
max-age=7889238What we expected
Strict-Transport-Security: max-age=31536000; includeSubDomains; preloadAppend
; preloadafterincludeSubDomainsand submit your domain at https://hstspreload.org/.
Add a BreadcrumbList JSON-LD block to every PDP
Why this matters: Breadcrumbs help agents understand where a product sits in your catalog.
Findings (10)
Searched JSON-LD on 10 sampled product pages for a BreadcrumbList (0 found, 0%).
How: Search every JSON-LD block on each PDP for @type: BreadcrumbList with a non-empty itemListElement.
Coverage
0/10 · 0%
- No BreadcrumbList JSON-LD with a populated itemListElementLOW× 10
Add a BreadcrumbList JSON-LD block walking Home → Category → Product.
Affected (10)
- /products/built-different-the-wolf-stealth
- /products/built-different-the-lion-stealth
- /products/crucifix-pendant-stealth
- /products/cross-pendant-stealth
- /products/collectors-bundle-forged-carbon-fathe…
- /products/icon-forged-carbon-pink
- /products/icon-forged-carbon-blue
- /products/icon-automatic-quesar-edition
- /products/birthstone-bracelet-may-6mm
- /products/chrono-limited-edition-quasar-edition
Upload higher-resolution product images (area ≥ 50,000 pixels)
Why this matters: Tiny product images get dropped from Google’s shopping rich-result modules and are unhelpful to AI agents quoting your product visually.
Findings (7)
Inspected <img width=… height=…> attributes on 20 sampled product pages (13 have at least one image with area ≥ 50,000 px; dimensions absent from HTML are not HEAD-probed and count as indeterminate).
How: For every sampled PDP, parse <img> tags and read explicit width and height attributes; a PDP passes when at least one image has width × height ≥ 50,000. PDPs without any explicit-dimension <img> are marked indeterminate (this check does not HEAD image URLs).
Coverage
13/20 · 65%
- All images on this PDP are below the 50,000-pixel thresholdLOW× 6
Upload an image whose width × height ≥ 50,000 (e.g., 400 × 300 = 120,000).
Affected (6)
- /products/micro-cuban-chain-necklace-2-2mm-stea…largest image area observed: 2,500 px
- /products/spiritual-bead-cross-bracelet-4mm-bla…largest image area observed: 2,500 px
- /products/tennis-bracelet-goldlargest image area observed: 2,500 px
- /products/crucifix-pendant-stealthlargest image area observed: 2,500 px
- /products/cross-pendant-stealthlargest image area observed: 2,500 px
- /products/the-serpentine-bracelet-rose-gold-sta…largest image area observed: 2,500 px
- No <img> on this PDP carries explicit width+height attributesLOW
/products/parts-22mm-modern-steel-gunmetal-link…68 <img> tags found, none with width+height
Server-render explicit width and height attributes so crawlers can verify image area without fetching.
Skipped — No OfferShippingDetails node carried `deliveryTime`, so the ShippingDeliveryTime check has nothing to evaluate.
Context: Without populated handling/transit times, agents can't quote a delivery window in shopping cards.
Why this was skipped
No OfferShippingDetails node carried deliveryTime, so the ShippingDeliveryTime check has nothing to evaluate.
How: On each OfferShippingDetails node where deliveryTime is set, require an object with at least one of handlingTime / transitTime populated as a QuantitativeValue.
Enable Apple Pay through your payment processor (informational only)
Why this matters: Apple Pay is a checkout-quality signal for human shoppers — informational only, does not affect the agent-readiness score.
Findings (1)
Scanned the homepage and 20 sampled PDPs for Apple Pay markers; none matched.
How: Substring match on known Apple Pay SDK/markup signatures (ApplePaySession, apple-pay-button, /apple-developer-merchantid-domain-association) across the homepage and every sampled PDP HTML.
- No Apple Pay markers detected on the homepage or PDPsINFO
Enable Apple Pay in your payment processor's dashboard (Stripe / Adyen / Braintree). Informational only — does not affect the score.
Enable Google Pay through your payment processor (informational only)
Why this matters: Google Pay is a checkout-quality signal for human shoppers — informational only, does not affect the agent-readiness score.
Findings (1)
Scanned the homepage and 20 sampled PDPs for Google Pay markers; none matched.
How: Substring match on known Google Pay SDK/markup signatures (pay.google.com/gp/p/js/pay.js, google.payments.api, <google-pay-button) across the homepage and every sampled PDP HTML.
- No Google Pay markers detected on the homepage or PDPsINFO
Enable Google Pay in your payment processor's dashboard (Stripe / Adyen / Braintree). Informational only — does not affect the score.