jococups.com
Audited 6 days ago· woocommerce
Agent-readiness across all five AI commerce surfaces.
Surfaces — click to filter
18 failing · 42 not checked · 60 shown
42 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://jococups.com/ for redirect behaviour, and parsed the Strict-Transport-Security header (absent).
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).
- No Strict-Transport-Security header on the homepage responseCRITICAL
Add
Strict-Transport-Security: max-age=31536000; includeSubDomainsto every HTTPS response.
Skipped — No PDP carried a Product JSON-LD node, so there is nothing to inspect for Offer price + priceCurrency.
Context: Agents need a price with a currency to show and compare your product.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is nothing to inspect for Offer price + priceCurrency.
How: Parse Offer price (or AggregateOffer lowPrice) as a parseable numeric price ≥ 0; require priceCurrency to match /^[A-Z]{3}$/i.
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 (0 found, 0%).
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
0/20 · 0%
- No Product JSON-LD on this PDPHIGH× 10
Add a
<script type="application/ld+json">block with@type: Productto the PDP<head>.Affected (10)
- /usa/wp-content/themes/jococups/img/favicon.ico
- /usa
- /usa/wp-json/oembed/1.0/embed?url=https%3A%2F%2…
- /usa/wp-json/oembed/1.0/embed?url=https%3A%2F%2…
- /usa/wp-content/cache/wpspeed/css/fd1f09cb76b42…
- /usa/wp-json
- /usa/wp-json/wp/v2/pages/107199
- /usa/xmlrpc.php?rsd=
- /usa/wp-content/uploads/sites/10/2019/06/croppe…
- /usa/wp-content/uploads/sites/10/2019/06/croppe…
…and 1 more
Remove the noindex directive from every PDP
Why this matters: A noindex on the PDP makes it invisible to Google and ineligible for the merchant listing program.
Findings (4)
Sampled 20 PDP(s); 4 returned a noindex directive.
How: For each sampled PDP, inspect the HTML for <meta name="robots" content="...noindex..."> and the response headers for X-Robots-Tag: ...noindex....
Coverage
16/20 · 80%
- PDP returns noindex (header)HIGH× 4
What we found
X-Robots-Tag: noindexWhat we expected
<meta name="robots" content="index, follow">Remove the noindex directive from both the meta tag and the X-Robots-Tag header on this route.
Affected (4)
- /usa/wp-json/oembed/1.0/embed?url=https%3A%2F%2…content: noindex
- /usa/wp-json/oembed/1.0/embed?url=https%3A%2F%2…content: noindex
- /usa/wp-jsoncontent: noindex
- /usa/wp-json/wp/v2/pages/107199content: noindex
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 (0 attributed, 0%).
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
0/20 · 0%
- 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)
- /usa/wp-content/themes/jococups/img/favicon.ico
- /usa
- /usa/wp-json/oembed/1.0/embed?url=https%3A%2F%2…
- /usa/wp-json/oembed/1.0/embed?url=https%3A%2F%2…
- /usa/wp-content/cache/wpspeed/css/fd1f09cb76b42…
- /usa/wp-json
- /usa/wp-json/wp/v2/pages/107199
- /usa/xmlrpc.php?rsd=
- /usa/wp-content/uploads/sites/10/2019/06/croppe…
- /usa/wp-content/uploads/sites/10/2019/06/croppe…
…and 1 more
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%
- No valid GTIN on this product pageHIGH× 10
Populate gtin/gtin8/gtin12/gtin13/gtin14 with the manufacturer's barcode.
Affected (10)
- /usa/wp-content/themes/jococups/img/favicon.ico
- /usa
- /usa/wp-json/oembed/1.0/embed?url=https%3A%2F%2…
- /usa/wp-json/oembed/1.0/embed?url=https%3A%2F%2…
- /usa/wp-content/cache/wpspeed/css/fd1f09cb76b42…
- /usa/wp-json
- /usa/wp-json/wp/v2/pages/107199
- /usa/xmlrpc.php?rsd=
- /usa/wp-content/uploads/sites/10/2019/06/croppe…
- /usa/wp-content/uploads/sites/10/2019/06/croppe…
…and 1 more
Publish /.well-known/ucp with at minimum a version field
Why this matters: Without `/.well-known/ucp`, Google's AI Mode can't identify your storefront as a UCP-conformant merchant.
Findings (1)
Inspected /.well-known/ucp for a parseable JSON document with a top-level version string.
How: Confirm ctx.wellKnownUcp is non-null and carries a non-empty version string (the only universally-required UCP profile field).
- /.well-known/ucp is not reachable or not parseable as JSONHIGH
Serve a JSON document at /.well-known/ucp with a top-level
versionstring (e.g., "2026-04-08").
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)
Wanted to inspect UCP root keys, but no profile was found.
How: Read the profile root (or top-level ucp wrapper) and verify the presence of version, services, capabilities, and signing_keys keys.
- No /.well-known/ucp profile presentHIGH
Publish /.well-known/ucp first (see ucp-profile-present).
Declare a shopping service entry with a recognised transport and an HTTPS endpoint
Why this matters: Without a valid shopping service entry, agents can recognise you as a UCP merchant but have no way to fetch your catalog.
Findings (1)
Wanted to walk the UCP profile's services[] for a valid shopping entry, but no profile was found.
How: List every services[] entry whose namespace is shopping (or contains shopping) and require at least one with transport ∈ {rest,mcp,a2a,embedded} AND a syntactically valid https:// endpoint.
- No /.well-known/ucp profile presentHIGH
Publish /.well-known/ucp first (see ucp-profile-present), then declare the shopping service.
Make every signing_keys[] entry a JWK with kty + kty-specific params
Why this matters: Malformed JWK entries are rejected silently by agents — signed payloads cannot be verified and the merchant loses trust signal.
Findings (1)
Wanted to validate signing_keys[], but no UCP profile was found.
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.
- No /.well-known/ucp profile presentHIGH
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 — No PDP carried a Product JSON-LD node, so there is nothing to inspect for `hasMerchantReturnPolicy`.
Context: 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.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is nothing to inspect for hasMerchantReturnPolicy.
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%.
Skipped — No PDP carried a resolvable Offer, so there is nothing to inspect for `availability`.
Context: Agents suppress out-of-stock or ambiguous items; a valid availability URL keeps you eligible.
Why this was skipped
No PDP carried a resolvable Offer, so there is nothing to inspect for availability.
How: On each Offer, accept availability only if it matches one of the canonical Schema.org ItemAvailability IRIs (http or https, trailing slash optional).
Skipped — No PDP carried a Product JSON-LD node, so there is nothing to inspect for `shippingDetails`.
Context: Without shippingDetails, AI agents fall back to vague defaults — they can't quote your rates, destinations, or delivery windows in shopping cards.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is nothing to inspect for shippingDetails.
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.
Skipped — No PDP in the sample carried a Product JSON-LD node, so there is nothing to inspect for `image`.
Context: Agents show your product image in shopping cards; a missing image weakens or drops the listing.
Why this was skipped
No PDP in the sample carried a Product JSON-LD node, so there is nothing to inspect for image.
How: Resolve image on each Product node into a list of URL strings (string, array, or ImageObject.url/contentUrl); require at least one non-empty URL.
Skipped — No PDP in the sample carried a Product JSON-LD node, so there is nothing to inspect for `name`.
Context: A product's name is the minimum an agent needs to list it.
Why this was skipped
No PDP in the sample carried a Product JSON-LD node, so there is nothing to inspect for name.
How: On each PDP with a Product JSON-LD node, require name to be a string of length > 0 after trimming.
Skipped — No PDP carried a Product JSON-LD node, so there is nothing to inspect for `offers`.
Context: Without an Offer, agents can't see that the product is for sale.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is nothing to inspect for offers.
How: On each Product node, require a resolvable Offer (or first Offer inside an AggregateOffer) via findOffer.
Skipped — No UCP profile present; Cache-Control policy is not evaluable.
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
No UCP profile present; Cache-Control policy is not evaluable.
How: Parse the Cache-Control header on the /.well-known/ucp response; require public, max-age ≥ 60, and no no-store/no-cache/private.
Skipped — No UCP profile present; Content-Type is not evaluable.
Context: Agent runtimes that gate parsing on Content-Type will skip your profile if it's served as HTML or plain text.
Why this was skipped
No UCP profile present; Content-Type is not evaluable.
How: Check that the Content-Type header on /.well-known/ucp starts with application/json (optionally with a charset parameter).
Skipped — No UCP profile reachable; public-fetch evaluation deferred to ucp-profile-present.
Context: Agents fetch `/.well-known/ucp` without credentials — a 401 or 403 means they never see the profile.
Why this was skipped
No UCP profile reachable; public-fetch evaluation deferred to ucp-profile-present.
How: Confirm an unauthenticated GET to /.well-known/ucp returns a 2xx status.
Skipped — No UCP profile present; redirect behaviour is not evaluable.
Context: Lightweight agent clients fetch `/.well-known/ucp` without following redirects — a 301/302 means they never see your profile.
Why this was skipped
No UCP profile present; redirect behaviour is not evaluable.
How: Inspect the final HTTP status of GET /.well-known/ucp and whether any 3xx redirect was followed to reach it.
Skipped — No UCP profile present.
Context: A service declared with the right transport but missing endpoint/schema is unreachable — agents can't negotiate or connect.
Why this was skipped
No UCP profile present.
How: For each services[] entry with a recognised transport, require the transport-conditional fields: rest/mcp → endpoint+schema; a2a → endpoint; embedded → schema.
Skipped — No UCP profile present.
Context: An unrecognised transport leaves agents with no handler to dispatch — your service appears absent.
Why this was skipped
No UCP profile present.
How: For each services[] entry, require transport to be one of: rest, mcp, a2a, embedded.
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)
Found a homepage Organization node but its contactPoint is missing both email and telephone.
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.
- Homepage Organization node has no contactPoint with email or telephoneMEDIUM
What we expected
"contactPoint": [{"@type":"ContactPoint","contactType":"customer service","email":"support@example.com","telephone":"+1-555-123-4567"}]Add a contactPoint object with at least one of
emailortelephone.
Install a third-party review platform so agents see syndicated reviews on your storefront
Why this matters: Third-party review widgets feed the ratings AI agents trust when ranking merchants.
Findings (1)
Scanned the homepage and 20 sampled PDPs for 8 review-platform asset fingerprints; none matched.
How: Substring scan of homepage and sampled PDP HTML for known review-platform asset fingerprints (judge.me, yotpo, stamped.io, reviews.io, okendo, loox, trustpilot, bazaarvoice).
- No third-party review-platform integration detectedMEDIUM
none of 8 fingerprints matched across 21 sources
Install a Judge.me / Yotpo / Loox / Okendo / Stamped / Reviews.io / Trustpilot / Bazaarvoice widget on your storefront.
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)
Tried to resolve an XML sitemap from robots.txt (Sitemap: directives) or /sitemap.xml. No entries were returned.
How: Parse <loc> entries from the resolved sitemap (or sitemap index) and classify each against product-URL patterns (/products/..., /product/..., /p/<id>, etc.).
- No XML sitemap was reachable, or it contained no <loc> entriesMEDIUM
/sitemap.xml0 entries parsed
Publish a sitemap at /sitemap.xml that includes one <loc> entry per product.
Add a Sitemap: line to robots.txt
Why this matters: Declaring the sitemap in robots.txt is the simplest way to point every crawler at your full product list.
Findings (1)
Read robots.txt and looked for a Sitemap: directive; none were declared.
How: Read parsed Sitemap: directives from robots.txt (sitemaps.org / RFC 9309 implementation note).
- robots.txt has no Sitemap: directiveMEDIUM
/robots.txt0 Sitemap: lines parsed
What we expected
Sitemap: https://yourdomain.com/sitemap.xmlAdd a top-level
Sitemap:line pointing at your XML sitemap (or sitemap index).
Skipped — HSTS itself is not enabled
Context: Without includeSubDomains, an HTTP subdomain (staging, mail, …) can be used to attack the apex's cookies.
Why this was skipped
Looked for includeSubDomains in the Strict-Transport-Security header, but HSTS itself is not enabled.
How: Parse the homepage Strict-Transport-Security header for the includeSubDomains directive (RFC 6797 §6.1.2).
- HSTS not enabled; check
https-and-hsts-enforcedfirst.MEDIUMFix
https-and-hsts-enforcedfirst — once HSTS ships, re-run this check.
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 — No PDP carried a Product JSON-LD node, so there is nothing to inspect for `brand`.
Context: Brand on every product is a primary agent filter and a required feed field.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is nothing to inspect for brand.
How: On each Product node, accept brand if it's a non-empty trimmed string OR an object with a non-empty name. Objects with @type Brand/Organization but no name are rejected.
Skipped — No PDP carried a Product JSON-LD node, so there is nothing to inspect for `description`.
Context: Agents quote your description to answer shopper questions; an empty description gives them nothing to work with.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is nothing to inspect for description.
How: Read description on each Product node; strip HTML tags and collapse whitespace; require length > 0.
Skipped — No PDP carried a Product JSON-LD node, so there is nothing to inspect for `sku`.
Context: A stable SKU lets agents track and re-identify your product across catalogs.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is nothing to inspect for sku.
How: On each PDP with a Product node, accept sku if it is a non-empty trimmed string or a number.
Skipped — No PDP carried a Product JSON-LD node, so there is nothing to inspect for placeholder titles.
Context: Placeholder titles like Default Title make products look broken to agents.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is nothing to inspect for placeholder titles.
How: Read name on the first Product JSON-LD node. Fail if empty, matches a known placeholder list (Default Title / Untitled / Product N / sample / test / draft / placeholder), or matches slug shape (lower-case alnum + at least one hyphen).
Skipped — the runner did not surface any sitemap resources
Context: Unescaped `&` is the single most common cause of sitemap parse errors that drop product URLs silently.
Why this was skipped
Wanted to inspect sampled <loc> entries for entity escaping, but the runner did not surface any sitemap resources.
How: Sample the first 100 <loc> entries per sitemap document and check for raw &, <, or > (sitemaps.org entity escaping rules).
- Transport metadata not available — runner update pendingLOW
Skipped — the runner did not surface any sitemap resources
Context: Cross-host sitemap entries are silently dropped, so the off-host product URLs effectively don't exist for the crawler.
Why this was skipped
Wanted to compare sitemap entry hosts against the containing sitemap, but the runner did not surface any sitemap resources.
How: For each resolved sitemap resource, parse the sitemap URL's host and compare it against every parsed <loc> URL's host.
- Transport metadata not available — runner update pendingLOW
Skipped — the runner did not surface any sitemap resources
Context: Schema-validating crawlers reject sitemaps with a missing or wrong namespace.
Why this was skipped
Wanted to check the xmlns declaration on every resolved sitemap document, but the runner did not surface any sitemap resources.
How: Substring-match xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" against the raw XML of every resolved sitemap document.
- Transport metadata not available — runner update pendingLOW
Skipped — No UCP profile present.
Context: Capabilities missing version/spec/schema can't be matched against agent support tables — agents skip them silently.
Why this was skipped
No UCP profile present.
How: For each capabilities[] entry, require non-empty string values for version, spec, and schema.
Skipped — No UCP profile present.
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 UCP profile present.
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.
Skipped — No UCP profile present; service version formats are not evaluable.
Context: Free-form version labels like `1.0` or `latest` defeat the version-pinning agents rely on, leaving them unable to negotiate the correct spec generation.
Why this was skipped
No UCP profile present; service version formats are not evaluable.
How: For each services[] entry, require version to be a string matching /^\d{4}-\d{2}-\d{2}$/.
Send Content-Type: text/plain on /robots.txt
Why this matters: A wrong content type makes strict crawlers ignore the file entirely and fall back to permissive defaults.
Findings (1)
Inspected /robots.txt Content-Type ("text/html; charset=UTF-8"); not text/plain.
How: Inspect the /robots.txt response Content-Type header for a text/plain media type per RFC 9309 §2.3.
- /robots.txt Content-Type is "text/html; charset=UTF-8", not text/plainLOW
What we found
text/html; charset=UTF-8What we expected
Content-Type: text/plain; charset=utf-8Configure your origin to send
Content-Type: text/plain; charset=utf-8on /robots.txt.
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 (10)
Inspected <img width=… height=…> attributes on 20 sampled product pages (10 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
10/20 · 50%
- No <img> on this PDP carries explicit width+height attributesLOW× 10
Server-render explicit width and height attributes so crawlers can verify image area without fetching.
Affected (10)
- /usa/wp-content/themes/jococups/img/favicon.icono <img> tags found in the HTML
- /usa/wp-json/oembed/1.0/embed?url=https%3A%2F%2…no <img> tags found in the HTML
- /usa/wp-json/oembed/1.0/embed?url=https%3A%2F%2…no <img> tags found in the HTML
- /usa/wp-content/cache/wpspeed/css/fd1f09cb76b42…no <img> tags found in the HTML
- /usa/wp-jsonno <img> tags found in the HTML
- /usa/wp-json/wp/v2/pages/107199no <img> tags found in the HTML
- /usa/xmlrpc.php?rsd=no <img> tags found in the HTML
- /usa/wp-content/uploads/sites/10/2019/06/croppe…no <img> tags found in the HTML
- /usa/wp-content/uploads/sites/10/2019/06/croppe…no <img> tags found in the HTML
- /usa/wp-content/uploads/sites/10/2019/06/croppe…no <img> tags found in the HTML
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 (10)
Parsed <img> alt attributes across 20 sampled product pages (10 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
10/20 · 50%
- Most images on this product page lack alt textLOW× 10
What we expected
<img src="/img/sneaker.webp" alt="Red leather running shoe, side view" />Populate the alt attribute on each <img> with a description of what the image shows; use alt="" only for decorative images.
Affected (10)
- /usa19/84 <img> tags have non-empty alt (23%)
- /product/16oz-insulated-flask19/84 <img> tags have non-empty alt (23%)
- /product/12oz-insulated-flask19/84 <img> tags have non-empty alt (23%)
- /product/active-flask-17oz19/84 <img> tags have non-empty alt (23%)
- /product/16oz-utility-joco-cup19/84 <img> tags have non-empty alt (23%)
- /product/12oz-utility-joco-cup19/84 <img> tags have non-empty alt (23%)
- /product/6oz-utility-joco-cup19/84 <img> tags have non-empty alt (23%)
- /product/12oz-artist-series-sandstone19/84 <img> tags have non-empty alt (23%)
- /product/utility-lid-regular19/84 <img> tags have non-empty alt (23%)
- /product/utility-lid-small19/84 <img> tags have non-empty alt (23%)
Skipped — No PDP carried a Product JSON-LD node, so there is no eligible PDP to inspect for BreadcrumbList.
Context: Breadcrumbs help agents understand where a product sits in your catalog.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is no eligible PDP to inspect for BreadcrumbList.
How: Search every JSON-LD block on each PDP for @type: BreadcrumbList with a non-empty itemListElement.
Skipped — HSTS itself is not enabled
Context: HSTS preload-list inclusion is the strongest downgrade protection available — first-time visits are protected too.
Why this was skipped
Looked for the preload directive in the Strict-Transport-Security header, but HSTS itself is not enabled.
How: Parse the homepage Strict-Transport-Security header for the preload directive (hstspreload.org vendor extension to RFC 6797).
- HSTS not enabled; check
https-and-hsts-enforcedfirst.LOWFix
https-and-hsts-enforcedfirst — once HSTS ships, re-run this check.
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 PDP carried a resolvable Offer, so there is nothing to inspect for `itemCondition`.
Context: When you declare itemCondition, agents and Google require a canonical Schema.org IRI; free-text values get ignored.
Why this was skipped
No PDP carried a resolvable Offer, so there is nothing to inspect for itemCondition.
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.
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 — No PDP carried a Product JSON-LD node, so there is nothing to inspect for `aggregateRating`.
Context: Review ratings are a trust signal agents use to rank and filter products.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is nothing to inspect for aggregateRating.
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.
Skipped — No PDP carried a Product JSON-LD node, so there is nothing to inspect for title quality.
Context: Empty or all-caps product titles signal low quality to agents and trigger Google Merchant Center policy flags.
Why this was skipped
No PDP carried a Product JSON-LD node, so there is nothing to inspect for title quality.
How: Read name on the first Product JSON-LD node. Fail if missing/empty after trimming OR if the string contains letters and they're all upper-case.
Skipped — the runner did not surface any sitemap resources
Context: Strict crawlers drop over-cap URLs without surfacing the error, so over-cap product entries effectively vanish.
Why this was skipped
Wanted to check <loc> URL lengths across every resolved sitemap document, but the runner did not surface any sitemap resources.
How: Iterate every parsed <loc> URL across all resolved sitemap resources and check length against the 2,048-character cap.
- Transport metadata not available — runner update pendingLOW
Skipped — the runner did not surface any sitemap resources
Context: Over-cap sitemaps are silently dropped — neither byte overflow nor entry overflow surfaces a crawler error.
Why this was skipped
Wanted to verify each sitemap's byte size and entry count against sitemaps.org caps, but the runner did not surface any sitemap resources.
How: Check raw byte size (≤ 52,428,800 B) and entry count (≤ 50,000) for every resolved sitemap resource.
- Transport metadata not available — runner update pendingLOW
Skipped — the runner did not surface any sitemap resources with transport metadata
Context: Non-UTF-8 sitemaps are silently dropped by Search Console and trip default XML parsers used by other crawlers.
Why this was skipped
Wanted to check the encoding of every resolved sitemap document, but the runner did not surface any sitemap resources with transport metadata.
How: Inspect every resolved sitemap document's raw byte stream for UTF-8 decodability (sitemaps.org encoding requirement).
- Transport metadata not available — runner update pendingLOW
This check activates once the runner (Task I1) populates ctx.sitemapResources with raw bytes + headers.
Skipped — No UCP profile found; MCP transport validity is not evaluable.
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
No UCP profile found; MCP transport validity is not evaluable.
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.