A nine-step audit for SaaS marketing sites: docs and changelog indexation, JavaScript rendering, programmatic duplication, and the trial/demo conversion path, tied to a fix-prioritisation system.
Most SEO audits treat a SaaS site like a restaurant website with different words swapped in. They check title tags, run a Lighthouse score, count backlinks, and hand over a PDF. They never touch the pages that actually decide whether a software company ranks: the docs subdomain, the changelog, the JavaScript-rendered pricing page, and the twenty comparison pages your growth team shipped last quarter.
That gap is expensive. A blocked docs section sends every long-tail "how do I configure X" query to a competitor's help center instead of yours. A noindexed changelog means fresh, genuinely useful content never gets crawled. A pricing page that renders its price after hydration means Google may never see it as a price. None of that shows up on a generic checklist.
This is the audit our team runs before any SaaS SEO engagement starts, because content published to pages Google can't crawl is wasted work. It's a nine-step process for product-led SaaS sites: what to check, in what order, and how to turn each finding into a prioritised fix tied to a real funnel stage — not a vague "improve SEO" action item.
You'll need: Search Console access, GA4 access to check event configuration, a crawler such as Screaming Frog or Sitebulb for the rendering and de-duplication checks, and roughly a day for a first pass on a mid-sized site. Sites with thousands of programmatic URLs will spend longer on the de-duplication step.
Here is what this audit covers:
- How to scope the audit against your actual page templates and funnel, before you run a single crawl
- The SaaS-specific crawl and indexation checks — docs, changelog, and programmatic pages — that generic audits skip
- How to verify JavaScript-rendered marketing pages actually get indexed, not just rendered correctly in your browser
- How to de-duplicate the comparison and integration pages competing against each other in search
- How to prioritise findings by reach, severity, and effort, and connect each one to a defined GA4 event
Set the Audit Scope and the SaaS Funnel First
Before crawling anything, define two things: which page templates exist on your site (home, pricing, product, integrations, docs, changelog, blog, programmatic, comparison/alternative), and which funnel stage you're auditing toward. Skipping this step means findings pile up with no way to judge which ones matter.
This audit assumes your site already clears Google's baseline — crawlable, indexable, secure, usable on mobile — as defined in Search Central's SEO starter guide. If you haven't checked that baseline recently, start there; the steps below pick up from a working foundation.
Every SaaS site has roughly nine broad page templates, and each carries different technical risk. A docs page might be static HTML behind a CDN; a pricing page might hydrate its price with JavaScript after the crawler has moved on. Treating every page the same way misses template-specific failures. Use this table as your master checklist through the steps below.
| Template | Indexable | Canonical | Renderable (JS) | CWV sampled | Schema | CTA present | Links in/out |
|---|---|---|---|---|---|---|---|
| Home/landing | Check | Check | Usually static | Priority | Organization, SoftwareApplication | Check | Check |
| Pricing | Check | Check | Often client-rendered | Priority | Offer, FAQPage | Check | Check |
| Product/feature | Check | Check | Check | Sample | SoftwareApplication | Check | Check |
| Integrations | Check | High dup risk | Check | Sample | BreadcrumbList | Check | Check |
| Docs | Common gap | Check | Depends on platform | Sample | BreadcrumbList | Optional | Check |
| Changelog | Common gap | Check | Usually static | Skip | Optional | Optional | Check |
| Blog | Check | Check | Usually static | Sample | Article | Check | Check |
| Programmatic (use-case/location) | High dup risk | High dup risk | Check | Sample | BreadcrumbList | Check | Check |
| Comparison/alternative | High dup risk | High dup risk | Check | Sample | FAQPage | Check | Check |
Pick one funnel to audit toward and keep every stage separate — do not fold them into a single "conversion rate."
- Impression — appears in a search result.
- Click — visits from that impression.
- Engaged session — reads past the fold.
- Email/lead-magnet capture — hands over an email address.
- Free-trial signup or demo request — starts the sales motion.
- Product activation — reaches first real value.
- Product-qualified or trial-qualified lead — usage crosses a revenue-predicting threshold.
- Paid conversion — becomes a customer.
- Expansion/retention — stays and grows.
A page can win at the top of this chain and lose everywhere else. A comparison page that ranks well but sends clicks to a generic pricing page with no relevant CTA shows healthy traffic and a dead funnel underneath. Audit the whole chain, not just the ranking.
Audit Crawl and Indexation Across Every SaaS Surface
Crawl and indexation audits start with robots.txt and your sitemap, then move into Search Console's indexing report. On SaaS sites, check three surfaces first: the docs subdomain, the changelog, and any programmatic template — these get blocked, noindexed, or orphaned more often than marketing pages do.
For general robots.txt syntax and sitemap basics, see theStacc's general SEO audit checklist; this section covers what's different for SaaS. Google's robots.txt documentation is explicit that a disallow rule blocks crawling entirely, not just deprioritises it. SaaS teams routinely disallow entire subdirectories by accident: a staging rule never removed, a docs-platform default scoped for "authenticated preview" and never fixed, or a blanket app disallow that also catches marketing pages on the same path prefix. Pull the live file and check every rule against every template above.
Google's sitemap documentation frames sitemaps as a discovery aid for URLs a crawler might otherwise miss — large or loosely linked programmatic and docs sets qualify. Many SaaS stacks run docs on a separate platform (GitBook, Mintlify, ReadMe, a Docusaurus subdomain) with its own sitemap that never gets submitted alongside the marketing site's. Check both, then open Search Console's page indexing report — the source of truth for whether a URL is indexed, not just crawlable — filtered by URL prefix per template, and match the reported state to the triage list below.
| Search Console state | Likely cause on a SaaS site | Fix owner |
|---|---|---|
| Indexed | Working as intended — confirm it's still the canonical version you want ranking | SEO owner |
| Crawled – currently not indexed | Thin or templated content Google chose not to index, common on auto-generated integration or location pages | Content owner |
| Discovered – currently not indexed | Crawl budget or internal linking gap — the URL is known but never prioritised | SEO owner |
| Excluded by "noindex" tag | Often a CMS or docs-platform default left on by mistake, or a staging flag that shipped to production | Engineering |
| Blocked by robots.txt | A disallow rule catching more than intended, usually from the check above | Engineering |
| Duplicate, Google chose different canonical than user | Programmatic or comparison pages competing with near-identical content and no clear canonical signal | SEO owner |
Docs and changelog pages fail this step more than any other template. Docs platforms often ship with default noindex tags meant for staging that never get flipped for production, and changelogs are frequently built as a JSON or RSS-first feature with an HTML view bolted on — that HTML view is what needs the indexing checks above, not the feed itself.
Found blocked docs or a noindexed changelog and no engineering time this sprint? theStacc's content module researches winnable keywords from live SERP data and publishes long-form articles with schema and internal links on a set cadence, so your content pipeline keeps moving while the technical fix gets queued.
Handle JavaScript-Rendered Marketing Pages
Many SaaS marketing and pricing pages render client-side, which means what a visitor sees and what Googlebot indexes can differ. Verify rendering with URL Inspection's live test and check that the indexed HTML actually contains your headline, pricing, and body copy — not just a loading shell.
SaaS marketing sites increasingly share a JavaScript framework with the product app itself. That's efficient for engineering and risky for SEO. Google's JavaScript SEO documentation confirms Google can render JavaScript, but rendering happens in a second wave after initial crawling, and content depending on client-side fetching or user interaction can be missed entirely.
Test it directly. Run a live URL Inspection test on your pricing page, top comparison pages, and one programmatic template. Search the rendered HTML for your actual headline, price, and FAQ copy — if it's missing there but visible in your browser, Google is likely indexing an empty shell.
Three failure patterns show up repeatedly on SaaS sites:
| Pattern | What it looks like | Fix |
|---|---|---|
| Loading-shell indexing | Rendered HTML shows a spinner or skeleton, no real copy | Pre-render or server-render the specific marketing routes; keep the app itself client-rendered |
| Delayed hydration | Content appears after a client-side fetch call finishes, past Google's rendering budget | Move critical copy — headline, price, FAQ text — into the initial server response instead of a follow-up fetch |
| Interaction-gated content | FAQ answers or pricing tiers only render after a click or tab change | Render all tab and accordion content in the DOM by default; hide it with CSS, not conditional rendering |
If a full migration to server-side rendering isn't realistic this quarter, dynamic rendering — serving a pre-rendered snapshot to crawlers while keeping the client-rendered version for users — is a legitimate stopgap. Treat it as exactly that: it adds a second rendering pipeline to maintain, and it stops working the moment the snapshot generator falls behind the live app.
De-Duplicate Programmatic and Parameterised URLs
Programmatic pages — integrations, use-case, and comparison variants — often generate near-duplicate URLs with different parameters or slight text swaps. Without a clear canonical signal, Google picks one version to rank and ignores the rest, and it may not be the version you intended.
Programmatic SaaS pages are the fastest way to create duplicate-content risk at scale. A page factory generating one integration or comparison page per entry can ship hundreds of URLs in an afternoon, and if forty of them share most of their copy with only a name swapped, Google's guidance on consolidating duplicate URLs is clear that Google will pick one version to show and treat the rest as redundant.
Two separate problems hide inside "duplicate," and they need different fixes. Accidental URL duplication comes from tracking parameters, trailing slashes, and case differences creating multiple crawlable URLs for one page — the same page reachable with and without a referral parameter can resolve to identical content under different URLs. Fix this with a self-referencing canonical on the clean URL and a redirect from parameterised variants where you control the link source.
Template duplication is a content problem wearing a technical mask. If forty industry or comparison pages differ only by a swapped noun, no canonical tag fixes that — Google still sees forty thin pages competing for the same query. Either write genuinely distinct content per page or consolidate the weakest performers into canonical redirects to the strongest one and stop generating new pages from the same shallow template.
Map Keyword and Intent Coverage to the Funnel
Audit whether your content covers all three funnel stages: TOFU educational content, MOFU comparison and category pages, and BOFU pricing, product, and docs pages. Gaps at any stage mean visitors drop out of your funnel before they ever reach a trial or demo.
This step is a coverage audit, not a keyword-research project. If you need a full keyword and cluster strategy, that's a separate exercise — see theStacc's SaaS SEO guide. Here, you're checking whether each funnel stage has a page type actually built for it, or whether entire stages sit empty.
| Funnel stage | SaaS search intent | Typical page type | Common gap |
|---|---|---|---|
| TOFU | Educational — "how to [job-to-be-done]" | Blog, guides | Content exists but never links down to product or comparison pages |
| MOFU | Comparison / alternative — "[competitor] alternative" | Comparison, alternative pages | Missing entirely, or built without genuine feature-level detail |
| MOFU | Category — "best [category] software" | Category or roundup pages | Ceded to third-party listicles and review sites |
| BOFU | Pricing | Pricing page | Ranks but doesn't answer buyer objections directly on-page |
| BOFU | Product / feature | Feature pages | Thin, templated, duplicate risk — see the previous step |
| BOFU | Docs | Documentation | Blocked or noindexed — see the crawl step |
The MOFU row is where most SaaS sites lose the most ground. Comparison and alternative queries carry real buying intent — someone searching for a competitor alternative already knows they want to switch, they're deciding who to switch to — and if that page doesn't exist on your site, a review site or the competitor's own comparison page answers the query instead. For a full plan to close gaps across every stage, see theStacc's SaaS content strategy guide.
Audit Content Quality and E-E-A-T on Product Pages
Product and pricing pages need to demonstrate real value, not templated feature copy. Check whether each page states a specific job-to-be-done, gives an honest comparison where relevant, and shows who wrote or maintains it — the signals Google's helpful-content guidance rewards over thin marketing text.
Google's helpful-content guidance asks one blunt question of every page: would a person land here and get real value, or does it exist mainly to attract search traffic? Product and pricing pages fail this test constantly, not because they're wrong, but because they're generic. Phrases like "powerful integrations" and "enterprise-grade security" describe every SaaS product simultaneously and none of them specifically.
Run this check per page. Does it name the actual job? "Sync new leads to a messaging channel within sixty seconds" is a job description; "native integration support" is a category label wearing a sentence's clothes. Does the pricing page answer the objections a buyer actually has — seat limits, what's metered, what's included per tier — instead of just listing tier names? Does the page show who built or maintains the claim: a named team, a support doc trail, a changelog proving the feature ships and stays maintained?
Comparison and alternative pages need the same test applied harder, since they're the pages most tempted to cut corners. A page listing five advantages for your product and one generic weakness for the competitor reads as marketing, not information, and readers can tell. Name specific, checkable differences: pricing tiers, a feature that genuinely exists in one product and not the other, a setup step one requires that the other doesn't.
Audit Page Experience and Structured Data Per Template
Sample Core Web Vitals on your pricing page and your heaviest JavaScript templates, not just the homepage — those are usually the slowest and most likely to fail. Then check structured data per template: SoftwareApplication and Offer on product and pricing pages, FAQPage and BreadcrumbList elsewhere, all matching visible content exactly.
Google's Core Web Vitals documentation defines the three page-experience signals — Largest Contentful Paint, Interaction to Next Paint, and Cumulative Layout Shift — and most SaaS audits check exactly one URL against them: the homepage. That's a mistake. Homepages are usually the most-optimised page on the site. Your pricing page, carrying a JavaScript-rendered feature table, and your top programmatic template, replicated across hundreds of URLs, are far more likely to fail, and far more likely to be where an actual buyer lands mid-funnel.
Sample at least one URL per template from the field data in Search Console's Core Web Vitals report, plus a lab test on your pricing page and busiest comparison page specifically.
Google's structured data documentation is explicit that markup must match visible content to stay eligible for rich results — schema is not a place to state a claim you haven't put on the page itself. Apply this per template:
| Template | Structured data | What to verify matches |
|---|---|---|
| Product / pricing | SoftwareApplication, Offer | Price, currency, and availability match what's rendered on the page, not a stale cached figure |
| Any page with visible Q&A | FAQPage | Schema text is byte-identical to the visible answer text |
| All templates | BreadcrumbList | Breadcrumb trail matches the actual site navigation hierarchy |
Audit Conversion Surfaces: Trial and Demo Paths
Check that every ranking page actually routes to a working trial signup or demo request, that the form fires its defined event, and that the CTA matches your motion — self-serve pages should offer a trial, sales-led pages should offer a demo, not the reverse.
This step is a UX and measurement check, not a promise that fixing it will lift conversion rates — it verifies the mechanics work and that you can measure what happens next.
Click every primary CTA on your top twenty ranking pages by hand, once a quarter. Redesigns, CMS migrations, and A/B test cleanup routinely leave dead buttons, forms pointed at deprecated endpoints, or CTAs still promoting a trial tier that no longer exists — the single most common finding on this step, and the easiest to fix once found.
Then confirm the event fires. GA4's recommended-events documentation lists sign_up and generate_lead as the standard events, but the business has to define when each one fires — form submit, confirmation-page load, or a backend webhook once the account activates — and confirm it fires that way in GA4's DebugView rather than assuming the original implementation still works.
Last, check the CTA matches the motion. A self-serve product's blog and comparison pages should default to a trial CTA; a sales-led product's should default to a demo request. Mixing them either offers unqualified self-serve trials nobody follows up on, or gatekeeps a demo call in front of visitors who just wanted to try the product themselves.
Instrument, Prioritise, and Re-Check
Connect every finding from this audit to a defined GA4 event, rank fixes by reach times severity times effort, and set a re-check date. A finding without an owner and a re-check date is a note, not a fix — it will not get done.
Every finding needs four things before it goes on a roadmap: which template it affects, how many URLs or how much traffic it touches (reach), how bad the outcome is if left alone (severity), and how much work the fix takes (effort). Rank by reach times severity divided by effort; anything high on all three axes goes first, regardless of what's easiest to explain in a stakeholder meeting.
| Finding | Affected template(s) | Reach | Severity | Effort | Owner | Hypothesis | Event affected | Re-check date |
|---|---|---|---|---|---|---|---|---|
| Docs subdomain disallowed in robots.txt | Docs | All docs URLs | High | Low | Engineering | Unblocking lets Google crawl and index long-tail "how do I" doc queries | Organic sessions to docs pages | +14 days |
| Twelve integration pages share one template with no unique copy | Integrations | 12 URLs | Medium | Medium | Content | Distinct copy per integration reduces internal duplicate-canonical competition | Indexed count for integration pages | +30 days |
| Pricing page Offer schema missing price value | Pricing | 1 URL, high-traffic | Medium | Low | Engineering | Complete Offer markup restores rich-result eligibility | N/A — schema eligibility, not a funnel event | +14 days |
Baseline every metric at the moment you ship the fix, not before — comparing a post-fix number to a baseline taken weeks earlier during the audit conflates the fix with whatever else changed. Re-check at 14, 30, 60, and 90 days: early enough to catch a broken fix, late enough for indexation and ranking effects to show up.
Only report the funnel numbers you can actually source, and keep every field attached each time you display them.
| Formula | Numerator | Denominator | Evidence window | Source system | Owner | Exclusions |
|---|---|---|---|---|---|---|
| Indexation coverage | URLs reported indexed for a template | Total canonical URLs submitted for that template | One declared crawl/inspection date | Search Console (page indexing report) | SEO owner | Non-canonical duplicates, intentionally noindexed URLs, staging/subdomains |
| Organic-to-signup rate | Unique organic visitors who fire the defined sign_up/trial-start event | Unique organic visitors landing on the audited template in the same cohort | One declared cohort window stated on display | GA4 with channel = organic | Growth owner | Bots, internal traffic, paid/branded-nav sessions, existing customers |
| Organic-to-demo-request rate | Unique organic visitors who fire the defined generate_lead event | Unique organic visitors landing on the audited template in the same cohort | One declared cohort window | GA4 + CRM lead record | Marketing owner | Spam/disqualified fills, existing customers, internal submissions |
You've got a prioritised list and no one on the roadmap to write the fixes. theStacc's content module drafts the long-form articles and page rewrites your fix list calls for, in your brand voice, structured for AI-search citation, published to your CMS with schema and internal links already in place.
Failure States This Audit Catches Most Often
Seven failure states account for most of the findings this audit turns up: blocked docs, noindexed changelogs, duplicated programmatic pages, unrendered JavaScript content, pricing pages missing Offer markup, silently broken form events, and orphaned comparison pages with no internal links pointing to them.
Use this checklist as a fast reference once you know roughly where your site tends to break.
| Failure state | What it looks like | Fix |
|---|---|---|
| Docs blocked by robots.txt | Docs subdomain or path disallowed, often a leftover staging rule | Scope the disallow rule to the actual non-production path only |
| Changelog noindexed | Meta robots noindex tag on the HTML view, usually a platform default | Remove the noindex tag on the production changelog route |
| Programmatic pages duplicated without canonical | Dozens of near-identical URLs, no canonical tag or a self-referencing one on every variant | Point weak variants at the strongest version, or add real per-page differentiation |
| JS content unrendered | Rendered HTML in URL Inspection is missing copy visible in the browser | Move critical copy into the initial server response, or pre-render the route |
| Pricing page missing Offer markup | Structured data present but no price, currency, or availability field | Complete the Offer fields and match them to the visible price |
| Form event not firing | GA4 DebugView shows no sign_up or generate_lead event on a real test submission | Re-wire the event to the confirmation state that actually fires today |
| Comparison page orphaned | Page exists and may even be indexed, but nothing on the site links to it | Add it to primary navigation, a resources hub, or relevant blog posts |
If a finding hits the same page twice — orphaned and duplicated, say — fix the duplication first. An orphaned page gets little traffic either way; a duplicated page actively competes against a page you want to win.
Frequently Asked Questions
These seven questions come up most when SaaS teams run their first audit. They cover definitions, docs and changelog risk, JavaScript indexing, audit cadence, and structured data — the parts of this process people ask about after they've already read the nine steps above.
A SaaS SEO audit is a structured review of a software company's marketing site — not the in-product app — checking whether Google can crawl, index, and understand every page template: home, pricing, product, docs, changelog, and programmatic pages. It's a diagnostic exercise, not a ranking guarantee, and it ends in a prioritised fix list, not a score.
A generic website audit assumes most pages share one template and one rendering method. A SaaS site doesn't — pricing might be JavaScript-rendered while docs sit on a separate static platform, and a changelog behaves like neither. A SaaS-specific audit checks indexation and rendering per template instead of applying one crawl report to the whole domain, which is why generic checklists miss docs and changelog issues almost every time.
Beyond the crawl and indexation basics, a B2B SaaS audit should check whether docs live on a subdomain (help.example.com) or a subdirectory (example.com/docs). Subdomains split authority signals from the main domain and often get treated as a separate property in Search Console, which is easy to miss if you only check the main property's coverage report.
Run a quick sanity check with a site search: search site:yourdomain.com/docs and site:yourdomain.com/changelog in Google. If far fewer results come back than you have live URLs, or nothing comes back at all, you likely have a blocking or noindex problem worth confirming in Search Console. The site: operator isn't a precise index count, but a near-empty result set for a section with hundreds of live pages is a reliable red flag.
Yes, but not always on the first pass. Google crawls the raw HTML first and queues rendering as a second wave, and that second wave can lag by hours on well-established sites or considerably longer on newer or lower-authority domains competing for the same rendering budget. That's the practical reason to keep critical copy — headline, price, primary CTA — in the initial server response rather than depending on client-side rendering alone.
Run the full nine-step audit quarterly, and monitor the two highest-risk items — Search Console's indexing report and a spot-check of your top comparison and programmatic pages — monthly in between. SaaS sites change faster than most: new integration pages, pricing changes, and framework migrations all introduce new risk between quarterly audits, so the in-between monitoring catches regressions before the next full pass.
Product and pricing pages typically pair SoftwareApplication with Offer for price and availability, plus FAQPage if there's genuine on-page Q&A and BreadcrumbList for navigation context. Skip AggregateRating unless you have real, verifiable review data to back it — submitting a rating without genuine reviews behind it is a common structured-data policy violation, and valid markup is still never a guarantee of a rich-result placement.
Turn This Audit Into a 30-Day Fix Schedule
Close this audit with three commitments: a fix list sorted by reach, severity, and effort; one owner and one re-check date attached to every item; and a defined funnel you're measuring against. Without those three, an audit is a document nobody acts on — with them, it's a schedule.
Run the nine steps in order once, end to end. After that, you don't need to redo the whole thing every month — re-run the crawl and indexation check and the conversion-surface check monthly, since those break the most often between full audits, and save the complete pass for your quarterly cadence.
The pages this audit surfaces — a fixed docs section, a rewritten comparison page, a new category page to close a MOFU gap — still have to get written. That's where most fix lists stall: the audit finishes, the roadmap ticket sits in a backlog, and six months later the same finding shows up in the next audit.
Get the fix list written, not just found. theStacc researches winnable keywords from live SERP data, drafts long-form articles in your brand voice structured for AI-search citation, and publishes them to your CMS with schema, internal links, and meta tags on a set cadence — so the comparison page and docs coverage this audit calls for actually ship.
Sources & references
- Search Central — SEO starter guide
- Google — Creating helpful, reliable, people-first content
- Google — Introduction to robots.txt
- Google — Sitemaps overview
- Google — Consolidating duplicate URLs
- Google — JavaScript SEO basics
- Google — Introduction to structured data
- Google — Core Web Vitals
- Search Console Help — Index Coverage / Page Indexing report
- Google Analytics Help — Recommended events (GA4)
Researched, written, and published articles that compound organic traffic.