Magento 2 Module — SEO Rich Data (JSON-LD)
- SKU
- M2-SEO-RICH-DATA
Description / Magento 2 Module — SEO Rich Data (JSON-LD)
MAGENTO 2 · SCHEMA.ORG · JSON-LD · PRODUCT DATA
Provide search engines with structured data from your store.
Kowal SEO Rich Data
Generate JSON-LD for products, offers, your company, and navigation. Use reviews, videos, and optional FAQ to describe your store content in the schema.org format.
Product and Offer · Reviews and multimedia · Admin panel configuration
HOW IT WORKS IN PRACTICE
01 · You complete your store data
You map attributes and configure company data.
02 · The module builds JSON-LD
It generates data relevant to the product or page.
03 · You verify publication
You check that the data matches the visible store content.
What does your store gain?
Explore the module features, use cases, and configuration process.
What does SEO Rich Data provide?
The module adds schema.org structured data to Magento in JSON-LD format. It describes products, categories, navigation, and your company in a way that systems analyzing websites can understand.
The data can support content eligibility for supported rich results, including price, availability, or ratings. Correct markup does not guarantee display, a CTR increase, rankings, or faster indexing.
Product — product information
Pass the product name, description, URL, images, SKU, and product identifiers. The configuration lets you choose sources for brand, manufacturer, and identifiers such as EAN/GTIN.
The previous description also mentioned MPN. The scope of emitted identifiers should be checked in the specific package version and product data instead of assuming that every field is available.
Offer — price, availability, and terms
The offer can include price, currency, availability, product condition, and price validity date. The parameters correspond to Magento data and the module configuration.
The current code also includes options for shipping data and return policy: countries, costs, processing times, and return rules. Complete them according to your actual sales terms.
Brand and Manufacturer
Brand and manufacturer data comes from product information. In the configuration, you select the appropriate attributes for your catalog structure.
Properly completed sources allow you to describe the relationship between the product, brand, and manufacturer without manually creating JSON-LD for each product page.
Organization — seller data
Describe your company: name, website, logo, description, address, and contact information. The configuration includes, among others, sales contact, technical support, and customer service.
You can also complete links to social media profiles. The data should match the information published in the store.
BreadcrumbList — navigation
Breadcrumb navigation data communicates the page structure and the path to the viewed content. It helps systems analyzing the store recognize its hierarchy.
In the configuration, you manage the breadcrumbs component and path options, matching them to catalog navigation.
WebSite and SearchAction
WebSite data describes the website, while SearchAction provides the schema for how the store’s internal search engine works.
The presence of these schema.org types does not automatically mean that a special search box or another element will appear in Google results.
ItemList — products in a category
The product list on a category page can include the product name, image, and link. Structured data provides context for the displayed collection.
This is a description of list content, not a mechanism for speeding up indexing. Indexing speed also depends on page availability, content quality, and search engine behavior.
Review and AggregateRating
The module generates data for individual reviews and aggregate rating: rating, number of reviews, review content, and author. The configuration also includes rating format options and review source.
Ratings can qualify a product for supported results with stars if it meets search engine requirements. There is no guarantee that stars will be displayed or that the number of clicks will increase.
VideoObject — gallery videos
The module detects external videos in the product gallery and generates VideoObject for up to five items. The data includes title, description, thumbnail, URL, and date.
In the verified code, uploadDate comes from the product creation date. During validation, check whether this value matches the actual video publication.
FAQPage and ‘Ask About Product’
After installing and enabling Kowal Ask About Product, the module can build an FAQPage from questions and answers related to a given product. The code selects published entries and limits the result to 50 items.
You manage the questions tab, its activity, and its title in the Ask About Product module. Approved seller answers remain useful content for customers and a source of structured data.
FAQ and current Google results
Google stopped displaying FAQ rich results as of May 7, 2026. FAQPage can still describe content according to schema.org, but a question-and-answer section in Google results should not be promised.
This clarifies the earlier FAQ integration description. The change is published by Google Search Central; other valid structured data also does not guarantee rich results.
Configuration and automatic generation
In Stores → Configuration → Kowal → SEO Rich Data, you set available components, company data, attribute mapping, and product data options. JSON-LD is created automatically for supported pages.
The previous description indicated separate FAQ and VideoObject toggles. In the verified configuration, these processors work based on available data and dependencies; separate toggles for both have not been confirmed. You set the FAQ tab title in Ask About Product.
More data and optional integrations
The current package also includes HowTo options from a product attribute, SoftwareApplication, and additional properties. Integrations with the blog and TrustedUs are optional.
The included Kowal_SeoRichDataHyva adapter uses the main JSON-LD generator and helps reduce conflicting markup in Hyvä. You enable and configure it separately; the main module works independently of Hyvä.
Requirements and data compliance
The previous description indicates Magento 2.4.x, testing on Magento 2.4.7, and PHP 8.1+. Match your environment to the requirements of the Magento release you use. The package uses kowal/base.
Ask About Product is recommended for the FAQ feature but is not required for basic product and category data. Also check whether the theme or another module emits conflicting or duplicated data.
What you receive and how to evaluate the result
The offer description includes a module installed via Composer, documentation, code prepared according to Magento guidelines, and technical support during implementation.
Structured data can improve how your offer is described and support visibility. Evaluate SEO and CTR results based on measurements; the module does not provide a specific increase. Google’s structured data policies describe the requirements for eligibility for rich results.
Installation via Composer
Package kowal/module-seo-rich-data, module Kowal_SeoRichData. Configure access to the Kowal repository, install the package, enable the module, update Magento, and clear the cache. In production, include compilation and static content deployment according to your store’s process.
From configuration to results
1. You complete your store data
You map attributes and configure company data.
2. The module builds JSON-LD
It generates data relevant to the product or page.
3. You verify publication
You check that the data matches the visible store content.
A product also described for the search engine
The product page includes price, availability, and reviews. SEO Rich Data provides corresponding Product, Offer, and AggregateRating data in JSON-LD format.
The search engine receives structured context. Displaying a rich result depends on its rules and decisions.
Organize structured data in Magento
Want to adapt the module to your store? Ask about implementing Kowal SEO Rich Data and discuss the configuration or extensions you need.
More Information
Change Log
Version: 1.0.17
05/19/2026
Added
- Added support for the
shippingDetailsfield in theoffersstructure for product JSON-LD data. - Added support for the
hasMerchantReturnPolicyfield in theoffersstructure for product JSON-LD data. - Added shipping data configuration:
- enable/disable generation of
shippingDetails, - shipping country,
- shipping cost,
- minimum and maximum order handling time,
- minimum and maximum transit time.
- enable/disable generation of
- Added return policy configuration:
- enable/disable generation of
hasMerchantReturnPolicy, - country where the policy applies,
- return policy type,
- number of days for returns,
- return method,
- return fees,
- optional return shipping fee amount.
- enable/disable generation of
- Added EAN / GTIN attribute selection in product configuration.
- Added automatic mapping of EAN / GTIN values to the
gtin8,gtin12,gtin13,gtin14, orgtinproperties, depending on the number length. - Added source models for return policy configuration options:
ReturnPolicyCategory,ReturnMethod,ReturnFees.
Changed
- Improved retrieval of
brandandmanufacturerattribute values for JSON-LD. - Added fallback retrieval of attribute values from raw EAV value when
getAttributeText()orgetData()does not return a value. - For configurable and grouped products, added fallback retrieval of brand / GTIN values from simple products.
- Replaced the deprecated
Block\Product::getResultArray()method with sharedModel\JsonLd\ProductInfologic so product data generation is consistent on the product page and category lists. - Extended the offer cache key with shipping and return policy configuration so configuration changes affect the generated JSON-LD.
Fixed
- Fixed a case where the configured
Brandattribute did not appear in product JSON-LD. - Added missing data required by Google Search Console for merchant listing:
shippingDetails,hasMerchantReturnPolicy,- global product identifier via EAN / GTIN.
Module Installation Instructions
SEO Rich Data - installation and configuration
Module purpose
The Kowal_SeoRichData module adds schema.org structured data to Magento 2 in JSON-LD format. Generated data can include products, offers, prices, availability, ratings, reviews, breadcrumbs, organization data, site name, search box, social profiles, FAQ, and video.
The module configuration is available in the Magento admin panel:
Stores > Configuration > Kowal > SEO Rich Data
Requirements
- Magento 2.
- Access to Magento CLI.
- Access to the Composer repository with the
kowal/module-seo-rich-datapackage. - Required base package:
kowal/base. - Permissions to run
bin/magentocommands.
Installation via Composer
- Add the package repository:
You will receive Composer repository access details, meaning the customer email address and license token, by email after purchase. They are also available in the customer panel after logging in at kowal.store. Replace TWOJ_EMAIL_KLIENTA with your account email address and TWOJ_TOKEN with the token you received. Run the commands in the Magento root directory.
composer config repositories.kowal composer https://repo.kowal.store- 2. Configure access credentials for the Kowal Composer repository:
composer config http-basic.repo.kowal.store 'TWOJ_EMAIL_KLIENTA' 'TWOJ_TOKEN'- 3. Install the module:
composer require kowal/module-seo-rich-data- 4. Enable the module:
php bin/magento module:enable Kowal_SeoRichData- 5. Run the Magento update:
php bin/magento setup:upgrade- 6. In a production environment, run DI compilation:
php bin/magento setup:di:compile- 7. In a production environment, if the project requires it, generate static files:
php bin/magento setup:static-content:deploy- 8. Clear the cache:
php bin/magento cache:flushManual installation
- Copy the module to the directory:
app/code/Kowal/SeoRichData- 2. Enable the module:
php bin/magento module:enable Kowal_SeoRichData- 3. Run the Magento update:
php bin/magento setup:upgrade- 4. Clear the cache:
php bin/magento cache:flushPost-installation steps
After installation, the module adds a product attribute:
| Attribute | Meaning |
|---|---|
offer_item_condition | Product condition used to generate itemCondition in offers. |
The attribute supports the following values:
| Value in Magento | JSON-LD value |
|---|---|
DamagedCondition | https://schema.org/DamagedCondition |
NewCondition | https://schema.org/NewCondition |
RefurbishedCondition | https://schema.org/RefurbishedCondition |
UsedCondition | https://schema.org/UsedCondition |
If the product does not have an attribute value set, the module treats it as NewCondition.
Configuration scope
All configuration fields are available for the Default, Website, and Store View scopes, according to Magento settings.
Enabled, Show ..., and similar fields use standard Magento values:
| Value | Meaning |
|---|---|
Yes | The feature is enabled and can generate JSON-LD data. |
No | The feature is disabled. |
Breadcrumbs
This section is responsible for structured data for the navigation path.
| Field | Meaning | Values |
|---|---|---|
Enabled | Enables generation of BreadcrumbList data. | Yes, No |
Fixed Category Path | On the product page, uses the most specific category path when Magento does not provide full category context. | Yes, No |
Type | Defines the length of the breadcrumbs path generated for the search engine. | Default (Long), Short |
Values of the Type field:
| Value | Meaning |
|---|---|
Default (Long) | Full path, e.g. Store > Category > Subcategory > Product. |
Short | Shortened path, e.g. Store > Subcategory > Product. |
Include Your Site Name in Search Results
This section is responsible for WebSite data, which can help Google recognize the site name.
| Field | Meaning | Values |
|---|---|---|
Enabled | Enables generation of WebSite data. | Yes, No |
Website Name | The website/store name passed in structured data. | Text, e.g. the store name. |
Organization
This section is responsible for Organization data.
| Field | Meaning | Values |
|---|---|---|
Enabled | Enables generation of organization data. | Yes, No |
Organization Name | Company or store name. | Text; required field after enabling the section. |
Logo Url | Full URL of the organization logo. | URL to an image file. |
Description | Organization description. | Text. |
Description Length | Maximum number of description characters. | Number; empty means no truncation. |
Country | Organization country. | Country code from the Magento list. |
Region/State | Region or state. | Text. |
ZIP/Postal Code | ZIP/postal code. | Text. |
City | City. | Text. |
Street Address | Street and number. | Text. |
Sales | Sales department phone number. | Number in international format, e.g. +48.... |
Technical Support | Technical support phone number. | Number in international format. |
Customer Service | Customer service phone number. | Number in international format. |
The country from this section can be used as a fallback for the shipping country and return policy country if the relevant fields in the product section remain empty.
Social Profiles
This section adds the organization’s social profiles. For the data to make sense, the Organization section should be enabled.
| Field | Meaning | Values |
|---|---|---|
Enabled | Enables generation of social profile links. | Yes, No |
Facebook | Facebook profile URL. | Full URL. |
Twitter | Twitter / X profile URL. | Full URL. |
Google+ | Google+ profile URL. | Full URL; historical configuration field. |
Instagram | Instagram profile URL. | Full URL. |
YouTube | YouTube channel URL. | Full URL. |
LinkedIn | LinkedIn profile URL. | Full URL. |
Myspace | Myspace profile URL. | Full URL; historical configuration field. |
Pinterest | Pinterest profile URL. | Full URL. |
SoundCloud | SoundCloud profile URL. | Full URL. |
Tumblr | Tumblr profile URL. | Full URL. |
Empty fields are skipped.
Search Box
This section is responsible for SearchAction data, which can enable the store search box to be displayed in Google results.
| Field | Meaning | Values |
|---|---|---|
Enabled | Enables generation of site search data. | Yes, No |
Category Rich Data
This section is responsible for generating product data on category pages.
| Field | Meaning | Values |
|---|---|---|
Show Products Data | Adds structured data for products visible on the category page. | Yes, No |
Enabling this option can degrade category page performance because the module must collect data for many products.
Product Rich Data
This section is responsible for the main Product product data and offers data.
Basic product fields
| Field | Meaning | Values |
|---|---|---|
Enabled | Enables generation of product JSON-LD on the product page. | Yes, No |
Show Availability | Adds availability in offers. | Yes, No |
priceValidUntil Default Value | Default price validity date. | Date. |
Use “Special Price To” Value for priceValidUntil Snippet | If the product has an active special price and a Special Price To date, this date replaces the default value. | Yes, No |
Show Condition | Adds itemCondition in offers. | Yes, No |
Description | Defines the source of the product description in JSON-LD. | None, Product Short Description, Product Full Description, Page Meta Description |
Values of the Description field:
| Value | Meaning |
|---|---|
None | Does not retrieve the description from configuration; the code can use the product name as a fallback if the description is empty. |
Product Short Description | Uses the product short description. |
Product Full Description | Uses the product full description. |
Page Meta Description | Uses the page meta description. |
Configurable and grouped products
| Field | Meaning | Values |
|---|---|---|
Show Configurable Products as | Defines how offers are generated for configurable products. | Main Offer, List of Associated Products Offers, Aggregate Offer |
Show Grouped Products as | Defines how offers are generated for grouped products. | Main Offer, List of Associated Products Offers, Aggregate Offer |
Values:
| Value | Meaning |
|---|---|
Main Offer | Generates one offer for the main product. |
List of Associated Products Offers | Generates a separate offer for each simple or associated product. |
Aggregate Offer | Generates AggregateOffer with the lowest price, highest price, and number of offers. |
Ratings and reviews
| Field | Meaning | Values |
|---|---|---|
Show Rating | Adds aggregateRating and review to product data. | Yes, No |
Use Yotpo Reviews instead of Magento Reviews | Retrieves reviews from Yotpo instead of Magento Reviews. | Yes, No |
Rating Format | Defines the rating scale. | Percentage Scale, Numeric Scale |
Number of Reviews | Limit for the number of newest reviews added to JSON-LD. | Number; empty means all reviews. |
Values of the Rating Format field:
| Value | Meaning |
|---|---|
Percentage Scale | Ratings are interpreted on a percentage scale. |
Numeric Scale | Ratings are interpreted on a numeric scale. |
Integration with Yotpo requires the availability of a module that supports Yotpo. If the module is not installed, the Yotpo configuration should not be enabled.
Brand, manufacturer, and product identifiers
| Field | Meaning | Values |
|---|---|---|
Brand | Product attribute used to generate the brand property. | Any product attribute from the list. |
EAN / GTIN Attribute | Product attribute used as a global product identifier. | Any product attribute from the list. |
Manufacturer | Product attribute used to generate the manufacturer property. | Any product attribute from the list. |
The EAN / GTIN Attribute field generates the property depending on the number of digits:
| Number of digits | JSON-LD property |
|---|---|
| 8 | gtin8 |
| 12 | gtin12 |
| 13 | gtin13 |
| 14 | gtin14 |
| Other positive number of digits | gtin |
The module removes non-digit characters from the EAN / GTIN value before generating JSON-LD.
Shipping details
The shipping section is responsible for generating shippingDetails in offers. Data is added only when the section is enabled and has a complete set of required values.
| Field | Meaning | Values |
|---|---|---|
Show Shipping Details | Enables generation of shippingDetails. | Yes, No |
Shipping Country | Shipping country. | Country code from the Magento list; if empty, the country from the Organization section is used. |
Shipping Price | Shipping cost. | Number equal to or greater than 0; 0 means free shipping. |
Handling Time Min Days | Minimum order handling time. | Integer, days. |
Handling Time Max Days | Maximum order handling time. | Integer, days. |
Transit Time Min Days | Minimum transit time. | Integer, days. |
Transit Time Max Days | Maximum transit time. | Integer, days. |
The shipping cost currency is taken from the product offer currency.
Example meaning of values:
| Field | Example | Meaning |
|---|---|---|
Shipping Price | 0 | Free shipping. |
Handling Time Min Days | 0 | The order can be processed on the same day. |
Handling Time Max Days | 1 | Order processing takes a maximum of 1 day. |
Transit Time Min Days | 1 | Delivery takes at least 1 day. |
Transit Time Max Days | 5 | Delivery takes a maximum of 5 days. |
Merchant return policy
The return policy section is responsible for generating hasMerchantReturnPolicy in offers. Data is added only when the section is enabled and has the required values.
| Field | Meaning | Values |
|---|---|---|
Show Merchant Return Policy | Enables generation of hasMerchantReturnPolicy. | Yes, No |
Return Policy Country | Country where the return policy applies. | Country code from the Magento list; if empty, the country from the Organization section is used. |
Return Policy Category | Return policy type. | Finite Return Window, Returns Not Permitted, Unlimited Return Window |
Merchant Return Days | Number of days for returns. | Integer; required for Finite Return Window. |
Return Method | Supported return method. | -- Empty --, Return By Mail, Return In Store, Return At Kiosk |
Return Fees | Information about return fees. | -- Empty --, Free Return, Customer Responsibility, Return Shipping Fees |
Return Shipping Fee | Return shipping fee amount. | Number greater than 0; required only for Return Shipping Fees. |
Values of the Return Policy Category field:
| Value | JSON-LD value | Meaning |
|---|---|---|
Finite Return Window | https://schema.org/MerchantReturnFiniteReturnWindow | Return possible for a specified number of days. Requires Merchant Return Days. |
Returns Not Permitted | https://schema.org/MerchantReturnNotPermitted | Returns are not allowed. |
Unlimited Return Window | https://schema.org/MerchantReturnUnlimitedWindow | Return without a specified day limit. |
Values of the Return Method field:
| Value | JSON-LD value | Meaning |
|---|---|---|
-- Empty -- | no value | The return method is not added to JSON-LD. |
Return By Mail | https://schema.org/ReturnByMail | Return by mail. |
Return In Store | https://schema.org/ReturnInStore | Return in a physical store. |
Return At Kiosk | https://schema.org/ReturnAtKiosk | Return at a point/kiosk. |
Values of the Return Fees field:
| Value | JSON-LD value | Meaning |
|---|---|---|
-- Empty -- | no value | Fee information is not added to JSON-LD. |
Free Return | https://schema.org/FreeReturn | The return is free. |
Customer Responsibility | https://schema.org/ReturnFeesCustomerResponsibility | The customer bears the return cost. |
Return Shipping Fees | https://schema.org/ReturnShippingFees | The return has a specified return shipping fee. Requires Return Shipping Fee. |
The currency of the Return Shipping Fee field is taken from the product offer currency.
Custom Properties
The Custom Properties field allows you to add your own properties to product JSON-LD.
Format:
wlasciwosc_jsonld,kod_atrybutuIf only one element is provided, the module treats it both as the JSON-LD property name and the attribute code.
Default value:
skumpn,skuMeaning of the default value:
| Line | Effect |
|---|---|
sku | Adds sku based on the sku attribute. |
mpn,sku | Adds mpn based on the sku attribute. |
Example of adding a custom attribute:
color,colormaterial,materialRecommended minimum configuration for products
To reduce Google Search Console warnings for product data, configure at least:
| Field | Recommendation |
|---|---|
Product Rich Data > Enabled | Yes |
Show Availability | Yes |
Brand | Select the attribute with the product brand. |
EAN / GTIN Attribute | Select the attribute with EAN / GTIN if products have a global identifier. |
Show Shipping Details | Yes, if the store has a uniform shipping policy that can be described in the configuration. |
Show Merchant Return Policy | Yes, if the store has a uniform return policy that can be described in the configuration. |
Custom Properties | Keep at least sku; optionally add mpn if the store has such an identifier. |
Clearing cache after configuration changes
After changing the configuration, run:
php bin/magento cache:flushIf the store uses additional HTTP cache, Varnish, or CDN, clear those cache layers as well.
Verifying operation
- Open the product page on the frontend.
- Check the page source and find:
<script type='application/ld+json'>- 3. Verify that JSON-LD contains the expected fields, e.g.:
{ '@type': 'Product', 'brand': { '@type': 'Brand', 'name': 'Example Brand' }, 'gtin13': '5901234123457', 'offers': [ { '@type': 'Offer', 'shippingDetails': {}, 'hasMerchantReturnPolicy': {} } ]}- 4. Test the product URL in the Google Rich Results Test tool or in Google Search Console.
Implementation notes
- Do not enable
shippingDetailsorhasMerchantReturnPolicyif the values in the configuration do not match the store’s actual policy. - If shipping or return policies differ by product, region, shipping method, or cart, one global configuration may not be sufficient.
- After changing the
Brand,Manufacturer, orEAN / GTIN Attributeattributes, it is worth reindexing product data if the store uses cache or indexes that affect attribute reading. - In multilingual and multicurrency stores, check the configuration separately for each Store View.