Structured Data & JSON-LD
What you'll learn
- What JSON-LD is and why answer engines rely on it.
- How m18t generates JSON-LD from a content type's schema.org
@type. - How to write or paste custom JSON-LD, and why m18t won't validate it for you.
The concept: tell the machine what the page is
A person reading a page infers that the name near the top is the author and the block at the bottom is an FAQ. Search-engine crawlers and answer engines (LLM-backed tools like ChatGPT, Claude, and Perplexity) don't infer reliably — they read explicit labels. JSON-LD is a <script type="application/ld+json"> block that states, in schema.org vocabulary, what the page's entities are: this is an Article, here's its author, here's its FAQ.
For answer engines this is the load-bearing signal. A meta description barely helps them; a well-formed Article or FAQPage block helps them understand and cite the page. That's why m18t treats the schema.org @type as a first-class field on every content type rather than an afterthought — see The SEO Philosophy.
How m18t generates JSON-LD
Each content type carries a Schema.org @type in its SEO defaults — Article, BlogPosting, FAQPage, WebPage, and so on. When you generate JSON-LD for a piece, m18t uses that type as the schema's @type and fills it from the piece's data (title, the resolved canonical URL, and so on).
You generate it from the content editor:
- Open the piece's SEO tab.
- Find the JSON-LD field near the bottom.
- Click Generate JSON-LD with AI.
The generator runs on your own AI key (BYOK); the button is disabled with a tooltip when no AI key is set. Because m18t injects the resolved canonical into the prompt and instructs the model to use only that URL — or omit the URL field if none exists — the generated schema points at the real address rather than an invented one. See The SEO AI Prompt for the mechanics.
Writing custom JSON-LD
If you need a schema m18t doesn't generate for you — say a Restaurant block for a local-business agency client — you can supply it directly:
- Open the piece's SEO tab.
- Go to the JSON-LD field.
- Paste your valid JSON-LD.
When you push to your CMS, m18t carries your JSON-LD in the payload as-is.
An honest limit: m18t does not validate your JSON
m18t stores and pushes the JSON-LD string you give it; it does not check that the JSON is syntactically valid or that the schema is well-formed. A stray comma can break how the page is parsed. Before you publish custom JSON-LD, paste it into the Google Rich Results Test (or schema.org's validator) and confirm it passes. And as always, m18t emits the block into the CMS payload — your front-end still has to render it into the page. If it's correct in m18t but missing on the live page, see SEO troubleshooting.
What's next
FAQ
Why do AI answer engines care about JSON-LD? It's the explicit, machine-readable description of what's on the page. Answer engines parse it to understand the entity before citing it — far more reliably than they'd infer from prose.
Where does the schema.org @type come from?
From the content type's SEO defaults at /studio/config/content-types. Set Article, FAQPage, WebPage, etc. per type. See Configuring SEO Defaults.
Can I add a schema m18t doesn't support? Yes. Paste valid JSON-LD into the JSON-LD field on the piece's SEO tab and it's pushed as-is.
Does m18t check my custom JSON-LD for errors? No. It stores and forwards the string without validating it. Test custom JSON-LD in the Google Rich Results Test before publishing — a syntax error can break the page's parsing.
Why is the "Generate JSON-LD with AI" button disabled? No AI key is configured. It's BYOK — add a key in the vault to enable it.