OfferShippingDetails Schema Generator
Mark up your shipping rates, free shipping threshold and delivery times so Google can show them.
Your details
Your shipping policy markup
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Harbour & Co",
"url": "https://example.com",
"hasShippingService": {
"@type": "ShippingService",
"@id": "https://example.com/policies/shipping-policy#shipping-policy",
"name": "Standard shipping",
"handlingTime": {
"@type": "ServicePeriod",
"cutoffTime": "14:00:00-05:00",
"businessDays": [
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday"
],
"duration": {
"@type": "QuantitativeValue",
"minValue": 0,
"maxValue": 1,
"unitCode": "DAY"
}
},
"shippingConditions": [
{
"@type": "ShippingConditions",
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "US"
},
"orderValue": {
"@type": "MonetaryAmount",
"minValue": 0,
"maxValue": 49.99,
"currency": "USD"
},
"shippingRate": {
"@type": "MonetaryAmount",
"value": 5.95,
"currency": "USD"
},
"transitTime": {
"@type": "ServicePeriod",
"duration": {
"@type": "QuantitativeValue",
"minValue": 2,
"maxValue": 5,
"unitCode": "DAY"
}
}
},
{
"@type": "ShippingConditions",
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "US"
},
"orderValue": {
"@type": "MonetaryAmount",
"minValue": 50,
"currency": "USD"
},
"shippingRate": {
"@type": "MonetaryAmount",
"value": 0,
"currency": "USD"
},
"transitTime": {
"@type": "ServicePeriod",
"duration": {
"@type": "QuantitativeValue",
"minValue": 2,
"maxValue": 5,
"unitCode": "DAY"
}
}
}
]
}
}
</script>Put this on your shipping policy page. Product markup can then point at it with its @id. Settings in Merchant Center or Search Console override this markup.
ShippingService vs OfferShippingDetails
Google accepts a store-wide shipping policy (ShippingService under your Organization, via hasShippingService) and a product-level override (OfferShippingDetails under an Offer, via shippingDetails). Google recommends the store-wide version and only overriding products that ship differently.
- Store-wide supports conditions: order value ranges (free shipping over a threshold), weight, number of items, destinations, cutoff time and business days.
- Product-level supports a subset: one rate, destinations, and handling and transit times in days. It can't express a free shipping threshold.
- A product can point at the store-wide policy by
@idinstead of repeating it:"shippingDetails": { "@type": "OfferShippingDetails", "hasShippingService": { "@id": "…#shipping-policy" } }.
How the default example works
Standard shipping, free over $50
- Orders from $0 to $49.99
- $5.95
- Orders of $50 or more
- $0.00
- Handling
- 0 to 1 day, Monday to Friday, cutoff 14:00 (UTC−05:00)
- Transit
- 2 to 5 days
Two ShippingConditions with orderValue ranges. If more than one condition applies, Google uses the cheapest rate and shows its delivery time.
Handling time is how long you take to dispatch. Transit time is how long the carrier takes. Google adds them to estimate delivery.
Adding it to Shopify or WooCommerce
- 01
Match your real rates
On Shopify, check Settings → Shipping and delivery. On WooCommerce, check WooCommerce → Settings → Shipping. The markup must match what checkout charges.
- 02
Place the store-wide markup
Put it on your shipping policy page (Shopify: Online Store → Themes → … → Edit code; WooCommerce: a Custom HTML block or a snippet in
wp_head). - 03
Add product overrides
Paste the
shippingDetailsproperty into the Offer of products with special shipping, like oversized items.
Merchant Center and Search Console shipping settings override this markup, so keep them consistent.
Questions people ask
Can I show free shipping over a certain order value?
Yes, with the store-wide policy. Pick “Flat rate, free over an order value” and the tool writes two conditions with order value ranges.
Which countries and regions are supported?
Destinations use two-letter country codes. Google only supports state-level regions for the US, Australia and Japan, and postal codes for Australia, Canada and the US.
Does the shipping currency need to match the product price?
Yes. For product-level markup, Google requires the shipping rate currency to match the offer's currency.
What does the cutoff time do?
Orders after the cutoff are treated as received the next business day, which adds a day to the delivery estimate.
Related tools
Last reviewed 30 September 2026.
Sources: Google Search Central: Merchant shipping policy structured data · Google Search Central: Merchant listing structured data
