its.co.uk
Audited 6 days ago· bigcommerce
Agent-readiness across all five AI commerce surfaces.
Surfaces — click to filter
12 failing · 14 not checked · 26 shown
14 checks couldn't run on this store — each is listed below with the reason. Your score reflects only what we could verify.
Use a canonical Schema.org availability IRI on every Offer
Why this matters: Agents suppress out-of-stock or ambiguous items; a valid availability URL keeps you eligible.
Findings (11)
Checked Offer availability on 20 sampled product pages with an Offer (0 use a canonical Schema.org URL, 0%).
How: On each Offer, accept availability only if it matches one of the canonical Schema.org ItemAvailability IRIs (http or https, trailing slash optional).
Coverage
0/20 · 0%
- Offer
availabilityis missing or not a canonical Schema.org URLHIGH× 10Use https://schema.org/InStock (or OutOfStock / PreOrder / BackOrder).
Affected (10)
- /pd/A50824-Arrow-12mm-T50-Staples---Pack-of-125…value: InStock
- /pd/DRS18100-Dewalt-25mm-x-19mm-Insulated-Crown…value: InStock
- /pd/DNBA1632GZ-Dewalt-32mm-16g-20-Angled-Brad-N…value: InStock
- /pd/DNBA1638GZ-Dewalt-38mm-16g-20-Angled-Brad-N…value: InStock
- /pd/DNBA1644GZ-Dewalt-44mm-16g-20-Angled-Brad-N…value: InStock
- /pd/DNBA1650GZ-Dewalt-50mm-16g-20-Angled-Brad-N…value: InStock
- /pd/DNBA1663GZ-Dewalt-63mm-16g-20-Angled-Brad-N…value: InStock
- /pd/Dewalt-35-x-34mm-Positive-Placement-Nails-G…value: InStock
- /pd/DNPT28R50Z-Dewalt-50mm-x-28mm-34-Ring-Shank…value: InStock
- /pd/DNPT31R90Z-Dewalt-90mm-x-31mm-34-Ring-Shank…value: InStock
…and 1 more
Emit hasMerchantReturnPolicy on Product or Offer JSON-LD
Why this matters: Without the entry-point return-policy node, agents can't render or quote your return terms — they fall back to platform defaults or skip your store.
Findings (11)
Inspected hasMerchantReturnPolicy on Product/Offer JSON-LD across 20 sampled product pages (0 present, 0%).
How: On each PDP, locate the Product JSON-LD node and check for a hasMerchantReturnPolicy object/array at Product level OR Offer level. Pass band ≥ 85% coverage, partial ≥ 50%.
Coverage
0/20 · 0%
- Product JSON-LD missing
hasMerchantReturnPolicyHIGH× 10Add a MerchantReturnPolicy node to Product or Offer with category + applicableCountry (or merchantReturnLink).
Affected (10)
- /pd/A50824-Arrow-12mm-T50-Staples---Pack-of-125…
- /pd/DRS18100-Dewalt-25mm-x-19mm-Insulated-Crown…
- /pd/DNBA1632GZ-Dewalt-32mm-16g-20-Angled-Brad-N…
- /pd/DNBA1638GZ-Dewalt-38mm-16g-20-Angled-Brad-N…
- /pd/DNBA1644GZ-Dewalt-44mm-16g-20-Angled-Brad-N…
- /pd/DNBA1650GZ-Dewalt-50mm-16g-20-Angled-Brad-N…
- /pd/DNBA1663GZ-Dewalt-63mm-16g-20-Angled-Brad-N…
- /pd/Dewalt-35-x-34mm-Positive-Placement-Nails-G…
- /pd/DNPT28R50Z-Dewalt-50mm-x-28mm-34-Ring-Shank…
- /pd/DNPT31R90Z-Dewalt-90mm-x-31mm-34-Ring-Shank…
…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 (11)
Inspected shippingDetails on Product/Offer JSON-LD across 20 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/20 · 0%
- Offer JSON-LD missing
shippingDetailsHIGH× 10Add OfferShippingDetails with shippingRate, shippingDestination, and deliveryTime.
Affected (10)
- /pd/A50824-Arrow-12mm-T50-Staples---Pack-of-125…
- /pd/DRS18100-Dewalt-25mm-x-19mm-Insulated-Crown…
- /pd/DNBA1632GZ-Dewalt-32mm-16g-20-Angled-Brad-N…
- /pd/DNBA1638GZ-Dewalt-38mm-16g-20-Angled-Brad-N…
- /pd/DNBA1644GZ-Dewalt-44mm-16g-20-Angled-Brad-N…
- /pd/DNBA1650GZ-Dewalt-50mm-16g-20-Angled-Brad-N…
- /pd/DNBA1663GZ-Dewalt-63mm-16g-20-Angled-Brad-N…
- /pd/Dewalt-35-x-34mm-Positive-Placement-Nails-G…
- /pd/DNPT28R50Z-Dewalt-50mm-x-28mm-34-Ring-Shank…
- /pd/DNPT31R90Z-Dewalt-90mm-x-31mm-34-Ring-Shank…
…and 1 more
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.
Populate the conditional fields required by each service's transport
Why this matters: A service declared with the right transport but missing endpoint/schema is unreachable — agents can't negotiate or connect.
Findings (1)
Validated 1 services with recognised transports (0 satisfy their transport's required fields).
How: For each services[] entry with a recognised transport, require the transport-conditional fields: rest/mcp → endpoint+schema; a2a → endpoint; embedded → schema.
Coverage
0/1 · 0%
- Service is missing transport-conditional field(s)HIGH
/.well-known/ucpnamespace=dev.ucp.shopping; transport=rest
What we found
missing: schemaWhat we expected
`endpoint` + `schema`Add schema to this services[] entry.
Skipped — No MerchantReturnPolicy node used the MerchantReturnFiniteReturnWindow category, so the `merchantReturnDays` check has nothing to evaluate.
Context: AI agents quote your concrete return window in shopping cards. Without `merchantReturnDays`, your policy renders as 'has a return policy' without the headline number.
Why this was skipped
No MerchantReturnPolicy node used the MerchantReturnFiniteReturnWindow category, so the merchantReturnDays check has nothing to evaluate.
How: For each MerchantReturnPolicy node whose returnPolicyCategory normalizes to MerchantReturnFiniteReturnWindow, require merchantReturnDays to be a positive number (or a numeric string > 0).
Skipped — No PDP carried a `hasMerchantReturnPolicy` node, so Option A/B shape cannot be evaluated.
Context: A policy node missing both shapes is invisible to agents — they can't render it, link to it, or quote your return terms.
Why this was skipped
No PDP carried a hasMerchantReturnPolicy node, so Option A/B shape cannot be evaluated.
How: For each PDP, walk every hasMerchantReturnPolicy node (Product or Offer level) and require either (applicableCountry + returnPolicyCategory) OR a syntactically-valid merchantReturnLink URL.
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.
Publish a sitemap containing product URLs
Why this matters: A sitemap that omits product URLs forces every crawler into slower, less complete frontier discovery.
Findings (1)
Resolved an XML sitemap with 1000 <loc> entries, but none look like product URLs.
How: Parse <loc> entries from the resolved sitemap (or sitemap index) and classify each against product-URL patterns (/products/..., /product/..., /p/<id>, etc.).
Coverage
0/1000 · 0%
- Sitemap reachable but contains no product URLsMEDIUM
/sitemap.xml1000 total <loc> entries, 0 product-shaped (0%)
Add product URLs (e.g., /products/<handle>) to the sitemap or include the product-section sitemap in your sitemap index.
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 MerchantReturnPolicy node carried `returnPolicyCategory`, so the enum check has nothing to evaluate.
Context: An invalid category is silently dropped — your policy looks present in the source but never renders in Google's return-policy rich result.
Why this was skipped
No MerchantReturnPolicy node carried returnPolicyCategory, so the enum check has nothing to evaluate.
How: On each MerchantReturnPolicy node where returnPolicyCategory is set, accept the bare enum name or the schema.org URL form; reject any other string.
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.
Skipped — No services declared a `spec` URL; origin matching has nothing to evaluate.
Context: A spec URL on an unrelated authority signals the service was copy-pasted from stale documentation — agents can't trust the conformance claim.
Why this was skipped
No services declared a spec URL; origin matching has nothing to evaluate.
How: For each service with a spec URL, require the URL origin to be a canonical UCP authority OR the host/path to include the namespace token.
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 (11)
Inspected <img width=… height=…> attributes on 20 sampled product pages (0 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
0/20 · 0%
- All images on this PDP are below the 50,000-pixel thresholdLOW× 10
Upload an image whose width × height ≥ 50,000 (e.g., 400 × 300 = 120,000).
Affected (10)
- /pd/A50824-Arrow-12mm-T50-Staples---Pack-of-125…largest image area observed: 9,600 px
- /pd/DRS18100-Dewalt-25mm-x-19mm-Insulated-Crown…largest image area observed: 9,600 px
- /pd/DNBA1632GZ-Dewalt-32mm-16g-20-Angled-Brad-N…largest image area observed: 9,600 px
- /pd/DNBA1638GZ-Dewalt-38mm-16g-20-Angled-Brad-N…largest image area observed: 9,600 px
- /pd/DNBA1644GZ-Dewalt-44mm-16g-20-Angled-Brad-N…largest image area observed: 9,600 px
- /pd/DNBA1650GZ-Dewalt-50mm-16g-20-Angled-Brad-N…largest image area observed: 9,600 px
- /pd/DNBA1663GZ-Dewalt-63mm-16g-20-Angled-Brad-N…largest image area observed: 9,600 px
- /pd/Dewalt-35-x-34mm-Positive-Placement-Nails-G…largest image area observed: 9,600 px
- /pd/DNPT28R50Z-Dewalt-50mm-x-28mm-34-Ring-Shank…largest image area observed: 9,600 px
- /pd/DNPT31R90Z-Dewalt-90mm-x-31mm-34-Ring-Shank…largest image area observed: 9,600 px
…and 1 more
Add an AggregateRating to Product nodes when you have real reviews
Why this matters: Review ratings are a trust signal agents use to rank and filter products.
Findings (11)
Looked for a valid aggregateRating on Product JSON-LD across 20 sampled product pages (0 valid, 0%).
How: On each Product node, parse aggregateRating (or the first element if it's an array) and require ratingValue in [0,5] AND reviewCount or ratingCount ≥ 1.
Coverage
0/20 · 0%
- Product has no valid AggregateRating (ratingValue 0-5 + reviewCount/ratingCount ≥ 1)LOW× 10
Render
aggregateRatingfrom real review totals — never fabricate.Affected (10)
- /pd/A50824-Arrow-12mm-T50-Staples---Pack-of-125…
- /pd/DRS18100-Dewalt-25mm-x-19mm-Insulated-Crown…
- /pd/DNBA1632GZ-Dewalt-32mm-16g-20-Angled-Brad-N…
- /pd/DNBA1638GZ-Dewalt-38mm-16g-20-Angled-Brad-N…
- /pd/DNBA1644GZ-Dewalt-44mm-16g-20-Angled-Brad-N…
- /pd/DNBA1650GZ-Dewalt-50mm-16g-20-Angled-Brad-N…
- /pd/DNBA1663GZ-Dewalt-63mm-16g-20-Angled-Brad-N…
- /pd/Dewalt-35-x-34mm-Positive-Placement-Nails-G…
- /pd/DNPT28R50Z-Dewalt-50mm-x-28mm-34-Ring-Shank…
- /pd/DNPT31R90Z-Dewalt-90mm-x-31mm-34-Ring-Shank…
…and 1 more
Add a BreadcrumbList JSON-LD block to every PDP
Why this matters: Breadcrumbs help agents understand where a product sits in your catalog.
Findings (11)
Searched JSON-LD on 20 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/20 · 0%
- No BreadcrumbList JSON-LD with a populated itemListElementLOW× 10
Add a BreadcrumbList JSON-LD block walking Home → Category → Product.
Affected (10)
- /pd/A50824-Arrow-12mm-T50-Staples---Pack-of-125…
- /pd/DRS18100-Dewalt-25mm-x-19mm-Insulated-Crown…
- /pd/DNBA1632GZ-Dewalt-32mm-16g-20-Angled-Brad-N…
- /pd/DNBA1638GZ-Dewalt-38mm-16g-20-Angled-Brad-N…
- /pd/DNBA1644GZ-Dewalt-44mm-16g-20-Angled-Brad-N…
- /pd/DNBA1650GZ-Dewalt-50mm-16g-20-Angled-Brad-N…
- /pd/DNBA1663GZ-Dewalt-63mm-16g-20-Angled-Brad-N…
- /pd/Dewalt-35-x-34mm-Positive-Placement-Nails-G…
- /pd/DNPT28R50Z-Dewalt-50mm-x-28mm-34-Ring-Shank…
- /pd/DNPT31R90Z-Dewalt-90mm-x-31mm-34-Ring-Shank…
…and 1 more
Either omit itemCondition (defaults to NewCondition) or set it to a canonical IRI
Why this matters: When you declare itemCondition, agents and Google require a canonical Schema.org IRI; free-text values get ignored.
Findings (11)
Checked Offer itemCondition on 20 sampled product pages with an Offer (0 either omit or use a canonical Schema.org URL, 0%).
How: On each Offer: if itemCondition is omitted, count as pass (Google defaults to NewCondition). If present, accept only when it matches a canonical Schema.org ItemCondition IRI.
Coverage
0/20 · 0%
- Offer
itemConditionis set but isn't a canonical Schema.org URLLOW× 10Use https://schema.org/NewCondition / UsedCondition / RefurbishedCondition / DamagedCondition.
Affected (10)
- /pd/A50824-Arrow-12mm-T50-Staples---Pack-of-125…value: NewCondition
- /pd/DRS18100-Dewalt-25mm-x-19mm-Insulated-Crown…value: NewCondition
- /pd/DNBA1632GZ-Dewalt-32mm-16g-20-Angled-Brad-N…value: NewCondition
- /pd/DNBA1638GZ-Dewalt-38mm-16g-20-Angled-Brad-N…value: NewCondition
- /pd/DNBA1644GZ-Dewalt-44mm-16g-20-Angled-Brad-N…value: NewCondition
- /pd/DNBA1650GZ-Dewalt-50mm-16g-20-Angled-Brad-N…value: NewCondition
- /pd/DNBA1663GZ-Dewalt-63mm-16g-20-Angled-Brad-N…value: NewCondition
- /pd/Dewalt-35-x-34mm-Positive-Placement-Nails-G…value: NewCondition
- /pd/DNPT28R50Z-Dewalt-50mm-x-28mm-34-Ring-Shank…value: NewCondition
- /pd/DNPT31R90Z-Dewalt-90mm-x-31mm-34-Ring-Shank…value: NewCondition
…and 1 more
Skipped — No MerchantReturnPolicy node carried returnFees, returnMethod, or refundType, so the enum check has nothing to evaluate.
Context: Invalid enrichment values are dropped silently, leaving merchants confused about why their rendered policy is missing fields they configured.
Why this was skipped
No MerchantReturnPolicy node carried returnFees, returnMethod, or refundType, so the enum check has nothing to evaluate.
How: On each MerchantReturnPolicy node, inspect returnFees/returnMethod/refundType if set; require the bare name or schema.org URL form of a value in the corresponding Schema.org enum.
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.
Skipped — Walked services[] for `transport: "mcp"` entries; none advertised.
Context: If you advertise MCP transport, agents will try to connect — broken or non-HTTPS endpoints fail silently and lose the integration.
Why this was skipped
Walked services[] for transport: "mcp" entries; none advertised.
How: Filter services[] to entries where transport=mcp and validate that endpoint is an absolute https:// URL.
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.
Skipped — Looked for /llms.txt at the site root; the fetcher returned no file.
Context: An /llms.txt manifest points agents at your feed and key pages without them having to guess.
Why this was skipped
Looked for /llms.txt at the site root; the fetcher returned no file.
How: Check whether the fetcher reached an /llms.txt at the site root. Informational only — no failure path per llmstxt.org being a voluntary community convention.