Skip to content
Academy
Marketing Academy · Field Work●SEO
MiniTeardown· 20 minutes

Spot the Schema Violations: A Broken Product JSON-LD Teardown

Lenskart

Objective: Given two JSON-LD specimens drafted ahead of a Rich Results launch, find every validation error and guideline violation before either ships, and rank them by how much rich-result eligibility each one costs.

Lenskart's product team drafted two JSON-LD blocks ahead of a Rich Results push across its eyewear catalog. Both look plausible at a glance. Your job is to catch what fails before either one goes live sitewide.

Two specimens, two teardowns: a Product block with a type mismatch and a missing property, and an FAQ block copied from an unrelated page with a syntax error baked in.

Which errors in each JSON-LD specimen would block rich results outright, versus which are guideline violations that risk a manual penalty?

Structured Data/JSON-LD Validation/Schema Markup

Before you start

What you'll need

  • —Basic familiarity with JSON syntax
  • —Understanding of what schema.org structured data is used for
JSON-LD
a JSON-based format for embedding schema.org structured data in a page, read by Google to power rich results.
Rich results
enhanced search listings, star ratings, prices, FAQ dropdowns, generated from valid structured data matching what's visibly on the page.
Guideline violation
structured data that is technically valid JSON but violates Google's content rules, such as marking up content not visible on the page, risking a manual action.

Free path (everything below is enough to finish)

FreeRun URL Inspection's live Rich Results check against the corrected markup before it ships sitewide

Free, the same validation pipeline Google's own indexing system uses, no third-party tool needed to confirm a fix worked.

Paid upgrades (optional, faster/deeper)

This teardown needs no paid tool at all, it's a structural read of two short JSON-LD specimens. GSC is free and only worth opening to confirm a fix against a live URL.

Ahrefs(optional)
PaidRun a site-wide schema audit across the whole Lenskart catalog beyond these two specimens

The free path (a manual JSON-LD read plus GSC validation) is complete for reviewing a couple of specimens; Ahrefs' Site Audit is worth it once checking schema validity across thousands of product pages.

The process

Specimens to review

Lenskart's product team drafted this JSON-LD block for a new eyewear PDP ahead of launch. The live page shows a price of ₹1,499 and currently has no reviews section (reviews ship next sprint). Validate the block against the lesson's rules before it ships.

Sample output
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Article",
  "name": "Lenskart Ray Vision Blue-Light Glasses",
  "description": "Lightweight blue-light-filtering eyewear frame.",
  "offers": {
    "@type": "Offer",
    "price": "1499"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.6",
    "reviewCount": "212"
  }
}
</script>

Specimen: synthetic, realistic

This FAQPage block was drafted for a Lenskart blue-light-glasses FAQ section by copying and lightly editing markup from an old RayCon sunglasses page. Validate it before it ships.

Sample output
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "What is the return policy for RayCon sunglasses?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "RayCon offers a 30-day return window on all sunglasses."
      },
    }
  ]
}
</script>

Specimen: synthetic, realistic

Analyze your findings

What to look for

Type match
Does @type actually describe what's on the page, or is it borrowed from a different content type?
Visibility match
Does every marked-up value actually appear on the rendered page, or is something declared that isn't shown?
Syntax validity
Is the JSON itself well-formed, no trailing commas, matching braces, before checking anything else?
Value provenance
Do the specific values (price, ratings, policy text) belong to this exact product, or were they copied from elsewhere?

Make the call

Both specimens have multiple issues. Which single defect should be fixed first across both blocks?

Recommendation · Priority: High

“Neither specimen should ship as drafted. Specimen 1's @type must change from Article to Product, its aggregateRating block must be removed until the reviews section actually ships (marking up invisible content risks a sitewide manual action), and priceCurrency must be added to the offers object. Specimen 2's trailing comma is a hard JSON syntax error that silently voids the entire block, and its FAQ content must be rewritten to reflect this product's actual return policy rather than the copied RayCon reference.”

Common mistakes

What trips people up

  • Only checking JSON syntax, not content accuracy — syntactically valid JSON can still violate Google's content guidelines, like an aggregateRating for reviews that aren't visible on the page.

  • Missing a mismatched @type because the rest of the fields look complete — a wrong @type disqualifies the entire block from its intended rich-result type regardless of how complete the other fields are.

  • Overlooking a trailing comma as a minor issue — invalid JSON is silently ignored by Google entirely, it isn't a partial failure, it's zero rich-result eligibility.

  • Assuming copied-and-edited schema is safe once the type and product name are updated — every value inside the block, not just the headline fields, needs to be verified against this exact page, not the page it was copied from.

Final deliverable

A completed teardown sheet flagging every schema defect across both specimens, ranked critical to cosmetic, each with the corrected JSON-LD line.

See a reference example
Sample output
Applying the same read to a Warby Parker-style frame PDP (illustrative): the draft correctly used @type: Product, but the aggregateRating block cited a 4.9 rating pulled from a different frame color's reviews entirely, a values-not-updated mistake caught before launch. The fix scoped aggregateRating to the exact SKU shown on the page rather than the product family average.

Success criteria

You're done when you can:

  • Identified the Article-instead-of-Product type mismatch in specimen 1 as the highest-severity defect
  • Flagged the invisible aggregateRating (no reviews shown on page) as a guidelines violation, not just a missing field
  • Caught the trailing comma in specimen 2 as a hard validation failure, not a cosmetic issue
  • Named the copied RayCon reference in specimen 2 as a values-not-updated mistake distinct from the syntax error

Key takeaway

A schema teardown has two separate failure classes: syntax errors that silently kill eligibility, and guideline violations that are syntactically fine but risk a manual penalty. Catching only one class isn't enough, both specimens needed a full read against the actual rendered page, not just a JSON linter.