For a B2B SaaS company, there are five schema types worth more than all the others combined: Organization, Service, FAQPage, BreadcrumbList and Article. Implemented in JSON-LD, with stable @ids and links between them, they are the minimum viable to start being citable by AI. This piece has the snippet for each one, ready to adapt.
Key takeaways
JSON-LD is the right serialisation in 2026
five types solve 80% of the upside: Organization, Service, FAQPage, BreadcrumbList, Article
stable @ids turn loose entities into a graph
validate at validator.schema.org and in the Rich Results Test
irrelevant schema is worse than no schema
Why schema matters for GEO
Schema.org is the standard vocabulary for structured data. In HTML, describing something as an organisation is implicit (from tags like header, from CSS classes, from context). In schema, it is explicit: @type: Organization.
For traditional engines, schema unlocks rich results (stars, expanded FAQ, visible breadcrumbs). For LLMs, schema is the only reliable way to know, without ambiguity, what each thing is. When ChatGPT cites "Acme is a cybersecurity consultancy in Lisbon", it is inferring three things, what it is, what it does, where, and schema narrows the room for error.
The five types, one per tab
The foundation. One Organization entity per company, with a stable @id, referenced by all the other entities as provider, author, publisher.
Three critical fields: sameAs (links to consistent external profiles, LinkedIn, GitHub, Wikipedia if it exists), knowsAbout (3 to 10 topics that assert the company's expertise), and contactPoint with availableLanguage.
One Service per service offered. It links to the Organization through provider:
For B2B SaaS with variable pricing, AggregateOffer with lowPrice signals the entry point without committing to an exposed price table. It works well for "from EUR X" without revealing the ceiling.
A block of questions and answers in structured format. AI models prefer to cite this format because it is trivial to extract:
Rule of thumb: 5 to 10 questions per FAQPage. More than that is noise. The questions should match real queries customers make, not queries invented by the marketing team.
Small but important. It helps crawlers understand the hierarchy of your pages. It produces a visible result in Google SERPs and gives structural clues to LLMs:
Three details many sites get wrong: mainEntityOfPage should point at a WebPage that actually gets emitted (not an @id that never exists). articleSection helps LLMs categorise. author and publisher reference the Organization through @id instead of duplicating data.
The @graph idea (and why it matters)
If you have several entities on the same page, you can wrap them in a @graph instead of scattering multiple application/ld+json script blocks:
The advantage: less parsing, shared context, explicit links through @id. For LLMs, a coherent graph is significantly more legible than five loose scripts.
How the five link up through @id
Type
@id
Links to
Organization
#organization
Referenced by the others as provider, author, publisher
Rich Results Test, tells you which of your schema is eligible for rich results in Google.
Manual inspection in DevTools: copy the JSON, parse it, confirm the @ids are linked.
Typical mistakes we see
Duplicated entities. Organization redeclared on every page instead of referenced by @id.
Missing @id. The schema works, but LLMs treat each block as an independent entity.
FAQPage with fabricated questions. The team invents SEO-friendly questions instead of copying real ones. Result: it discredits everything.
Article with no dateModified. Models prefer to cite recent content; with no dateModified, they have no update signal.
Frequently asked questions
JSON-LD. It is the only one Google explicitly recommends, it is the cleanest to maintain (it separates semantic markup from presentation HTML), and it is what LLMs extract with the highest fidelity. Microdata and RDFa are still supported for compatibility, but they are not worth starting with in 2026.
Either works, the specification does not require one. In the Next.js App Router, the typical pattern is to inject it with a JsonLd component inside the page's return (in the body, before the content). In static sites, the head is cleaner. In both cases, one script tag per semantic block avoids duplication.
It is not mandatory, but it is the difference between having a set of loose entities and having a coherent graph. With stable @ids (like https://example.com/#organization) you can reference the same entity from several pages without duplicating it. Engines and LLMs strongly prefer linked graphs.
Irrelevant or invented schema is worse than no schema. Each type should correspond to something real on the page. Marking a pricing page as Recipe is plainly wrong; marking it as AggregateOffer makes sense. Rule: if you cannot defend why you put it there, take it out.