sierrabullets.com
Audited 5 days ago· bigcommerce
Agent-readiness across all five AI commerce surfaces.
Surfaces — click to filter
20 failing · 9 not checked · 29 shown
9 checks couldn't run on this store — each is listed below with the reason. Your score reflects only what we could verify.
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)
- /6mm-107-gr-hpbt-matchking-x-mkx
- /50-cal-350-gr-jhp-sports-master
- /6-5mm-144-gr-hpbt-matchking-smk
- /45-cal-300-gr-jsp-sports-master
- /30-cal-175-gr-hpbt-matchking-x-mkx
- /6-5mm-120-gr-hpbt-matchking-smk
- /30-cal-200-gr-hpbt-cn-matchking-smk
- /6-5mm-150-gr-hpbt-cn-matchking-smk
- /22-cal-40-gr-hp-varmintking-vk
- /sierra-trucker-flag-black
…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)
- /6mm-107-gr-hpbt-matchking-x-mkx
- /50-cal-350-gr-jhp-sports-master
- /6-5mm-144-gr-hpbt-matchking-smk
- /45-cal-300-gr-jsp-sports-master
- /30-cal-175-gr-hpbt-matchking-x-mkx
- /6-5mm-120-gr-hpbt-matchking-smk
- /30-cal-200-gr-hpbt-cn-matchking-smk
- /6-5mm-150-gr-hpbt-cn-matchking-smk
- /22-cal-40-gr-hp-varmintking-vk
- /sierra-trucker-flag-black
…and 1 more
Make every MerchantReturnPolicy node satisfy Option A or Option B
Why this matters: A policy node missing both shapes is invisible to agents — they can't render it, link to it, or quote your return terms.
Findings (11)
Inspected 20 MerchantReturnPolicy nodes across 20 PDPs (0 satisfy Option A or B, 0%).
How: For each PDP, walk every hasMerchantReturnPolicy node (Product or Offer level) and require either (applicableCountry + returnPolicyCategory) OR a syntactically-valid merchantReturnLink URL.
Coverage
0/20 · 0%
- MerchantReturnPolicy node fails Option A and Option BHIGH× 10
Add (applicableCountry + returnPolicyCategory) or merchantReturnLink to this policy node.
Affected (10)
- /6mm-107-gr-hpbt-matchking-x-mkxnode missing Option A or B (lacks: returnPolicyCategory, applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /50-cal-350-gr-jhp-sports-masternode missing Option A or B (lacks: returnPolicyCategory, applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /6-5mm-144-gr-hpbt-matchking-smknode missing Option A or B (lacks: returnPolicyCategory, applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /45-cal-300-gr-jsp-sports-masternode missing Option A or B (lacks: returnPolicyCategory, applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /30-cal-175-gr-hpbt-matchking-x-mkxnode missing Option A or B (lacks: returnPolicyCategory, applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /6-5mm-120-gr-hpbt-matchking-smknode missing Option A or B (lacks: returnPolicyCategory, applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /30-cal-200-gr-hpbt-cn-matchking-smknode missing Option A or B (lacks: returnPolicyCategory, applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /6-5mm-150-gr-hpbt-cn-matchking-smknode missing Option A or B (lacks: returnPolicyCategory, applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /22-cal-40-gr-hp-varmintking-vknode missing Option A or B (lacks: returnPolicyCategory, applicableCountry (ISO alpha-2), merchantReturnLink (URL))
- /sierra-trucker-flag-blacknode missing Option A or B (lacks: returnPolicyCategory, applicableCountry (ISO alpha-2), merchantReturnLink (URL))
…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 — 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.
Emit brand as either a string or a typed Brand object on every Product
Why this matters: Brand on every product is a primary agent filter and a required feed field.
Findings (11)
Inspected the brand field on Product JSON-LD across 20 sampled product pages (0 valid as string or object, 0%).
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.
Coverage
0/20 · 0%
- Product
brandis missing or empty (neither a string nor an object withname)MEDIUM× 10Emit
brandas"Acme"(string) or{"@type":"Brand","name":"Acme"}(object).Affected (10)
- /6mm-107-gr-hpbt-matchking-x-mkx
- /50-cal-350-gr-jhp-sports-master
- /6-5mm-144-gr-hpbt-matchking-smk
- /45-cal-300-gr-jsp-sports-master
- /30-cal-175-gr-hpbt-matchking-x-mkx
- /6-5mm-120-gr-hpbt-matchking-smk
- /30-cal-200-gr-hpbt-cn-matchking-smk
- /6-5mm-150-gr-hpbt-cn-matchking-smk
- /22-cal-40-gr-hp-varmintking-vk
- /sierra-trucker-flag-black
…and 1 more
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=31536000") 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=31536000What 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.
Emit shippingDestination as a DefinedRegion with ISO addressCountry
Why this matters: 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.
Findings (11)
Validated shippingDestination on 20 OfferShippingDetails nodes (0 valid DefinedRegion, 0%).
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.
Coverage
0/20 · 0%
- shippingDestination is missing ISO addressCountryMEDIUM× 10
Emit DefinedRegion with addressCountry as a 2-letter ISO code.
Affected (10)
- /6mm-107-gr-hpbt-matchking-x-mkxDefinedRegion missing ISO addressCountry
- /50-cal-350-gr-jhp-sports-masterDefinedRegion missing ISO addressCountry
- /6-5mm-144-gr-hpbt-matchking-smkDefinedRegion missing ISO addressCountry
- /45-cal-300-gr-jsp-sports-masterDefinedRegion missing ISO addressCountry
- /30-cal-175-gr-hpbt-matchking-x-mkxDefinedRegion missing ISO addressCountry
- /6-5mm-120-gr-hpbt-matchking-smkDefinedRegion missing ISO addressCountry
- /30-cal-200-gr-hpbt-cn-matchking-smkDefinedRegion missing ISO addressCountry
- /6-5mm-150-gr-hpbt-cn-matchking-smkDefinedRegion missing ISO addressCountry
- /22-cal-40-gr-hp-varmintking-vkDefinedRegion missing ISO addressCountry
- /sierra-trucker-flag-blackDefinedRegion missing ISO addressCountry
…and 1 more
Emit shippingRate as a valid MonetaryAmount
Why this matters: An invalid rate object is silently dropped; agents can't quote your shipping cost in shopping cards.
Findings (11)
Validated shippingRate on 20 OfferShippingDetails nodes (0 valid MonetaryAmount, 0%).
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.
Coverage
0/20 · 0%
- shippingRate is not a valid MonetaryAmountMEDIUM× 10
Emit { value: <number>, currency: "USD" } (or maxValue + currency).
Affected (10)
- /6mm-107-gr-hpbt-matchking-x-mkxmissing numeric value/maxValue, ISO currency
- /50-cal-350-gr-jhp-sports-mastermissing numeric value/maxValue, ISO currency
- /6-5mm-144-gr-hpbt-matchking-smkmissing numeric value/maxValue, ISO currency
- /45-cal-300-gr-jsp-sports-mastermissing numeric value/maxValue, ISO currency
- /30-cal-175-gr-hpbt-matchking-x-mkxmissing numeric value/maxValue, ISO currency
- /6-5mm-120-gr-hpbt-matchking-smkmissing numeric value/maxValue, ISO currency
- /30-cal-200-gr-hpbt-cn-matchking-smkmissing numeric value/maxValue, ISO currency
- /6-5mm-150-gr-hpbt-cn-matchking-smkmissing numeric value/maxValue, ISO currency
- /22-cal-40-gr-hp-varmintking-vkmissing numeric value/maxValue, ISO currency
- /sierra-trucker-flag-blackmissing numeric value/maxValue, ISO currency
…and 1 more
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.
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 (4)
Compared 265 <loc> entries against their sitemap host across 2 resource(s); 4 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 www.sierrabullets.com but entry is on sierrabullets.comMEDIUM
/xmlsitemap.phpsitemap host: www.sierrabullets.com; entry host: sierrabullets.com
What we found
https://sierrabullets.com/xmlsitemap.php?type=pages&page=1Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.
- Cross-host <loc> — sitemap host is www.sierrabullets.com but entry is on sierrabullets.comMEDIUM
/xmlsitemap.phpsitemap host: www.sierrabullets.com; entry host: sierrabullets.com
What we found
https://sierrabullets.com/xmlsitemap.php?type=products&page=1Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.
- Cross-host <loc> — sitemap host is www.sierrabullets.com but entry is on sierrabullets.comMEDIUM
/xmlsitemap.phpsitemap host: www.sierrabullets.com; entry host: sierrabullets.com
What we found
https://sierrabullets.com/xmlsitemap.php?type=categories&page=1Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.
- Cross-host <loc> — sitemap host is www.sierrabullets.com but entry is on sierrabullets.comMEDIUM
/xmlsitemap.phpsitemap host: www.sierrabullets.com; entry host: sierrabullets.com
What we found
https://sierrabullets.com/xmlsitemap.php?type=news&page=1Remove the cross-host entry from this sitemap, or publish a separate sitemap on that host.
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 — 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× 9
Upload an image whose width × height ≥ 50,000 (e.g., 400 × 300 = 120,000).
Affected (9)
- /6mm-107-gr-hpbt-matchking-x-mkxlargest image area observed: 1,656 px
- /50-cal-350-gr-jhp-sports-masterlargest image area observed: 1,656 px
- /6-5mm-144-gr-hpbt-matchking-smklargest image area observed: 1,656 px
- /45-cal-300-gr-jsp-sports-masterlargest image area observed: 1,656 px
- /30-cal-175-gr-hpbt-matchking-x-mkxlargest image area observed: 1,656 px
- /6-5mm-120-gr-hpbt-matchking-smklargest image area observed: 1,656 px
- /30-cal-200-gr-hpbt-cn-matchking-smklargest image area observed: 1,656 px
- /6-5mm-150-gr-hpbt-cn-matchking-smklargest image area observed: 1,656 px
- /22-cal-40-gr-hp-varmintking-vklargest image area observed: 1,656 px
- No <img> on this PDP carries explicit width+height attributesLOW
/sierra-trucker-flag-black17 <img> tags found, none with width+height
Server-render explicit width and height attributes so crawlers can verify image area without fetching.
…and 1 more
Use Schema.org enum values for returnFees / returnMethod / refundType
Why this matters: Invalid enrichment values are dropped silently, leaving merchants confused about why their rendered policy is missing fields they configured.
Findings (11)
Validated enrichment enums on 20 MerchantReturnPolicy nodes (0 all-valid, 0%).
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.
Coverage
0/20 · 0%
- MerchantReturnPolicy enum field uses an invalid Schema.org valueLOW× 10
What we found
returnFees=""; returnMethod=""Use the bare enum name or schema.org URL form from the documented enum.
Affected (10)
- /6mm-107-gr-hpbt-matchking-x-mkx
- /50-cal-350-gr-jhp-sports-master
- /6-5mm-144-gr-hpbt-matchking-smk
- /45-cal-300-gr-jsp-sports-master
- /30-cal-175-gr-hpbt-matchking-x-mkx
- /6-5mm-120-gr-hpbt-matchking-smk
- /30-cal-200-gr-hpbt-cn-matchking-smk
- /6-5mm-150-gr-hpbt-cn-matchking-smk
- /22-cal-40-gr-hp-varmintking-vk
- /sierra-trucker-flag-black
…and 1 more
Emit a ShippingDeliveryTime with handlingTime and/or transitTime populated
Why this matters: Without populated handling/transit times, agents can't quote a delivery window in shopping cards.
Findings (11)
Validated deliveryTime on 20 OfferShippingDetails nodes (0 valid ShippingDeliveryTime, 0%).
How: On each OfferShippingDetails node where deliveryTime is set, require an object with at least one of handlingTime / transitTime populated as a QuantitativeValue.
Coverage
0/20 · 0%
- deliveryTime is missing populated handling/transit timeLOW× 10
Emit at least one of handlingTime / transitTime as a QuantitativeValue with value/minValue/maxValue.
Affected (10)
- /6mm-107-gr-hpbt-matchking-x-mkxneither handlingTime nor transitTime is a populated QuantitativeValue
- /50-cal-350-gr-jhp-sports-masterneither handlingTime nor transitTime is a populated QuantitativeValue
- /6-5mm-144-gr-hpbt-matchking-smkneither handlingTime nor transitTime is a populated QuantitativeValue
- /45-cal-300-gr-jsp-sports-masterneither handlingTime nor transitTime is a populated QuantitativeValue
- /30-cal-175-gr-hpbt-matchking-x-mkxneither handlingTime nor transitTime is a populated QuantitativeValue
- /6-5mm-120-gr-hpbt-matchking-smkneither handlingTime nor transitTime is a populated QuantitativeValue
- /30-cal-200-gr-hpbt-cn-matchking-smkneither handlingTime nor transitTime is a populated QuantitativeValue
- /6-5mm-150-gr-hpbt-cn-matchking-smkneither handlingTime nor transitTime is a populated QuantitativeValue
- /22-cal-40-gr-hp-varmintking-vkneither handlingTime nor transitTime is a populated QuantitativeValue
- /sierra-trucker-flag-blackneither handlingTime nor transitTime is a populated QuantitativeValue
…and 1 more
Use sentence-case product titles
Why this matters: Empty or all-caps product titles signal low quality to agents and trigger Google Merchant Center policy flags.
Findings (9)
Inspected the Product JSON-LD title on 20 sampled product pages (11 non-empty and not all-caps, 55%).
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.
Coverage
11/20 · 55%
- Product title is entirely upper-caseLOW
/50-cal-350-gr-jhp-sports-master
What we found
50 CAL 350 GR JHP SPORTS MASTERUse sentence-case or title-case capitalisation.
- Product title is entirely upper-caseLOW
/45-cal-300-gr-jsp-sports-master
What we found
45 CAL 300 GR JSP SPORTS MASTERUse sentence-case or title-case capitalisation.
- Product title is entirely upper-caseLOW
/30-cal-175-gr-hpbt-matchking-x-mkx
What we found
30 CAL 175 GR HPBT MATCHKING X (MKX)Use sentence-case or title-case capitalisation.
- Product title is entirely upper-caseLOW
/30-cal-200-gr-hpbt-cn-matchking-smk
What we found
30 CAL 200 GR HPBT/CN MATCHKING (SMK)Use sentence-case or title-case capitalisation.
- Product title is entirely upper-caseLOW
/30-cal-180-gr-tipped-gameking-tgk
What we found
30 CAL 180 GR TIPPED GAMEKING (TGK)Use sentence-case or title-case capitalisation.
- Product title is entirely upper-caseLOW
/41-cal-170-gr-jhc-sports-master
What we found
41 CAL 170 GR JHC SPORTS MASTERUse sentence-case or title-case capitalisation.
- Product title is entirely upper-caseLOW
What we found
9MM 125 GR JHP SPORTS MASTERUse sentence-case or title-case capitalisation.
- Product title is entirely upper-caseLOW
What we found
30 CAL 125 GR SPT PRO-HUNTERUse sentence-case or title-case capitalisation.
- Product title is entirely upper-caseLOW
/375-cal-350-gr-hpbt-cn-matchking-smk
What we found
375 CAL 350 GR HPBT/CN MATCHKING (SMK)Use sentence-case or title-case capitalisation.
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=31536000") 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=31536000What 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 (3 valid, 15%).
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
3/20 · 15%
- Product has no valid AggregateRating (ratingValue 0-5 + reviewCount/ratingCount ≥ 1)LOW× 10
Render
aggregateRatingfrom real review totals — never fabricate.Affected (10)
- /6mm-107-gr-hpbt-matchking-x-mkx
- /50-cal-350-gr-jhp-sports-master
- /6-5mm-144-gr-hpbt-matchking-smk
- /6-5mm-120-gr-hpbt-matchking-smk
- /30-cal-200-gr-hpbt-cn-matchking-smk
- /6-5mm-150-gr-hpbt-cn-matchking-smk
- /22-cal-40-gr-hp-varmintking-vk
- /sierra-trucker-flag-black
- /22-cal-88-gr-tipped-matchking-tmk
- /30-cal-180-gr-tipped-gameking-tgk
…and 1 more
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.