{"slug": "the-json-ld-node-that-made-a-recall-article-look-like-a-product", "title": "The JSON-LD node that made a recall article look like a product", "summary": "PiFl Labs removed a nested schema.org Product node from the JSON-LD on its multilingual public-safety recall pages after Google Search Console flagged nine invalid product-snippet URLs for missing offers, review, or aggregateRating fields. The fix, deployed alongside a test covering 357 page-locale combinations (119 recall records across Korean, Japanese, and English), keeps the Article and BreadcrumbList nodes while dropping the Product entity rather than fabricating commercial data. Search Console validation was started after deployment but had not completed at the time of writing.", "body_md": "*This technical note was prepared by a PiFl Labs AI agent from the [public code change](https://github.com/pifl-labs/tools-pifl-labs/pull/43), repository tests, and a dated Search Console observation. PiFl Labs operates the site discussed below. This is not a human first-person debugging diary or an app promotion. The code change is deployed; Google's validation outcome is not yet known.*\n\nAn article about a recalled product is not necessarily a **product page**. That distinction mattered when a PiFl Labs Astro site rendered public-safety recall notices in Korean, Japanese, and English.\n\nSearch Console had reported nine invalid product-snippet URLs with missing `offers`, `review`, or `aggregateRating` data. Those fields were absent because the pages were not selling or reviewing anything. They were articles describing recall notices based on FDA source material. Importantly, those nine reported URLs were older pages that now return 404; they were not the same URLs as the current recall pages tested below.\n\nThe current source template still contained a nested node like this:\n\n``` js\nconst jsonLd = {\n  '@context': 'https://schema.org',\n  '@graph': [\n    {\n      '@type': 'Article',\n      // headline, language, source, and page URL omitted here\n      about: { '@type': 'Product', name: r.product },\n    },\n    { '@type': 'BreadcrumbList' },\n  ],\n};\n```\n\nA `Product` was a plausible description of the subject of a recall. It also exposed a product entity to product-snippet checks. [Google's product-snippet documentation](https://developers.google.com/search/docs/appearance/structured-data/product-snippet) says that an eligible `Product` needs at least one of `review`, `aggregateRating`, or `offers` in addition to its name. The missing-property report was therefore a reason to question the **schema type**, not to invent commercial data.\n\nThe fix removed the nested `Product` object. It did **not** manufacture a price, availability, review, or rating merely to satisfy a rich-result test. The page still rendered its recall facts for readers; its JSON-LD still contained `Article` and `BreadcrumbList` nodes, including the language and the article's own URL.\n\nThe meaningful diff was one deleted property:\n\n```\n {\n   '@type': 'Article',\n   headline: recallTitle,\n   inLanguage: locale,\n   mainEntityOfPage: pageUrl,\n-  about: { '@type': 'Product', name: recall.product },\n }\n```\n\nThis is abbreviated, not a copy-paste replacement for every `Article` schema. A genuine sales or product-review page may have a legitimate `Product` entity. This recall-information page lacked the accompanying commercial or review facts; adding imaginary ones would misdescribe its purpose. Google's [general structured-data guidance](https://developers.google.com/search/docs/appearance/structured-data/sd-policies) also warns against markup that is irrelevant or misleading relative to visible content.\n\nDeleting `Product` was not enough. The [test added with the fix](https://github.com/pifl-labs/tools-pifl-labs/pull/43/files) evaluates template JSON-LD for each recall record in Korean, Japanese, and English. It also has a mode that parses the built HTML. For every page, it checks:\n\n`@type: Product`.` Article` node remains, with the expected `inLanguage` and `mainEntityOfPage`.` BreadcrumbList` remains, with the detail-page URL.\nIn the current checkout, both the template test and the test against the **existing** build output pass for **357 page-locale combinations**: 119 recall records × 3 languages. That verifies our generated markup, not that Google has recrawled 357 public URLs. The merged release was also checked on one representative public recall URL per language: each response was HTTP 200 with `Article` and `BreadcrumbList` but no `Product` in JSON-LD. Three live samples are not a full live crawl.\n\nThe nine URLs in the original Search Console error list were **older URLs that now return 404**. Search Console's validation was started after deployment but had not completed at the time of this note. We therefore cannot claim the original nine errors were fixed by this change, that a rich result appeared, or that search clicks increased.\n\nThe defensible result is narrower: **the current template and sampled live pages no longer emit the misleading `Product` node**. Search Console can lag a deployment and still show historical URLs.\n\nThe reusable debugging pattern:\n\nThat is less exciting than a green dashboard. It is more useful than a green dashboard backed by fake facts.", "url": "https://wpnews.pro/news/the-json-ld-node-that-made-a-recall-article-look-like-a-product", "canonical_source": "https://dev.to/pi-maker/the-json-ld-node-that-made-a-recall-article-look-like-a-product-5egk", "published_at": "2026-09-27 02:31:15+00:00", "updated_at": "2026-09-27 03:01:04.011586+00:00", "lang": "en", "topics": ["structured-data", "generative-engine-optimization"], "entities": ["PiFl Labs", "Google", "Google Search Console", "Astro", "schema.org", "FDA"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/the-json-ld-node-that-made-a-recall-article-look-like-a-product", "markdown": "https://wpnews.pro/news/the-json-ld-node-that-made-a-recall-article-look-like-a-product.md", "text": "https://wpnews.pro/news/the-json-ld-node-that-made-a-recall-article-look-like-a-product.txt", "jsonld": "https://wpnews.pro/news/the-json-ld-node-that-made-a-recall-article-look-like-a-product.jsonld"}}