Glossary

JSON-LD

JSON-LD (JavaScript Object Notation for Linked Data) is a format for embedding structured data in a web page as a self-contained block of JSON, placed inside a script tag. Search engines parse it to learn what a page is about — that a PDP describes a 3/8-16 Grade 8 hex cap screw with a specific GTIN, price, and availability — instead of inferring it from visible HTML. It is the structured data format Google recommends.

What JSON-LD actually is

JSON-LD stands for JavaScript Object Notation for Linked Data. It is ordinary JSON with two extra keys that do all the work:

  • @context — which vocabulary the field names come from. For product pages, that is https://schema.org.
  • @type — what kind of thing this object is: Product, Offer, Brand, Organization.

Without those, {"name": "hex cap screw", "sku": "HCS-38162"} is just text a parser can load. It cannot tell whether name means the product's name, the brand's name, or the author of the page. Add the context and the type, and every key points at a public definition anyone can look up.

The markup lives in a script tag in the page source:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "3/8-16 x 2 in. Grade 8 Hex Cap Screw, Yellow Zinc",
  "sku": "HCS-38162-G8-YZ",
  "mpn": "38162G8YZ",
  "gtin13": "0012345678905"
}
</script>

A browser renders none of it. It is invisible to the person shopping. It exists so a crawler does not have to work out that 0012345678905 is a GTIN and not a model number, or dig the $12.40 out of a sentence.

JSON-LD vs microdata vs RDFa

All three express the same schema.org vocabulary. The difference is where the markup lives — and that difference is operational, not semantic.

DimensionJSON-LDMicrodataRDFa
Lives whereOne script block, separate from the pageitemprop attributes on visible HTMLproperty attributes on visible HTML
Coupled to designNoYesYes
Injectable via tag managerYes, nativelyOnly by rewriting the rendered DOM, which is impractical at catalog scaleOnly by rewriting the rendered DOM, which is impractical at catalog scale
Google supportSupported, and the format Google recommendsSupportedSupported
Typical failure modeBlock drifts out of sync with the rendered pageA template refactor drops the itemprop attributes and the markup silently vanishesA template refactor drops the property attributes and the markup silently vanishes

The practical case for JSON-LD is that your front-end team can rebuild the PDP without touching the structured data, and your data team can change the structured data without touching the PDP.

The practical risk is the flip side of the same coin: nothing forces the block to agree with what the page shows. Microdata is welded to the visible price. JSON-LD is not, so it can lie by accident.

What a Product block should carry

Google's Product rich result documentation defines what is required and what is merely recommended. For a B2B catalog, the useful shape looks like this:

FieldRequired?Example valueWhy it's there
@typeRequiredProductTells the parser what to expect
nameRequired3/8-16 x 2 in. Grade 8 Hex Cap Screw, Yellow ZincThe title in a rich result
offersRequired{"@type": "Offer", ...}No offer, no price treatment
skuRecommendedHCS-38162-G8-YZYour identifier
mpnRecommended38162G8YZMatches you to the manufacturer's record
gtin13Recommended0012345678905The global identifier that lets engines merge listings
brandRecommended{"@type": "Brand", "name": "..."}Nested object, not a string
offers.priceRequired12.40No currency symbol and no thousands separator: "12.40", never "$12.40"
offers.priceCurrencyRequiredUSDISO 4217
offers.availabilityRecommendedhttps://schema.org/InStockFull URL, not the word "in stock"
additionalPropertyOptional{"@type": "PropertyValue", "name": "Thread Pitch", "value": "16 TPI"}Where specs go when schema.org has no dedicated field

That last row is where most technical catalogs actually live. Schema.org has no voltageRating and no threadPitch. A UL-listed 600V wire connector expresses those through repeated additionalProperty entries, which engines read even though they rarely surface them as a rich result on their own.

Why engines want it

A crawler reading your PDP as prose has to guess. Is "600V" a rating, a model number, or part of a marketing line? JSON-LD removes the guess and replaces it with an assertion.

That matters in three places:

  • Rich results. Price, availability, and review stars in the SERP come from parsed markup, not from a language model reading your copy.
  • Merging. A GTIN in the markup lets an engine recognize that your listing and four competitors' listings are the same physical part.
  • Answer engines. LLM-backed search grounds answers in whatever it can extract cheaply and confidently. A structured block is cheaper and more confident than a paragraph.

None of this is a ranking bonus for having markup. It is a retrievability change, and the difference is worth being precise about. Ranking is a contest among pages already eligible for a surface. Retrievability decides which contests you are entered in at all.

A PDP with no parsable price is not ranked lower in the price box; it is not in the price box. With no GTIN it is not a candidate for a merged listing. An answer engine asked who stocks a Grade 8 hex cap screw in yellow zinc has nothing cheap to lift from it. Markup does not move you up a list. It puts you on lists you were never on.

Where it breaks in a real catalog

The markup is the easy part. Any modern PDP template can emit a JSON-LD block in an afternoon. What breaks is upstream.

  • Empty fields. You cannot emit gtin13 for 40,000 SKUs if 40,000 SKUs have no GTIN. Omitting the key is valid and functionally useless: the block parses, and the identifier an engine needs to merge your listing is simply absent. Emitting "gtin13": null is worse, because null is not a valid value and Search Console will flag it as an error.
  • Wrong nesting. "brand": "Acme" instead of a Brand object. Common, and quietly costs you the brand association.
  • Drift. Price changes in the ERP, the page updates from a live call, the JSON-LD comes from a nightly cache. Now they disagree, and mismatched markup is worse than none.
  • Spec fields with nowhere to go. Thread pitch, amperage, listing agency — all real, all sitting in a PDF datasheet, none in a field the template can read.

Your PIM stores the values; the template serializes them. JSON-LD cannot serialize data you do not have.

Frequently asked questions

Is JSON-LD better than microdata for SEO?

Google supports both and does not rank one above the other. JSON-LD is easier to operate: it sits in a single script block instead of being sprinkled across visible HTML as itemprop attributes, so a template redesign cannot silently strip your markup. Google's own documentation recommends JSON-LD. If you already have working microdata, there is no ranking reason to rip it out, only a maintenance one.

Does the JSON-LD have to match what is shown on the page?

Yes. Google's structured data policy requires markup to represent content visible to users. If your JSON-LD says $12.40 and InStock while the page shows $14.90 and backordered, that is a mismatch and can trigger a manual action or loss of rich results. The safest pattern is generating the JSON-LD from the same data the template renders, not from a separate export.

Where should the JSON-LD script go on the page?

Either the head or the body works. Google reads application/ld+json anywhere in the document, including blocks injected by JavaScript, as long as the block exists in the rendered DOM. Head placement is conventional and easiest to reason about. What matters more is that there is exactly one Product block per product page. Multiple Product blocks make it ambiguous which one describes the primary product.

Can I add JSON-LD with Google Tag Manager instead of changing the site?

You can, and it is a common stopgap because JSON-LD is decoupled from the HTML. It works but adds latency and a rendering dependency: the crawler has to execute the container before it sees your markup. Treat tag-manager injection as a way to test whether markup earns you anything, then move it into the page template once it does.

What is the difference between JSON-LD on a page and a product feed?

A feed is a file you push to a destination, such as Google Merchant Center, Amazon, or a distributor portal, on a schedule. JSON-LD is markup a crawler pulls from your own page. They usually carry the same facts (GTIN, MPN, price, availability) and should agree. Feeds control paid and marketplace placement; JSON-LD controls how organic search and answer engines read your PDP.

Related terms

See it on your own SKUs.

A 30-minute walkthrough on your categories and your supplier data.

Book a demo