You’ve probably seen those Google results where a product page shows stars, price, and “In stock” directly under the title. That’s a rich result, and it’s what a properly implemented schema.org Product triggers. Sites that get them often see CTR increase by 15 to 40% at the same ranking position compared with results without rich results.
In 2026, implementation through JSON-LD is the official method recommended by Google. Here is the complete, testable, production-ready version.
Three formats can add schema.org to a web page: Microdata (directly in the HTML), RDFa (HTML5 attributes), and JSON-LD (a separate structured data block).
Google has recommended JSON-LD since 2015, and by 2026 it has become the de facto standard. Reasons:
Data/presentation separation: JSON-LD lives in a <script type="application/ld+json"> inside the <head>, independently from the visible HTML
Easier to generate: one JSON block per page, easy to maintain
No conflict with your theme: no need to modify the HTML structure of templates
Better compatibility with modern frameworks (Next.js, Nuxt, etc.)
Microdata is still readable by Google but is no longer recommended for new implementations.
reviewCount: minimum 1, but Google recommends 3+ for display
The matching reviews must be visible on the page — faking AggregateRating with nonexistent reviews can lead to a manual penalty
Tip: if you have few reviews, display them on your page through a widget (Yotpo, Judge.me, Trustpilot) and pull the count + average rating from their API for the JSON-LD.
Since 2023, Shopify automatically generates Product schema on product pages if you use an official theme. The problem: the default schema is often incomplete (no AggregateRating, no brand).
For a complete schema:
Edit your theme: Online Store → Themes → Edit code
Open snippets/product-structured-data.liquid or sections/main-product.liquid
Add the missing fields or replace it with a custom template
Alternative: install an app like SEO JSON-LD Schema or Smart SEO that manages schema across the full catalog on its own.
Warning: generating JSON-LD client-side (through useEffect) does not work for SEO — Google crawls server-rendered output. Make sure the JSON-LD is present in the initial HTML returned by the server.
Contradictions between the visible page and the JSON-LD. If the page shows “In stock” but the JSON-LD says OutOfStock, Google ignores the JSON-LD. Sync both to the same data source.
Different price in JSON-LD and on the page. Same logic: Google detects the mismatch and ignores the rich result.
Multiple Product objects in the same <script>. Only one @type: Product per script. If you have variants, use @type: ProductGroup with hasVariant: [...] to link them.
Images not accessible. Image URLs must be public, not behind a login. Test each URL with curl to confirm it returns a 200.
Made-up AggregateRating. Showing 4.9 stars on a page with no visible reviews can lead to a manual penalty, and the risk is real.
If your product has multiple sizes or colors, there are 2 approaches:
Approach 1: one Product schema only (the parent)
Simpler, and suitable for 90% of cases. The parent schema describes the generic product, and the page handles variants through the selector. The displayed price is the default one, and availability is InStock if at least one variant is available.
Approach 2: ProductGroup with hasVariant
More precise but more complex. Recommended if your variants have very different prices or different availability states (out of stock in size 44 but not in 42). Google has supported ProductGroup since 2022.
Between 1 and 4 weeks after publishing the correct schema. Google needs to recrawl the page and trigger eligibility on the algorithm side. You can speed this up by submitting the URL through Search Console → URL Inspection → Request Indexing.
Not directly. Schema is not a ranking signal. It enables rich results (stars, price, availability in the SERP), which increase CTR and can improve rankings indirectly through engagement signals.
Optional. Adding individual Review objects in the JSON-LD can enable more rich features, but it makes the code heavier. On catalogs with 5,000+ product pages, AggregateRating alone is more than enough.
No. Google does not penalize content origin, it penalizes quality. Correct JSON-LD on a high-quality AI-generated page can get rich results just like any other page.
Bing: yes, with a longer delay (sometimes 2-3 months). DuckDuckGo uses Bing as a backend, so yes indirectly. Both use the same schema.org standard, so no adaptation is needed.
On Ecomptimize, Product JSON-LD is generated automatically from your Shopify or WooCommerce catalog data. See the Shopify or WooCommerce page.