Structured data that contradicts visible page content is treated as deceptive markup under Google's Structured Data Policies, and offending pages lose rich result eligibility or get manual actions applied. When an Article's JSON-LD headline is hardcoded while the H1 renders from post.title, every new post ships a schema lie. Findability collapses for the affected templates because rich snippets disappear and crawlers downrank the URL.
Medium because impact is per-template loss of rich results, not site-wide deindexation or data exposure.
Populate JSON-LD from the same variables that render the visible DOM. In app/products/[slug]/page.tsx, bind name and description to the product object you already fetched for the template, and never hand-write static strings in a dynamic context.
const product = await getProduct(slug)
const schema = { '@type': 'Product', name: product.name, description: product.description }
ID: marketing-advanced-seo.structured-data.markup-content-match
Severity: medium
What to look for: Count all JSON-LD blocks with content fields (headline, name, description). Before evaluating, extract and quote the first 3 structured data titles/names found in JSON-LD blocks. Compare each with the visible page content. For JSON-LD blocks that can be statically examined, enumerate whether content fields in the schema match what would actually be visible on the page. Specifically: (1) If an Article schema has a headline field, does it match the page's H1? (2) If a Product schema has a name, does it match the product title rendered on the page? (3) Check whether any JSON-LD uses hardcoded strings in a template that renders dynamic data, where the static value does not match the rendered output — for example, a hardcoded headline in JSON-LD when the page H1 is dynamically populated from a different variable.
Pass criteria: All statically determinable schema content fields (headline, name, description) appear consistent with the corresponding visible page elements. At least 95% of structured data values must match visible page content.
Fail criteria: A schema field contains a hardcoded value that clearly does not match the rendered page content, or schema uses template/placeholder text in production code.
Skip (N/A) when: All JSON-LD content is dynamically generated from the same data source as the visible page content (no static mismatch is possible), or no JSON-LD is present.
Cross-reference: For schema validity, see schema-validity.
Detail on fail: "Mismatch detected: Article JSON-LD 'headline' field is hardcoded as a static string but the page H1 is populated dynamically. Schema markup may not reflect actual content at runtime."
Remediation: Google can penalize or ignore structured data that misrepresents page content. Ensure your JSON-LD fields are populated from the same data source as your visible content. Both the rendered heading and the schema headline should use post.title — not one hardcoded string and one dynamic value. If you are building schema in a layout that does not have access to page-specific data, pass that data explicitly as props rather than using placeholder strings.
// Ensure JSON-LD in app/products/[slug]/page.tsx uses the same data source as rendered content
const product = await getProduct(slug)
const schema = { "@type": "Product", "name": product.name, "description": product.description }