Checkout Experience Stack
Checkout pages with delivery/returns policies, FAQs, and breadcrumb context to reduce friction.
When to use this stack
- Checkout or payment pages needing structured delivery/returns info
- Flows where FAQs address payment, shipping, and returns
- Pages that benefit from breadcrumb clarity in multi-step checkout
What is included
Identifies the page as a checkout step.
Clarifies delivery regions, handling/transit times, and rates.
Defines returns window, method, and fees.
Answers payment, shipping, returns, and security questions.
Provides navigation/step context.
Properties across the bundle
Nested properties keep their parent path, such as offers.priceCurrency. Only publish values that match visible page content.
Required properties
- deliveryTime.transitTime
- itemListElement[].name
- mainEntity[].@type=Question
- mainEntity[].acceptedAnswer.text
- name
- returnFees
- returnMethod
- returnPolicyCategory
- shippingDestination.addressCountry
- shippingRate.currency
- url
Recommended properties
- applicableCountry
- deliveryTime.businessDays
- deliveryTime.handlingTime
- description
- inStoreReturnsOffered
- itemListElement[].item
- mainEntity[].acceptedAnswer.text
- mainEntity[].author.name
- mainEntity[].name
- merchantReturnDays
- restockingFee
- shippingDestination.addressRegion
- shippingRate.value
- url
Combined JSON-LD
Paste this as one script tag, then replace every example value with data from the live page.
[
{
"@context": "https://schema.org",
"@type": "CheckoutPage",
"@id": "https://www.example.com/checkout#page",
"name": "Checkout — Payment",
"url": "https://www.example.com/checkout"
},
{
"@context": "https://schema.org",
"@type": "OfferShippingDetails",
"shippingDestination": { "@type": "DefinedRegion", "addressCountry": "US" },
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": { "@type": "QuantitativeValue", "minValue": 0, "maxValue": 1, "unitCode": "d" },
"transitTime": { "@type": "QuantitativeValue", "minValue": 2, "maxValue": 5, "unitCode": "d" }
},
"shippingRate": { "@type": "MonetaryAmount", "value": "0.00", "currency": "USD" }
},
{
"@context": "https://schema.org",
"@type": "MerchantReturnPolicy",
"@id": "https://www.example.com/policies/returns#policy",
"name": "Standard returns",
"url": "https://www.example.com/policies/returns",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn",
"applicableCountry": "US"
},
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{ "@type": "Question", "name": "Which payment methods are accepted?", "acceptedAnswer": { "@type": "Answer", "text": "We accept major credit cards, PayPal, and ShopPay." } },
{ "@type": "Question", "name": "How long does shipping take?", "acceptedAnswer": { "@type": "Answer", "text": "Standard shipping arrives in 3-5 business days; expedited options at checkout." } },
{ "@type": "Question", "name": "What is the return policy?", "acceptedAnswer": { "@type": "Answer", "text": "30-day free returns on unused items. Start a return from your account." } }
]
},
{
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Cart", "item": "https://www.example.com/cart" },
{ "@type": "ListItem", "position": 2, "name": "Checkout", "item": "https://www.example.com/checkout" }
]
}
]Implement and verify
- 01
Start with the live page
Confirm titles, prices, availability, policies, and visible FAQ content before generating markup.
- 02
Add one JSON-LD script
Use the combined example as a template in the document head or before the closing body tag.
- 03
Complete regional details
Fill shipping destinations and timing for every region the page actually serves.
- 04
Link the return policy
Use a stable MerchantReturnPolicy URL and keep its terms synchronized with the page.
- 05
Match visible answers
Add only FAQs that users can read on the same page, with identical answers.
- 06
Validate after changes
Run Rich Results Test after implementation and whenever price, availability, or policy data changes.
Common errors and fixes
- Missing currency or availability
Use ISO currency codes and complete schema.org availability URLs in Offer data.
- Incomplete shipping details
Include shippingDestination.addressCountry and deliveryTime.transitTime with units.
- Return policy is not connected
Reference MerchantReturnPolicy from the Offer and provide a stable public policy URL.
- FAQ answers differ from the page
Keep structured FAQ answers identical to visible answers.
Stack FAQs
Should I include product-level data?
Optional. Keep checkout JSON-LD focused on the flow; product data belongs on product pages.
How do I localize shipping/returns?
Add multiple OfferShippingDetails per region and set MerchantReturnPolicy applicableCountry accordingly.