Your Rich Results Test shows zero errors. You deployed schema three months ago. Google still shows plain blue links.
Most guides on product and review schema markup for e-commerce cover the code. None covers the diagnostic trail when the green checkmark leads nowhere for 90 days.
Schema implementation is a hypothesis, not a configuration. You prove it on one page before scaling to a thousand. Most stores skip that step.
What are the essential schema properties that actually get you rich snippets?
The properties that trigger product rich results aren’t the ones most tutorials lead with. name, description, and image are required — but they don’t earn star ratings or price badges. Those come from a complete offers block and a properly formatted aggregateRating.
Miss either and the snippet doesn’t appear, even when the validator says you’re clean.
What most stores do instead
They copy a JSON-LD block from a tutorial. It includes name, description, and a basic price. They run Rich Results Test. Green. Done.
What that costs: a store doing $50k/month loses an estimated 20–30% of incremental organic clicks to competitors with star ratings. That’s $10k–$15k monthly in revenue that better-structured listings capture.
The fields that determine eligibility
The offers block has internal requirements that most tutorials skip. price alone is not enough.
priceCurrency must be a three-letter ISO code — USD, EUR, GBP. Not "dollars." Not "$". The code.
availability must be a full schema.org URL. "https://schema.org/InStock" works. "InStock" does not.
url must be the canonical product URL. Without it, the Offer is incomplete.
Miss any of these and Rich Results Test may still pass. Google’s snippet eligibility check is stricter than the validator.
A real example
A kitchenware store doing $60k/month on WooCommerce had schema on every product page. Rich Results Test passed consistently. No rich results appeared for four months.
The diagnosis: their WooCommerce schema plugin generated "availability": "InStock" instead of "availability": "https://schema.org/InStock". One string. Four months of lost CTR.
They corrected the availability format and added priceCurrency. Rich results appeared on 68% of their product pages within six weeks.
How do I handle review schema without violating Google’s aggregateRating requirements?
aggregateRating is the most misunderstood field in product schema. Google doesn’t publish a minimum review threshold. The safe floor among practitioners is 5 reviews.
Including aggregateRating on a product with 2 reviews can trigger a manual action. That suppresses snippets across your entire domain.
What plugins get wrong by default
Most schema plugins set their minimum review threshold at 3, not 5. Some include aggregateRating unconditionally. If the numbers in your schema don’t match what’s visible on the page, that’s a policy violation — not a technicality Google ignores.
The correct conditional logic:
- 0 reviews: emit
name,offers,brand, andimageonly - 1–4 reviews: include individual
reviewobjects, omitaggregateRating - 5+ reviews: include both
review(capped at 10 most recent) andaggregateRatingwith accurateratingValueandreviewCount
This is one conditional in whatever generates your JSON-LD. The challenge is knowing to build it at all.
Individual review objects still matter below the threshold
Even without aggregateRating, individual review objects signal structured review data to Google. Yellow stars won’t appear yet. The signal accumulates.
When you hit 5 reviews and add aggregateRating, Google already has context for the page.
A real example
A Shopify supplement store at $40k/month used a schema app that included aggregateRating on every product. That included 47 products with fewer than 3 reviews.
They crawled their full catalog with Screaming Frog and extracted raw schema JSON from every product URL. They removed aggregateRating from products below 5 reviews. They populated aggregateRating on products above 5 reviews using their review platform’s API.
Organic CTR on corrected pages moved from 2.1% to 3.4% over eight weeks. That’s a 62% lift on pages where the fix was structurally clean.
How can I test if my schema markup is working before rolling it out site-wide?
Rich Results Test validates code. It does not confirm Google will show a rich result for your page. The only real confirmation is a live snippet on one page you control and watch closely.
The 10-product isolation method
Start with your top 10 best-selling products. Ignore the rest of the catalog.
For product number one, write the JSON-LD by hand. Use Merkle’s Schema Markup Generator as your starting point. Include name, image, description, brand, and a complete offers block.
Add aggregateRating only if the product has 5 or more verified reviews.
Paste the output into Rich Results Test. Fix every warning — not just errors. Warnings about gtin13 and mpn are worth addressing if your supplier provides those identifiers.
They don’t guarantee rich results. They do strengthen eligibility.
Render the JSON-LD server-side. If a JavaScript script injects it after page load, Googlebot may skip it on first crawl. This is the most common delay driver.
It’s also one of the hardest to trace after the fact.
Deploy that one page. Open Google Search Console. Use URL Inspection to request indexing for that specific URL.
What to look for at week two
Check the live URL in a private browser. If the rich snippet appears, that JSON-LD is your working template. Use it as the reference for dynamic generation.
Write a Liquid block in Shopify, a PHP function in WooCommerce, or a custom script for Magento — whichever applies.
If the snippet does not appear, you have one page to debug. Check URL Inspection for crawl errors. Re-run Rich Results Test.
Confirm the page isn’t noindexed. Verify the schema renders server-side.
One isolated page is far easier to debug than a mystery spread across 800 product URLs.
A real example
A Shopify store at $85k/month added schema to their full catalog in January via a third-party app. No rich results appeared by April.
They reset. They chose one product — their best-selling protein shaker — and wrote JSON-LD manually. Rich Results Test showed two warnings: missing gtin13 and mpn.
They pulled both from their supplier’s data sheet and added them.
They requested indexing via Search Console. The rich snippet appeared 19 days later, showing star rating, price, and availability.
That exact JSON-LD became the template for a schema block in their product.liquid Shopify theme file. By week eight, 71% of product pages showed rich results. Search Console showed average CTR up from 2.8% to 3.9% on schema-enabled pages.
What results should I realistically expect, and when?
Rich results are not immediate. Google crawls, processes, and evaluates structured data separately from standard page indexing. Even after requesting indexing manually, expect a 2–6 week lag before first snippet appearance.
Pages with lower crawl frequency take longer.
A realistic timeline
Weeks 1–2: Deploy schema to your test product. Request indexing via URL Inspection. No visible change yet — that’s normal.
Week 3: First rich result may appear for the manually submitted URL. Confirm it in a private browser and in Search Console’s "Live URL" view.
Weeks 4–8: After validating your template and rolling it across the catalog, expect 40–70% of eligible pages to show rich results. Pages with fewer than 5 reviews, missing GTINs, or out-of-stock status show at lower rates.
Month 3: Search Console surfaces meaningful CTR data comparing schema-enabled pages against your pre-implementation organic baseline.
The number to track in Search Console
Filter by landing page type. Compare three-month average CTR on product pages before and after schema deployment. A clean implementation with accurate aggregateRating and 10+ reviews typically produces a 25–37% CTR lift on those pages.
A $50k/month Shopify store saw a 37% CTR increase on schema-enabled product pages over a 90-day post-implementation window. That translated to roughly 22% more organic sessions on those pages. Those results depend on category, competitor schema coverage, and implementation quality. They’re achievable when the markup is correct from day one.
Two things that kill the timeline
JavaScript-rendered JSON-LD: If your schema block loads via client-side script, Googlebot may skip it. Render it server-side.
Static availability on out-of-stock products: If availability stays "https://schema.org/InStock" while the product is unavailable, Google flags it as a policy violation. That suppresses the rich result. Dynamic availability via server-side rendering or a scheduled sync prevents this.
Rich Results Test gives you a green checkmark and tells you nothing about whether your snippet will appear. The only confirmation is a live rich result on one real page.
Pick one product this week. Write the JSON-LD by hand using Merkle’s generator. Fix the warnings, not just the errors.
Request indexing via Search Console. In three weeks you’ll know whether the template works — or exactly which field to correct before you scale.









