schema markup generator.
product, breadcrumb, faq, onlinestore & website json-ld, combined into one @graph
> json-ld preview
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Product",
"name": "ACME Trail Runner Pro",
"description": "Lightweight trail running shoes with a Vibram outsole and breathable engineered mesh upper. Waterproof tongue, 4mm drop, 280g per shoe.",
"sku": "ACME-TR-PRO-42",
"brand": {
"@type": "Brand",
"name": "ACME Outdoor"
},
"gtin": "0812345678901",
"mpn": "TRP-2025-42",
"image": "https://acmeoutdoor.com/cdn/products/trail-runner-pro-1200.jpg",
"category": "Apparel > Shoes > Running Shoes",
"offers": {
"@type": "Offer",
"price": "149.00",
"priceCurrency": "USD",
"availability": "https://schema.org/InStock",
"itemCondition": "https://schema.org/NewCondition",
"url": "https://acmeoutdoor.com/products/trail-runner-pro?variant=42",
"priceValidUntil": "2026-12-31",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": "0.00",
"currency": "USD"
},
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "US"
}
},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "US",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
}
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://acmeoutdoor.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Trail Running",
"item": "https://acmeoutdoor.com/collections/trail-running"
},
{
"@type": "ListItem",
"position": 3,
"name": "Shoes",
"item": "https://acmeoutdoor.com/collections/trail-running-shoes"
},
{
"@type": "ListItem",
"position": 4,
"name": "Trail Runner Pro",
"item": "https://acmeoutdoor.com/products/trail-runner-pro"
}
]
}
]
}
</script>> worked example
A Shopify merchant generates structured data for a trail-running shoe PDP. They toggle on Product, BreadcrumbList, and FAQPage, edit the four-level breadcrumb trail (Home → Trail Running → Shoes → Trail Runner Pro) and three shipping / returns / sizing FAQs. The Product block includes SKU, GTIN, MPN, brand, price, currency, availability, shipping details, and a 30-day MerchantReturnPolicy. All three types render as a single @graph JSON-LD block wrapped in a <script> tag, ready to paste into the theme.liquid file.
takeaway, A single @graph output, rather than three separate JSON-LD blocks, keeps the document head clean and lets Google parse the relationships between types in one pass.
> when operators reach for this
- Shopify merchants adding Product + BreadcrumbList + FAQPage to every PDP to qualify for Google rich results.
- WooCommerce SEO leads combining OnlineStore + WebSite schema on the homepage to enable the sitelinks search box.
- Agencies building structured-data templates for a client site migration, copy-paste markup with the right fields for every page template.
- Ecommerce developers generating JSON-LD to feed into Next.js / Remix server components without hand-writing the types.
- Headless commerce teams prototyping schema for a new catalogue before wiring it into the CMS pipeline.
- Brands preparing for AI shopping assistants, using MerchantReturnPolicy and shippingDetails to make offer terms machine-readable for ChatGPT and Perplexity.
> the calculation
- product fields
name · description · sku · brand · gtin · image · offers.price · offers.priceCurrency · offers.availability - offer extensions
shippingDetails (cost, destination) + hasMerchantReturnPolicy (days, fees, method) - breadcrumb list
ordered ListItems, position 1 = Home, last = current page - faq page
Question → acceptedAnswer.text pairs · each answer ≤ 500 chars for rich results - onlinestore
OnlineStore subtype of Organization, add areaServed, paymentAccepted, hasMerchantReturnPolicy - website + searchaction
enables the Google sitelinks search box on brand SERPs - @graph wrapping
multiple @types share one @context when wrapped in a single @graph array
> related calculators, seo & metadata
- slug generatorany text → clean url-safe slug, ecommerce-tuned
- meta description testerchar + pixel width check with ecommerce serp preview
- title tag tester60-char limit, pixel width, product serp preview
- og image testerpaste url → preview how the page renders on social
- robots.txt generatorshopify / woocommerce presets with sitemap + crawl-delay