# OfferShippingDetails: Shipping Costs in Schema.org Markup

> What OfferShippingDetails is, what Google asks for to show shipping cost and delivery time, when to use it versus a store-wide policy and how to check it.

URL: https://clione.ai/glossary/offershippingdetails/
Lang: en

Before buying, almost everyone looks for the same thing: what shipping costs and when it arrives. OfferShippingDetails is how you tell a search engine, in the [structured data](/glossary/structured-data/) of your [product page](/glossary/product-page/), with numbers and not with phrases like "fast shipping". It is a [Schema.org](/glossary/schema-org/) type, and it is written the same way in every language because it is a name from the vocabulary. **It describes the shipping of one specific offer, not the shipping policy of the whole store**, which has its own place in the markup. It matters to you because, according to Google, with it people can see the shipping cost and the estimated delivery time based on where they are and on your shipping policy.[^google-merchant-listing]

## How it works

Schema.org defines OfferShippingDetails as the information about shipping destinations, and explains that several are used at once: one for each zone with a different rate, or two for the same destination that differ only in price and delivery time, a cheaper, slower one and a pricier, faster one.[^schema-org-osd] It goes inside the offer, the [Offer](/glossary/offer-schema/) type, with the `shippingDetails` property. Its main properties are the destination (`shippingDestination`), the cost (`shippingRate`), the total time from receiving the order until it reaches the customer (`deliveryTime`) and `doesNotShip`, to say that you do not ship to a destination; it also accepts the shipping origin and the item's weight and dimensions.[^schema-org-osd]

Google uses it in [merchant listings](/glossary/merchant-listings/). It is not required, but if you add it and want your shipping to be eligible to show, it asks for three things:[^google-merchant-listing]

| Property              | What Google asks for                                                                                                                                                                                                                      |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `shippingDestination` | The destination country as a two-letter code, such as `US`                                                                                                                                                                                |
| `shippingRate`        | The cost, with `value` or `maxValue`, and the currency as a three-letter code, which has to be the same as the offer's. Free shipping is `0`. Only one rate per OfferShippingDetails                                                      |
| `deliveryTime`        | Only one per shipment, with two parts: `handlingTime`, how long the order takes to leave the warehouse, and `transitTime`, how long it takes to arrive once it leaves. Each with a minimum and a maximum in whole days and the unit `DAY` |

If you offer several options to the same destination, such as standard and express shipping, Google asks for **one `shippingDetails` per option**, each with its own combination of cost and delivery time.[^google-merchant-listing]

Since November 12, 2025, Google also supports a store-wide shipping policy, and that changed the role of OfferShippingDetails.[^google-updates] The general policy is written with another type, ShippingService, inside the organization node with the `hasShippingService` property, and it can vary cost and delivery time by weight, order value, number of items or destination. Google recommends putting it on a single page of your site. **OfferShippingDetails is left for products that fall outside that policy**, and it supports fewer properties than the policy does.[^google-shipping-policy] The merchant listing documentation says the same: it recommends the general policy on the organization and using the offer's shipping only for exceptions or if you have no general policy.[^google-merchant-listing] An offer that follows the general policy can point to it with an OfferShippingDetails that carries only `hasShippingService` with the `@id` of that policy.[^google-merchant-listing]

As with returns, the markup is the weakest source. Google applies the Content API for Shopping first, then the shipping settings in [Google Merchant Center](/glossary/google-merchant-center/) or [Search Console](/glossary/google-search-console/), then the product markup and, last, the organization's.[^google-shipping-policy]

## In a store

**Made-up example.** An invented furniture store has its general shipping policy on the organization node. An oak table falls outside it: because of its size it travels with another carrier, costs more and takes longer. Its offer carries its own shipping to the United States:

| What the page says                     | Property                             | Value                                                                          |
| -------------------------------------- | ------------------------------------ | ------------------------------------------------------------------------------ |
| "Ships to the United States"           | `shippingDestination.addressCountry` | `US`                                                                           |
| "Shipping: $39"                        | `shippingRate`                       | `39`, `USD` |
| "Leaves the warehouse in 1 to 2 days"  | `handlingTime`                       | `1` to `2`, `DAY`                                                              |
| "Delivered 3 to 5 days after it ships" | `transitTime`                        | `3` to `5`, `DAY`                                                              |

```json
"offers": {
  "@type": "Offer",
  "price": "649.00",
  "priceCurrency": "USD",
  "shippingDetails": {
    "@type": "OfferShippingDetails",
    "shippingDestination": {
      "@type": "DefinedRegion",
      "addressCountry": "US"
    },
    "shippingRate": {
      "@type": "MonetaryAmount",
      "value": 39,
      "currency": "USD"
    },
    "deliveryTime": {
      "@type": "ShippingDeliveryTime",
      "handlingTime": { "@type": "QuantitativeValue", "minValue": 1, "maxValue": 2, "unitCode": "DAY" },
      "transitTime": { "@type": "QuantitativeValue", "minValue": 3, "maxValue": 5, "unitCode": "DAY" }
    }
  }
}
```

What to read in it. The shipping currency is the same as the price's, as Google asks.[^google-merchant-listing] The delivery time is not written as "4 to 7 days": it is split into what the store takes and what the carrier takes, and the total time is the sum of the two.[^schema-org-osd] And the rest of the catalog repeats none of this, because it follows the organization's general policy.[^google-shipping-policy]


Trying to mark a different shipping option for a region or a postal code in a country where Google does not accept it, such as a Canadian province or the Scottish Highlands. Schema.org allows it, but for a shipping destination Google **only accepts regions in the United States, Australia and Japan, and postal codes in Australia, Canada and the United States**.[^google-merchant-listing] Everywhere else, the destination Google understands is the whole country. If your rates change by zone, the page can explain it in text, and the shipping settings in Merchant Center are what rule over the markup.[^google-shipping-policy]


## How to check it

1. **Search a product page's source code for `shippingDetails`** and note the destination, the cost, the currency and the two delivery times.[^google-merchant-listing]
2. **Compare them with what the customer sees** on the page and in the cart for that destination, including the free-shipping threshold if you have one.
3. **Search for `hasShippingService` on your organization node.** If you have a general policy, the shipping on offers should appear only on products that fall outside it.[^google-shipping-policy]
4. **Check whether you have shipping set up in Merchant Center or Search Console.** If you do, those are what Google uses, ahead of your markup.[^google-shipping-policy]
5. **Run the URL through the [Rich Results Test](/glossary/rich-results-test/)** to see what it detects and with which errors or warnings.

## Related concept: ShippingService

ShippingService is the store's shipping policy; OfferShippingDetails is an offer's shipping. **The first is written once, on the organization, and can have conditions by weight, by amount or by destination; the second goes on the offer and serves the exception.**[^google-shipping-policy] ShippingService lives inside the [Organization](/glossary/organization-schema/) node, just like the general [return policy](/glossary/return-policy/), which in markup is [MerchantReturnPolicy](/glossary/merchantreturnpolicy/).

To go further, the [structured data reading path](/learn/structured-data/) orders the rest of the terms, and the [Offer](/glossary/offer-schema/) entry explains what else the offer that carries the shipping holds.
