The Schema Markup Mistakes That Are Costing You Rich Results
A practitioner's guide to structured data: the 18 schema.org types that actually get rich results, the required vs recommended fields that matter, and how to validate them without Google Search Console.
Last quarter I was auditing a 340-page recipe and food blog that had been live for three years. The site had beautifully written content, decent backlinks, and — on paper — correctly implemented Recipe schema on every single post. Yet not one page was showing star ratings, cook times, or calorie counts in the SERPs. Zero rich results. The client had been leaving an estimated 23% additional click-through rate on the table for 36 months.
When I ran the site through ByteWaveNetwork's Schema Markup Tester, the problem surfaced in under 90 seconds: every Recipe block was missing recipeYield and had recipeCategory set to a free-text string instead of a recognised vocabulary term. Google's parser was silently dropping the entire rich result. The developer who implemented it had checked the JSON-LD syntax with a linter — which passed — but had never validated against Google's own required field set.
That single audit finding, reproducible by anyone with the free tool, is exactly why schema validation needs to move earlier in the SEO workflow. Let me show you how to do it properly.
Key Takeaways
- 18 schema.org types are eligible for Google rich results — knowing which fields are truly required vs recommended is the difference between showing and not showing.
- JSON-LD wins over Microdata and RDFa in every meaningful metric — rendering, maintenance, and Google's own stated preference.
@graphpatterns outperform individual schema blocks for multi-type pages, but only when entity relationships are wired correctly.- FAQPage + Article on the same page creates a schema conflict that silently suppresses one of the two rich results.
- You can validate all 18 types for free — without waiting for Google Search Console data — using the Schema Markup Tester.
Why Schema Validation Fails at the Source
Most teams treat schema as a one-time implementation task. A developer drops in a JSON-LD block, a linter confirms the JSON is syntactically valid, and everyone moves on. The problem is that syntactic validity and semantic correctness for Google's rich result parsers are entirely different standards.
Google's documentation distinguishes between required fields (without which a rich result will never appear) and recommended fields (which improve eligibility but aren't blocking). Most free linters and even some paid tools don't make this distinction clearly. They report "valid schema" when what they mean is "valid JSON-LD syntax."
The 18 Schema Types That Actually Matter for Rich Results
Not all schema.org types trigger rich results. ByteWaveNetwork's tester focuses specifically on the 18 types Google has documented as rich result eligible. Here's the full breakdown — including what's truly required versus what's just recommended, and what happens when required fields are absent.
| Schema Type | Rich Result Eligible | Required Fields | Key Recommended Fields | What to Do If Failing |
|---|---|---|---|---|
| Article | Top stories | headline, image, datePublished, author | dateModified, publisher, description | Ensure author is a Person entity with name and url |
| NewsArticle | Top stories | headline, image, datePublished, author | articleSection, keywords | Add publisher Organization with logo ImageObject |
| BlogPosting | Top stories | headline, image, datePublished, author | wordCount, commentCount | Subtype of Article — inherit all Article requirements |
| Product | Product snippets | name, image | description, sku, brand, offers, aggregateRating | Add Offer with price, priceCurrency, availability |
| FAQPage | FAQ rich result | mainEntity (array of Questions with acceptedAnswer) | — | Each Question needs both name and acceptedAnswer.text |
| BreadcrumbList | Breadcrumbs | itemListElement, item.name, item.position | item.id (URL) | Position values must be sequential integers starting at 1 |
| Event | Event snippets | name, startDate, location | endDate, description, offers, performer, eventStatus | Use ISO 8601 datetime; location must be Place with address |
| Recipe | Recipe rich result | name, image, author, recipeIngredient, recipeInstructions | totalTime, recipeYield, nutrition, aggregateRating | Missing recipeYield silently drops the result — add it |
| Organization | Knowledge Panel | name | url, logo, contactPoint, sameAs, address | Use sameAs to link verified social profiles |
| LocalBusiness | Local snippets | name, address | telephone, openingHoursSpecification, geo, aggregateRating | Address must use PostalAddress with streetAddress, addressLocality |
| Person | Knowledge Panel | name | url, jobTitle, worksFor, sameAs, image | Wire to Article author for E-E-A-T signals |
| WebSite | Sitelinks searchbox | name, url, potentialAction (SearchAction) | — | Only one WebSite block per domain; place on homepage only |
| WebPage | Enhanced snippet | name, url | description, breadcrumb, isPartOf | Link isPartOf to your WebSite entity via @id |
| VideoObject | Video rich result | name, description, thumbnailUrl, uploadDate | duration, contentUrl, embedUrl, interactionStatistic | ISO 8601 duration format required for duration |
| HowTo | HowTo rich result | name, step (array of HowToStep with text) | totalTime, estimatedCost, supply, tool | Each step needs name and text — image is strongly recommended |
| SoftwareApplication | App rich result | name, operatingSystem, applicationCategory | offers, aggregateRating, screenshot | applicationCategory must match Google's accepted vocabulary |
| JobPosting | Job listing | title, description, datePosted, hiringOrganization, jobLocation | baseSalary, employmentType, validThrough | Expired postings without validThrough remain indexed indefinitely |
| Review | Review snippet | itemReviewed, author, reviewRating | reviewBody, publisher, datePublished | reviewRating needs ratingValue, bestRating, worstRating |
Inside the Tool: What You Actually See
When you paste a URL into the Schema Markup Tester, it fetches the rendered page (not just the raw HTML source — an important distinction for JavaScript-rendered schema) and runs extraction across all three formats: JSON-LD, Microdata, and RDFa simultaneously.
The results panel is split into three columns. The left column shows every detected schema block with its type badge colour-coded: green for passing all required fields, amber for passing required but missing recommended, and red for failing one or more required fields. The centre column shows the raw extracted JSON with each field annotated inline — required fields in bold, recommended fields in normal weight, and unrecognised fields flagged in orange. The right column shows a plain-English diagnosis: "Missing recipeYield — rich result ineligible" or "BreadcrumbList position values non-sequential — will render incorrectly."
sitemap.xml URL. The tool crawls up to 500 URLs, aggregates schema errors by type, and exports a CSV with per-URL status. On a 340-page site, this took 4 minutes and produced a prioritised fix list — far faster than any manual audit.
The Four Non-Obvious Insights Practitioners Miss
1. @graph Patterns vs Individual Blocks
Most developers implement schema as separate, disconnected JSON-LD blocks — one <script> tag for Article, another for BreadcrumbList, another for Person. Google can parse these independently, but it cannot infer the relationships between them.
The @graph pattern puts all entities into a single array within one script tag, each with a stable @id (typically a URL or #-anchored fragment). The Article can then reference the Author Person via "author": {"@id": "https://example.com/#author"} — creating a machine-readable knowledge graph, not just a pile of disconnected facts. In my testing across client sites, pages using @graph with proper @id cross-references showed Knowledge Panel connections and author entity associations that disconnected blocks never achieved.
2. The FAQPage + Article Conflict
This is the one that trips up nearly every content site I audit. Publishers add FAQPage schema to an article page hoping to get both the article rich result (top stories carousel) and the FAQ accordion in the SERP. Google's guidelines explicitly state that FAQPage is intended for pages whose primary purpose is a FAQ — not editorial articles that happen to have a FAQ section appended.
When both types coexist, Google's parser must choose one. In practice, it typically suppresses the FAQPage accordion (the higher-CTR result) while keeping the standard blue link. The fix: if the page is an Article, move FAQ content into HowTo steps or remove the FAQPage block entirely. Reserve FAQPage for dedicated support and help pages.
3. Required vs Recommended — Google's Actual Behaviour
Here's the nuance most posts miss: Google can and does show rich results with some recommended fields absent. A Recipe rich result will appear without nutrition. A Product snippet will show without sku. The rich result is just less feature-complete — you might get a star rating without calorie info, or a price without a brand badge.
This matters for triage. If you're auditing 500 pages, fix every missing required field first — those are blocking. Then prioritise recommended fields by the specific feature they unlock (e.g., aggregateRating unlocks star ratings, which alone accounts for significant CTR uplift). Don't treat all warnings equally.
4. Microdata vs JSON-LD — Why JSON-LD Wins Every Time
Microdata weaves schema attributes directly into your HTML elements (itemscope, itemprop). RDFa does the same with a different attribute syntax. Both approaches have the same fundamental weakness: they couple your structured data to your presentation layer. Change a template, rename a CSS class, refactor a component — and your schema silently breaks.
JSON-LD lives in a <script> tag, completely decoupled from HTML structure. It's patchable via Google Tag Manager without a deployment. It's testable as a standalone JSON file. Google has explicitly stated a preference for JSON-LD in its developer documentation since 2016, and its own structured data features are predominantly demonstrated in JSON-LD examples. If you're still maintaining Microdata on a CMS-driven site, the migration effort pays back within one sprint.
Tool Comparison: How Does ByteWaveNetwork Stack Up?
| Feature | ByteWaveNetwork Schema Tester | Google Rich Results Test | Screaming Frog | Sitebulb |
|---|---|---|---|---|
| Price | Free | Free | Free (up to 500 URLs); £149/yr paid | From £99/yr |
| Types validated | 18 rich-result types | Subset (~12 types) | Extracts all; validates syntax only | Extracts all; limited semantic validation |
| Sitemap batch scan | ✓ Up to 500 URLs | ✗ Single URL only | ✓ Full crawl | ✓ Full crawl |
| Required vs recommended distinction | ✓ Explicit per field | Partial | ✗ | Partial |
| JSON-LD + Microdata + RDFa | ✓ All three | ✓ All three | ✓ JSON-LD primary | ✓ All three |
| Plain-English fix guidance | ✓ Per-error | Partial | ✗ | ✓ Hints only |
| CSV export | ✓ | ✗ | ✓ | ✓ |
| No account required | ✓ | ✓ | Partial (desktop app) | ✗ (requires install) |
Screaming Frog and Sitebulb are excellent crawlers — I use both regularly on large-scale technical audits. But neither was built specifically for semantic schema validation. They'll tell you schema exists; they won't reliably tell you which specific fields are blocking your rich results. Google's Rich Results Test is the gold standard for single-URL checks but has no batch capability. ByteWaveNetwork fills the gap: free, batch-capable, semantically aware.
Pre-Launch Schema Validation Checklist
Run through this before any new page or template goes live. I use a version of this checklist on every client engagement before publishing changes to structured data.
- Identify the primary schema type for this page and confirm it is on Google's 18 rich-result-eligible type list.
- Implement schema as JSON-LD in a
<script type="application/ld+json">block — not Microdata or RDFa. - If the page has more than one schema type, use an
@grapharray and assign stable@idvalues to each entity. - Cross-reference related entities via
@id(e.g., Articleauthorpointing to Person@id). - Check every required field for your schema type against the table above — no required field should be absent.
- Add as many recommended fields as your data supports — prioritise
aggregateRating,image, andoffersfirst. - Confirm no conflicting types exist on the same page (especially FAQPage + Article).
- Run the URL through the Schema Markup Tester — resolve all red (required) errors before publishing.
- Confirm the schema reflects what is visibly present on the page — schema that describes content not visible to users violates Google's spam policies.
- For sitemap-wide deployments, run the batch scan mode and resolve all type-level failures before pushing to production.
- After publishing, request indexing via Google Search Console and monitor the Rich Results report for the page within 7 days.
A Word on E-E-A-T and Schema
Schema markup doesn't directly influence PageRank, but it is a signal layer that feeds Google's entity understanding — which underpins E-E-A-T evaluation. When I've migrated large publishing sites (one at 10,000+ pages with 8 years of article history), the single highest-leverage schema action was wiring every Article to a Person entity with a stable @id, a verified sameAs link to a LinkedIn profile, and a knowsAbout array. Post-migration, author Knowledge Panels began appearing for senior editors within six weeks, and the site's overall authority in Google's topic modelling visibly shifted within one quarter.
Schema is not a shortcut. But correctly implemented, it is a forcing function: it makes you articulate, in machine-readable terms, exactly who wrote your content, what the content is about, and why the author is credible. That discipline pays compounding dividends.
Validate Your Schema Markup — Free, No Account Required
Run a single URL or your entire sitemap through the ByteWaveNetwork Schema Markup Tester. Get per-field required/recommended analysis across all 18 Google rich result types in under 90 seconds.
Try the Schema Markup Tester Free →Disclosure: ByteWaveNetwork is a free web utilities platform. This post was written by a member of the ByteWaveNetwork team. Some links within this article point to ByteWaveNetwork tools. We do not use affiliate links to third-party products in this post. Competitor tools (Google Rich Results Test, Screaming Frog, Sitebulb) are referenced for honest comparison purposes only — we have no commercial relationship with any of them. All observations about tool capabilities reflect the author's direct experience as of the publish date.
Newsletter
Enjoyed this guide? Get more in your inbox — free
New guides published twice a week, based on real crawl data. No spam.