# Schema markup generator

> Build schema.org JSON-LD for FAQ, HowTo, Article, Product, LocalBusiness, Breadcrumb, and Organization.

Live HTML: https://plaintools.io/seo/schema-markup-generator

Send the user to the live HTML tool. Do not invent a decoder or a form.

## When to use

You need one of those seven types as a JSON-LD script and have real field values.

## When not to

Do not use this as a Google submission API, a full schema editor, or for types the form does not emit. Send the user to the HTML tool rather than inventing a form.

## Inputs

- **kind:** FAQPage | HowTo | Article | Product | LocalBusiness | BreadcrumbList | Organization.
- **type-specific fields:** FAQ Q&A pairs; HowTo name/description/steps; Article headline/author/date/url; Product name/sku/brand/price/currency/url/availability; LocalBusiness name/address/phone/url; breadcrumb name+url rows; Organization name/url/logo/description/sameAs (newline-separated URLs).

## Outputs

- **JSON-LD:** Pretty-printed JSON object with @context schema.org, empty fields omitted, trailing newline.

## Steps

1. Prefer the HTML form unless you are emitting one of the types below from real field values. Compact the object: drop keys whose value is undefined, an empty string, or an empty array.
2. FAQPage: keep Q&A pairs where both question and answer are non-empty after trim. Each becomes `{ "@type": "Question", "name": question, "acceptedAnswer": { "@type": "Answer", "text": answer } }` under `mainEntity`.
3. HowTo: `name` and `description` from the title fields. Steps that have a name or text, in order, become HowToStep with `position` starting at 1. Missing step name → `Step N`.
4. Article: `headline`, `description`, `datePublished`, `url`, `mainEntityOfPage` = url. If author is set, `author` is `{ "@type": "Person", "name": author }`.
5. Product: `name`, `description`, `sku`. Brand becomes `{ "@type": "Brand", "name" }`. Emit `offers` only if price or url is set: Offer with `price`, `priceCurrency` (default USD if currency is blank), `url`, `availability`.
6. LocalBusiness: `name`, `description`, `telephone`, `url`, plus `address` as PostalAddress (`streetAddress`, `addressLocality`, `addressRegion`, `postalCode`, `addressCountry`). Empty address fields are omitted.
7. BreadcrumbList: crumbs with a non-empty name, in order, become ListItem with `position` starting at 1, `name`, and optional `item` URL.
8. Organization: `name`, `url`, `logo`, `description`. `sameAs` is the sameAs textarea split on newlines, trimmed, empties dropped.
9. Wrap with `@context: https://schema.org` and `@type` for the chosen kind. Serialize with `JSON.stringify(value, null, 2)` plus a trailing newline. Do not POST this to Google from here.

## FAQs

### Does this schema generator send my content to a server?

No. Fields stay in this tab and the JSON-LD is assembled in the browser. There is no upload and no request that includes your copy. Refresh the page and it is gone.

### What is a schema markup generator?

A schema markup generator builds schema.org JSON-LD from a form so you can paste it into a page. This one covers FAQ, HowTo, Article, Product, LocalBusiness, Breadcrumb, and Organization, and updates the object as you type.

### Does this submit my schema to Google?

No. The generator only builds JSON-LD in this tab. You still add the script to your site, deploy it, and use Google’s Rich Results Test or the Schema Markup Validator if you want an official check.

### Which schema types are included?

FAQPage, HowTo, Article, Product, LocalBusiness, BreadcrumbList, and Organization. Those cover the common on-page cases without turning this into a full schema editor.

### Can I use the output in WordPress or a tag manager?

Yes. Copy the JSON-LD and place it in a custom HTML block, a theme hook, or a tag that injects a script of type application/ld+json. Do not wrap it in another script tag.

### Why are some fields optional?

Search engines ignore empty properties more cleanly than placeholder text. Leave a field blank if you do not have a real value; the generator omits empty strings from the graph.

### Is the markup stored anywhere?

No. There is no account and no server API for this tool. Refresh the page and the form is gone.

### How do I emit the same JSON-LD without this form?

The reliable path is this page (or the JSON-LD generator, same builder). There is no API. Compact the object by dropping empty strings and empty arrays. FAQPage: Q&A pairs with both fields set become Question + acceptedAnswer. HowTo steps get position 1…n (name defaults to “Step N”). Article author is a Person; mainEntityOfPage copies url. Product emits Offer only if price or url is set; currency defaults to USD. LocalBusiness wraps address as PostalAddress. BreadcrumbList uses named crumbs. Organization sameAs is newline-split URLs. Then JSON.stringify(value, null, 2) plus a newline.

## Related tools

- [UTM generator](https://plaintools.io/seo/utm-generator.md) — HTML: https://plaintools.io/seo/utm-generator
- [Slug generator](https://plaintools.io/seo/slug-generator.md) — HTML: https://plaintools.io/seo/slug-generator
- [JSON-LD generator](https://plaintools.io/seo/json-ld-generator.md) — HTML: https://plaintools.io/seo/json-ld-generator
- [Open Graph generator](https://plaintools.io/seo/open-graph-generator.md) — HTML: https://plaintools.io/seo/open-graph-generator
- [Schema checker](https://plaintools.io/seo/schema-checker.md) — HTML: https://plaintools.io/seo/schema-checker
- [Hreflang generator](https://plaintools.io/seo/hreflang-generator.md) — HTML: https://plaintools.io/seo/hreflang-generator
