SaaS SEO audit

Audit the SaaS pages that are meant to bring in trials and demos

SaaS sites fail in a specific way: the marketing site is a JavaScript app, and the page a crawler receives is a shell. The copy is there for visitors and missing for anything that does not render. SEOAST reads the HTML your server returns and tells you whether your product, pricing and documentation pages carry their content in it, then checks the tags and structure around that content.

No signup required to start — 10 audits a day without an account.

The 12 checks behind this

Each one is a check that runs, described by the engine itself. If a check changes, this page changes with it.

  • Server-rendered content

    render_dependency

    Visible text as a share of the response body, plus inline script share and server-rendered word count. Fails under 60 words alongside a script-heavy document, or below a 2% text ratio; warns below 5%. SEOAST executes no JavaScript, so this measures what a crawler sees before deciding whether to queue a rendered pass.

    Fixing it: Puts the content in the first response, where every crawler reads it, instead of behind a render pass that is neither fast nor guaranteed.

  • Canonical URL

    canonical

    Presence of <link rel="canonical">, whether its href is absolute in the markup, whether it resolves to the audited URL itself, and whether more than one canonical is declared. A missing or conflicting canonical lets parameter and trailing-slash variants compete with the page.

    Fixing it: Consolidates duplicate URL variants onto one address, so ranking signals stop being split.

  • robots.txt

    robots_txt

    The origin /robots.txt, parsed to RFC 9309: consecutive user-agent lines share a group, the most specific group wins, and the longest matching pattern decides with Allow winning ties. Fails when the audited path is disallowed for Googlebot; warns when the file is absent or declares no Sitemap. Distinct from the robots meta tag: a disallow here stops the crawl, not just the indexing.

    Fixing it: Lets crawlers read the page, so every other signal on it can be seen.

  • Robots meta directives

    robots_meta

    Directives across meta robots, googlebot, bingbot and googlebot-news tags. A noindex or none directive fails the check outright because it removes the page from search regardless of every other signal; nofollow warns because it strips the page of its outbound crawl value.

    Fixing it: Removes a directive that keeps the page out of search regardless of its content.

  • X-Robots-Tag header

    x_robots_tag

    Indexing directives delivered in the response header rather than the markup, including any bot-name prefix. A noindex or none fails; nofollow warns. This is checked separately from the robots meta tag because the two disagree often and a header-level noindex is invisible in the HTML.

    Fixing it: Removes a header-level block that keeps the page out of the index entirely.

  • Title tag

    title

    Presence, length and structure of <title>. Fails when absent or empty; warns outside 15-60 characters (Google truncates around 60) or when a separator-delimited segment such as the brand name is repeated within the same title.

    Fixing it: Improves the strongest on-page relevance signal and the line people click.

  • H1 and title alignment

    h1_title_alignment

    Overlap between the meaningful terms in <title> and in the first <h1>, as a fraction of the smaller term set. At or above 0.5 the two describe the same topic; at or above 0.25 they are loosely related; below that the search result promises one thing and the page delivers another. Reports not_measurable when either element is missing or empty.

    Fixing it: Makes the search result and the page agree about the topic, reducing bounce.

  • Heading hierarchy

    heading_hierarchy

    The h1-h6 outline: how many h1 elements exist, whether any heading is empty, and whether the document skips a level (an h2 followed directly by an h4). Zero or multiple h1 elements and skipped levels both make the page outline ambiguous to crawlers and screen readers.

    Fixing it: Gives crawlers and screen readers an unambiguous outline of what the page covers.

  • Question-and-answer extractability

    qa_content

    Headings that end in a question mark, and summary/details blocks, in the main content — each paired with the copy beneath it, plus any FAQPage or QAPage JSON-LD. Fails when marked-up questions are absent from the visible copy, or when every question on the page has under 15 words beneath it; warns when questions carry no markup, when some go unanswered, or when an answer runs past 200 words before reaching the point. A page with no questions on it reports not_measurable — this measures how liftable existing answers are and does not require a page to have any.

    Fixing it: Lets an answer engine lift a complete answer off this page instead of a fragment of one.

  • Structured data (JSON-LD)

    structured_data

    Every <script type="application/ld+json"> block: whether it parses as JSON, whether it declares an @type (walking arrays and @graph), and which types are present. A block that fails to parse is worse than no block at all, because it forfeits rich-result eligibility silently.

    Fixing it: Makes the page eligible for rich results. Eligible, not guaranteed — Google decides whether to show them.

  • Internal linking

    internal_linking

    Anchors classified into same-site, external, same-page fragment, non-navigation (mailto:, tel:, javascript:) and href-less. Fewer than 3 internal links makes the page a crawl dead end. Reports not_measurable when the final URL could not be parsed, since there is no origin to judge "same site" against.

    Fixing it: Gives crawlers a path onward from this page and spreads authority through the site.

  • Business identity

    business_identity

    The business name as claimed in JSON-LD, og:site_name, the copyright line and the logo alt text, compared across those sources after normalising punctuation and legal suffix. Fails when a page that presents a business names it nowhere readable, or names it only outside structured data; warns when the sources disagree. Reports not_measurable on any page that does not present a business at all.

    Fixing it: Gives search engines one stable business name to match this site against its own listings, reviews and citations.

How this works in practice

The JavaScript problem, measured

One check compares what is in the raw HTML against what a rendered page would need. If your headline and body copy only exist after hydration, the report says so. That matters for search engines that queue rendering for later and for AI fetchers that do not render at all.

Docs and pricing pages deserve their own audit

Documentation is often served from a subdomain with its own robots.txt, canonical rules and templates, and it is frequently where an old noindex survives. Audit a docs page and a pricing page separately from the homepage. The results are often different.

Being readable to AI assistants

People now ask assistants which tool to use. Whether your pages can be fetched and read by those systems is a prerequisite you can check. SEOAST reports which AI crawlers your robots.txt blocks and whether questions on the page are answered directly. SEOAST does not query ChatGPT, Perplexity, Gemini or Google AI Overviews, and it does not track citations or produce an AI visibility score.

What this will not do

One URL per audit from server HTML. It does not execute JavaScript, crawl a docs site or measure signups.

Questions

Does it work on single-page apps?

Yes, and that is where it is most useful. It audits the HTML the server sends, so it shows what a non-rendering crawler receives from a client-rendered page.

Can I run it from CI or an agent?

Yes. The same audit is available through the REST API and the MCP server. See the API section and MCP docs.

Does it crawl all of my docs?

No. One URL per audit. Pick representative pages for each template.

  • Technical SEO audit

    Run a technical SEO audit on any URL. SEOAST checks HTTP status, redirects, HTTPS, robots.txt, the robots meta tag, X-Robots-Tag, canonicals and your XML sitemap, then ranks what to fix first.

  • Generative engine optimization (GEO) audit

    GEO audit for any URL. SEOAST checks the signals generative engines depend on — crawl access for AI bots, snippet eligibility, server-rendered content, structured data, and entity and trust signals — then ranks the fixes.

  • Answer engine optimization (AEO) audit

    AEO audit for any URL. SEOAST checks whether your answers can be extracted: question headings, direct answers beneath them, FAQPage and QAPage schema, heading structure, readability and server-rendered copy.

Audit your page

No signup required to start.