A

Policy

HIGH

Offer JSON-LD carries shippingDetails (OfferShippingDetails)

Each PDP's Offer JSON-LD carries `shippingDetails: OfferShippingDetails`. Without shippingDetails, AI agents fall back to vague defaults — they can't quote your rates, destinations, or delivery windows in shopping cards.

What this check looks for

Without `shippingDetails` on Offer (or, defensively, on Product), Google's shipping-policy rich-result family has nothing to render and downstream sub-aspect checks (rate, destination, delivery-time) have nothing to evaluate. Coverage ≥ 85% across PDPs with Product JSON-LD passes; ≥ 50% partial; otherwise fail.

Which AI surfaces it affects

  • Google AI Mode (UCP)90
  • Microsoft Copilot60
  • Meta AI50
  • ChatGPT (ACP)40
  • Perplexity30

Weighted against the live specs — ACP 2026-04-17, UCP 2026-04-08.

How to fix it

Emit shippingDetails (OfferShippingDetails) on Offer JSON-LD

Shopify

Developer
  1. Settings → Shipping and delivery: configure shipping zones and rates per market.
  2. On Online Store 2.0 themes with merchant-listing schema enabled, Shopify emits `shippingDetails` automatically.
  3. On custom themes, inject the block in `sections/product.liquid` referencing your shop's primary shipping zone.

Platform docs ↗

BigCommerce

Developer
  1. Store Setup → Shipping: confirm zones and rates are configured.
  2. Edit `templates/components/products/product-view.html` to emit `shippingDetails` on the Offer JSON-LD block.

Platform docs ↗

WooCommerce

Developer
  1. WooCommerce → Settings → Shipping: configure zones and methods.
  2. Install/update Yoast SEO or AIOSEO with the merchant-listings add-on, which emits `shippingDetails` from your WooCommerce zone configuration.

Platform docs ↗

Custom / headless

Developer
  1. Inject `shippingDetails` on every Offer JSON-LD block.
  2. At minimum: shippingRate (MonetaryAmount), shippingDestination.addressCountry (ISO), deliveryTime.
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Example Hat",
  "offers": {
    "@type": "Offer",
    "price": "49.99",
    "priceCurrency": "USD",
    "shippingDetails": {
      "@type": "OfferShippingDetails",
      "shippingRate": {
        "@type": "MonetaryAmount",
        "value": 5.99,
        "currency": "USD"
      },
      "shippingDestination": {
        "@type": "DefinedRegion",
        "addressCountry": "US"
      },
      "deliveryTime": {
        "@type": "ShippingDeliveryTime",
        "handlingTime": {
          "@type": "QuantitativeValue",
          "minValue": 0,
          "maxValue": 1,
          "unitCode": "DAY"
        },
        "transitTime": {
          "@type": "QuantitativeValue",
          "minValue": 2,
          "maxValue": 5,
          "unitCode": "DAY"
        }
      }
    }
  }
}
</script>

The spec it's pinned to

  • schema.org/OfferShippingDetails

    schema.org/OfferShippingDetails is the canonical container for shipping rate, destination, and delivery-time fields on an Offer.

  • Google shipping-policy SD — entry-point field

    Google's shipping-policy SD treats `shippingDetails` on Offer as the entry point for the entire shipping rich-result family; without it the rest of the family can't render.

Google — shipping policy structured data

Does your store pass this check?

Run the full audit — 82 checks across five AI shopping surfaces. Most tools only check whether you get mentioned; we check whether an agent can buy from you.

Related policy checks

← All 82 checks