Offer Shipping Details — Clarify Regions, Rates, and Timing
Generate valid OfferShippingDetails JSON‑LD for product offers. Describe regions, rates, handling/transit times, and thresholds to set clear delivery expectations.
Add Shipping Details to an OfferWhy many product pages underperform
- Shoppers can’t see accurate shipping costs by region.
- No handling/transit breakdown, leading to missed delivery expectations.
- Free‑shipping policies are unclear or inconsistently modeled.
- Multiple regions and rates are mixed together in one block of JSON.
How SwiftSchema helps
The generator guides you to add one OfferShippingDetails object per region/policy, with region targeting (DefinedRegion), a clear shippingRate, and deliveryTime as handling and transit ranges in days.
It supports shippingLabel for merchandising and a rate of 0 for free shipping, producing clean, copy‑ready JSON‑LD attached under Offer.shippingDetails.
How it works
- 01
Select Offer (or Product > Offer) in the generator.
- 02
Add shippingDestination (country, and optional region or postal ranges).
- 03
Set shippingRate (value + currency); use 0 for free shipping.
- 04
Provide deliveryTime with handling and transit ranges in days (unitCode=DAY).
- 05
Copy JSON or Script and paste into the product offer. Validate in the Rich Results Test.
What is OfferShippingDetails structured data?
OfferShippingDetails describes shipping regions, rates, and delivery timing for an Offer. Use one object per region or policy to keep options clear and maintainable across your catalog.
Eligibility & Status
This type supports clarity and consistency for commerce but isn't a standalone rich result. Correct modeling helps Product/Offer eligibility and user expectations.
Why shipping markup matters
- Clarity at scale: Customers see accurate costs and timelines per region, reducing checkout friction.
- Policy enforcement: Structured delivery times ensure your on-page messaging mirrors logistics data.
- Automation: Region-specific objects let teams update shipping policies without touching every product page.
- Merchandising: Free-shipping thresholds and labels can be surfaced consistently in feeds.
Essential properties to include
shippingDestination(DefinedRegion): Always setaddressCountry; addaddressRegion/postalCodeRangewhen needed.shippingRate(MonetaryAmount): Providevalue+currency; set to 0 for free tiers.deliveryTime(ShippingDeliveryTime): IncludehandlingTimeandtransitTimeQuantitativeValues with min/max andunitCode=DAY.- Free shipping: set
shippingRate.valueto0. OfferShippingDetails has no threshold property; order-value rules belong in Organization-level shipping policy markup (ShippingConditionswithorderValue). shippingLabel: Text label to identify each shipping method.
Preparing shipping data before generating schema
- Audit policies: Gather current rates, zones, and SLA windows from logistics.
- Segment regions: Decide how granular you need (country, state, postal range).
- Confirm currencies: Ensure rates use valid ISO currency codes.
- Document thresholds: Capture free-shipping minimums or promotional rules.
- Plan labels: Align labels (Standard, Express) with storefront messaging.
- Sync with ops: Establish who updates schema when fulfillment rules change.
Implementation workflow inside SwiftSchema
- Select Offer (or Product > Offer) in the generator.
- Add
shippingDestinationfor the region this policy covers. - Set
shippingRate(use0for free shipping). - Provide
deliveryTimewith handling/transit ranges (unitCode=DAY). - Add
shippingLabelor notes for each method. - Repeat per region/policy and attach each object under
Offer.shippingDetails. - Validate via the Rich Results Test.
Troubleshooting & QA
- Missing units: Always specify
unitCode=DAY(or other ISO codes). - Mixed regions: Keep one object per region/postal range.
- Threshold confusion: State any free-shipping minimum clearly on the page; describe it in Organization-level
ShippingConditions(orderValue) rather than on the offer. - Incorrect nesting: Place objects under
Offer.shippingDetails, not directly on Product. - Stale data: Update schema when rates or transit windows change; scripts can compare schema to logistics tables.
Maintenance and governance
- Update shipping entries whenever logistics teams adjust policies.
- Audit quarterly to ensure schema matches storefront shipping tables and merchant feeds.
- Coordinate promotions—when running free shipping, adjust thresholds and revert afterward.
- Keep
lastReviewedmetadata current and note ownership for shipping schema updates.
Common Errors & Fixes
- Missing units: add
unitCode=DAYfor handling/transit time ranges. - Mixed regions: provide separate objects per region or postal range.
- Unclear free shipping: set
shippingRate.valueto0where shipping is free, and state any minimum order value on the page. - Incorrect nesting: ensure the object sits under
Offer.shippingDetails.
On-page parity checklist
- Shipping table on-page matches each
shippingLabelandshippingRate. - Regions shown to shoppers align with
shippingDestination(country/region/postal ranges). - Handling/transit times displayed match
deliveryTimeranges; units are clear (days). - When shipping is free over a threshold, the same threshold is stated in copy and applied at checkout.
- Only shipping methods you actually offer on-page are present in schema.
Content depth (avoid thin policy pages)
- Describe carriers/methods (Standard via USPS/UPS, Express, Same-day) and cutoff times.
- Explain exclusions (PO boxes, territories) and surcharges (oversize, hazardous).
- Provide packaging or sustainability notes (recyclable, minimal packaging) if relevant.
- Link to your returns policy and clarify how shipping fees are handled on returns.
Modeling multiple methods and carriers
- Use separate OfferShippingDetails objects for Standard vs. Express; include distinct
shippingLabelvalues. - For multi-country catalogs, localize currency/thresholds and keep per-country objects scoped via
addressCountry. - If transit times differ by carrier, reflect the longest/most conservative window unless you can route by carrier on-page too.
QA and governance
- Centralize shipping rules in a single data source that feeds both storefront and schema to prevent drift.
- Add automated checks to compare rendered shipping tables to JSON-LD values before deployment.
- Revalidate after promotions (free shipping weekends) and roll back thresholds when promos end.
- Audit quarterly to retire outdated regions, expired thresholds, or deprecated carriers.
- Keep
lastReviewedupdated after each logistics change and note the owner (ops/merchandising) responsible for shipping schema. - When adding new carriers or service levels, document cutoff times and weekend/holiday behavior so
deliveryTimeremains accurate. - If you surface ETA badges on PDPs, ensure they use the same handling/transit ranges as
deliveryTimeso customers see consistent promises. - Document blackout regions (e.g., PO boxes, remote territories) in content and match them to
shippingDestinationexclusions.
Required properties
shippingDestination.addressCountryshippingRate.valueshippingRate.currency
Recommended properties
shippingDestination.addressRegionshippingDestination.postalCodeRangeshippingRate.valueshippingRate.currencydeliveryTime.handlingTime.minValuedeliveryTime.handlingTime.maxValuedeliveryTime.handlingTime.unitCode=DAYdeliveryTime.transitTime.minValuedeliveryTime.transitTime.maxValuedeliveryTime.transitTime.unitCode=DAYshippingLabel
{
"@context": "https://schema.org",
"@type": "Offer",
"price": 9.99,
"priceCurrency": "USD",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "US"
},
"shippingRate": {
"@type": "MonetaryAmount",
"value": 3.49,
"currency": "USD"
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 1,
"maxValue": 2,
"unitCode": "DAY"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 3,
"maxValue": 5,
"unitCode": "DAY"
}
}
}
}FAQs
Where do I put it?ShowHide
Attach under Offer.shippingDetails. Include one object per shipping region or policy, and duplicate for each distinct rate/threshold.
Handling vs transit time?ShowHide
Handling is prep time before shipment; transit is carrier time after dispatch. Use QuantitativeValue in days for both.
How do I represent free shipping?ShowHide
Set shippingRate.value to 0, as Google's merchant listing docs show. OfferShippingDetails has no free-shipping threshold property; if free shipping depends on order value, state the minimum on the page and use Organization-level shipping policy markup (ShippingConditions with orderValue).
Can I target specific regions or postal codes?ShowHide
Use DefinedRegion with addressCountry and optional addressRegion or postalCodeRange to narrow eligibility.
Do times need units?ShowHide
Yes. Provide unitCode=DAY for handlingTime and transitTime ranges to avoid ambiguity.