Fixing the Wrong Schema Type in AI-Generated Markup
The type is the first word of any structured data block and the one that decides everything after it. When an AI generator labels a recipe as a BlogPosting, a price comparison as a Product or a plumber as a plain Organization, every other property is chosen to fit the wrong description.
The markup can still validate, which is why the mistake survives. This guide covers the page patterns that mislead type detection, a simple test for choosing the right type, and how to override it before or after generation without leaving mismatched properties behind.
Why a model picks the wrong type
A language model chooses a type by recognising patterns in the wording. It has seen a great many pages, and it associates tone and layout with types: a chatty, first-person opening looks like a blog post; a list of prices looks like a product; a name and phone number look like an organisation. Most of the time that works. It fails when a page's style and its purpose point in different directions.
- Style over substance. A recipe preceded by six paragraphs about a family holiday reads like a BlogPosting for most of its length. The ingredients and method, which make it a Recipe, are a minority of the text.
- Nouns over intent. A page titled "The best cordless drills for 2026" mentions many products, so Product is an easy guess, even though the page sells nothing and reviews several things.
- Generic over specific. Models often fall back on broad types, Organization instead of Dentist, Article instead of NewsArticle, because broad types are safe and common in their training data.
- One type per page. Some pages genuinely contain two things, such as an article with an embedded event. A generator asked for one block has to pick, and it may pick the less important one.
None of these produce invalid markup. A BlogPosting with a headline and author is perfectly valid. The cost is quieter: the page loses eligibility for the rich result it could have had, and search engines receive a less accurate description of what the page is.
Common mislabels and what they should be
These are the swaps that come up most often when reviewing generated markup. The right answer depends on the page, so treat the table as a first guess to confirm, not a rule.
| Page | Often generated as | Usually better as |
|---|---|---|
| Recipe post with a long introduction | BlogPosting | Recipe,
or Recipe as the page's main entity with the post around it |
| "Best of" roundup or comparison | Product | Article or
BlogPosting, with Review or an ItemList if each item is genuinely
reviewed |
| Category or collection page | Product | CollectionPage,
optionally with an ItemList of product URLs |
| Service page with a price list | Product | Service, with
offers if prices are shown |
| Dentist, garage or café home page | Organization | The matching LocalBusiness
subtype, such as Dentist, AutoRepair or CafeOrCoffeeShop |
| Sole trader's site | Person | A LocalBusiness or ProfessionalService,
with the owner as a Person linked to it |
| Event announcement written as news | NewsArticle | Event,
if the page's job is to get people to attend |
| Downloadable app or SaaS product page | Product | SoftwareApplication
or a subtype such as WebApplication |
| Job advert | WebPage or Article | JobPosting |
| Help centre question page | FAQPage | Article, or QAPage
only where users post answers |
Two further points about FAQ and HowTo types, which generators still produce often. Google removed HowTo rich results in 2023, and FAQ rich results are now limited to well-known, authoritative government and health sites. The types still exist in schema.org and can still describe a page accurately, but choosing them in the hope of a rich result on an ordinary business site will not work.
The main-entity test for choosing a type
The quickest way to settle a disputed type is to ask one question: if this page could only be about one thing, what would it be? Write the answer as a single sentence starting "This page is a…" or "This page is for…". Then check it against these prompts.
- What would a visitor come here to do? Cook, buy, book, attend, apply, read, contact. The verb usually points at the type: cook suggests Recipe, attend suggests Event, apply suggests JobPosting.
- What would be wrong if it were missing? Remove the ingredients from a recipe post and it stops being useful; remove the holiday story and nothing important is lost. The part you cannot remove is the main entity.
- Does the page sell or describe? Product and Offer describe something the reader can buy from this page or from a named seller. A page that describes products it does not sell is usually an article or a review.
- Is there a more specific type that is still true? Once you have a broad answer, look down the schema.org hierarchy. LocalBusiness has dozens of subtypes; Article has NewsArticle, BlogPosting, TechArticle and others. Pick the deepest one that fits without stretching.
A small fictional example: Greenfield Garden Services publishes a page called "Hedge trimming in Exampleton".
It has a paragraph about the service, a price guide and a contact form. The generator returned Product,
because of the prices. The one-sentence answer is "This page is for booking hedge trimming from a local
gardener", which makes it a Service offered by the business, with the business itself as
a LocalBusiness described once, site-wide.
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Service",
"@id": "https://www.example.co.uk/hedge-trimming#service",
"name": "Hedge trimming",
"serviceType": "Hedge trimming",
"areaServed": "Exampleton",
"provider": { "@id": "https://www.example.co.uk/#business" },
"offers": {
"@type": "Offer",
"price": "45.00",
"priceCurrency": "GBP",
"description": "Hedges up to 10 metres, one visit"
},
"url": "https://www.example.co.uk/hedge-trimming"
}
</script>
The provider reference assumes the site already publishes the business as an entity with
that @id. If it does not, the Organization
and Person references guide explains how to set one up.
Overriding the type: before or after generation
There are two places to correct the type, and one is much better than the other.
Before generation (preferred)
When a page is ambiguous, set the type yourself before running the generator, rather than letting it infer one. The model then reads the page looking for the properties of the type you chose, so it looks for ingredients and cooking times on a recipe, or dates and a venue on an event. The output is shaped correctly from the start, and required fields for that type are more likely to be found.
After generation (only for small changes)
Editing the @type value by hand is fine when moving between closely related types that
share their properties, such as Article to NewsArticle, or LocalBusiness
to Plumber. It is risky when the types are unrelated. Changing Product to Service
in one line leaves behind properties like sku, gtin or brand in
a form that makes little sense for a service, and leaves out provider and serviceType,
which the original never looked for. For a jump between unrelated types, regenerate.
| Change | Safe to edit by hand? | Why |
|---|---|---|
| Article to BlogPosting or NewsArticle | Yes | Subtypes share the same properties |
| LocalBusiness to a subtype | Yes | Subtypes inherit everything, and add a few optional extras |
| Organization to LocalBusiness | Mostly | Then add address and opening hours if the page shows them |
| BlogPosting to Recipe | No | Recipe needs ingredients, instructions and times the first pass ignored |
| Product to Service | No | Different properties, different offer logic |
| Article to Event | No | Event needs dates and a location |
The fix, step by step
Step 1
Write down what the page is for in one sentence
Before looking at the markup, look at the page and complete the sentence "This page is for…" from a visitor's point of view. Use a verb: buying a product, booking a service, cooking a dish, attending an event, reading news. Ignore how the page is written and focus on what someone gets from it. If you need two sentences, note both and decide which one matters more for the search results you care about.
Step 2
Compare that sentence with the generated @type
Open the generated block and read the top-level @type, plus the type
of any main nested entity. Ask whether a stranger reading only the type would expect the page you described.
A BlogPosting for a recipe page, or a Product for a comparison page, fails
that test. Also check for a type that is true but too broad, such as Organization for a
local shop with an address and opening hours.
Step 3
Choose the most specific type that is true
Look up the candidate on schema.org and read its description and subtypes. Pick the deepest
type that honestly fits without stretching, such as Bakery rather than FoodEstablishment,
or NewsArticle rather than Article for a news story. Then check Google's documentation
for that type to see which rich result, if any, it supports. Where two types are both true, prefer the
one tied to the result you want.
Step 4
Set the type before regenerating
Run the generator again with the type set by you instead of detected automatically. The model will then look for the properties that type needs, such as ingredients for a recipe or dates and venue for an event. Review the new output as a fresh block: check the values against the page, remove anything you cannot see there, and confirm that the type-specific properties were actually found rather than guessed.
Step 5
Clear out properties that belong to the old type
If you corrected the type by hand rather than regenerating, go through every property
and check it exists for the new type on its schema.org page. Remove leftovers such as sku
on a service or articleBody on an event. Add the properties the new type expects that the
old one ignored. The Schema Markup Validator will flag properties that do not belong, which makes this
quicker.
Step 6
Test for the rich result you actually want
Paste the corrected block, or better the live URL once published, into the Rich Results Test and check that the detected item is the one you intended, such as Recipe or Event rather than Article. Fix any required-field errors that the new type raises. Then generate markup for two or three similar pages with the type set in advance, so the same mislabel does not repeat across the rest of the section.
Pages that are genuinely two things
Some pages have a real second subject. A news article about a festival also announces the festival; a blog post about a trip includes a recipe; a shop's product page includes a how-to video. You have three sensible options, and the right one depends on what each part is worth.
- Describe only the main entity. If the second subject is incidental, leave it out. A passing embed of a video does not need VideoObject markup.
- Nest the second thing inside the first. Use a property that links them, such as
about,mentions,subjectOforvideo. The page keeps one main type, and the relationship is explicit. - Use two linked top-level entities. Output the page as a
WebPagewithmainEntitypointing at the thing it is mainly about, and give each entity its own@id. This suits a recipe post, where theWebPageorBlogPostingwraps theRecipeas its main entity.
What to avoid is two unconnected blocks that each claim to be the page, such as a BlogPosting and a Recipe with the same headline and no link between them. That reads as two competing descriptions. If another system, such as your SEO plugin, already outputs the article type, see the duplicate schema guide before adding a second main entity.
Multiple types on one entity
JSON-LD allows an array of types, such as ["Product", "Car"] or ["LocalBusiness", "Restaurant"],
where an entity really is both. Use it sparingly. Where one type is a subtype of the other, as with LocalBusiness
and Restaurant, the subtype alone already says both things, and the array adds nothing.
Harder calls
Article, BlogPosting or NewsArticle
All three are fine for Google's article features, which do not require the subtype. Use NewsArticle
for reporting on current events, BlogPosting for posts on a blog, and Article
when neither fits. The difference is descriptive rather than a switch for special treatment, so a generator
choosing BlogPosting for a news story is a small correction, not an urgent one.
Organization or LocalBusiness
If customers visit a physical location, or you serve a defined local area and show an address, LocalBusiness
or a subtype is usually right. Online-only businesses and head-office sites for larger companies are
usually Organization, sometimes with separate LocalBusiness entities for each branch page.
Product or Offer-only
A page selling one item is a Product with offers. A page listing a single
deal on someone else's product, such as a voucher site, is harder; the product is not yours, so be careful
about claiming ratings or identifiers for it.
Review or Article
A genuine review of one thing, with a verdict, suits Review with itemReviewed.
Google limits self-serving reviews, so a business marking up reviews of itself on its own site will not
get review stars for its LocalBusiness or Organization.
Stopping the same mislabel across a site
- Decide types per template. Most sites have a handful of page kinds. Write a one-line table: blog post is BlogPosting, recipe is Recipe with a WebPage wrapper, location page is the relevant LocalBusiness subtype, and so on.
- Set the type for ambiguous templates every time. Leave detection on only for templates where it reliably gets the answer right.
- Review a sample after bulk runs. A type mistake repeats on every page with the same layout, so checking three pages per template catches most of them.
- Watch Search Console. If a report for the feature you expected, such as Recipes or Events, never appears for a section, the pages may be typed as something else.
For choosing types in hand-written markup, rather than correcting generated output, see the schema type choice guide.
1. Why did the AI mark my recipe as a blog post?
Because most of the text on the page probably reads like a blog post. Recipe pages often open with several paragraphs of story before the ingredients, and a model weighing the whole page can decide the blog style dominates. Set the type to Recipe before generating, or make the recipe the page's main entity with the post around it. Then check that ingredients, instructions and the image were all picked up, since the first run may have skipped them.
2. Is it harmful to use a broader type like Organization instead of Dentist?
It is not harmful in the sense of breaking anything, and the markup will still validate. It is simply less informative. A specific subtype tells search engines what kind of business you are without them having to work it out, and it inherits all the properties of the broader type, so nothing is lost by being specific. If a clear subtype exists for what you do, use it; if none fits well, the broader type is perfectly acceptable.
3. Can I just change the @type value and keep the rest?
Only when the two types are closely related, such as Article and NewsArticle, or LocalBusiness and one of its subtypes, because they share the same properties. For unrelated types, such as moving from Product to Service or from BlogPosting to Recipe, the rest of the block was built for the wrong type. It will contain properties that do not belong and miss ones that do. Regenerate with the correct type set instead of editing one line.
4. Should a category page have Product schema?
No. Product markup should describe one specific product, and Google's guidelines say not to use it for a category or a list of products. A category page is better described as a CollectionPage, optionally with an ItemList that points to the individual product pages. Each product page then carries its own Product markup. If a generator produced Product for a category page, change the type and remove the prices and ratings it attached.
5. Is FAQPage still worth using?
FAQPage is still a valid schema.org type and can accurately describe a page of questions and answers, but Google now shows FAQ rich results only for well-known, authoritative government and health websites. For most business sites it will not produce a rich result. If a generator chose FAQPage for an ordinary page, consider whether the page is really an FAQ at all. A help article or product page with a few questions is often better described by its main type.
6. What if the page has two equally important subjects?
That is less common than it seems, so first ask which subject the page is really trying to rank or convert for. If both genuinely matter, describe each as its own entity with an @id, and connect them, for example a WebPage whose mainEntity is the event and which mentions the article topic. Avoid two separate blocks that each describe the whole page differently, because they give search engines conflicting accounts of what the page is.
7. Does the schema type affect rankings?
Google has said structured data is used to understand pages and to enable rich results, not as a direct ranking factor. The type matters because it decides which rich results a page can be eligible for and how clearly the page is described. A wrong type will not usually push a page down, but it can keep it out of features such as recipe or event results that would make the listing more visible.
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. Set the type yourself for ambiguous pages, then review the result.
Open AI Schema Generator Fixes →