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 the cost lives | What an agent reading public pages gets | Fix |
|---|---|---|
| Only in the checkout calculator | Nothing. It would have to start checkout and enter an address. | Publish the rate table on a shipping page |
| In a cart drawer estimate | Usually nothing. It appears after Add to cart. | Repeat the estimate on the product page |
| In a free delivery banner image | Nothing readable unless the alt text says it | Put the threshold in text, near the price |
| On a policy page, as an image or PDF | Little or nothing | An HTML table with countries, rates and times |
| In text on the product page and a shipping page | The cost, the threshold and the delivery time | Keep both in step when rates change |
Put the delivery cost where agents read
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>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.
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.
Step 1: Add the store-wide policy to your shipping page
Each
ShippingConditionsentry needs a destination, a rate and a transit time. Free delivery is a rate of0. 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>Step 2: Point product offers to it only when needed
To reference the store-wide policy from a product's offer, Google asks for
hasShippingServicewith only the@id.JSON-LD: an offer that references the store policy "shippingDetails": { "@type": "OfferShippingDetails", "hasShippingService": { "@id": "https://example.com/policies/shipping-policy#standard" } }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_offerfilter 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 );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.