A

shop.osmaps.com

Audited 2 days ago· bigcommerce

81
Grade B

Agent-readiness across all five AI commerce surfaces.

Surfaces — click to filter

17 failing · 15 not checked · 32 shown

15 checks couldn't run on this store — each is listed below with the reason. Your score reflects only what we could verify.

FAILHIGH
Product JSON-LD present on PDPsproduct-jsonld-presentSchema.orgMerchant

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 (11)

Parsed JSON-LD on 20 sampled product pages for a Product node (4 found, 20%).

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

4/20 · 20%

…and 1 more

How to fix · 3 steps · create a free account to viewCreate a free account →
FAILHIGH
Contact page exposes email or phonecontact-with-email-or-phoneMerchant

Add a mailto: email link or tel: phone link to your contact page

Why this matters: Without an email or phone on your contact page, ChatGPT and Perplexity have no escalation path to surface for shoppers.

Findings (1)

Probed 5 candidate contact-page paths and none returned a 2xx response.

How: URL probe of contact paths; the first 2xx body is scanned for mailto: / tel: hrefs, plain emails (placeholder hosts excluded), and phone-shaped numbers.

  • No contact page reachableHIGH

    statuses: /contact-us/=404, /contact/=404, /contact=404, /contact-us=404, /pages/contact=404

    Publish a contact page at /contact (or your platform's standard path) with a mailto: and/or tel: link.

How to fix · 3 steps · create a free account to viewCreate a free account →
FAILHIGH
Brand attribution on PDPsproduct-brand-attributionSchema.orgMerchant

Surface brand attribution on every PDP

Why this matters: Brand on every product is a primary agent filter and a required feed field.

Findings (11)

Checked 20 sampled product pages for brand attribution via Product JSON-LD or visible HTML signals (4 attributed, 20%).

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

4/20 · 20%

…and 1 more

How to fix · 3 steps · create a free account to viewCreate a free account →
FAILHIGH
GTIN coverage on PDPsproduct-gtin-populatedSchema.orgMerchant

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 (0 carry a valid GTIN, 0%).

How: Extract gtin / gtin8 / gtin12 / gtin13 / gtin14 from the first Product JSON-LD node on each PDP; validate digit length.

Coverage

0/20 · 0%

…and 1 more

How to fix · 2 steps · create a free account to viewCreate a free account →
FAILHIGH
MerchantReturnPolicy node present on Product or Offermerchant-return-policy-presentReturnsSchema.org

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 (4)

Inspected hasMerchantReturnPolicy on Product/Offer JSON-LD across 4 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/4 · 0%

How to fix · 2 steps · create a free account to viewCreate a free account →
FAILHIGH
Offer JSON-LD carries shippingDetails (OfferShippingDetails)offer-shipping-details-presentSchema.orgShipping

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 (4)

Inspected shippingDetails on Product/Offer JSON-LD across 4 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/4 · 0%

How to fix · 2 steps · create a free account to viewCreate a free account →
FAILHIGH
UCP profile carries all four required top-level keysucp-profile-required-keysUCP

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_keys is missingHIGH

    /.well-known/ucp

    What we expected

    Add a top-level "signing_keys" field to the JSON document (empty array/object is fine).

    Set signing_keys at the root of the JSON document.

How to fix · 2 steps · create a free account to viewCreate a free account →
FAILHIGH
Each service satisfies the transport-conditional field requirementsucp-service-transport-conditional-fieldsUCP

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: schema

    What we expected

    `endpoint` + `schema`

    Add schema to this services[] entry.

How to fix · 2 steps · create a free account to viewCreate a free account →
NAHIGH
MerchantReturnPolicy finite-window has positive merchantReturnDaysmerchant-return-policy-finite-daysReturns

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).

NAHIGH
MerchantReturnPolicy satisfies Option A (country+category) or B (returnLink)merchant-return-policy-option-a-or-bReturnsSchema.org

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.

NAHIGH
Every signing_keys[] entry is a valid JWKucp-signing-keys-validJWKS

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.

FAILMEDIUM
Organization/OnlineStore JSON-LD with contactPoint on homepageorganization-jsonld-with-contactSchema.org

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.

How to fix · 3 steps · create a free account to viewCreate a free account →
FAILMEDIUM
Sitemap entries share the host of the containing sitemapsitemap-same-hostSitemap

Keep every sitemap entry on the sitemap's own host

Why this matters: Cross-host sitemap entries are silently dropped, so the off-host product URLs effectively don't exist for the crawler.

Findings (5)

Compared 1503 <loc> entries against their sitemap host across 2 resource(s); 1503 cross-host entries found.

How: For each resolved sitemap resource, parse the sitemap URL's host and compare it against every parsed <loc> URL's host.

  • Cross-host <loc> — sitemap host is shop.osmaps.com but entry is on store-qc7qegnorm.mybigcommerce.comMEDIUM

    /xmlsitemap.phpsitemap host: shop.osmaps.com; entry host: store-qc7qegnorm.mybigcommerce.com

    What we found

    https://store-qc7qegnorm.mybigcommerce.com/xmlsitemap.php?type=pages&page=1

    Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.

  • Cross-host <loc> — sitemap host is shop.osmaps.com but entry is on store-qc7qegnorm.mybigcommerce.comMEDIUM

    /xmlsitemap.phpsitemap host: shop.osmaps.com; entry host: store-qc7qegnorm.mybigcommerce.com

    What we found

    https://store-qc7qegnorm.mybigcommerce.com/xmlsitemap.php?type=products&page=1

    Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.

  • Cross-host <loc> — sitemap host is shop.osmaps.com but entry is on store-qc7qegnorm.mybigcommerce.comMEDIUM

    /xmlsitemap.phpsitemap host: shop.osmaps.com; entry host: store-qc7qegnorm.mybigcommerce.com

    What we found

    https://store-qc7qegnorm.mybigcommerce.com/xmlsitemap.php?type=categories&page=1

    Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.

  • Cross-host <loc> — sitemap host is shop.osmaps.com but entry is on store-qc7qegnorm.mybigcommerce.comMEDIUM

    /xmlsitemap.phpsitemap host: shop.osmaps.com; entry host: store-qc7qegnorm.mybigcommerce.com

    What we found

    https://store-qc7qegnorm.mybigcommerce.com/xmlsitemap.php?type=brands&page=1

    Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.

  • Cross-host <loc> — sitemap host is store-qc7qegnorm.mybigcommerce.com but entry is on shop.osmaps.comMEDIUM

    /xmlsitemap.php?type=products&page=1sitemap host: store-qc7qegnorm.mybigcommerce.com; entry host: shop.osmaps.com

    What we found

    https://shop.osmaps.com/map-of-romsey-andover-test-valley/

    Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.

How to fix · 2 steps · create a free account to viewCreate a free account →
NAMEDIUM
MerchantReturnPolicy merchantReturnLink URL is reachablemerchant-return-link-reachableReturns

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.

NAMEDIUM
MerchantReturnPolicy applicableCountry uses ISO 3166-1 alpha-2 codesmerchant-return-policy-applicable-country-isoReturns

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.

NAMEDIUM
MerchantReturnPolicy returnPolicyCategory uses valid Schema.org enummerchant-return-policy-category-enumReturns

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.

NAMEDIUM
OfferShippingDetails shippingDestination is a valid DefinedRegionoffer-shipping-destination-validShipping

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.

NAMEDIUM
OfferShippingDetails shippingRate is a valid MonetaryAmountoffer-shipping-rate-validShipping

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.

NAMEDIUM
Each capability has version + spec + schemaucp-capability-required-fieldsUCP

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.

NAMEDIUM
Each service's `spec` URL origin matches its namespace authorityucp-service-spec-url-origin-matchesUCP

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.

FAILLOW
Alt text on at least 80% of PDP imagesimage-alt-text-coverageWCAG

Add descriptive alt text to product images (WCAG 2.x SC 1.1.1)

Why this matters: Alt text is the only text description AI agents and screen readers have for your product imagery.

Findings (11)

Parsed <img> alt attributes across 20 sampled product pages (0 have alt text on at least 80% of images).

How: Per PDP, count <img> tags via regex; a tag 'has alt text' when its alt attribute is present AND non-empty after trim. A PDP passes when it carries no <img> at all OR ≥80% of its <img> tags have non-empty alt.

Coverage

0/20 · 0%

…and 1 more

How to fix · 3 steps · create a free account to viewCreate a free account →
FAILLOW
BreadcrumbList present on PDPsbreadcrumb-list-presentSchema.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 (4)

Searched JSON-LD on 4 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/4 · 0%

How to fix · 2 steps · create a free account to viewCreate a free account →
FAILLOW
About page reachable with substantive copyabout-page-reachableMerchant

Publish a substantive About page at a standard URL

Why this matters: Perplexity and ChatGPT use About-page text to summarise your brand to shoppers in answer responses.

Findings (1)

Probed 5 candidate About-page paths and none returned a 2xx body.

How: URL probe of platform-specific about-page paths via politeFetch; the first 2xx response whose HTML-stripped body length is ≥ 200 chars counts as a pass.

  • No About page reachable at any standard URLLOW

    statuses: /about-us/=404, /about/=404, /about=404, /about-us=404, /pages/about=404

    Publish an About page at /about (or your platform's standard path) with ≥ 200 chars of body text.

How to fix · 3 steps · create a free account to viewCreate a free account →
FAILLOW
Offer `itemCondition` is canonical when presentoffer-item-condition-when-not-newSchema.orgMerchant

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 (4)

Checked Offer itemCondition on 4 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/4 · 0%

How to fix · 2 steps · create a free account to viewCreate a free account →
HALFLOW
Product `aggregateRating` presentproduct-aggregate-rating-presentSchema.org

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 (2)

Looked for a valid aggregateRating on Product JSON-LD across 4 sampled product pages (2 valid, 50%).

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

2/4 · 50%

  • Product has no valid AggregateRating (ratingValue 0-5 + reviewCount/ratingCount ≥ 1)LOW× 2

    Render aggregateRating from real review totals — never fabricate.

How to fix · 2 steps · create a free account to viewCreate a free account →
NALOW
MerchantReturnPolicy enrichment enums use valid Schema.org valuesmerchant-return-policy-enums-validReturns

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.

NALOW
OfferShippingDetails deliveryTime is a valid ShippingDeliveryTimeoffer-shipping-delivery-time-validShipping

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.

NALOW
UCP MCP-transport entries have valid HTTPS endpointsucp-mcp-transport-validUCP

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.

NALOW
Declarative WebMCP forms are validwebmcp-declarative-tools-validwebmcp

Skipped — No declarative WebMCP forms found on the homepage or sampled product pages. WebMCP is an optional, experimental browser-agent capability — not in scope until advertised.

Context: If you expose WebMCP tools, browser agents call them directly instead of scraping — but a tool missing its name or description is unusable to the agent.

Why this was skipped

No declarative WebMCP forms found on the homepage or sampled product pages. WebMCP is an optional, experimental browser-agent capability — not in scope until advertised.

How: Parse the homepage and sampled PDP HTML for <form> elements carrying WebMCP attributes (toolname/tooldescription/toolautosubmit), then validate each against the 5 declarative-form rules.

FAILINFO
Apple Pay markers detected (informational)apple-pay-detectedSchema.org

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.

How to fix · 3 steps · create a free account to viewCreate a free account →
FAILINFO
Google Pay markers detected (informational)google-pay-detectedSchema.org

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.

How to fix · 3 steps · create a free account to viewCreate a free account →
NAINFO
llms.txt present (informational)llms-txt-presentllms.txt

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.

Engine 2.0.0 · ACP 2026-04-17 · UCP 2026-04-08

Get notified when this score drops.

Paid plans auto-rescan your store weekly and email you when anything changes — incl. when ACP/UCP ships a new spec.

See plans · from $29/mo →