Product facts

Why can't AI agents find my delivery price?

Because on many stores the delivery cost first appears at checkout, after the shopper types an address, and an agent reading your public pages never gets that far. Publish your rates as text on a shipping page, show the cost or a link next to the price on every product page, and describe the policy in structured data.

Author
Aiscovery team
Published
Updated
Reading time
8 min read

Why agents miss the delivery cost

A shopper who asks an assistant what an order will cost delivered needs two numbers: the price and the delivery. The price is on the product page. The delivery cost is often only at checkout, calculated from an address, and checkout is exactly where browsing agents stop or hand back to the person. Aiscovery's own AI agents stop before cart, checkout and any form that sends data, by design.

Where stores put delivery costs, and what an agent gets
Where the cost livesWhat an agent reading public pages getsFix
Only in the checkout calculatorNothing. It would have to start checkout and enter an address.Publish the rate table on a shipping page
In a cart drawer estimateUsually nothing. It appears after Add to cart.Repeat the estimate on the product page
In a free delivery banner imageNothing readable unless the alt text says itPut the threshold in text, near the price
On a policy page, as an image or PDFLittle or nothingAn HTML table with countries, rates and times
In text on the product page and a shipping pageThe cost, the threshold and the delivery timeKeep both in step when rates change

Put the delivery cost where agents read

  1. Step 1: Write a shipping page an agent can quote

    List each destination, the rate, any free delivery threshold, the handling time, the transit time and the order cut-off. Use an HTML table or plain sentences, not an image. On Shopify, this is your shipping policy at /policies/shipping-policy; fill it in under Settings, then Policies.

    HTML: a rate table an agent can read
    <table>
      <caption>Delivery rates and times</caption>
      <thead>
        <tr><th scope="col">Destination</th><th scope="col">Rate</th><th scope="col">Delivery time</th></tr>
      </thead>
      <tbody>
        <tr><th scope="row">Canada</th><td>CAD 9.95, free over CAD 100</td><td>2 to 5 business days</td></tr>
        <tr><th scope="row">United States</th><td>CAD 9.95, free over CAD 100</td><td>3 to 7 business days</td></tr>
      </tbody>
    </table>
  2. Step 2: Add one line next to the price on every product page

    For example: Delivery to Canada and the US from CAD 9.95, free over CAD 100, 2 to 5 business days, followed by a link to the shipping page. Render it in the HTML, not only after a click, so agents that read the page source see it too.

  3. Step 3: Link the shipping page from the footer and from llms.txt

    Agents follow links. A footer link and an entry in llms.txt give them two short routes. See how to add llms.txt to Shopify or WooCommerce.

Describe the policy in structured data

Search engines and AI tools that read structured data get the same facts in a fixed shape. Google's guidance: put one store-wide shipping policy under your Organization (an OnlineStore for a store) on the page that describes it, and only add shippingDetails to a product's offer when that product ships differently.

  1. Step 1: Add the store-wide policy to your shipping page

    Each ShippingConditions entry needs a destination, a rate and a transit time. Free delivery is a rate of 0. If more than one condition applies, Google uses the lowest cost. Replace the example values with your own.

    JSON-LD: store-wide shipping policy
    <script type="application/ld+json">
    {
      "@context": "https://schema.org",
      "@type": "OnlineStore",
      "@id": "https://example.com/#store",
      "name": "Example Outdoor Co.",
      "url": "https://example.com/",
      "hasShippingService": {
        "@type": "ShippingService",
        "@id": "https://example.com/policies/shipping-policy#standard",
        "name": "Standard delivery to Canada and the US",
        "fulfillmentType": "FulfillmentTypeDelivery",
        "handlingTime": {
          "@type": "ServicePeriod",
          "duration": { "@type": "QuantitativeValue", "minValue": 0, "maxValue": 1, "unitCode": "DAY" }
        },
        "shippingConditions": [
          {
            "@type": "ShippingConditions",
            "shippingDestination": [
              { "@type": "DefinedRegion", "addressCountry": "CA" },
              { "@type": "DefinedRegion", "addressCountry": "US" }
            ],
            "orderValue": { "@type": "MonetaryAmount", "minValue": 0, "maxValue": 99.99, "currency": "CAD" },
            "shippingRate": { "@type": "MonetaryAmount", "value": 9.95, "currency": "CAD" },
            "transitTime": {
              "@type": "ServicePeriod",
              "duration": { "@type": "QuantitativeValue", "minValue": 2, "maxValue": 5, "unitCode": "DAY" }
            }
          },
          {
            "@type": "ShippingConditions",
            "shippingDestination": [
              { "@type": "DefinedRegion", "addressCountry": "CA" },
              { "@type": "DefinedRegion", "addressCountry": "US" }
            ],
            "orderValue": { "@type": "MonetaryAmount", "minValue": 100, "currency": "CAD" },
            "shippingRate": { "@type": "MonetaryAmount", "value": 0, "currency": "CAD" },
            "transitTime": {
              "@type": "ServicePeriod",
              "duration": { "@type": "QuantitativeValue", "minValue": 2, "maxValue": 5, "unitCode": "DAY" }
            }
          }
        ]
      }
    }
    </script>
  2. Step 2: Point product offers to it only when needed

    To reference the store-wide policy from a product's offer, Google asks for hasShippingService with only the @id.

    JSON-LD: an offer that references the store policy
    "shippingDetails": {
      "@type": "OfferShippingDetails",
      "hasShippingService": {
        "@id": "https://example.com/policies/shipping-policy#standard"
      }
    }
  3. Step 3: On WooCommerce, add the reference with a filter

    WooCommerce core outputs a product offer but no shipping details. Its woocommerce_structured_data_product_offer filter lets you add them.

    PHP: functions.php or a small plugin
    add_filter( 'woocommerce_structured_data_product_offer', function ( $offer, $product ) {
    	$offer['shippingDetails'] = array(
    		'@type'              => 'OfferShippingDetails',
    		'hasShippingService' => array( '@id' => home_url( '/shipping/#standard' ) ),
    	);
    	return $offer;
    }, 10, 2 );
  4. Step 4: Test it

    Run the shipping page and one product page through Google's Rich Results Test. Search Console's Shipping and returns settings take precedence over markup, so make sure they match.

On Shopify, the theme's {{ product | structured_data }} output has no shipping details, so add the store-wide JSON-LD to your shipping policy page through the theme, with your rates written in. Check that the numbers match Settings, then Shipping and delivery. More on Aiscovery for Shopify stores.

Check that an agent can answer it

Ask the question the way a shopper would: what does delivery to my country cost for this product, and when would it arrive? Then try to answer it yourself from public pages only, without adding to cart. If you can't, an agent can't either.

Finding delivery and returns is one of the key shopping tasks in Aiscovery's AI agent test runs: named AI agents try it on your store in a read-only browser, and the step log and screenshots show where they found the answer or gave up. See the product tour.

Keep going

Questions store owners ask

Why don't AI agents just go to checkout to see the delivery cost?

Checkout needs an address and form submissions, and agents are built to ask the person before they submit forms. Google's Gemini, for example, asks for confirmation before submitting web forms. Aiscovery's agents stop before cart and checkout by design.

Do I need shippingDetails on every product?

No. Google recommends one store-wide shipping policy under your Organization, and offer-level shippingDetails only for products whose shipping differs.

My rates depend on weight. Can I still mark them up?

Yes. Google's ShippingConditions supports weight, order value and number of items, and uses the lowest cost when several conditions apply. On the page itself, give the rate for typical orders and link the full table.

Does Shopify add shipping structured data for me?

Not through the structured_data filter that themes such as Dawn and Horizon use: it outputs products, variants and offers without shipping details.

Where else does a missing shipping policy hurt?

Shopify lists shop policy completeness, including shipping, returns and refunds, among the listing quality signals for its agentic storefronts.

Sources

Every technical claim on this page comes from the vendor's own documentation, checked on the date shown as Updated. Crawler names and settings change, so check the source before you edit a live store.

  1. 01More ways to share your shipping and returns policies with GoogleGoogle Search Central Blog
  2. 02Merchant shipping policy (ShippingService) structured dataGoogle Search Central
  3. 03Merchant listing (Product, Offer) structured dataGoogle Search Central
  4. 04Manage your tasks and workflows in Gemini AppsGemini Apps Help
  5. 05structured_data filterShopify.dev
  6. 06Managing agentic storefrontsShopify Help Center
  7. 07class-wc-structured-data.phpWooCommerce on GitHub

See what AI agents do in your store.

A short call: we run the site check on your store, show what robots.txt tells each AI crawler, and walk through a test run where named AI agents try key shopping tasks.

Have a real workflow to test now? Apply as a launch partner

We only use this to arrange your demo. Privacy notice