Skip to content
Articles
Methodology9 min read

Schema.org for B2B SaaS: the minimum viable in JSON-LD

The five schema types every B2B SaaS company needs, with JSON-LD snippets ready to paste: Organization, Service, FAQPage, BreadcrumbList and Article.

CTO

a laptop computer sitting on top of a wooden desk
Photo by Nangialai Stoman on Unsplash

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.

{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://acme.com/#organization",
  "name": "Acme SaaS",
  "url": "https://acme.com",
  "logo": "https://acme.com/logo.png",
  "description": "Inventory management platform for EU retailers.",
  "foundingDate": "2021",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Rua X, 42",
    "postalCode": "1234-567",
    "addressLocality": "Lisboa",
    "addressCountry": "PT"
  },
  "contactPoint": {
    "@type": "ContactPoint",
    "contactType": "sales",
    "email": "contacto@acme.com",
    "availableLanguage": ["pt-PT", "en", "es"]
  },
  "sameAs": [
    "https://www.linkedin.com/company/acme-saas",
    "https://github.com/acme-saas"
  ],
  "knowsAbout": ["Inventory Management", "Retail Tech", "ERP"]
}

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.

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:

{
  "@context": "https://schema.org",
  "@graph": [
    { "@type": "Organization", "@id": "https://acme.com/#organization", ... },
    { "@type": "WebSite",      "@id": "https://acme.com/#website",     ... },
    { "@type": "WebPage",      "@id": "https://acme.com/#webpage",     ... },
    { "@type": "Service",      "@id": "https://acme.com/#service-inv", ... },
    { "@type": "FAQPage",      "@id": "https://acme.com/#faq",         ... }
  ]
}

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@idLinks to
Organization#organizationReferenced by the others as provider, author, publisher
Service#service-inventoryprovider → #organization
FAQPage#faqisPartOf → #website
BreadcrumbList/product/inventory#breadcrumbNone in the example
BlogPosting/blog/integrate-sap#articleauthor, publisher → #organization; mainEntityOfPage → /blog/integrate-sap#webpage

The @ids of the Acme examples above, without the https://acme.com at the start.

Validation is not optional

Schema without validation is a trap. Before deploying, three tools:

  • validator.schema.org, checks conformance with the specification.
  • 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.
The minimum viable, before deploying
0 of 9 done

Frequently asked questions

Sources