stanley1913.com
Audited 6 days ago· shopify
Agent-readiness across all five AI commerce surfaces.
Surfaces — click to filter
16 failing · 7 not checked · 23 shown
7 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://stanley1913.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.
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 (html)HIGH× 4
What we found
<meta name="robots" content="noindex,nofollow">What 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)
- /products/the-iceflow%E2%84%A2-flip-straw-tumbl…content: noindex,nofollow
- /products/the-quencher-protour-flip-straw-tumbl…content: noindex,nofollow
- /products/adventure-stacking-beer-pint-stanley-…content: noindex,nofollow
- /products/the-iceflow%E2%84%A2-bottle-with-flip…content: noindex,nofollow
Emit a single Product JSON-LD node per PDP
Why this matters: Duplicate Product nodes on a single PDP cause Google's merchant scraper to drop the listing or pick the wrong variant.
Findings (16)
Sampled 20 PDP(s); 16 carried multiple Product JSON-LD nodes.
How: For each sampled PDP, count JSON-LD nodes whose @type is Product or whose @type array contains Product. Each PDP must expose at most one.
Coverage
4/20 · 20%
- PDP exposes 3 Product JSON-LD nodesHIGH× 4
Emit exactly one Product JSON-LD block per PDP; model variants via
hasVariantor multiple Offer children.Affected (4)
- /products/the-iceflow%E2%84%A2-flip-straw-tumbl…3 Product nodes detected
- /products/forge-thermal-bottle-1-4-qt3 Product nodes detected
- /products/stanley-lifted-spirits-steel-cooler-5…3 Product nodes detected
- /products/stanley-lifted-spirits-steel-cooler-2…3 Product nodes detected
- PDP exposes 4 Product JSON-LD nodesHIGH
/products/the-quencher-protour-flip-straw-tumbl…4 Product nodes detected
Emit exactly one Product JSON-LD block per PDP; model variants via
hasVariantor multiple Offer children. - PDP exposes 6 Product JSON-LD nodesHIGH× 5
Emit exactly one Product JSON-LD block per PDP; model variants via
hasVariantor multiple Offer children.Affected (5)
- /products/adventure-stacking-beer-pint-stanley-…6 Product nodes detected
- /products/the-iceflow%E2%84%A2-bottle-with-flip…6 Product nodes detected
- /products/country-collection-iceflow-tumbler-30…6 Product nodes detected
- /products/country-collection-quencher-protour-f…6 Product nodes detected
- /products/country-collection-stacking-pint-16-oz6 Product nodes detected
…and 6 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)
- /products/the-iceflow%E2%84%A2-flip-straw-tumbl…
- /products/the-quencher-protour-flip-straw-tumbl…
- /products/adventure-stacking-beer-pint-stanley-…
- /products/the-iceflow%E2%84%A2-bottle-with-flip…
- /products/country-collection-iceflow-tumbler-30…
- /products/country-collection-quencher-protour-f…
- /products/country-collection-iceflow-aerolight-…
- /products/country-collection-stacking-pint-16-oz
- /products/the-daybreak-cafe-latte-cup-10-6-oz
- /products/the-daybreak-cafe-latte-cup-stillness…
…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)
- /products/the-iceflow%E2%84%A2-flip-straw-tumbl…
- /products/the-quencher-protour-flip-straw-tumbl…
- /products/adventure-stacking-beer-pint-stanley-…
- /products/the-iceflow%E2%84%A2-bottle-with-flip…
- /products/country-collection-iceflow-tumbler-30…
- /products/country-collection-quencher-protour-f…
- /products/country-collection-iceflow-aerolight-…
- /products/country-collection-stacking-pint-16-oz
- /products/the-daybreak-cafe-latte-cup-10-6-oz
- /products/the-daybreak-cafe-latte-cup-stillness…
…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.
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)
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.
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 708 <loc> entries against their sitemap host across 7 resource(s); 5 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 stanley1913.com but entry is on www.stanley1913.comMEDIUM
/sitemap.xmlsitemap host: stanley1913.com; entry host: www.stanley1913.com
What we found
https://www.stanley1913.com/sitemap_agentic_discovery.xmlRemove the cross-host entry from this sitemap, or publish a separate sitemap on that host.
- Cross-host <loc> — sitemap host is stanley1913.com but entry is on www.stanley1913.comMEDIUM
/sitemap.xmlsitemap host: stanley1913.com; entry host: www.stanley1913.com
What we found
https://www.stanley1913.com/sitemap_products_1.xml?from=5019769274427&to=14973483647336Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.
- Cross-host <loc> — sitemap host is stanley1913.com but entry is on www.stanley1913.comMEDIUM
/sitemap.xmlsitemap host: stanley1913.com; entry host: www.stanley1913.com
What we found
https://www.stanley1913.com/sitemap_pages_1.xml?from=58699382843&to=692011204968Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.
- Cross-host <loc> — sitemap host is stanley1913.com but entry is on www.stanley1913.comMEDIUM
/sitemap.xmlsitemap host: stanley1913.com; entry host: www.stanley1913.com
What we found
https://www.stanley1913.com/sitemap_collections_1.xml?from=190292099131&to=671708643688Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.
- Cross-host <loc> — sitemap host is stanley1913.com but entry is on www.stanley1913.comMEDIUM
/sitemap.xmlsitemap host: stanley1913.com; entry host: www.stanley1913.com
What we found
https://www.stanley1913.com/sitemap_blogs_1.xmlRemove the cross-host entry from this sitemap, or publish a separate sitemap on that host.
Populate sku on every Product JSON-LD node
Why this matters: A stable SKU lets agents track and re-identify your product across catalogs.
Findings (4)
Read the sku field on Product JSON-LD across 20 sampled product pages (16 populated, 80%).
How: On each PDP with a Product node, accept sku if it is a non-empty trimmed string or a number.
Coverage
16/20 · 80%
- Product JSON-LD has no populated
skuMEDIUM× 4Fill in the SKU field in your product admin; the JSON-LD template typically binds to that field.
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 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 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)
- /products/the-iceflow%E2%84%A2-flip-straw-tumbl…
- /products/the-quencher-protour-flip-straw-tumbl…
- /products/adventure-stacking-beer-pint-stanley-…
- /products/the-iceflow%E2%84%A2-bottle-with-flip…
- /products/country-collection-iceflow-tumbler-30…
- /products/country-collection-quencher-protour-f…
- /products/country-collection-iceflow-aerolight-…
- /products/country-collection-stacking-pint-16-oz
- /products/the-daybreak-cafe-latte-cup-10-6-oz
- /products/the-daybreak-cafe-latte-cup-stillness…
…and 1 more
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%
- 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)
- /products/the-iceflow%E2%84%A2-flip-straw-tumbl…27/61 <img> tags have non-empty alt (44%)
- /products/the-quencher-protour-flip-straw-tumbl…28/62 <img> tags have non-empty alt (45%)
- /products/adventure-stacking-beer-pint-stanley-…27/60 <img> tags have non-empty alt (45%)
- /products/the-iceflow%E2%84%A2-bottle-with-flip…30/64 <img> tags have non-empty alt (47%)
- /products/country-collection-iceflow-tumbler-30…30/65 <img> tags have non-empty alt (46%)
- /products/country-collection-quencher-protour-f…30/65 <img> tags have non-empty alt (46%)
- /products/country-collection-iceflow-aerolight-…31/66 <img> tags have non-empty alt (47%)
- /products/country-collection-stacking-pint-16-oz27/61 <img> tags have non-empty alt (44%)
- /products/the-daybreak-cafe-latte-cup-10-6-oz32/64 <img> tags have non-empty alt (50%)
- /products/the-daybreak-cafe-latte-cup-stillness…29/64 <img> tags have non-empty alt (45%)
…and 1 more
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 4 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: /pages/about=404, /pages/about-us=404, /about=404, /about-us=404
Publish an About page at /about (or your platform's standard path) with ≥ 200 chars of body text.
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.