Technical SEO for SaaS Products: The 23-Point Audit Checklist
Many B2B SaaS sites carry technical SEO issues that hold back organic traffic. A 23-point audit checklist to find and fix them.

TL;DR
- Many B2B SaaS sites have critical technical SEO issues quietly holding back their organic traffic
- The "SaaS SEO gap": Most technical SEO guides target e-commerce or blogs -not web applications with dynamic content
- Four critical SaaS-specific issues: JavaScript rendering, authentication walls, duplicate dashboard URLs, slow Time to Interactive
- Many of the fixes take days rather than months, and the most important ones can be done in a single sprint
# Technical SEO for SaaS Products: The 23-Point Audit
Your SaaS product should be ranking. You've published plenty of blog posts, built backlinks, and optimised every meta tag. But organic traffic is stuck.
The problem isn't your content. It's your technical foundation.
SaaS sites tend to share the same technical problems, and they aren't "nice-to-haves." They're traffic killers: JavaScript rendering failures, duplicate dashboard URLs, authentication walls blocking bots, and painfully slow Time to Interactive.
This guide is your complete technical SEO audit checklist for SaaS products.
Why Traditional Technical SEO Advice Fails for SaaS
Most technical SEO guides are written for:
- E-commerce sites (product pages, category pages, filters)
- Blogs (static content, simple structure)
- Local businesses (maps, citations, reviews)
None of these are web applications.
Your SaaS product has unique challenges:
Challenge #1: JavaScript-Heavy Interfaces
E-commerce: Server-side rendered HTML
Your SaaS: React/Vue/Angular Single Page App (SPA)
The problem: Google has to execute JavaScript to see your content. If it fails, your page is invisible to search engines.
Example: Imagine a project management SaaS with a beautifully designed homepage. "View source" shows only this:
<div id="root"></div>
<script src="app.js"></script>That's all Google saw. Zero content. Zero keywords. Zero chance of ranking.
Challenge #2: Authentication Walls
Blog: All content publicly accessible
Your SaaS: Most of your product is behind login
The problem: Google can't (and shouldn't) log in. But you still want certain authenticated pages to be discoverable.
Example: A CRM wanted their "Email Template Gallery" to rank for "sales email templates." But the gallery required login. Google never saw it.
Challenge #3: Dynamic URLs
Blog: /blog/post-title/
Your SaaS: /app/dashboard?project=123&view=kanban&filter=active
The problem: Query parameters create infinite URL variations. Google treats each as a separate page, but they're duplicates.
Bottom line: SaaS sites face technical issues that blogs simply don't, and together they can cost a large share of potential organic traffic.
The 23-Point SaaS Technical SEO Audit
Here's the complete checklist. I've organized it by category with priority levels.
Category 1: JavaScript & Rendering (6 Points)
These are the highest-impact issues for modern SaaS products.
Point #1: Verify Googlebot Can Render Your JavaScript
How to test:
- Go to Google Search Console → URL Inspection Tool
- Enter your homepage URL
- Click "Test Live URL"
- Click "View Tested Page" → "Screenshot"
What you're looking for: Does the screenshot show your full page with content, or just a blank page?
If blank: Google can't see your content. Fix Priority: CRITICAL
Solution:
- Best: Implement Server-Side Rendering (SSR) or Static Site Generation (SSG)
- Next.js, Nuxt.js, or similar frameworks
- Renders HTML on server before sending to client
- Good: Use dynamic rendering
- Serve fully-rendered HTML to bots, JavaScript app to users
- Tools: Prerender.io, Rendertron
- Minimum: Ensure critical content is in HTML, not just JavaScript
What to expect: After moving a React SPA to server-side rendering, Search Console's "Discovered - currently not indexed" count should fall as Google can finally see the content.
Point #2: Implement Proper Meta Tags for SPAs
The problem: In SPAs, meta tags are often added via JavaScript *after* page load. Google sees the default tags, not your JavaScript-added ones.
How to test: View page source (Cmd+U / Ctrl+U). Check if title and meta description are in the HTML or added by JavaScript later.
Solution:
<!-- This works (in HTML before JavaScript runs) -->
<head>
<title>Actual Page Title - Not "React App"</title>
<meta name="description" content="Actual description">
</head>
<!-- This doesn't work for SEO (added by JavaScript) -->
<head>
<title>React App</title>
<!-- Meta tags added by React after load -->
</head>Framework-specific solutions:
- React: Use React Helmet or Next.js Head
- Vue: Use Vue Meta or Nuxt.js head
- Angular: Use Angular Universal
Point #3: Fix JavaScript Errors Blocking Rendering
How to test:
- Open DevTools Console
- Look for red error messages
- Check if errors prevent content from loading
Common SaaS errors:
- Failed API calls on page load
- Missing environment variables in production
- Third-party script errors (analytics, chat widgets)
Solution: Ensure page renders even if:
- API calls fail (show skeleton UI)
- Third-party scripts fail (graceful degradation)
- User is not authenticated (show public content)
Point #4: Optimize Lazy Loading for SEO
The problem: Lazy loading content that appears "above the fold" delays rendering, hurting SEO.
How to test:
- Throttle network to "Slow 3G" in DevTools
- Reload page
- Note how long until main content appears
What to fix:
- ✅ Lazy load images below the fold
- ❌ Don't lazy load your H1, main content, or hero section
Code fix:
// Bad: Lazy loading critical content
<Hero lazy={true} />
// Good: Immediately load critical content
<Hero />
<BelowFoldContent lazy={true} />Point #5: Implement Prerendering for Key Landing Pages
Strategy: Even if your full app is an SPA, prerender key marketing/landing pages.
What to prerender:
- Homepage
- Pricing page
- Feature pages
- Blog index and posts
What can stay SPA:
- Authenticated dashboard
- Settings
- Reports
Tools:
- Prerender.io (£30-£200/month)
- Prerender Cloud (free tier available)
- DIY: Puppeteer + caching layer
Point #6: Check Rendering for International Content
The problem: Using JavaScript i18n (internationalization) that changes content after page load.
How to test: View source for /fr, /de pages. Is content in the right language in HTML?
Solution: Use framework-level i18n that renders on server:
- Next.js:
next-i18next - Nuxt.js:
@nuxtjs/i18n - Angular: Angular Universal with i18n
Category 2: Authentication & Access (4 Points)
Balancing security with search visibility.
Point #7: Verify robots.txt Isn't Blocking Login Pages
The mistake: Blocking /login, /signup from crawlers means Google can't see those pages *exist*.
How to check:
curl https://yoursite.com/robots.txtWhat NOT to block:
User-agent: *
Disallow: /login ❌ Bad
Disallow: /signup ❌ BadWhy? You want /login and /signup to rank for branded searches like "YourProduct login."
What TO block:
User-agent: *
Disallow: /app/* ✅ Dashboard (requires auth)
Disallow: /api/* ✅ API endpoints
Disallow: /admin/* ✅ Admin panel
Disallow: /*?token=* ✅ Magic link tokensPoint #8: Create Public Previews of Gated Content
Strategy: Show a preview of valuable authenticated content to search engines and non-logged-in users.
Real example: Notion's template gallery
- Logged out: Shows template previews, titles, descriptions (Google indexes these)
- Logged in: Full access to use templates
Implementation:
// Pseudo-code
if (user.isAuthenticated) {
return <FullDashboard />
} else {
return (
<>
<DashboardPreview />
<SignUpCTA />
</>
)
}What to preview:
- Feature showcases (screenshots/videos)
- Template galleries
- Example reports/dashboards
- Integration directories
Point #9: Use Proper Meta Tags for Authenticated Pages
For pages that SHOULD be blocked:
<meta name="robots" content="noindex, nofollow">Use this for:
- Individual user dashboards
- Account settings
- Billing pages
- Private projects/workspaces
Don't use for:
- Login page
- Signup page
- Public product pages
- Help documentation
Point #10: Implement LD+JSON for SoftwareApplication
Most SaaS sites miss this. It helps Google understand what your product does.
Example schema:
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "YourProduct",
"applicationCategory": "BusinessApplication",
"operatingSystem": "Web",
"offers": {
"@type": "Offer",
"price": "99.00",
"priceCurrency": "GBP"
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.8",
"ratingCount": "340"
}
}Where to add: Homepage, pricing page, app index
Category 3: URL Structure & Duplicate Content (5 Points)
Dashboard URLs create massive duplication if not handled properly.
Point #11: Canonicalize Query Parameter Variations
The problem: /app/dashboard?view=list and /app/dashboard?view=grid are different URLs with same content.
How to check: Google Search Console → "Coverage" → "Excluded" → Look for "Duplicate without user-selected canonical"
Solution: Add canonical tag pointing to base URL:
<!-- On /app/dashboard?view=grid -->
<link rel="canonical" href="https://yoursite.com/app/dashboard">Point #12: Handle Pagination Properly
The problem: If you have paginated content (help docs, blog archive), each page competes with itself.
Solution: Use rel="next" and rel="prev" tags:
<!-- On /blog/page/2 -->
<link rel="prev" href="https://yoursite.com/blog/page/1">
<link rel="next" href="https://yoursite.com/blog/page/3">Alternative: Use "View All" canonical:
<!-- On /blog/page/2 -->
<link rel="canonical" href="https://yoursite.com/blog">Point #13: Implement Clean URLs for Features
Bad URL structure:
/app?feature=email_templates
/app?feature=crm&sub=contacts
/app?feature=reports&type=sales&period=monthlyGood URL structure:
/features/email-templates
/features/crm/contacts
/features/reports/salesWhy it matters: Clean URLs perform better in search, get more clicks, and are easier to link to.
Point #14: Set Up Redirect Rules for Old URLs
Common scenarios:
- Renamed features (
/old-feature→/new-feature) - Removed pages (
/deprecated→/recommended-alternative) - Changed URL structure (
/app?page=X→/features/X)
How to implement:
// Next.js example
module.exports = {
async redirects() {
return [
{
source: '/old-feature',
destination: '/new-feature',
permanent: true, // 301 redirect
},
]
},
}Point #15: Audit for Soft 404s
The problem: Pages that return 200 (success) but show "Page not found" content.
How to check:
- Google Search Console → "Coverage" → "Soft 404"
- Or manually: Try accessing
/definitely-doesnt-exist
If it shows your 404 page but returns HTTP 200: Fix it.
Solution: Ensure 404 pages return HTTP 404 status:
// Next.js example
export async function getStaticProps() {
const data = await fetchData()
if (!data) {
return {
notFound: true, // Returns 404 status
}
}
return { props: { data } }
}Category 4: Performance & Core Web Vitals (4 Points)
Google uses Core Web Vitals as a ranking factor.
Point #18: Achieve LCP < 2.5s
Largest Contentful Paint: How quickly main content loads
How to test: PageSpeed Insights → Enter URL → Check LCP score
Target: <2.5 seconds (green)
Common fixes:
- Optimize hero images (next/image, lazy loading)
- Reduce JavaScript bundle size
- Use CDN for static assets
- Enable server-side rendering
Point #19: Achieve FID < 100ms
First Input Delay: How quickly page responds to user interaction
Target: <100ms (green)
Common fixes:
- Code-split large JavaScript bundles
- Defer non-critical JavaScript
- Use web workers for heavy computation
- Remove render-blocking scripts
Point #20: Achieve CLS < 0.1
Cumulative Layout Shift: How much content shifts while loading
Target: <0.1 (green)
Common causes in SaaS apps:
- Images without width/height attributes
- Ads or embeds loading late
- Fonts loading and changing layout
- Dynamic content injected above existing content
Solution:
// Bad: No dimensions, causes layout shift
<img src="hero.jpg" />
// Good: Specify dimensions
<img src="hero.jpg" width="1200" height="600" />
// Best: Use Next.js Image (automatic optimization)
<Image src="/hero.jpg" width={1200} height={600} />Point #21: Optimize Time to Interactive
TTI: How long until page is fully interactive
Target: <3.8 seconds
How to improve:
- Minimize JavaScript execution time
- Remove unused code (tree-shaking)
- Code-split by route
- Lazy load below-the-fold components
Test: Chrome DevTools → Performance tab → Record page load → Check TTI
Category 5: Mobile & Accessibility (4 Points)
Mobile-first indexing means Google primarily uses mobile version.
Point #22: Pass Mobile-Friendly Test
How to test: Google Mobile-Friendly Test tool
Common failures:
- Text too small to read
- Touch targets too close together
- Content wider than screen
- No viewport meta tag
Solution:
<meta name="viewport" content="width=device-width, initial-scale=1">And responsive CSS:
@media (max-width: 768px) {
.dashboard {
grid-template-columns: 1fr; /* Single column on mobile */
}
}Point #23: Implement Proper Heading Hierarchy
The problem: Using headings for styling rather than structure.
Bad:
<h1>Product Name</h1>
<h3>Feature 1</h3> <!-- Skipped H2 -->
<h2>Feature 2</h2> <!-- Out of order -->Good:
<h1>Product Name</h1>
<h2>Feature 1</h2>
<h3>Feature 1 Sub-point</h3>
<h2>Feature 2</h2>Why it matters: Screen readers and search engines use heading hierarchy to understand content structure.
Walkthrough: How a Fix Sprint Might Play Out
Here is how this might play out for a mid-sized project management SaaS whose marketing pages are built as a pure React SPA.
Week 1: The audit
The audit turns up a familiar mix of critical issues: the homepage, pricing and key feature pages fail to render for Googlebot, dashboard URLs with query parameters are being indexed as duplicates, LCP is well over the 2.5s target, SoftwareApplication schema is missing, and a handful of "not found" pages return HTTP 200. Lower-priority issues include gated content with no public preview, wrong canonicals on blog pagination and poor mobile CLS.
Week 2: Implementation
- Rendering: migrate the homepage, pricing and feature pages to Next.js SSR so they ship full HTML
- Duplication: add canonical tags to query parameter variations, resubmit the sitemap and request recrawls
- Performance: switch to next/image, code-split bundles by route and put static assets on a CDN
- Schema and status codes: add SoftwareApplication schema and make soft 404s return a real 404
- Mobile: fix layout shifts, enlarge touch targets and confirm the viewport tag
The weeks after
Google reindexes the fixed pages over the following weeks, and Search Console's indexed page count should rise. Rankings and click-through rates often follow as pages become crawlable and schema earns richer snippets. Track organic traffic, indexed pages, Core Web Vitals and leads from organic against the pre-fix baseline, and weigh the gains against the developer time the sprint cost.
Prioritisation Framework: What to Fix First
You can't fix everything at once. Here's how to prioritise.
Critical (Fix This Week)
Issues that block the most traffic:
- JavaScript rendering failures
- Core Web Vitals in red (LCP >4s, CLS >0.25)
- Major duplicate content issues
- Broken redirects/404s on high-traffic pages
Estimated impact: The largest gains
High Priority (Fix This Month)
Issues that meaningfully limit traffic:
- Missing schema markup
- Authentication walls blocking valuable content
- Poor mobile experience
- Slow Time to Interactive (>5s)
Estimated impact: Solid additional gains
Nice-to-Have (Fix This Quarter)
Optimization opportunities:
- Fine-tuning heading hierarchy
- Optimizing internal linking
- Adding FAQ schema
- Improving breadcrumb navigation
Estimated impact: Smaller, incremental gains
Tools & Resources for SaaS Technical SEO
Free tools you need:
- Google Search Console - Monitor indexing, check for errors
- PageSpeed Insights - Test Core Web Vitals
- Mobile-Friendly Test - Check mobile usability
- Screaming Frog (free up to 500 URLs) - Crawl your site like Googlebot
- Chrome DevTools - Inspect rendering, check for JavaScript errors
Paid tools worth it:
- Ahrefs Site Audit (from £99/month) - Comprehensive technical audit
- Semrush Site Audit (from £108/month) - Alternative to Ahrefs
- Prerender.io (from £30/month) - JavaScript rendering for bots
For developers:
- Lighthouse CI (free, open source) - Automated performance testing
- Next.js / Nuxt.js (free, open source) - Frameworks with built-in SEO features
Your Technical SEO Action Plan
This week:
- [ ] Run Google Search Console coverage report
- [ ] Test homepage rendering in URL Inspection tool
- [ ] Check PageSpeed Insights for Core Web Vitals
- [ ] Identify top 3 critical issues
Next week:
- [ ] Fix JavaScript rendering (if applicable)
- [ ] Optimize LCP to <2.5s
- [ ] Add SoftwareApplication schema
This month:
- [ ] Complete full 23-point audit
- [ ] Fix all critical and high-priority issues
- [ ] Monitor traffic in Google Analytics
Within 90 days:
- [ ] Measure the traffic impact in Search Console and analytics
- [ ] Maintain fixes and monitor for regressions
- [ ] Move to optimization phase
The reality: Most SaaS companies ignore technical SEO. By fixing it, you're not just improving -you're leapfrogging the competitors who don't.
---
Need help with technical SEO for your SaaS product? OpenHelm's AI agents can automatically identify and flag technical SEO issues, monitor Core Web Vitals, and alert you to regressions before they impact traffic. See how it works →
Related reading:
---
Frequently Asked Questions
Q: Is traditional SEO still relevant with AI search?
Yes, but it's evolving. Traditional SEO fundamentals (quality content, technical optimisation, authority building) remain important because AI search engines still rely on these signals for retrieval. The change is in what content gets cited and how.
Q: How do I optimise content for AI search engines?
Focus on directly answering questions, providing comprehensive coverage, citing authoritative sources, and using clear structure. AI models prefer content that demonstrates expertise and provides genuine value over keyword-optimised filler.
Q: How long does it take to see GEO results?
Initial citations typically appear within 2-4 weeks for well-optimised content on sites with existing authority. Meaningful traffic and brand awareness impact usually takes 3-6 months as citations compound and users begin searching for you directly.
More from the blog
How to Set Up Claude Code on a VPS: A Complete Guide
Claude Code VPS setup, step by step: provisioning, authentication, tmux vs systemd, security, and an honest look at when a VPS beats running locally.
Claude Code Agent Teams: How to Run Them on a Schedule
Claude Code Agent Teams runs up to 10 parallel Claude instances against one task list. What it is, how it works, and how to schedule runs.
Stop doing the work around the work
OpenHelm connects to your tools, reads the context, and does the steps, so you sign off on the result instead of producing it. See how it covers an entire role’s weekly workload, check the pricing, or run it yourself with the free local app.