How to Add Merchant listing (Product, Offer) structured data? Documents

When you add structured data for merchant listings to your page, your products become eligible to appear in enhanced experiences on Google Search, such as the shopping knowledge panel, Google Images, popular product results, and product snippets. Merchant listing structured data allows you to highlight specific product information like price, availability, shipping, and return policies.
How to Add Structured Data
Add the Required Properties
Insert the necessary properties (@context
, @type
, name
, image
, offers
) into your page. Depending on your format—JSON-LD, RDFa, or Microdata—you may embed the markup in the <head>
section or inline with your HTML.
Using a CMS?
If you’re on WordPress, Shopify, Wix, or another CMS, leverage a schema plugin that supports merchant listing structured data. Ensure it allows custom JSON-LD snippets.
Generate Structured Data Dynamically
For sites with frequently changing product data, you can generate JSON-LD with JavaScript. Be mindful of crawl delays; server-side rendering of structured data is preferred.
Validate Your Code
After adding markup, use Google’s Rich Results Test. Address all critical errors and consider resolving warnings to boost data quality.
Deploy and Test
- Ensure your pages aren’t blocked by
robots.txt
,noindex
, or authentication. - Use the URL Inspection Tool in Search Console to request recrawls.
Submit Your Sitemap
Automate this step via the Search Console Sitemap API to notify Google of new or updated pages.
Sample JSON-LD for a Product with Offer
htmlCopyEdit<html>
<head>
<title>Executive Anvil</title>
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "Product",
"name": "Executive Anvil",
"image": [
"https://kumarharshit.in/photos/1x1/photo.jpg",
"https://kumarharshit.in/photos/4x3/photo.jpg",
"https://kumarharshit.in/photos/16x9/photo.jpg"
],
"description": "Sleeker than ACME's Classic Anvil, the Executive Anvil is perfect for the business traveler.",
"sku": "0446310786",
"mpn": "925872",
"brand": {
"@type": "Brand",
"name": "ACME"
},
"review": {
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": 4,
"bestRating": 5
},
"author": {
"@type": "Person",
"name": "Fred Benson"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": 4.4,
"reviewCount": 89
},
"offers": {
"@type": "Offer",
"url": "https://kumarharshit.in/anvil",
"priceCurrency": "USD",
"price": 119.99,
"priceValidUntil": "2024-11-20",
"itemCondition": "https://schema.org/UsedCondition",
"availability": "https://schema.org/InStock"
}
}
</script>
</head>
<body>
</body>
</html>
Understanding Pricing Types in Structured Data
Google Search recognizes multiple ways to present price information in your markup. Choose the pattern that best suits your selling strategy:
Active Price
The current selling price.
jsonCopyEdit"offers": {
"@type": "Offer",
"price": 10.00,
"priceCurrency": "USD"
}
Strikethrough Price (Sale Pricing)
To highlight a sale, supply two UnitPriceSpecification
entries—one for the sale price, one for the original price marked as strikethrough.
jsonCopyEdit"offers": {
"@type": "Offer",
"priceSpecification": [
{
"@type": "UnitPriceSpecification",
"price": 10.00,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"priceType": "https://schema.org/StrikethroughPrice",
"price": 15.00,
"priceCurrency": "USD"
}
]
}
Member Price
Offer exclusive pricing to loyalty members by using validForMemberTier
.
jsonCopyEdit"offers": {
"@type": "Offer",
"url": "https://kumarharshit.in/trinket_offer",
"price": 10.00,
"priceCurrency": "USD",
"priceSpecification": {
"@type": "UnitPriceSpecification",
"price": 8.00,
"priceCurrency": "USD",
"validForMemberTier": {
"@type": "MemberProgramTier",
"@id": "https://kumarharshit.in/members#tier_gold"
}
}
}
Multiple Member Tiers
Different loyalty tiers, different prices:
jsonCopyEdit"offers": {
"@type": "Offer",
"priceSpecification": [
{
"@type": "UnitPriceSpecification",
"price": 10.00,
"priceCurrency": "USD"
},
{
"@type": "UnitPriceSpecification",
"price": 8.00,
"priceCurrency": "USD",
"validForMemberTier": {
"@type": "MemberProgramTier",
"@id": "https://kumarharshit.in/members#tier_gold"
}
},
{
"@type": "UnitPriceSpecification",
"price": 7.00,
"priceCurrency": "USD",
"validForMemberTier": {
"@type": "MemberProgramTier",
"@id": "https://kumarharshit.in/members#tier_platinum"
}
}
]
}
Member Points Instead of Price
Use loyalty points in lieu of currency:
jsonCopyEdit"offers": {
"@type": "Offer",
"url": "https://kumarharshit.in/trinket_offer",
"price": 10.00,
"priceCurrency": "USD",
"priceSpecification": {
"@type": "UnitPriceSpecification",
"eligibleTransactionVolume": {
"@type": "PriceSpecification",
"price": 20,
"priceCurrency": "USD"
},
"validForMemberTier": {
"@type": "MemberProgramTier",
"@id": "https://kumarharshit.in/members#tier_silver"
}
}
}
Shipping Details
jsonCopyEdit"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": 3.49,
"currency": "USD"
},
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "US"
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 0,
"maxValue": 1,
"unitCode": "DAY"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 1,
"maxValue": 5,
"unitCode": "DAY"
}
}
}
Return Policy
jsonCopyEdit"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "CH",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 60,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
Certification
jsonCopyEdit"hasCertification": {
"@type": "Certification",
"issuedBy": {
"@type": "Organization",
"name": "BMWK"
},
"certificationCategory": "Vehicle_CO2_Class",
"certificationRating": {
"@type": "Rating",
"ratingValue": "D"
}
}
3D Model
jsonCopyEdit"subjectOf": {
"@type": "3DModel",
"encoding": {
"@type": "MediaObject",
"contentUrl": "https://kumarharshit.in/models/sofa.gltf"
}
}
Guidelines and Best Practices
- Use
Product
with nestedOffer
- Unique URLs for each product variant
- Embed structured data in initial HTML (avoid pure JavaScript)
- Server resources must handle crawler load for dynamic data
Required Product Properties
name
image
(crawlable, high-resolution)offers
(Offer
object)
Recommended Product Properties
aggregateRating
brand
color
description
gtin
/isbn
/mpn
hasCertification
material
pattern
review
size
sku
subjectOf
(3DModel)
Testing and Validation
- Rich Results Test – Use this tool to validate your code and check for errors and warnings.
- Link: Rich Results Test
- URL Inspection – Verify how Google processes your pages after implementing structured data.
- This will help check if the structured data is successfully recognized by Google.
- Schema.org Validator – Ensure compliance with Schema.org standards.
- Helps to make sure the structured data is correctly implemented.
- Manual Review – Review your structured data for marketing policy compliance and to ensure that all items conform to Google’s quality guidelines.
Tracking in Google Search Console
- Monitor Rich Results – Track the status of your rich results in the Rich Results status report.
- Keep an eye on which pages are eligible and how they perform.
- Performance Report – Use this report to view key metrics such as impressions, clicks, and average position for your structured data pages.
- URL Inspection – After making changes to your structured data or product pages, use this tool to validate if Google has crawled and indexed the updated information.
- Search Console API – Automate the retrieval of data related to structured data, such as tracking which pages are eligible for rich results.
Troubleshooting and Support
- Manual Actions Report – Check for penalties related to structured data issues.
- If you have any issues related to structured data violations, this is the place to check.
- General Structured Data Guidelines – Follow Google’s guidelines for best practices and to avoid common mistakes.
- Crawling & Indexing FAQ – This FAQ section will help with discovery issues related to structured data, such as why some pages are not showing up with rich results.
- Re-indexing – Allow 2–3 days for Google to process changes and reflect them in search results.
Product Type Definitions
When using @type: "Product"
, ensure you include the required properties and consider recommended ones to enhance eligibility.
Required Properties
name
(Text): The name of the product.image
(URL or ImageObject): One or more crawlable, high-resolution images (preferred aspect ratios: 16×9, 4×3, 1×1).offers
(Offer): A nestedOffer
object describing pricing and availability.
Recommended Properties
aggregateRating
(AggregateRating): Customer rating value and count.brand
(Text or Brand): The brand of the product.color
(Text): The product’s color.description
(Text): A clear product description.gtin8
/gtin12
/gtin13
/gtin14
orisbn
(Text): Global Trade Item Numbers or ISBN for books.hasCertification
(Certification): Certification details such as energy labels or vehicle CO₂ class.material
(Text): The material composition.pattern
(Text): Design pattern (e.g., “striped,” “polka dots”).review
(Review): A nested review object.size
(Text or SizeSpecification): Product size, with optional size group/system.sku
(Text): Merchant-specific stock-keeping unit.subjectOf
(3DModel): 3D model link for immersive experiences.
Offer Details
Within the Offer
object, the following are critical:
Required
price
(Number) orpriceSpecification
(PriceSpecification)priceCurrency
(Text, ISO 4217)availability
(URL from schema.org, e.g.,InStock
)itemCondition
(URL, e.g.,NewCondition
)url
(URL): Link to the product page
Recommended
priceValidUntil
(Date): Expiration date for theprice
.itemOffered
(Product): Points back to the product when nested.eligibleQuantity
(QuantitativeValue): Stock quantity.seller
(Organization or Person): Merchant info.
UnitPriceSpecification
Used within priceSpecification
for complex pricing:
Required
@type
:"UnitPriceSpecification"
price
(Number)priceCurrency
(Text)
Optional
priceType
(URL): Use"https://schema.org/StrikethroughPrice"
for original prices.referenceQuantity
(QuantitativeValue): Unit-based pricing reference.validForMemberTier
(MemberProgramTier): Member-specific prices.eligibleTransactionVolume
(PriceSpecification): Points-based pricing.
QuantitativeValue (for Unit Pricing & Shipping Times)
jsonCopyEdit{
"@type": "QuantitativeValue",
"minValue": 0.75,
"maxValue": 0.75,
"unitCode": "LTR"
}
unitCode
: UN/CEFACT codes (e.g.,LTR
for liters,KGM
for kilograms).- When used in shipping:
handlingTime
andtransitTime
(Quantity of days).
Shipping Details
Shipping information should be added using OfferShippingDetails
to provide users with clarity on shipping rates, delivery time, and regions.
Shipping Rate
Indicate how much shipping costs for a product, and include the relevant currency.
jsonCopyEdit"shippingRate": {
"@type": "MonetaryAmount",
"value": 3.49,
"currency": "USD"
}
value
: Shipping cost in specified currency.currency
: Use ISO 4217 format, e.g., “USD”, “EUR”.
Shipping Destination
The destination for which the shipping details apply. This is critical for international or regional delivery services.
jsonCopyEdit"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "US"
}
addressCountry
: Country code in ISO 3166-1 alpha-2 format.
Delivery Time
Specifies the estimated time frame for shipping.
jsonCopyEdit"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 0,
"maxValue": 1,
"unitCode": "DAY"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 1,
"maxValue": 5,
"unitCode": "DAY"
}
}
handlingTime
: The time it takes for the merchant to handle the order.transitTime
: The delivery time once the product is dispatched.
Return Policy
To improve customer trust, include details on your return policy.
jsonCopyEdit"hasMerchantReturnPolicy": {
"@type": "MerchantReturnPolicy",
"applicableCountry": "US",
"returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
"merchantReturnDays": 30,
"returnMethod": "https://schema.org/ReturnByMail",
"returnFees": "https://schema.org/FreeReturn"
}
merchantReturnDays
: The number of days within which the customer can return the product.returnMethod
: Indicates how returns are processed.returnFees
: Describes the return fee (or “FreeReturn”).
Handling Discounts and Coupons
If you are offering discount codes or coupons, use the DiscountOffer
or Offer
schema types.
jsonCopyEdit"offers": {
"@type": "Offer",
"price": 50.00,
"priceCurrency": "USD",
"discount": {
"@type": "PriceSpecification",
"price": 40.00,
"priceCurrency": "USD"
}
}
discount
: Subfield ofOffer
that provides discount pricing details.price
: Original price before the discount.
Structuring Coupons
If you provide coupon codes, ensure you link them to the offer using Coupon
.
jsonCopyEdit"offers": {
"@type": "Offer",
"url": "https://kumarharshit.in/special_offer",
"price": 100.00,
"priceCurrency": "USD",
"eligibleRegion": "US",
"discount": {
"@type": "Coupon",
"couponCode": "DISCOUNT10",
"discountCurrency": "USD"
}
}
couponCode
: The discount code users apply during checkout.eligibleRegion
: Specifies regions where the coupon is valid.
Best Practices for Structured Data
To maximize the effectiveness of your structured data, adhere to these guidelines:
- Provide Accurate Product Information
- Ensure all data about your products, such as price, availability, and shipping information, is accurate and up-to-date.
- Use Relevant Schema Types
- Always use the correct schema types. For example, use
Product
for products,Offer
for offers,Review
for product reviews, etc.
- Always use the correct schema types. For example, use
- Prioritize JSON-LD
- JSON-LD is Google’s recommended format for structured data because it’s easy to implement and doesn’t affect the page’s HTML content.
- Avoid Redundancy
- Don’t repeat the same information in multiple places. Each property in your structured data should be unique and accurately reflect the content of the page.
- Ensure Proper Testing
- Use Google’s Rich Results Test to validate your structured data implementation. Fix errors before moving forward.
- Update Regularly
- Ensure that you update your structured data whenever there are changes in product details, such as price updates or stock availability changes.
Monitoring Performance and Success
Once your structured data is implemented, monitor its performance to ensure it’s driving better visibility and engagement.
- Google Search Console
- Use the Rich Results report to see how many pages are eligible for rich results.
- Track the performance of structured data-eligible pages in the Performance report for metrics like impressions and clicks.
- Adjust Based on Data
- If some pages aren’t performing well, consider revising their structured data. Test different properties to see what works best for your audience.
- Error Tracking
- In Search Console, address any structured data errors that are flagged to ensure that your products can appear in rich results without issue.
Conclusion
Implementing structured data for merchant listings can significantly improve your product’s visibility in search results, helping you to capture more attention and ultimately drive more traffic and sales. By following best practices, monitoring performance, and continuously improving your structured data, you’ll be able to make your products more discoverable to a wider audience.
By including accurate, detailed, and well-structured information, you’ll help both search engines and potential customers understand your products better, which will help boost your SEO performance.
Leave a Reply