/ โ† AI Schema Generator Fixes / Missing Required Fields
In this guide
  1. What "missing required field" means for generated markup
  2. Why a model misses facts that are plainly visible
  3. Finding where each missing value really lives
  4. Making facts readable without changing how the page looks
  5. The fix, step by step
  6. Where missed facts usually hide, by platform
  7. Awkward cases
  8. Getting it right on the next page
  9. Questions and answers

What "missing required field" means for generated markup

A required field is a property that a particular Google rich result cannot work without. Schema.org itself makes almost nothing mandatory, so the word only has meaning against a named feature. The same Recipe block can be complete for one purpose and incomplete for another. When the generator validates its output against Google's criteria and flags a required field, it is telling you that the block, as written, cannot be considered for that feature at all.

The fields Google marks as required are short lists, and they are usually the most basic facts about the thing:

Rich resultRequired by GoogleWhere it often hides on a page
Recipename, imageThe hero photo is a CSS background, not an <img>
Eventname, startDate, locationDate and venue printed inside a poster graphic
Product snippetsname plus one of offers, review or aggregateRatingPrice injected by a script after load
Merchant listingsname, image, offers with price and priceCurrencyCurrency shown only as a ยฃ sign
Local businessname, addressAddress in a map embed or on the contact page only
Job postingtitle, description, datePosted, hiringOrganization, jobLocationPosting date only in the CMS, never printed
Videoname, thumbnailUrl, uploadDateAll three inside a third-party player iframe

Google changes these lists from time to time and has retired several features in recent years, so check the current documentation for your type before you start work. Article, notably, has no required properties in Google's documentation at all; if an Article block is being flagged, the problem is almost always a missing image or a malformed value rather than an absent field.

๐Ÿ’ก This guide is about facts that exist but were missed. If the fact is genuinely not on the page, the fix is different: publish it visibly, or accept that the page is not eligible. Never fill the gap with a plausible guess. The hallucinated properties guide covers what happens when a model does exactly that.

Why a model misses facts that are plainly visible

A person looking at a page sees a finished picture. A language model reading a page works from text: the words, and whatever structure survives the conversion of the page into something it can read. Anything that is not text, or not text at the moment the page is read, is invisible or ambiguous to it. The common reasons fall into five groups.

1. The fact is a picture

Event posters, menu boards, price lists saved as images, infographics with opening hours, and screenshots of spec sheets all carry information as pixels. Unless the same words appear in the HTML, perhaps in alt text or a caption, the model has nothing to extract. Alt text helps only if it actually states the fact; "summer fair poster" does not give a start date.

2. The fact arrives after the page loads

Prices from a pricing API, stock levels, review widgets, store locators and many booking systems write their content into the page with JavaScript once it is running in a browser. Tools that read the page source, rather than the page as rendered, see an empty container. Whether a given generator renders scripts depends on the tool, so the safe assumption is that anything missing from View Source may be missing from what the model read.

3. The fact is in a different document

Iframes are separate pages. A YouTube or Vimeo player, an embedded Google map, a ticketing widget and many review carousels all live in their own documents. The text inside them is not part of your page's HTML, so a video's upload date or a venue's address shown inside an embed is not available to extract.

4. The fact is there but unlabelled

A line reading "Sat 14th, doors 7" is a start date to a local reader and noise to a model deciding whether it is a date, a room number or a price. The same happens with prices written as "from 12", times given as "an hour or so", ingredients split across two columns, and addresses broken over separate elements with no heading. The model may skip a value rather than risk a wrong one, which is the behaviour you want, but it leaves a gap.

5. The fact belongs to the site, not the page

Your business address, logo, company name and default image are often in the header, footer or another page. A generator that reads the main content, or that is asked to describe one page, can reasonably leave them out. These are the values that should come from site-wide settings rather than page-by-page generation anyway.

Finding where each missing value really lives

Diagnosis takes a few minutes per template and tells you which of the fixes below applies. For each missing field, answer three questions in order.

  1. Can a visitor see it? Open the live page in a normal browser window. If the value is nowhere on the page, stop here: it is a content gap, not an extraction problem.
  2. Is it in the source? Press Ctrl+U (Cmd+Option+U on a Mac) to open View Source and use find for the exact value, such as the price or the date as printed. If it is not there, it arrives by script or through an iframe.
  3. Is it text, and is it labelled? If the value is in the source, look at the surrounding HTML. Is it inside an element with a clear label or heading, such as a <dt> reading "Date", a table column called "Price", or a <time> element? Or is it a loose fragment?

The answers point straight at the remedy:

What you foundLikely causeBest remedy
Visible, not in source, appears in the Elements panelScript-inserted contentServer-render it, or source the value from the system that feeds the script
Visible, not in source or Elements panelInside an iframe or an imageAdd the fact as page text, or take it from the embed's provider
In source, but as a loose fragmentNo label or contextAdd a label or semantic element, then regenerate
In source on another page onlySite-level factSupply it from site settings, not per page
Not visible anywhereContent gapPublish it, or drop the rich result goal
๐Ÿ’ก The Elements panel in developer tools shows the page after scripts have run, while View Source shows what the server sent. Comparing the two for one value is the fastest way to tell script-loaded content from content that was always there.

Making facts readable without changing how the page looks

Often the cleanest fix is to improve the page itself, so that the fact is present as labelled text. That helps every reader of the page, including screen readers, search engines and AI systems, not only the schema generator. Small changes usually do it:

For script-loaded content, the durable fix is server-side rendering: output the price, stock or review summary in the HTML the server sends, and let the script update it afterwards if it needs to. Most e-commerce platforms and modern frameworks can do this. If that is not practical, keep the value out of the generated snapshot and take it from the same data source the script uses, so that the markup and the page cannot drift apart.

Worked example: an event with its date in the poster

A fictional venue, Riverside Hall, published a page for a ceilidh night. The date and venue were only in the poster, so the generated block came back with just a name and description. After adding one line of text under the poster, with the date in a <time> element and the venue address written out, regeneration produced a block the checker accepted:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Event",
  "name": "Autumn Ceilidh Night",
  "startDate": "2026-11-14T19:00:00+00:00",
  "eventAttendanceMode": "https://schema.org/OfflineEventAttendanceMode",
  "eventStatus": "https://schema.org/EventScheduled",
  "location": {
    "@type": "Place",
    "name": "Riverside Hall",
    "address": {
      "@type": "PostalAddress",
      "streetAddress": "12 Mill Lane",
      "addressLocality": "Exampleton",
      "postalCode": "EX1 2AB",
      "addressCountry": "GB"
    }
  },
  "image": "https://www.example.co.uk/images/ceilidh-poster.jpg",
  "url": "https://www.example.co.uk/events/autumn-ceilidh"
}
</script>

Every value in it can be pointed to on the page. Nothing was typed in by hand that a visitor could not read, which is the test to apply before publishing.

The fix, step by step

Step 1

List each missing field and the feature that needs it

Copy the generator's validation messages, or run the generated block through the Rich Results Test, and write down every field reported as missing together with the rich result that requires it. Keep required fields separate from recommended ones, because only required gaps block eligibility outright. If a field is flagged for a feature you never wanted, such as a video field on a page with an incidental embed, note that too, since the answer may be to leave that type out.

Step 2

Find the fact on the page as a visitor sees it

Open the live page in an ordinary browser window and look for each missing value exactly as a customer would, including banners, images, tabs, accordions and embedded players. Write down where you found it and how it is presented. If you cannot find the value anywhere a visitor can see, mark the field as a content gap and do not fill it in the markup; that is a decision about publishing the information, not about schema.

Step 3

Check whether the fact exists in the page text

Open View Source and search for the value as printed. Then open the Elements panel in developer tools and search again. Present in source means the model could read it but may not have understood it. Present only in Elements means a script added it. Absent from both means it lives in an image or an iframe. Record which of the three applies, because each has a different remedy and mixing them up wastes time.

Step 4

Make the fact readable, or source it directly

For unlabelled text, add a label or wrap dates in <time> elements. For images and iframes, add the key facts as visible text next to them. For script-loaded values, render them on the server if you can; otherwise plan to take them from the same database or API the script uses. For site-wide facts such as your address and logo, point to the values held in your site settings rather than repeating them page by page.

Step 5

Regenerate or patch the block

Where you changed the page, run the generator again so it can pick up the newly readable facts, then review the new output from scratch rather than assuming earlier values still hold. Where you are sourcing a value directly, add it to the reviewed block by hand or through your template, using the correct format: ISO 8601 for dates, a plain number for price, a three-letter code such as GBP for currency and an absolute URL for images.

Step 6

Retest and repeat for the template

Test the updated page in the Rich Results Test using the live URL, not a pasted snippet, so you see what Google sees after scripts run. When it passes, apply the same page change to the template or content type so other pages benefit, then regenerate and check two or three of them. Missing fields almost always repeat across pages built the same way, so a template fix usually clears dozens at once.

Where missed facts usually hide, by platform

WordPress

Page builders are the usual culprit. Hero sections set as background images, text inside slider modules and details held in tabbed widgets can all be hard to read in context. Event and booking plugins often print dates through their own shortcodes, which is fine as long as the output is text; check that it is not a calendar rendered by script. Recipe card plugins usually output well-labelled text, so a missed ingredient list there is more likely a duplicate block issue than an extraction one.

Shopify

Themes normally render product title, price and images in the HTML, but some apps replace the price block with a script, particularly bundle, subscription and currency conversion apps. Review counts from review apps are frequently loaded by script too. The Shopify guide explains why moving values like these should come from Liquid rather than a generated snapshot.

Custom sites and JavaScript frameworks

Single-page applications built with client-side rendering can send an almost empty HTML shell, so a tool that does not run scripts sees nothing at all. Frameworks with server-side rendering or static generation, such as Next.js, Nuxt or Astro, avoid this when configured to render the content on the server. If you control the data, the most reliable pattern is to build the JSON-LD from the same props or API response that renders the page, and use generated output only as a guide to structure.

Hand-built and static sites

Static pages are usually easy for a generator to read, so misses there tend to come from wording. Look for dates without years, prices without currency, and ranges like "10 to 4" in opening hours that are clear to people but ambiguous in isolation.

Awkward cases

The fact is on the page but only in a PDF

A downloadable menu, brochure or timetable is a separate file. The generator reading the page will not see inside it. If the fact matters, such as opening hours or a course start date, put it in the page text as well; that also helps visitors on phones who would rather not open a PDF.

The fact is in a tab or accordion

Content in closed tabs is usually still in the HTML, just hidden with CSS, so it is readable. If it is loaded only when the tab is clicked, it behaves like script-loaded content. Check View Source to tell the difference.

Different variants have different values

A product with sizes at different prices, or an event with several dates, may come back with none of them because the model could not choose. Decide what the page represents: the selected variant, a price range with AggregateOffer, or separate Event entries for each date. Then supply the values to match that decision.

The image exists but fails the requirements

Sometimes the image field is filled but still flagged, because the URL points to a thumbnail, a placeholder, a lazy-loading stub or a file blocked by robots.txt. Point it at the full-size, crawlable image that appears on the page.

โš ๏ธ Resist fixing a required-field warning by pasting in a value from memory, such as "the event is usually in November" or "our standard price". If the page does not say it, the markup should not either. A missing rich result costs you a feature; misleading markup can cost you rich results across the whole site.

Getting it right on the next page

For the related problem of markup that has every required field but still does not appear as a rich result, see the rich result eligibility guide. For required fields in hand-written or plugin markup, rather than generated output, the required schema fields guide covers that side.

Questions and answers

1. Why does the generator leave a field out instead of guessing it?

A well-behaved generator should leave a property out when it cannot find support for it, because a guessed value is worse than a missing one. A gap costs you eligibility for one rich result, which you can fix later. An invented date, price or address that does not match the page can mislead searchers and breach Google guidelines. So a missing required field is often a sign the tool was being careful, and the job is to make the real fact readable.

2. The price is on my page, so why is offers missing?

The most common reason is that the price is written into the page by JavaScript after it loads, from a pricing service, a currency app or a variant picker. If the tool that read your page did not run that script, it saw an empty space where the price appears for visitors. Open View Source and search for the price. If it is not there, render it on the server or take it from the same data source the script uses.

3. Can I just type the missing value into the JSON-LD myself?

Yes, as long as the value is true and a visitor can see the same information on the page. Adding a start date you have printed in text, or an address shown in the footer, is fine. What you must not do is add something that appears nowhere on the page, or a value you believe is roughly right. Also make sure the hand-typed value is kept up to date, because it will not change when the page does.

4. Does alt text count as the fact being on the page?

Alt text is part of the page and is read by screen readers, so it is visible content in a real sense, and a generator may use it. But alt text is meant to describe an image, not to carry details the rest of the page leaves out. If an event date or price appears only in an image, add it as ordinary text too. That helps visitors whose images do not load and makes the fact unambiguous for every tool.

5. Which fields are required for an Article?

Google documents no required properties for Article, NewsArticle or BlogPosting. It lists recommended ones, such as headline, image, author, datePublished and dateModified. So if generated Article markup is being flagged, check what exactly the message says: it may be a problem with the format of a value, an image that cannot be fetched, or a check the tool applies against its own standard rather than a Google requirement. Other types, such as Recipe, Event and Product, do have required fields.

6. Will fixing required fields guarantee a rich result?

No. Required fields are the minimum for eligibility. Google still decides whether to show a rich result based on the query, the quality of the page, its own policies and how it chooses to lay out results. Filling the required fields removes one certain blocker. Adding genuine recommended fields, following the content policies and keeping the markup matched to the page improve your chances, but no markup can force a particular display in search results.

7. How do I stop the same fields going missing on new pages?

Fix the template, not the page. If event dates are always missed because they live in posters, add a date line to the event template. If prices are always missed because an app loads them, change how the template renders prices. Then generate markup for a new page from that template and check it before rolling out. Missing fields tend to follow the structure of a page, so one template change usually prevents the gap on every future page.

Generate markup from what your page really says

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, so missing required fields are flagged before you publish.

Open AI Schema Generator Fixes โ†’
๐Ÿ’ฌ Got a problem?
Related Guides: All AI Schema Generator Fixes  ·  Hallucinated Schema Properties  ·  Rich Result Eligibility Gaps  ·  AI Schema Guide  ·  Learning Hub

About aiwebpageseo

aiwebpageseo.com is a data-driven SEO and AEO (Answer Engine Optimisation) platform providing a free suite of technical SEO tools. Rather than relying on AI-theorised assumptions, the platform analyses live URL performance, delivering objective diagnostics, page speed metrics, CLS debugging, and site crawl data alongside actionable technical tutorials.