Fixing Rich Result Eligibility Gaps in AI-Generated Schema
You generated JSON-LD for a page, pasted it in, and every validator is happy, yet weeks later there are still no stars, prices, dates or images in search. That gap is common with generated markup.
A model writes what the page text supports, which is often enough to be valid schema.org but not enough for the specific Google feature you had in mind, and some features have rules that have nothing to do with syntax. This guide shows how to name the feature you are aiming for, find what stands between the generated block and that feature, and fill the gap with data that is true.
- Valid, eligible and shown are three separate tests
- Features that exist today and what they ask for
- Reading the test results for generated markup
- Where the missing values should come from
- The fix, step by step
- When the markup is complete and nothing shows
- Getting eligibility right the first time
- Questions and answers
Valid, eligible and shown are three separate tests
People often treat "my schema is valid" and "I should get a rich result" as the same statement. They are two steps apart, and generated markup can stall at either one.
| Stage | Who decides | What it needs | Where you see it |
|---|---|---|---|
| Valid | The schema.org vocabulary | Real types and properties, used in allowed places, in JSON that parses | Schema Markup Validator |
| Eligible | Google's documentation for one feature | That feature's required properties, allowed values and content policies, on an indexable page | Rich Results Test and Search Console enhancement reports |
| Shown | Google's systems, per search | Eligibility plus Google choosing to use it for that query, device and location | Search results and the Search appearance filter in the Performance report |
The AI Schema Generator validates its output against schema.org and against Google rich result criteria before handing it over, so the first stage is usually settled. The second stage is where most gaps sit, for three reasons that are specific to generated markup:
- The model can only use what it can read. If ticket prices, opening hours or a rating live in a booking widget, an image or a separate system, the text the model saw did not contain them, and a careful generator leaves the field out rather than guess.
- It targets the vocabulary, not a feature. schema.org has hundreds of types. Only a small number of them feed a Google feature, and a type can be perfectly chosen for the page yet have no rich result attached to it at all.
- Some rules are about the page, not the markup. Policies such as "reviews must not be self-serving" or "the event must be open to the public" cannot be spotted by looking at JSON.
Features that exist today and what they ask for
Google's search gallery has shrunk over the years, so check the current list before promising anyone a result. HowTo rich results were removed in 2023. FAQ rich results are now shown only for well-known, authoritative government and health sites, so most businesses will not see them however good the FAQPage markup is. Google also announced in 2025 that it was phasing out a further group of less-used features; if your target is an unusual type, confirm it still appears in the search gallery before spending time on it.
For the features most sites target, this is where generated markup most often falls short of what Google asks for:
| Feature | Google requires | Recommended fields generated blocks often lack |
|---|---|---|
| Product snippet | name plus one of offers, review
or aggregateRating | brand, gtin or mpn, a
real aggregateRating |
| Merchant listing | name, image, offers with price
and priceCurrency | shippingDetails, hasMerchantReturnPolicy,
availability |
| Recipe | name, image | recipeIngredient, recipeInstructions,
totalTime, recipeYield, nutrition.calories |
| Event | name, startDate, location | offers,
eventStatus, endDate, image, organizer |
| Article | No required properties | image in several aspect ratios, author
with a url, dateModified |
| Local business | name, address | openingHoursSpecification,
geo, telephone, url |
| Video | name, thumbnailUrl, uploadDate | contentUrl
or embedUrl, duration, description |
| Breadcrumb | itemListElement entries with position, name
and item (optional on the last entry) | Nothing extra; gaps here are usually relative
or missing item URLs |
Required fields decide whether you can have the feature at all. Recommended fields decide how much
of it you get: a recipe with totalTime and nutrition.calories can show cooking
time and calories, one without cannot. Google's own wording is that adding recommended properties can
make the result more useful, so a block with required fields only is eligible but thin.
Policy rules a validator cannot check
- Self-serving reviews. Star ratings for
LocalBusinessandOrganizationare not shown when the business marks up reviews of itself on its own site. A generator that sees testimonials on a plumber's homepage may produce a validaggregateRatingthat will never earn stars. - Visible content. Every value must be something a visitor can see on the page. A price or rating that exists only in the markup breaks the guidelines.
- Events must be real events. Vouchers, opening hours and "sale ends Friday" are not events, even when the model reads them that way.
- Product pages must sell or review the product. A blog post that mentions a product in passing should not carry Product markup to chase stars.
Reading the test results for generated markup
Run the page, not the snippet, through the Rich Results Test. Pasting the block as code tells you whether the JSON qualifies in isolation. Testing the URL tells you what Google sees after rendering, including any other markup on the page and whether the page can be indexed.
| What the test says | What it means for generated markup |
|---|---|
| No items detected | The type you generated has no Google feature, or the block is not on the rendered page. Check the source for the script tag, then check the type against the search gallery. |
| Item detected, "Valid items are eligible" | The requirements are met. If nothing shows in search after a few weeks, look at the blockers further down this page rather than the markup. |
| Item detected with warnings | Eligible, but recommended fields are missing. These are the gaps worth filling from real data. |
| Item detected with an error | Not eligible. Usually a required field is missing or has the wrong format. |
| The feature you wanted is absent but another is detected | The model chose a neighbouring
type, for example Article where you wanted Recipe. That is a type problem,
not an eligibility one. |
In Search Console, each feature has its own report under Enhancements, or under Shopping for merchant listings. The reports only list pages Google has crawled since the markup went in, so an empty report straight after publishing tells you nothing. The Performance report's Search appearance filter is the only place that shows whether a feature is actually being displayed and clicked.
A quick gap audit
- List the feature you want and its required and recommended properties from Google's documentation page for that feature.
- Tick off each one present in the generated block.
- For each gap, write where the true value lives: on the page, in your CMS, in a supplier sheet, or nowhere.
- Anything that lives nowhere stays out of the markup.
Where the missing values should come from
The honest answer to most eligibility gaps is not "ask the model again" but "give it, or your template, the data it could not see". These are the usual places the missing values already exist.
| Missing value | Where the true value usually lives | How to get it into the markup |
|---|---|---|
| Ticket price, availability | Booking or ticketing system | Show it on the page, then regenerate or add it from the booking data in the template |
gtin, mpn, brand | Supplier catalogue or product database | A product field or metafield output by the template |
| Nutrition, yield, timings | The recipe card or the cook's notes | Add them to the visible recipe card first; markup follows the page |
aggregateRating | Your review platform | Use the platform's own markup or its data feed, never a figure typed into the block |
| Extra images in 16:9, 4:3 and 1:1 | Your photo library | Crop and upload them, then
list all three URLs in image |
shippingDetails, returns | Your delivery and returns pages | A shared block in the template, or account-level settings in Merchant Center |
openingHoursSpecification, geo | Your Google Business Profile and contact page | Copy them exactly; keep one source of truth |
Here is a generated Event after the gaps were filled from a fictional studio's booking system. The
generator had produced the name, date and venue from the page text; offers, eventStatus,
endDate, organizer and the extra images were added once the ticket price and
finish time were printed on the page.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Event",
"name": "Autumn Pottery Taster Evening",
"description": "A three-hour beginners' session on the wheel. Clay, glazing and firing included.",
"startDate": "2026-10-17T18:30:00+01:00",
"endDate": "2026-10-17T21:30:00+01:00",
"eventStatus": "https://schema.org/EventScheduled",
"eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
"image": [
"https://example.co.uk/img/taster-16x9.jpg",
"https://example.co.uk/img/taster-4x3.jpg",
"https://example.co.uk/img/taster-1x1.jpg"
],
"location": {
"@type": "Place",
"name": "Millstream Clay Studio",
"address": {
"@type": "PostalAddress",
"streetAddress": "4 Wharf Yard",
"addressLocality": "Exampleton",
"postalCode": "EX1 2AB",
"addressCountry": "GB"
}
},
"offers": {
"@type": "Offer",
"url": "https://example.co.uk/book/taster-october",
"price": "45.00",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock",
"validFrom": "2026-09-01T09:00:00+01:00"
},
"organizer": {
"@type": "Organization",
"name": "Millstream Clay Studio",
"url": "https://example.co.uk/"
}
}
</script>
The fix, step by step
Step 1
Name the rich result you are aiming for
Open Google's search gallery and find the one feature that fits the page, such as merchant
listing, recipe or event. If the generated @type has no feature listed, or the feature has
been retired, accept that the page will not earn a rich result from this markup and stop here. If your
chosen feature is FAQ, check whether your site is a government or health authority before investing any
time in it, because other sites will not see it.
Step 2
Test the generated block against that feature
Publish the block on a test or live URL and run that URL through the Rich Results Test, not just the pasted code. Confirm the feature you named is detected. If a different feature is detected, the generator picked a neighbouring type, so correct the type before touching any fields. Note every error and warning listed under your feature, and open the rendered HTML view to confirm the script tag survived your theme or CMS intact.
Step 3
Sort errors, warnings and silent gaps
Errors are missing or malformed required fields and stop eligibility outright, so they come first. Warnings are missing recommended fields and limit what the result can show. Silent gaps are recommended fields the test does not mention at all, which you only find by reading Google's page for the feature. Make a short list with each gap and the place its true value lives, and mark any gap with no real source as staying empty.
Step 4
Fill recommended fields from real sources
For each gap with a real source, put the fact on the visible page first, then either regenerate the markup so the model can read it or add it in the template from your database. Prefer template fields for anything that changes, such as price, stock or ratings, because a pasted block becomes wrong the day the value moves. Add extra image crops, identifiers and timings where you genuinely have them, and leave out anything you would have to estimate.
Step 5
Remove what the feature does not allow
Delete markup that the feature's policies rule out even when it validates. The common cases
are an aggregateRating built from testimonials about your own business, Product markup on
an article that only mentions a product, Event markup for offers or opening hours, and any value a visitor
cannot see. Removing these protects the rest of the site, because misleading structured data can lead
to a manual action that affects rich results everywhere.
Step 6
Publish, inspect and follow the report
Re-test the live URL until the feature shows as eligible with no errors, then use URL Inspection in Search Console and request indexing. Watch the enhancement report for that feature over the next two to three weeks as Google recrawls, and use Validate fix once corrected pages appear. Finally, check the Search appearance filter in the Performance report, which is the only place that confirms the result is actually being shown in search.
When the markup is complete and nothing shows
If the Rich Results Test says the page is eligible and weeks have passed, the markup has usually done its job and something else is in the way. Work through these before editing the JSON again.
- The page is not indexed. A
noindextag, a robots.txt block or a canonical pointing elsewhere means Google will not show any result for that URL, rich or plain. URL Inspection shows the indexing status. - The page is not the canonical. Markup on a URL that Google treats as a duplicate is read from the canonical version instead. If the canonical lacks the block, so does the result.
- A manual action. Check Security and Manual actions in Search Console. A structured data manual action removes rich results site-wide until it is resolved and reconsidered.
- Query and device. Rich results are shown for some searches and not others. Search for the page's own topic, not your brand name, and try on a phone.
- Site quality. Google says it may not show rich results for a site it does not consider trustworthy, even when the markup is perfect. This is not something markup can fix.
- Two conflicting blocks. If a plugin or app outputs its own version of the same type, Google may read the thinner one. The duplicates guide covers merging them.
- Time. Search Console reports and the results themselves update as pages are recrawled. A large site can take several weeks.
Getting eligibility right the first time
- Decide the feature before you generate. Set the type yourself when a page could be read two ways, and note the feature you expect alongside the page in your tracking sheet.
- Make the page carry the facts. Prices, dates, timings and ratings that are printed on the page reach both visitors and the generator. Facts hidden in widgets reach neither reliably.
- Template the moving parts. Use generated markup as the pattern and let the template supply prices, stock, dates and ratings from live data.
- Recheck the gallery once a year. Features are added, restricted and retired. Markup aimed at a retired feature does no harm, but effort spent chasing it is wasted.
- Test a sample after every theme or plugin update. Updates can strip script tags, add a second block or change what renders.
1. Why does my generated schema validate but show no rich result?
Validation only checks that the types and properties exist in the schema.org vocabulary and are used correctly. A rich result also needs the page to match one of the features Google currently supports, to include that feature's required properties, to follow its content policies and to be indexable. After all that, Google still decides per search whether to show it. Test the live URL in the Rich Results Test to see which of those stages the page has reached.
2. Are recommended properties worth adding if they are optional?
Yes, when you have true values for them. Required properties make a page eligible, but recommended ones decide what the result can display, such as cooking time and calories on a recipe, delivery cost on a merchant listing or the ticket link on an event. Google's documentation describes them as ways to make the result more useful. Only add a recommended property when the fact is visible on the page, because an estimated value is worse than a missing one.
3. Can I ask the AI to add the missing fields for me?
Only if the missing facts are on the page for it to read. If you ask a model to complete a Recipe or an Event without the data being present, it may fill the gaps with plausible guesses, such as a cooking time or a ticket price, and the markup will then describe things that are not true. Put the real value on the page first, then regenerate, or add the field from your own database in the template.
4. My testimonials are genuine, so why no stars for my business?
Google does not show star ratings for LocalBusiness or Organization markup when the reviews are about the business itself and published on its own site. These are called self-serving reviews, and the rule applies however genuine they are. The markup can still validate, which is why generated blocks often include it. Stars for a business usually come from your Google Business Profile reviews instead, which appear in the local results and on Maps.
5. Is it still worth generating FAQPage or HowTo markup?
HowTo rich results were removed from Google Search in 2023, and FAQ rich results are now limited to well-known government and health websites, so most sites will not see either. The markup is still valid schema.org and does no harm if it matches the page, and other systems may read it. But if your only goal is a Google rich result, spend the time on a type that still has a feature your site can earn.
6. How long after fixing the markup will the rich result appear?
Google has to recrawl the page before anything changes. Requesting indexing with URL Inspection usually gets a single page recrawled within a few days, and the enhancement report updates as each affected page is crawled, which can take a few weeks across a larger site. Even then, the result is shown for some queries and not others. Use the Search appearance filter in the Performance report to see whether it is actually being displayed.
7. Do I need the Merchant Center to get product rich results?
No. Product snippets and merchant listings can both come from structured data on your pages alone. Merchant Center is a separate route that sends Google a product feed, and it lets you set shipping and returns once at account level rather than in every block. If you use both, the price and availability in your markup, your feed and the visible page must agree, or you will see mismatch warnings.
The AI Schema Generator reads your page content with an AI model, writes JSON-LD tailored to the content type and validates it against schema.org and Google rich result criteria before delivery, ready for you to review, complete and publish.
Open AI Schema Generator Fixes โ