Skip to main content

Pattern · TypeScript

FAQ and HowTo JSON-LD: when markup is appropriate

Avoid markup “for stars only”: visible content, one primary intent per page, Google guidelines.

Level: advancedTime estimate: ~30 min for policy

Google may ignore or penalize markup when questions do not match visible text or the whole landing is duplicated as FAQ.

  • Each FAQ answer must appear on the page for users
  • do not mark the entire catalogue as HowTo
  • follow Search Central type docs

FAQPage and HowTo only earn rich results when rules hold: human-first content, full parity with HTML, no spam or hidden text.

Code

Illustrative fragment (do not copy blindly — verify current Google specs):

const faqLd = {
  '@context': 'https://schema.org',
  '@type': 'FAQPage',
  mainEntity: [
    {
      '@type': 'Question',
      name: 'Is the short question identical to the on-page heading?',
      acceptedAnswer: {
        '@type': 'Answer',
        text: 'Yes — it matches the visible paragraph under the question verbatim.',
      },
    },
  ],
}

Verification

  • Every question/answer pair in JSON-LD exists in the DOM for real users without empty accordion shells.
  • Rich Results Test: no blocking errors; avoid dozens of low-quality duplicate questions.

Sources

Need this implemented for your domain and stack?

Short form: name, phone, and site. After you submit, we reply with next steps and a phase outline; details are refined on a call.