Skip to content
pageinspection

Valid is not eligible: the properties Google actually requires

Two organisations decide what your markup needs, they publish separate documents, and only one of them is enforcing anything. Schema.org says almost nothing is mandatory. Google says a specific list of properties per feature, and a block missing one of them is dropped whole. The word "valid" belongs to the first document and gets read as a verdict from the second.

The short answer

Valid schema.org markup and eligible markup are two different tests against two different documents. schema.org says which properties exist; Google publishes, separately, which ones a given rich result requires. A block missing a required property validates cleanly, earns nothing, and gives no error to tell you why.

CriticalAudit check · Required schema fields

Two documents, written for different purposes

Schema.org is a vocabulary. Its job is to define what a word means and where it may be used: a property page tells you which types accept it and what kinds of value it takes, and that is the whole remit. It has no notion of a mandatory property, which is why its validator will never report one as missing. From its point of view a Product with nothing but a name is as correct as one with forty properties. Both are things it can understand.

Google's structured data documentation is a different kind of document with a different purpose. It is organised by feature rather than by type, and each feature page carries a table splitting properties into Required and Recommended. That table is not a description of the vocabulary. It is the entry condition for one presentation on one search results page, and Google is free to change it, which it does.

Nothing in your markup is invalid when a required property is missing. It is ineligible, and those are not the same word.

One consequence of the split catches people out. Requirements attach to features, not to types, so the same type can clear the bar for one presentation and miss it for another because two features read it with different tables. And a type with no feature attached to it has no required properties at all, because there is nothing to be eligible for.

The same Product, eligible and not

Here is a block that passes a vocabulary check cleanly and earns nothing. Every property is real, every value is the right kind of thing, and there is no syntax error in it.

ineligible.json
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Linen-thread hardback notebook",
  "description": "192 pages, section-sewn, lies flat when open.",
  "image": "https://northgatebindery.com/img/nb-192-front.jpg",
  "offers": {
    "@type": "Offer",
    "price": "24.00"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.6"
  }
}

Two properties are missing and both are required for the product result. The Offer has a price and no priceCurrency, so 24.00 is a number rather than an amount of money. The AggregateRating has a score and no count, so nothing says whether 4.6 came from three people or three thousand. Neither omission is a syntax problem and neither is reported by a vocabulary validator.

eligible.json
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Linen-thread hardback notebook",
  "description": "192 pages, section-sewn, lies flat when open.",
  "sku": "NB-192-LIN",
  "image": ["https://northgatebindery.com/img/nb-192-front.jpg"],
  "brand": { "@type": "Brand", "name": "Northgate Bindery" },
  "offers": {
    "@type": "Offer",
    "url": "https://northgatebindery.com/notebooks/nb-192-lin",
    "price": "24.00",
    "priceCurrency": "GBP",
    "availability": "https://schema.org/InStock",
    "priceValidUntil": "2026-12-31"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.6",
    "reviewCount": "38"
  }
}

For the product result Google asks for a name and at least one of offers, review or aggregateRating. Whichever of those you supply then brings its own table with it: an Offer needs a price and a currency, an AggregateRating needs a value and either a reviewCount or a ratingCount, a Review needs an author and a rating. Requirements nest, which is the part a checklist mentality misses. Confirm the current table on the feature page before you ship, because these lists are revised and this page is not the authority on them.

Half an implementation costs more than none

The instinct is that some markup beats no markup, and on this rung it is wrong. Four reasons, in the order they cost you money.

  • You pay the maintenance and get nothing back. Once a price is in your markup, every price change has to update two places instead of one. An incomplete block carries that whole liability with none of the eligibility that was supposed to justify it.
  • A permanent error count hides real ones. Google's report lists items missing a required property as errors, so a template that has always been incomplete produces a number that never reaches zero. Six months later nobody reads that report, and a genuine regression arrives inside a count everyone has learned to ignore.
  • The missing property is the expensive one. Nobody omits name. What goes missing is the review count nobody collects, the currency the storefront treats as implicit, the modified date the CMS never recorded. Those are exactly the properties your competitors had to build a system to supply, which means the comparison you lose is with the sites that did.
  • A stale value is worse than an absent one. A half-finished block is usually half-wired, and the properties that were filled in by hand stop matching the page the first time the page changes. Markup that contradicts its own page is a different and more serious problem than markup that says less than it could.

A missing required property is usually a missing column, not a typo.

That is the useful thing to take from this check. When a block is short, the developer rarely forgot: the value does not exist anywhere to interpolate. Which means the fix is a schema change in your database, an import, or an editorial habit, and the markup was only the thing that made the gap visible.

Which templates ship a half-finished block

Completeness is a property of a template rather than of a page, and the same template produces complete blocks and incomplete ones depending on the row behind it. The product with no reviews yet, the post imported before anyone tracked authors, the variant with no price set. Finding those means comparing what is present against what the declared type needs, across every page, which is a different job from opening one URL.

This one needs the full crawl

This reads inside each block to compare the properties present against what the declared type requires, which is a field-by-field comparison rather than something a single page-level value can carry.

The instant search on this site audits a single page, so rather than show you a verdict it cannot support, this guide sends you to the place the check actually runs.

Telling a Google requirement from a schema.org property

The reliable method is to stop reading schema.org for this question. Its type pages list every property a type accepts, in alphabetical order, with no indication of importance, because importance is not something a vocabulary has an opinion about. Reading schema.org/Product to work out what you need produces a list of everything and a plan to write half of it.

Google publishes an index of the structured data features its search results support, and each feature has its own page with the Required and Recommended table for that feature. That table is the only list that decides eligibility. If a type you are marking up does not appear in that index at all, then no properties are required, and the reason to write the markup has to be something other than a search feature.

There is also a faster way to answer it for a page you have already built, without reading either document. Run the URL through Google's Rich Results Test and read the two categories separately. An error means a required property is missing and the item is out. A warning means a recommended property is missing and the item is still eligible. That distinction is the requirement table, applied to your actual markup, which is more useful than the table itself.

Two cautions on the tooling. It only reports on features it still renders, a limit the HowTo guide works through, so a type with no live result gives you no requirement feedback at all. And the vocabulary validator at validator.schema.org is the wrong instrument here by design: it will pass the ineligible block above without a murmur, because from its side there is nothing wrong with it.

Why an incomplete block is rated as high as a missing one

Because eligibility has no partial credit. Almost every other Critical on the catalogue is proportional: a longer redirect chain is somewhat worse than a shorter one, a thinner page competes somewhat less well, and improving the number improves the outcome. This one is a gate. A block carrying four of five required properties returns exactly the result of a block carrying none of them, and the effort that produced those four properties bought nothing at all. That step function is what puts it at the top of the severity scale.

The second reason is how long the fix takes. A syntax error is a same-day change. A missing required property is usually a request to record data nobody is recording, which means a field added to a content model, a backfill across existing rows, and a habit imposed on whoever publishes next. Measured in weeks, not hours. A check whose remedy has that lead time is one you want surfaced at the start of a quarter rather than discovered when somebody asks why a competitor's listing shows a rating and yours does not.

Confirming a block is eligible, not merely valid

Three passes, in this order, because each one catches something the next cannot see.

  • One URL, in the Rich Results Test. Read the errors as the required list and the warnings as the recommended one. Clear the errors before you argue about the warnings.
  • Every URL, in Search Console.Its enhancement reports group by feature and by reason, so a single row reading "missing field priceCurrency" against four hundred pages tells you which template is short. That is the number to drive to zero, and driving it to zero is what makes it useful again.
  • A sample, by eye.Open the page and the markup together and read the values against each other. Price, availability and rating are the three that drift, and a complete block full of last quarter's numbers passes every tool above.

One expectation to set before you start. Clearing the required list makes an item eligible, and eligible is not shown. Whether a result appears is a separate decision made per query, so the honest success condition here is an error count of zero rather than a screenshot of a rating in the results. If the block is not being read at all, the problem is a rung lower down and a parse failure is where to look first.

Questions this check raises

Why does my valid schema not produce a rich result?
Almost always a missing required property. schema.org has no required properties at all, so a block with a type and a name validates. Google publishes its own requirements per feature, and a block short of them is simply not eligible. The Rich Results Test names the missing field; a generic validator does not.
Is half an implementation better than none?
It is usually worse. It costs the same maintenance, it looks done in every review, and it produces nothing, so the gap goes unnoticed for years. A complete block on the templates that matter beats a partial block on every template.
How do I tell a Google requirement from a schema.org property?
By where it is documented. schema.org lists what the vocabulary allows; the Google Search Central documentation for each feature lists what that feature requires and recommends. Only the second one decides eligibility, and it changes more often than the vocabulary does.