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.
Why many product pages underperform
Pain points we solve
- 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
Solution
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 freeShippingThreshold and shippingLabel for merchandising, producing clean, copy‑ready JSON‑LD attached under Offer.shippingDetails.
How it works
How it works
- Select Offer (or Product > Offer) in the generator.
- Add shippingDestination (country, and optional region or postal ranges).
- Set shippingRate (value + currency) and any freeShippingThreshold.
- Provide deliveryTime with handling and transit ranges in days (unitCode=DAY).
- 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.
- freeShippingThreshold(MonetaryAmount): Order value that unlocks free shipping.
- 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 shippingRateand optionalfreeShippingThreshold.
- 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: Pair freeShippingThresholdwith clear on-page messaging.
- 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: add freeShippingThresholdMonetaryAmount and reflect policy in page content.
- Incorrect nesting: ensure the object sits under Offer.shippingDetails.
On-page parity checklist
- Shipping table on-page matches each shippingLabel,shippingRate, andfreeShippingThreshold.
- 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=DAYfreeShippingThreshold.valuefreeShippingThreshold.currencyshippingLabel
{
"@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"
}
}
}
}