Skip to content
ExponaBLOG
TECHNICAL SEO FOR DEVELOPERS · DAY 090 / 100

Technical SEO for SaaS products: lessons from production

Marketing site, docs, app — three different SEO problems.

Expona Admin7 min read

Most developers treat their SaaS product as a single SEO problem, but you're actually managing three completely different ecosystems. The marketing site, documentation, and authenticated app each have unique indexing rules, crawl budgets, and conversion paths—and mixing them up costs you signups.

In this article, I'll walk you through Technical SEO for SaaS products, showing you how to optimize each tier independently while keeping them working together as a cohesive funnel.

Marketing Site — Static, Fast, Structured

Your marketing site is your SEO foundation. It's static HTML (or near-static), it's fast, and every page serves a specific intent: feature explanations, pricing tiers, integration lists, customer stories, comparison pages.

The technical wins here are straightforward but often skipped. First, render everything server-side or pre-render at build time. If you're using Next.js, use getStaticProps or generateStaticParams. Cloudflare, Vercel, or Netlify will cache the results and serve them globally in milliseconds. Google's crawlers see pure HTML, not a JavaScript shell waiting for API calls.

Second, structure your data. Every feature page, pricing page, and use case needs schema markup. For a SaaS landing page offering project management tools:

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "name": "ProjectFlow",
  "applicationCategory": "BusinessApplication",
  "operatingSystem": "Web",
  "offers": {
    "@type": "Offer",
    "priceCurrency": "USD",
    "price": "29"
  },
  "description": "Collaborative project management for teams.",
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.8",
    "ratingCount": "1250"
  }
}
</script>

Third, build an internal linking strategy. Your comparison page ("Notion vs. ProjectFlow") should link to feature pages, pricing, and docs. Your feature pages should link to use cases. Your case studies should link to pricing. Don't leave money on the table by treating pages in isolation.

Fourth, optimize for Core Web Vitals. Use next/image for responsive images, lazy-load below-the-fold content, defer non-critical CSS. A slow marketing site loses signups and ranking positions. I've seen companies gain 20–30% more organic traffic just by cutting page load time from 4s to 1.5s.

Finally, set a clear crawl budget. If you have 10,000 marketing pages (unlikely, but happens with heavy personalization), you're competing with your docs and app for Google's crawl capacity. Prioritize: homepage, pricing, features, integrations, blog posts in that order.

Docs — Indexable, Versioned, and Well Linked

Documentation is often the entry point for technical users. Someone searching "how to build a webhook with ProjectFlow API" should land in your docs, not your marketing homepage. Yet many teams either leave docs completely unindexed or create a mess of duplicate content across versions.

Start with indexing strategy. Your current version should be fully indexable. Older versions should carry a rel="canonical" tag pointing to the latest equivalent page, or use noindex, follow to let crawlers discover new content without ranking old documentation.

html
<!-- In docs v2.0 (old version) -->
<link rel="canonical" href="https://docs.projectflow.io/api/webhooks" />

<!-- Or, if the page no longer exists in v3.0 -->
<meta name="robots" content="noindex, follow" />

Second, version your URLs cleanly: docs.projectflow.io/api/webhooks for current, docs.projectflow.io/v2/api/webhooks for archive. Never hide versioning in a dropdown selector (common mistake with Docusaurus and GitBook). Google needs to crawl the HTML.

Third, link aggressively from your marketing site. Your pricing page should link to the getting started guide. Your integration page should link to the integration docs. Your comparison page ("why ProjectFlow is better") should link to relevant feature documentation. Docs convert signups because they prove you've thought through the implementation details.

Fourth, use breadcrumbs and schema markup. Docs are hierarchical; Google should understand that /api/webhooks/events is a child of /api:

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Docs",
      "item": "https://docs.projectflow.io"
    },
    {
      "@type": "ListItem",
      "position": 2,
      "name": "API",
      "item": "https://docs.projectflow.io/api"
    },
    {
      "@type": "ListItem",
      "position": 3,
      "name": "Webhooks",
      "item": "https://docs.projectflow.io/api/webhooks"
    }
  ]
}
</script>

Fifth, manage your sitemap. Split it into sections: marketing site, docs current version, blog. Submit each to Google Search Console. If you're hosting docs under a subdomain (docs.projectflow.io), verify that subdomain separately in GSC and monitor it independently.

The App — Logged-in Pages Should Not Be Indexed

Your authenticated application is not for Google. Those dashboards, settings pages, user profiles—they should never be indexed. Indexed user content creates security risks, dilutes your crawl budget, and produces zero SEO value (no one searches "my dashboard").

Block the app entirely at the HTTP level. In your robots.txt:

html
User-agent: *
Disallow: /app/
Disallow: /dashboard/
Disallow: /user/

But don't rely on robots.txt alone. Add X-Robots-Tag headers to every authenticated response:

html
X-Robots-Tag: noindex, nofollow

If you're using .NET, add this in your middleware (pseudocode):

html
app.Use(async (context, next) => {
  if (context.User.Identity?.IsAuthenticated ?? false) {
    context.Response.Headers["X-Robots-Tag"] = "noindex, nofollow";
  }
  await next();
});

Even better: serve the authenticated app from a different subdomain or path that you explicitly disallow. If your marketing site is projectflow.io, serve the app at app.projectflow.io and block the entire subdomain in robots.txt. This isolates your concerns and makes debugging easier.

Check your Search Console regularly for indexed pages in your app. If crawlers are finding authentication bypass URLs or cached versions, you'll catch them early. I've seen teams lose ranking after Google indexed thousands of "My Account" pages with different user IDs.

Comparison and Integration Pages — High-Intent Pages That Convert

Comparison pages ("ProjectFlow vs. Asana") and integration pages drive qualified traffic. Someone searching "Asana alternative" is ready to evaluate. These pages deserve special attention.

Comparison pages need a specific structure. Heading hierarchy matters:

Section Best Practice
H1 Main comparison title ("ProjectFlow vs. Asana")
H2 Scoring dimensions ("Ease of Use", "Integration Library")
H3 Details under each dimension
Table Feature-by-feature comparison with schema markup

Include a comparison table with schema markup. Google can extract and display it in search results:

html
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Table",
  "about": "ProjectFlow vs. Asana",
  "columns": ["Feature", "ProjectFlow", "Asana"],
  "rows": [
    ["Real-time Collaboration", "Yes", "Yes"],
    ["Custom Workflows", "Yes", "Limited"],
    ["Pricing", "$29/mo", "$10.99/mo"]
  ]
}
</script>

Link to pricing and a CTA ("Start free trial") from every comparison page. These are high-intent users; remove friction.

Integration pages work similarly. If you support Slack, Stripe, and Salesforce integrations, build a dedicated page for each. These pages rank for commercial keywords ("ProjectFlow Stripe integration", "how to connect ProjectFlow to Slack") and convert well because they answer a specific user need. Link them from your integration hub and from relevant docs.

Common Mistakes

  • Mixing marketing and app under one robots.txt: If your app is at /app/ and your marketing site is at /, a single Disallow: /app/ might not catch everything. Use subdomains or explicit path blocking.
  • Duplicate content across docs versions: If v1, v2, and v3 docs all live at the same URL with no canonical or noindex, Google penalizes you. Always version your URLs or canonicalize.
  • Ignoring internal linking between tiers: Your marketing site and docs exist in the same ecosystem. Link them. Treat them as one SEO property, not three separate ones.
  • Slow docs site: Docs are often hosted on CDNs but use heavy JavaScript rendering. Pre-render or server-render. Serve static HTML to crawlers.
  • No schema markup on comparison pages: Comparison pages are structured data gold. Use table schema, software application schema, and aggregated review schema. Crawlers eat this up.
  • Letting authenticated pages leak into search results: Monitor GSC weekly. One cached user profile page in results is one too many.

Key Takeaways

  • Build your marketing site for speed and structure: server-side render, add schema markup, and build an internal linking graph. This is your conversion layer.
  • Make your docs discoverable and current-version-focused: version your URLs, canonicalize old docs, and link from marketing. Docs are your signup catalyst for technical users.
  • Block your app completely: use robots.txt, X-Robots-Tag headers, and ideally a separate subdomain. Authenticated pages have zero SEO value and introduce security risks.
  • Treat comparison and integration pages as high-intent conversion funnels: structure them well, add rich schema, and link them from every relevant location in your marketing site and docs.
  • Monitor Search Console separately for each tier (marketing, docs, app) so you catch indexing errors early. Your crawl budget is finite; protect it.
ShareXLinkedInReddit

Found this useful? Support the writing.

Buy me a coffee
Written by
Expona Admin
Site administrator

Comments

Loading comments…

Leave a comment

Comments are reviewed before they appear. Be kind and stay on topic.

Related articles