Start with the type, then fill the form: schema generators and HowTo
9 types sit behind the switcher, and choosing wrong is the most expensive mistake available here:
- Article - writing with an author and a date. Refine with BlogPosting or NewsArticle.
- FAQPage - several questions and answers you wrote yourself, on one page.
- HowTo - an ordered set of steps for a task.
- LocalBusiness - a place a customer can physically visit.
- Organization - the brand behind the site.
- QAPage - one question with competing answers submitted by other people.
- Review - one review, of one thing, by one named author.
- Product - a thing with a price, availability, and possibly a rating.
- BreadcrumbList - the trail from the homepage to the current page.
Most pages carry 2 or 3 at once. A blog post gets Article plus BreadcrumbList, the homepage gets Organization, a product page gets Product plus BreadcrumbList. Separate script tags, no conflict.
The 33 fields and which markup type reads which
One superset, not 9 separate forms. Each type consumes the subset it needs and ignores the rest. After you generate, the Fields this type uses panel lists what was consumed - if a field isn't there, your value was discarded. The groups:
- Identity - schema type, more specific type, name/headline, page URL, description, image URLs.
- Items - the repeatable textarea. Its meaning changes with the type.
- Authorship - author name, author URL, published date, modified date, publisher name, logo URL.
- Place and entity - phone, email, street address, city, region, postal code, country, coordinates, price range, opening hours, sameAs profiles.
- Commerce - brand, SKU, price, currency, availability.
- Rating - rating value, review count, best rating, review body.
Blank fields never reach the output. There is no "author": null and no "description": "". An empty value is dropped, and so is any nested object left holding nothing but its @type - an author block with no name doesn't ship as an empty Person, it just doesn't exist.
The items box does most of the work. One line per item, left | right. Tab-separated spreadsheet pastes work too, as do Q: / A: prefixed lines on alternating rows. Leading list markers (1., -, *, •) are stripped. The 2 halves mean different things per type:
- FAQPage -
question | answer. - HowTo -
step name | step text. A line with no pipe becomes a step with text and no name. - BreadcrumbList -
page name | url. Every crumb except the last needs a URL. - QAPage - the first line is the one question; everything after it becomes an answer.
A worked example
Article, subtype BlogPosting, headline "Rebuilding a dead sourdough starter", author Jane Rivera with a bio page, publisher Example Media, published 2024-03-14, modified 2024-06-02:
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Rebuilding a dead sourdough starter",
"image": [
"https://example.com/img/starter-16x9.jpg",
"https://example.com/img/starter-1x1.jpg"
],
"datePublished": "2024-03-14",
"dateModified": "2024-06-02",
"author": {
"@type": "Person",
"name": "Jane Rivera",
"url": "https://example.com/about/jane-rivera"
},
"publisher": {
"@type": "Organization",
"name": "Example Media",
"logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" }
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/guide/sourdough-starter"
}
}
2 images, so image is an array. One image would be a bare string. Google accepts either.
Guardrails that stop bad output leaving the tool
Several rules are enforced quietly, and they explain why the output is shorter than what most generators produce:
- No invented types. The "more specific type" field is checked against a whitelist per root type - the LocalBusiness list alone runs to eighty names. Type
Bakeryand you get Bakery. TypeBakeriesand you get a notice plus a fallback to the base type. A@typethat doesn't exist on schema.org makes the whole node meaningless, so nothing unrecognized is emitted. - No properties Google doesn't document. Only what Google's reference lists as required or recommended for that type. Padding a block with extra vocabulary doesn't improve eligibility.
- Headlines truncate at 110 characters, Google's documented limit, with a notice when it happens.
- Dates are checked against ISO 8601.
March 14, 2024is flagged;2024-03-14and2024-03-14T09:00:00+01:00pass. - Absolute URLs only. A relative
/logo.pngraises a notice, because a relative URL in JSON-LD resolves against the document base and breaks the moment the block is syndicated.
Validation warns; it never refuses to render.
Types Google no longer rewards
three of the nine types are worth generating only with clear eyes:
- FAQPage - since August 2023, Google shows FAQ rich results only for well-known government and health sites. If you are neither, the markup is valid and still parsed, but it will not add anything to your listing.
- HowTo - Google retired HowTo rich results in Search in 2023. The vocabulary is still real schema.org and still read by non-Google consumers; it will not change how your page looks in Google.
- QAPage - only legitimate on pages where visitors can submit competing answers. Using it for your own FAQ is a structured data violation, not a clever workaround for the FAQ restriction.
Ratings work the same way. Google ignores self-serving reviews - a review or aggregate rating you publish about your own business or product, on your own site. Marking it up doesn't make it count.
Why the generated markup escapes angle brackets
The output escapes <, >, and & as \u003c, \u003e, and \u0026. Still valid JSON, and every parser decodes it back. The reason is placement: an HTML parser ends a <script> element at the first literal </script> it sees, even inside a JSON string. A review body quoting some HTML would otherwise cut your block in half and dump the rest as visible text. Escaping makes that impossible.
The rest of placement is short. <head> or <body>, Google reads both. Organization goes on exactly one URL per site, normally the homepage. A page under 2 breadcrumb trails gets 2 BreadcrumbList blocks, not one merged.
Mistakes that pass validation and still fail
- Values that aren't on the page. Every marked-up question, answer, step, price, and date must be visible to a human reading the rendered page. Schema-only content is the most common cause of a manual action.
- Prices that drift. Product price, currency, and availability must match the page at crawl time. A stale price is worse than none, and a
pricewithout a 3-letterpriceCurrencyis invalid for merchant listings anyway. - A rating without a count.
aggregateRatingneeds both a value and a review count; supply one and the node is dropped rather than shipped broken. - Copying a competitor's block. Their publisher and logo end up on your page, quietly attributing your content to them.
Run the finished block through Google's Rich Results Test for eligibility and the schema.org validator for vocabulary. They answer different questions. If structured data is one item on a much longer content list, BlazeHive automates SEO content end to end, schema included.