JSON-LD Structured Data (EN)
How JSON-LD structured data (schema.org) works on product pages
JSON-LD Structured Data
What is JSON-LD?
JSON-LD is a data format for communicating page content to search engines in a machine-readable way. Separately from the visual HTML, it conveys meaning like “this page is a product page”, “this is the price”, and “this is the availability status”.
The shared vocabulary used for this is schema.org.
schema.org defines types like Product, Article, and BreadcrumbList, which search engines like Google read to understand page content.
From an SEO perspective, adding JSON-LD can:
- Help Google understand product pages as product listings
- Enable price and availability to appear as product snippets in search results
- Reflect breadcrumb navigation in search results
- Help article pages be recognized as Article content
In practice, JSON-LD is embedded in HTML like this:
<script type="application/ld+json">
{ ...JSON data... }
</script>
This is not displayed on the page. It’s “description data” for search engines, not for users.
JSON-LD Types Used on This Site
Takazudo Modular uses four main types:
| Type | Target Pages | Main Content |
|---|---|---|
Product | Product detail pages | Name, price, availability, image, brand, shipping, return policy |
ItemList | Product listing page | Product list (position, name, URL, image) |
BreadcrumbList | All pages | Breadcrumb navigation hierarchy |
Article | Article and guide pages | Title, description, publish date, author |
Product JSON-LD Details
Product is the most important type on this site.
It tells Google “this page is a product page with sales information”.
Basic Fields
| Field | Content |
|---|---|
name | Product name |
url | Canonical product page URL |
description | Product description (optional) |
image | Product image URL (/images/p/{slug}/1200w.webp) |
brand | Brand name (Brand type) |
Images are converted to absolute URLs even when passed as relative paths.
Offers
For products with a price, an offers block is output.
This is especially important for “price” and “availability” in search results.
The offers block is only output when price exists.
Products without a price will not have offers at all.
Availability Mapping
Availability is derived from mercariStatus:
mercariStatus | Output availability | Meaning |
|---|---|---|
| Not set / other | https://schema.org/InStock | In stock |
sold | https://schema.org/OutOfStock | Sold out |
discontinued | https://schema.org/OutOfStock | Discontinued |
unavailable | https://schema.org/OutOfStock | Unavailable |
incoming | https://schema.org/PreOrder | Coming soon / pre-order |
Seller
The seller is fixed as Takazudo Modular.
Shipping Details
Shipping information is output for domestic Japan delivery:
| Item | Value |
|---|---|
| Destination country | JP |
| Shipping rate | 0 JPY (included in product price) |
| Handling time | 1-3 business days |
| Transit time | 1-3 business days |
For PreOrder (pre-order) items, the entire shippingDetails block is omitted.
Pre-order items are not ready to ship yet, so including delivery timeframes would be inaccurate. Google’s structured data spec also requires deliveryTime whenever shippingDetails is present, so omitting the whole block is the correct way to signal “not yet shippable” — availability: PreOrder already conveys that to consumers.
Return Policy
The return policy is “no returns”:
{
"@type": "MerchantReturnPolicy",
"applicableCountry": "JP",
"returnPolicyCategory": "https://schema.org/MerchantReturnNotPermitted"
}
Output Example
Here is a realistic Product JSON-LD output example from this site:
{
"@context": "https://schema.org",
"@type": "Product",
"name": "ADDAC107 T-Networks",
"url": "https://takazudomodular.com/products/addac107-t-networks-intro/",
"description": "ADDAC107 T-Networks is a Eurorack module featuring 3 twin-peak filters.",
"image": "https://takazudomodular.com/images/p/addac107/1200w.webp",
"brand": {
"@type": "Brand",
"name": "ADDAC System"
},
"offers": {
"@type": "Offer",
"price": 27800,
"priceCurrency": "JPY",
"availability": "https://schema.org/InStock",
"seller": {
"@type": "Organization",
"name": "Takazudo Modular"
},
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "JP"
},
"shippingRate": {
"@type": "MonetaryAmount",
"value": 0,
"currency": "JPY"
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 1,
"maxValue": 3,
"unitCode": "DAY"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 1,
"maxValue": 3,
"unitCode": "DAY"
}
}
},
"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "JP",
"returnPolicyCategory": "https://schema.org/MerchantReturnNotPermitted"
}
}
}
For pre-order items (incoming), availability becomes PreOrder and the entire shippingDetails block is omitted.
ItemList
ItemList is used on the product listing page.
It tells search engines “this page contains multiple products in an ordered list”.
Each product includes:
| Field | Content |
|---|---|
position | Order in the list |
name | Product name |
url | Product detail page URL |
image | OGP image URL |
Only products with a detailHref are included.
BreadcrumbList
BreadcrumbList is structured data for breadcrumb navigation.
It communicates page hierarchy to search engines.
Example hierarchy for product pages:
- Home
- Brands
- Brand name
- Product name
For regular article pages, breadcrumbs are auto-generated by the component, with categories included as needed.
Article
Article is used for article and guide pages.
| Field | Content |
|---|---|
headline | Article title |
description | Article description |
image | OGP / hero image |
datePublished | Publish date |
dateModified | Last modified date |
author | Takazudo |
publisher | Takazudo Modular |
The schemaType defaults to Article but can also be set to WebPage or AboutPage.
How to Verify
Google Rich Results Test
Enter a URL in the Rich Results Test to check:
- Whether JSON-LD is correctly parsed
- Whether the page is recognized as a
Product - Whether price, availability, and image have no errors
- Whether any required fields are missing
Google Search Console
Search Console shows how Google actually interprets your structured data:
- Whether product pages are recognized as rich result candidates
- Whether there are any errors or warnings
- Whether structured data is correctly ingested after crawling
The recommended approach: first verify individual pages with Rich Results Test, then check site-wide status in Search Console.
Component Files
| File | Purpose |
|---|---|
src/astro/components/shared/product-json-ld.astro | Product structured data |
src/astro/components/shared/product-list-json-ld.astro | ItemList structured data |
src/astro/components/shared/breadcrumb-json-ld.astro | BreadcrumbList structured data |
src/astro/components/shared/article-json-ld.astro | Article structured data |
Calling pages:
| File | Purpose |
|---|---|
src/astro/pages/products/[slug].astro | Product detail page (JA) |
src/astro/pages/en/products/[slug].astro | Product detail page (EN) |
src/astro/pages/products/index.astro | Product listing page |
src/astro/pages/notes/[slug].astro | Article page |
Summary
- JSON-LD is “description data for search engines”
- Invisible on-page but important for SEO
Productis the most important type for product pages- Price, availability, shipping, and return policy are explicitly declared
- Availability is automatically mapped from
mercariStatus - Pre-order items intentionally omit delivery timeframes
- Use Rich Results Test and Search Console to verify