Skip to content

We use analytics cookies to see how the site is used. They are only set if you accept. Accepting also turns on session recording (pages viewed, clicks and scrolls) so we can fix problems; what you type stays hidden. It also lets Meta (Facebook) see your visit, so we can measure our ads. Read the privacy policy

A yellow inspection record stapled to a board beside the words Ready to open?, with three stages stamped OK and the final box still empty.

Inspection card · 7 min read

Technical SEO Before Go-Live: 12 Inspections a New SaaS Landing Page Must Pass

An inspection card for the night before a new SaaS landing page opens: twelve crawl and index inspections, each with the result that passes and, where a terminal can prove it, the one-line command.

Treat the night before your landing page opens like a building inspection: nobody moves in until every stage on the card is signed, and where a terminal can prove a sign-off, the command sits under it so you can compare its output with the passing result printed beside it. The card covers the technical part of SEO that breaks quietly on day one: leftovers from staging, duplicate addresses, the sitemap and what the crawler can actually read. Each rule links to the Google or web.dev page it comes from. Swap example.com for your own domain in every command.

Stage 1, site clearance: staging leftovers

  1. robots.txt on productionNo Disallow: /

    The blanket Disallow: / that kept staging quiet often ships with the first deploy. Google is plain that robots.txt is not a mechanism for keeping a page out of Google: a blocked URL can still be listed, just without a description, so on production the file can only hurt you.

    Expect a 200 and no Disallow: / under User-agent: *.

    curl -s -w '
    %{http_code}
    ' https://example.com/robots.txt
  2. noindex leftoversNone on public pages

    A noindex rule can sit in a <meta name="robots"> tag or in an X-Robots-Tag response header. When Googlebot finds either, Google drops the page from search results entirely. Check both places, because a framework setting and a hosting header are often set by different people.

    curl -sI https://example.com/ | grep -i x-robots-tag
    curl -s https://example.com/ | grep -io '<meta[^>]*robots[^>]*>'
  3. Staging hostPassword, not robots

    To keep a page out of Google, the robots.txt guide names two tools: noindex or a password. A noindex only works when the page is not blocked by robots.txt, since the crawler has to fetch the page to see it. Basic auth on staging is the simpler answer, and it keeps the copy you have not launched yet away from everyone else too.

Stage 2, street address: one URL per page

  1. http and www variants301 or 308 to one host

    Your page answers at up to four addresses: with and without www, over http and https. Pick one. Google puts redirects first in its list of canonical signals, ahead of the rel="canonical" link and the sitemap. Run the command for each variant you do not use; every one should come back as a permanent redirect (301 or 308) with a location pointing at the address you chose.

    curl -sI http://example.com/ | grep -iE '^(http|location)'
  2. A page that does not exist404, or noindex on the error page

    Single-page apps tend to answer every path with 200 and a friendly "not found" screen. Google calls that a soft 404, and its JavaScript guide gives two fixes: a JavaScript redirect to a URL that returns a real 404, or a noindex tag on the error page.

    curl -s -o /dev/null -w '%{http_code}' https://example.com/no-such-page

    curl only sees the server's answer; if you used the JavaScript fix, confirm the noindex in the URL Inspection tool.

  3. Canonical linkSelf, absolute, in the HTML

    Google asks for a self-referential canonical on the canonical page itself, set in the HTML source rather than added later by JavaScript, and never a different URL in the sitemap than in the tag. Tracking parameters such as ?utm_source= from your launch posts then point back to the one clean address.

    curl -s https://example.com/ | grep -io '<link[^>]*canonical[^>]*>'

Stage 3, plans on file: the sitemap

  1. sitemap.xmlAbsolute URLs, UTF-8

    The sitemap guide asks for fully qualified, absolute URLs and a UTF-8 file, best placed at the site root so it covers the whole site. One file holds at most 50,000 URLs or 50MB uncompressed, which a landing page will not reach. List only the canonical URLs you want in results: no staging hosts, no redirects, no pages with noindex.

    curl -s https://example.com/sitemap.xml | grep -o '<loc>' | wc -l
  2. Sitemap line in robots.txtPresent

    One line anywhere in robots.txt tells crawlers that read it where the map is, and Google picks it up the next time it reads the file. It costs nothing and works before you have verified the site in Search Console.

    Sitemap: https://example.com/sitemap.xml
    curl -s https://example.com/robots.txt | grep -i '^sitemap:'
  3. lastmod datesReal dates or none

    Google uses lastmod only when it is consistently and verifiably accurate, and it names a changed copyright year as an update that does not count. A generator that stamps every URL with the build time is the kind of lastmod Google learns to ignore. Use the date the content last changed, or leave the field out.

Stage 4, final walk-through: what the crawler reads

  1. Title elementsOne per page, all different

    Starter templates ship one <title> for every route. Google wants a title on every page, descriptive and concise, with no repeated boilerplate, and it calls out "Home" as a vague title by name. Pricing, docs and changelog each need their own.

  2. Scripts and stylesNot blocked

    Googlebot reads robots.txt before it fetches anything, and Google Search will not render JavaScript from blocked files or on blocked pages. A rule that hides a build folder such as /_next/ or /assets/ can leave the crawler with an empty shell where your hero copy should be.

  3. Core Web VitalsLCP 2.5 s, INP 200 ms, CLS 0.1

    Those are the good thresholds on web.dev: the largest paint within 2.5 seconds, a reply to input within 200 milliseconds, and a layout shift score of 0.1 or less, each met at the 75th percentile of page loads, mobile and desktop counted apart. Before launch there are no real visits to measure, so run a lab test on a throttled phone profile (it reports LCP and CLS; Total Blocking Time stands in for INP until real visits arrive) and fix the hero image and the font swap first.

Certificate of occupancy

Sign the certificate only when all four areas pass. One failure keeps the doors shut: every listing and every post you publish sends its first visitors and crawlers to whatever is live at that minute.

CrawlFails if robots.txt blocks a public page or any build folder

IndexFails if a noindex tag or header remains on a public page

AddressesFails if a second host answers 200, or a missing page answers 200 without a noindex

MapFails if the sitemap lists a URL that redirects, 404s or names another canonical

After the doors open

Once the site is verified in Search Console, submit the sitemap there and run the URL Inspection tool on the home page. Google's noindex guide points to it as the way to see the HTML that Googlebot received, which is the only proof that what you checked with curl is what the crawler saw.

Sources