SEO Fundamentals for SaaS
Technical SEO, meta tags, sitemaps, structured data, content strategy, and Google Search Console setup for your SaaS app.
Why SEO Matters for SaaS
SEO is one of the few growth channels that compounds over time. A blog post you write today can drive traffic for years. For indie SaaS, organic search is often the most cost-effective acquisition channel.
Technical SEO Basics
Meta Tags in Next.js
Use the Metadata API in Next.js App Router:
// app/layout.tsx
import type { Metadata } from 'next'
export const metadata: Metadata = {
title: {
default: 'MyApp — Tagline here',
template: '%s | MyApp',
},
description: 'A one-sentence description of your product.',
openGraph: {
title: 'MyApp — Tagline here',
description: 'A one-sentence description of your product.',
url: 'https://myapp.com',
siteName: 'MyApp',
images: [{ url: '/og-image.png', width: 1200, height: 630 }],
type: 'website',
},
twitter: {
card: 'summary_large_image',
title: 'MyApp — Tagline here',
description: 'A one-sentence description of your product.',
images: ['/og-image.png'],
},
}
For individual pages:
// app/pricing/page.tsx
export const metadata: Metadata = {
title: 'Pricing', // Renders as "Pricing | MyApp"
description: 'Simple, transparent pricing. Start free, upgrade when ready.',
}
Sitemap
// app/sitemap.ts
import type { MetadataRoute } from 'next'
export default function sitemap(): MetadataRoute.Sitemap {
const baseUrl = 'https://myapp.com'
const staticPages = [
'', '/pricing', '/about', '/blog',
].map((route) => ({
url: `${baseUrl}${route}`,
lastModified: new Date(),
changeFrequency: 'weekly' as const,
priority: route === '' ? 1 : 0.8,
}))
// Add dynamic pages (blog posts, etc.)
// const posts = await getBlogPosts()
// const blogPages = posts.map(...)
return [...staticPages]
}
Robots.txt
// app/robots.ts
import type { MetadataRoute } from 'next'
export default function robots(): MetadataRoute.Robots {
return {
rules: {
userAgent: '*',
allow: '/',
disallow: ['/dashboard/', '/api/', '/settings/'],
},
sitemap: 'https://myapp.com/sitemap.xml',
}
}
Canonical URLs
Prevent duplicate content issues:
export const metadata: Metadata = {
alternates: {
canonical: 'https://myapp.com/pricing',
},
}
Structured Data
Help search engines understand your content with JSON-LD:
// app/page.tsx
export default function Home() {
const jsonLd = {
'@context': 'https://schema.org',
'@type': 'SoftwareApplication',
name: 'MyApp',
applicationCategory: 'BusinessApplication',
offers: {
'@type': 'Offer',
price: '0',
priceCurrency: 'USD',
},
description: 'Your product description.',
}
return (
<>
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd) }}
/>
{/* page content */}
</>
)
}
Common schemas for SaaS:
SoftwareApplication— for your product pagesFAQPage— for FAQ sections (often shown as rich results)Article— for blog postsOrganization— for your about page
Content Strategy
Pages Every SaaS Needs
| Page | SEO Purpose |
|---|---|
| Homepage | Brand keywords, product description |
| Features | Feature-specific keywords |
| Pricing | "product pricing" searches |
| Blog | Long-tail keywords, topical authority |
| Docs/Guides | Technical keywords, how-to queries |
| Use Cases | Industry/role-specific keywords |
| Alternatives | "competitor alternative" searches |
| Changelog | Freshness signals, product updates |
Blog Content That Ranks
Focus on content types that attract your target audience:
- How-to guides — "How to [solve problem your product addresses]"
- Comparison posts — "Tool A vs Tool B for [use case]"
- List posts — "Best [category] tools for [audience]"
- Problem-solution posts — "[Common pain point] and how to fix it"
Keyword Research (Free)
- Google Autocomplete — Type your topic and see suggestions
- Google Search Console — See what queries already bring impressions
- Also Asked — Find related questions people search for
- Reddit/forums — See how your audience describes their problems
Google Search Console
Setup
- Go to search.google.com/search-console
- Add your property (use the URL prefix method)
- Verify ownership via DNS record or HTML file
- Submit your sitemap URL
Key Reports
- Performance — Which queries drive clicks, impressions, and your average position
- Coverage — Which pages are indexed and which have errors
- Core Web Vitals — Performance issues affecting rankings
- Links — External sites linking to you
Actions After Setup
- Submit your sitemap
- Request indexing for your most important pages
- Check for crawl errors weekly
- Monitor Core Web Vitals monthly
Performance & Core Web Vitals
Google uses page speed as a ranking signal. The three Core Web Vitals:
| Metric | What It Measures | Good Score |
|---|---|---|
| LCP (Largest Contentful Paint) | Loading speed | < 2.5s |
| FID (First Input Delay) | Interactivity | < 100ms |
| CLS (Cumulative Layout Shift) | Visual stability | < 0.1 |
Quick wins for Next.js:
- Use
next/imagefor all images (automatic optimization) - Use
next/fontfor fonts (no layout shift) - Minimize client-side JavaScript (prefer Server Components)
- Add
loading="lazy"to below-fold images - Avoid layout shifts from dynamic content
Common SEO Mistakes
- No meta descriptions — Every page needs a unique, compelling description (150-160 chars)
- Blocking pages with robots.txt — Don't accidentally block your public pages
- Missing alt text on images — Accessibility and SEO both benefit
- Duplicate content — Use canonical URLs and avoid identical pages
- Ignoring mobile — Google uses mobile-first indexing; test on small screens
- Slow pages — Optimize images, minimize JavaScript, use CDN caching