Structured Data for SaaS: Beyond Basic JSON-LD
Most SaaS companies implement Organization schema and call it done. The companies winning rich results in search results go further — here's what they're implementing.
Nextcraft Engineering Team
What Structured Data Actually Gets You
Structured data (JSON-LD is the format Google prefers) communicates machine-readable context to search engines. The payoff comes in two forms:
Rich results: Enhanced SERP displays — star ratings, FAQ dropdowns, article dates, breadcrumbs, event listings. These increase click-through rates significantly (studies show 20–30% CTR improvement for pages with rich results).
Better entity understanding: Even schemas that don't generate visible rich results help Google understand what your page is about, who created it, and how it relates to other entities. This can positively impact rankings for semantic queries.
The Foundation: Organization and Website Schema
Every SaaS site should have these in the root layout:
const organizationSchema = {
"@context": "https://schema.org",
"@type": "Organization",
"name": "Your Company",
"url": "https://yourcompany.com",
"logo": {
"@type": "ImageObject",
"url": "https://yourcompany.com/logo.png",
"width": 200,
"height": 60
},
"description": "One-sentence description of what you do",
"sameAs": [
"https://twitter.com/yourhandle",
"https://linkedin.com/company/yourcompany",
"https://github.com/yourcompany"
],
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer support",
"email": "support@yourcompany.com"
}
};
const websiteSchema = {
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Your Company",
"url": "https://yourcompany.com",
"potentialAction": {
"@type": "SearchAction",
"target": "https://yourcompany.com/search?q={search_term_string}",
"query-input": "required name=search_term_string"
}
};
The SearchAction on WebSite enables Google Sitelinks Search Box — a search field that appears directly in Google results for branded queries.
FAQ Schema: High-Value for SaaS Landing Pages
FAQ schema on pricing and feature pages can generate expandable FAQ dropdowns in SERPs — significant SERP real estate for high-intent queries.
const faqSchema = {
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How much does [Product] cost?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Our pricing starts at $X/month for the Starter plan, which includes [features]. The Pro plan at $Y/month adds [features]. Enterprise pricing is custom — contact us for a quote."
}
},
{
"@type": "Question",
"name": "Is there a free trial?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, we offer a 14-day free trial on all plans. No credit card required."
}
},
{
"@type": "Question",
"name": "Can I cancel anytime?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. We don't lock you into long-term contracts. Cancel your subscription anytime from your account settings."
}
}
]
};
Best practices for FAQ schema:
- Use actual questions your target users ask (check your support tickets, sales calls, and Search Console queries)
- Answers should be complete in the schema — don't truncate
- Match the FAQ content on the page exactly — discrepancies violate Google's guidelines
- Aim for 3–8 questions per page
SoftwareApplication Schema for SaaS Products
This schema type is specifically designed for software applications and can generate rich results showing your star rating, operating system, and price:
const softwareSchema = {
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Your App Name",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Web",
"offers": {
"@type": "Offer",
"price": "49",
"priceCurrency": "USD",
"priceSpecification": {
"@type": "UnitPriceSpecification",
"price": "49",
"priceCurrency": "USD",
"billingIncrement": 1,
"unitText": "MONTH"
}
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"reviewCount": "127",
"bestRating": "5",
"worstRating": "1"
},
"description": "Your app description",
"screenshot": "https://yourapp.com/screenshot.png"
};
Note: the aggregateRating must reflect real reviews. Fabricating reviews violates both Google's guidelines and basic ethics. Collect reviews on your site explicitly for this purpose.
HowTo Schema for Tutorial Content
If you publish tutorial content (step-by-step guides, technical how-tos), HowTo schema can generate rich results with visible steps:
const howToSchema = {
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to Set Up Next.js with TypeScript",
"description": "A step-by-step guide to creating a new Next.js project with TypeScript configuration.",
"totalTime": "PT15M",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "Create a new Next.js project",
"text": "Run `npx create-next-app@latest my-app --typescript` in your terminal.",
},
{
"@type": "HowToStep",
"position": 2,
"name": "Configure TypeScript",
"text": "Open tsconfig.json and set strict: true for maximum type safety.",
}
]
};
Review Schema for Case Studies
Portfolio pages and case studies can use Review schema to highlight client feedback:
const caseStudySchema = {
"@context": "https://schema.org",
"@type": "Article",
"headline": "How We Helped Acme Corp 3x Their Conversion Rate",
"author": {
"@type": "Organization",
"name": "Nextcraft"
},
"review": {
"@type": "Review",
"reviewRating": {
"@type": "Rating",
"ratingValue": "5",
"bestRating": "5"
},
"author": {
"@type": "Person",
"name": "Jane Smith",
"jobTitle": "CTO",
"worksFor": { "@type": "Organization", "name": "Acme Corp" }
},
"reviewBody": "Working with Nextcraft transformed our product. The performance improvements they delivered in 8 weeks would have taken our team 6 months."
}
};
Implementation in Next.js
Keep schema generation clean with a utility:
// components/seo/JsonLd.tsx
export function JsonLd({ schema }: { schema: object }) {
return (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}
/>
);
}
// In a page:
export default function PricingPage() {
return (
<>
<JsonLd schema={faqSchema} />
<JsonLd schema={softwareSchema} />
<main>...</main>
</>
);
}
Validate every schema with Google's Rich Results Test before publishing. Invalid schema silently fails — it generates no rich results and wastes the opportunity.
Continue reading
Related articles
Why Next.js App Router Is Better for SEO Than Pages Router
The App Router isn't just a new file-system convention — it fundamentally changes how search engines crawl and index your Next.js application.
EngineeringServer Components vs Client Components: Making the Right Call
The boundary between Server and Client Components is the most consequential architectural decision you make in a Next.js application. Here's how to draw it correctly.
EngineeringBuilding High-Performance Next.js Applications for Scale
A deep dive into how we utilize App Router and React Server Components to scale our client builds effectively.
Stay Informed.
Join 1,200+ founders and engineers receiving our monthly deep dives on product engineering, design, and growth.