OfferShippingDetails Schema Generator

Mark up your shipping rates, free shipping threshold and delivery times so Google can show them.

Describe the result you need. AI will set up the tool and ask for any missing details.

Configure with AI

Enter to submit · Shift + Enter for a new line

Sent to AI. Leave out passwords and private customer data.

Your details

Where it goes

Used for the service's @id.

Rates

Two-letter ISO country codes.

Delivery times

Orders after this ship the next business day. Leave blank to skip.

Your shipping policy markup

shipping-policy-schema.html
<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 @id instead 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

  1. 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.

  2. 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).

  3. 03

    Add product overrides

    Paste the shippingDetails property 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.

Want this builtinto your store?

I'm Emmanuel, a Shopify and WooCommerce developer. If this tool pointed at something you'd rather have fixed for you (a faster store, cleaner product data, a migration, a custom feature), send me a note.

Emmanuel Asika

Emmanuel Asika

Shopify & WooCommerce developer, Dublin

I build and fix online stores: new builds, migrations, speed, SEO and the custom bits apps can't do.

hello@emmanuelasika.com