Static website SEO means making your published pages useful, discoverable, and understandable to search engines. Prebuilt HTML can simplify delivery, but it does not automatically give you the right titles, working redirects, crawlable links, or a sitemap that reflects your latest content.
A static site can look finished in a preview while production serves the wrong canonical, hides a new article, or returns the homepage for a URL that does not exist. Fixing those problems starts with the response your visitor receives, then traces it back to the content, template, build, or hosting rule responsible.
The examples below follow one illustrative guide page through those layers. They apply to hand-built HTML, static site generators, and AI-built websites. Hybrid sites need an additional check: a live page and a build-generated sitemap may update on different schedules.
Are static websites good for SEO?
Yes. A static website can provide everything a public page needs: meaningful content, stable URLs, navigation, descriptive metadata, and a good mobile experience. You do not need WordPress or an SEO plugin to supply those elements. You do need a dependable way to maintain them.
The important question is what “static” describes. A static host can serve a complete HTML document or a nearly empty application shell that JavaScript fills later. Those are different starting points for crawling and rendering.
| Delivery model | What the initial response contains | What to verify |
|---|---|---|
| Prebuilt HTML | Page content generated before the request | The deployed file contains the latest content and correct metadata |
| Client-rendered application | An app shell plus scripts that create the content | Important content and links appear in Google's rendered output |
| Hybrid website | Some prebuilt pages and some pages generated on request | Each page type and discovery file follows its intended update process |
A build turns content and templates into the files or application output ready to run. A deployment makes that output available on your host. Saving a CMS record may change only an input to those processes, which is why a successful save is not always a successful publication.
Check what your server returns, not just which framework you use
Open an important public page in a fresh browser tab. Use View page source, then search for a distinctive sentence from its main content. Also inspect the document response in the browser's Network panel. The Elements panel shows the DOM after scripts may have changed it, so it answers a different question.
If the sentence is missing from the response, investigate the rendering strategy. That does not establish that Google cannot index the page: Google can render JavaScript. However, content that depends on additional scripts, requests, or user interaction creates more things to verify.
Keep the framework you already use if it can deliver the required result. Changing stacks is a large intervention when the actual fault may be one template or hosting rule.
Find the problem before changing your site
Choose one affected URL and write down its exact symptom. “SEO is not working” is too broad to guide a fix. A page that returns an error needs a different investigation from a page that is indexed but receives few clicks.
Use Search Console's URL Inspection tool for Google's recorded indexing state. Compare that with a current browser request and, when necessary, a live inspection. The indexed report may describe an earlier crawl; it is not a continuous production monitor.
| Symptom | First useful check | Likely layer to investigate | Passing result |
|---|---|---|---|
| New page is missing or returns 404 | Request its public URL directly | Content eligibility, generated routes, deployment | The intended content loads at its final URL |
| Page opens from a menu but fails on refresh | Paste the URL into a fresh tab | Hosting route handling or missing output file | Direct navigation works without an existing app session |
Google reports blocking or noindex |
Inspect robots rules, response headers, and HTML | Environment settings or shared template | Public page has the intended crawl and indexing controls |
| Google selects an unexpected canonical | Compare declared URL, redirects, sitemap, and content | URL policy or duplicate templates | Signals consistently identify the intended equivalent page |
| Unknown URL displays the homepage | Inspect the document status and body | SPA fallback or error handling | A nonexistent URL returns a meaningful 404 response |
| Page is crawled but not indexed | Inspect the reported reason, rendered content, and similar pages | Content, duplication, discovery, or an earlier issue | Current evidence supports the page's intended purpose; monitor Google's decision |
| Page is indexed but gets little traffic | Examine queries, impressions, position, and page intent | Demand, relevance, competition, or search presentation | A specific hypothesis replaces unrelated technical changes |
These are starting points, not automatic diagnoses. For example, an absent sitemap entry does not prove that Google has never discovered a page through links.
Fix access failures and unintended indexing controls before rewriting descriptions. Once the URL works, inspect its content and discovery path. The broader technical SEO checklist provides a general investigation sequence; the remaining checks here address static output and publishing mechanics.
Give every page a search purpose and a useful next step
A technically accessible page still needs to answer a question worth visiting for. Before generating dozens of routes, decide what each page helps someone understand, compare, or do.
For the illustrative /guides/static-website-seo/ page, the reader wants a practical implementation guide. Sending that reader to a short product pitch would leave the question unanswered, even if the pitch had perfect metadata.
Map page purposes before filling templates:
| Query theme | Reader's immediate question | Suitable page | Useful material |
|---|---|---|---|
| Static website SEO | What should I configure and check? | Practical guide | Examples, failure symptoms, and verification steps |
| Static page missing from Google | Which layer is preventing discovery or indexing? | Troubleshooting page | Diagnostic sequence and clearly qualified causes |
| Website audit tool | Can this product investigate my site? | Product page | Actual capabilities, constraints, and examples |
This is an illustrative content map, not search-volume research. Check real queries and competing results before treating a theme as a traffic opportunity.
A weak brief says: “Write 2,000 words about static SEO and mention our product.” A useful brief says: “Help the owner of a public static website distinguish a missing route from a missing sitemap entry, inspect canonical and indexing controls, and verify the deployed fix.” The second brief determines the evidence and examples the page needs.
Review generated location, feature, tag, and comparison pages with the same care. If two pages serve the same reader task and differ only in a few substituted words, more metadata will not create a meaningful distinction. Combine them where appropriate or give each a genuinely different purpose supported by useful content.
Finish a helpful page with an appropriate next step: a related implementation guide, an explanation of the relevant product capability, or a way to complete the task. Avoid adding a sales link where the reader still needs the answer. For websites created with AI coding tools, the vibe coding SEO guide covers the broader content and marketing decisions.
Generate useful HTML and accurate page metadata
Shared templates make static website SEO maintainable when they provide sensible defaults and accept page-specific information. They become a liability when every page inherits the homepage's title, canonical, or structured data.
Put the main content and real links in the page output
For a public guide, aim to deliver the heading, main explanation, and important navigation in the initial HTML. Interactive calculators and widgets can add functionality without replacing the entire document with an empty shell.
Compare three views: the response body, the browser's rendered page, and Google's inspected output. If the browser shows a guide but the response contains only an app container, investigate rendering rather than repeatedly submitting the sitemap. Use the JavaScript crawlability guide for a deeper rendering diagnosis.
Generate page-specific titles, descriptions and canonical URLs
Define the required page fields in your Markdown frontmatter, content collection, or headless CMS. This illustrative content record is framework-independent:
{
"path": "/guides/static-website-seo/",
"title": "Static Website SEO: Checks & Examples",
"description": "Check HTML, routes, indexing rules, sitemaps, and images on a static website, then verify each fix on the published page.",
"status": "published",
"indexable": true
}
Combine the approved path with the production origin to generate the canonical. Do not derive it from a preview hostname, or let an unreviewed content field assign an unrelated canonical. Render text through the template engine's escaping rules.
For https://example.com, the relevant output would include:
<head>
<title>Static Website SEO: Checks & Examples</title>
<meta name="description"
content="Check HTML, routes, indexing rules, sitemaps, and images on a static website, then verify each fix on the published page.">
<link rel="canonical"
href="https://example.com/guides/static-website-seo/">
</head>
<body>
<main>
<h1>Static Website SEO: Checks & Examples</h1>
<!-- The useful guide content belongs here. -->
</main>
</body>
The ampersand is escaped in HTML and remains readable in the displayed title. These fragments demonstrate field mapping; they are not a complete document or a ready-made template for every framework.
Inspect several pages that share the layout, including a page with missing optional fields. Ensure a fallback does not silently turn every canonical into the homepage URL. A successful build is not evidence that the production origin and metadata are correct.
Add structured data only when it fits the visible page
An article can use an appropriate article type; a product or breadcrumb trail needs its own relevant representation. Keep the declared title, URL, author, and dates consistent with visible information. Serialize JSON safely rather than assembling strings from unescaped content.
Parse the generated JSON, then use a suitable validator. Google's Rich Results Test checks supported search features; the Schema.org validator covers a broader vocabulary. Google's structured data guidance explains its role in understanding content and eligibility. Valid markup does not guarantee a rich result, and schema is not a prerequisite for indexing an ordinary page.
Make routes, redirects and canonicals agree
A source file, an output file, and a public URL are not necessarily the same thing. Your generator might create guide/index.html, while the host exposes /guide/. Another host may serve an extensionless file or redirect a variant. Inspect the deployed behavior before changing canonical templates.
Pick one public URL format and verify the host follows it
Choose the production hostname, HTTPS scheme, path convention, and trailing-slash policy. Then make generated links, canonicals, sitemaps, and hosting rules agree.
Here is an illustrative test matrix for a site that prefers HTTPS, no www, and a trailing slash:
| Requested URL | Intended response | What to check |
|---|---|---|
https://example.com/guides/static-website-seo/ |
200 with the guide |
Canonical identifies this same final URL |
HTTP or www variant of the guide |
Permanent redirect to the preferred version | No loop, unrelated destination, or needless extra hops |
/guides/static-website-seo |
Redirect if this host serves both slash variants | Final response and internal links use the chosen version |
/guides/static-website-seo/index.html |
Redirect if this alias is publicly available | Duplicate file path is not advertised as a separate page |
| An old guide URL with a genuine replacement | Permanent redirect to the replacement | Relevant content survives and the new page is accessible |
/this-page-does-not-exist-9284/ |
404 |
Error body and HTTP status agree |
You do not have to expose every possible variant just to redirect it. Test the variants your platform actually serves or that users and crawlers can encounter. Likewise, two pages with different purposes should not be canonicalized together simply because their slugs look similar.
Google's canonical guidance describes redirects, canonical declarations, and sitemap inclusion as signals of differing strength. They help communicate your preference; they do not force Google to choose it.
Redirect changed URLs to a relevant destination
Save the old-to-new mapping with your release configuration. After deployment, inspect the old URL's response and follow it to the final page. Update internal links to the destination so normal navigation does not depend on the redirect.
The configuration belongs to the system serving the request. Next.js static export does not provide every server-dependent feature available in a runtime deployment, including its framework redirect and header configuration. A static host can provide suitable alternatives. Do not paste runtime settings into an export configuration and assume the deployed files enforce them.
Return real 404 responses for pages that do not exist
Type a deliberately nonexistent path into a fresh tab. In the Network panel, select the document request and inspect its status, final URL, and response body. This tests an actual GET request; the text “Page not found” is not sufficient.
On Cloudflare Pages, the absence of a top-level 404.html can activate default SPA routing. That can be appropriate for an application, but a public content site needs intentional handling for missing pages. Other hosts have their own fallback rules.
If a missing URL returns homepage content with 200, correct the responsible fallback or route handler and repeat the same request. Return an error for genuinely missing content; redirect only when there is a useful equivalent. Screpy's redirect troubleshooting documentation helps investigate the paths and source links involved.
Keep indexing rules, sitemaps and publishing in sync
Publishing has several checkpoints. A record can be approved in the CMS without appearing in the generated files. A page can be live while the sitemap still describes an older build. And an indexable page can remain unindexed until Google processes and evaluates it.
Use robots.txt and noindex for their separate jobs
robots.txt controls crawler access. A noindex meta tag or HTTP header tells supporting search engines not to index an accessible resource. Google must be able to crawl a page to see its noindex rule.
Check both the document's HTML and its X-Robots-Tag response header. A preview-level header can override your intended production behavior even when the template contains no noindex tag. Inspect the actual production hostname, not only a local build.
Use authentication or another appropriate access control for private previews and unreleased content. Neither robots blocking nor noindex is a confidentiality mechanism. Conversely, do not carry preview restrictions into the public deployment by accident.
Include the canonical pages you intend to make discoverable
Define a shared publication policy for routes, sitemap entries, article listings, and feeds. For example:
| Content state | Public route policy | Sitemap and public listing policy |
|---|---|---|
| Approved, publication time reached, intended for search | Serve the complete page at its canonical URL | Include the canonical page where relevant |
| Scheduled for a future time | Keep unavailable until eligible under your release design | Exclude until publication eligibility is reached |
| Draft or private preview | Protect access or do not publish the route | Exclude from public discovery files |
Public page intentionally marked noindex |
Accessible if needed for visitors | Exclude from the search sitemap; useful visitor navigation can still link to it |
| Removed page without a replacement | Return an appropriate missing-content response | Remove stale references |
This is an illustrative publishing policy, not a universal CMS schema. A public noindex help page and a confidential draft have different requirements.
Use absolute URLs with the right production origin. Review sitemap entries for redirects, errors, unwanted pages, and stale destinations. Google's sitemap documentation explains how these files communicate preferred pages. Inclusion does not guarantee indexing, and a missing entry does not prevent discovery through a useful internal link.
Verify new and scheduled content after the build or refresh
The two simplified paths below show why “published” can mean different things:
| Publishing stage | Fully static page | Runtime page with static discovery files |
|---|---|---|
| Content becomes eligible | CMS or content file is ready | CMS record is ready |
| Page preparation | Build creates HTML | Request-time route can read eligible content |
| Public delivery | Deploy makes generated HTML available | Runtime serves the current page |
| Discovery refresh | Deploy the updated sitemap, index and feed | Refresh any discovery surfaces still produced at build time |
| Search processing | Google discovers, crawls and decides whether to index | Google discovers, crawls and decides whether to index |
On October 2, 2026, we checked one newly published Screpy article. Its public URL returned 200, but it was absent from the sitemap files referenced by our sitemap index. We compared that exact URL against every child sitemap listed in the index. The observation showed a live page and stale discovery coverage; it did not measure an indexing delay or traffic loss. Our site combines runtime content delivery with a generated sitemap, so this is a hybrid publishing example.
For a fully static site, the failure may occur earlier: until a build generates the new route and a deployment serves it, the article URL can remain unavailable. A scheduled publication time alone cannot update already deployed files.
The Astro sitemap integration generates output during a build and provides configuration for filtering and additional pages. Verify that its route coverage and your CMS eligibility rules agree. Installing an integration does not mean it understands arbitrary draft or publication fields.
Give scheduled content a release process that refreshes the affected surfaces when it becomes eligible. Afterward, request the page and inspect the sitemap, article index, and any feed you operate. If one is stale, find its update mechanism before assuming a manual indexing request will repair it. The XML sitemap optimization guide covers deeper sitemap validation.
Build navigation and internal links that survive deployment
A sitemap is not a substitute for a website people can navigate. Make important public pages reachable through meaningful links from relevant pages, indexes, or hubs.
For the example guide, a sensible path might be:
Homepage → Guides index → Static website SEO guide → Relevant troubleshooting guide
The route helps someone browse the site and gives a crawler a path to follow. There is no universal maximum number of clicks or required number of links per article. Prioritize important pages and useful next steps.
Google recommends crawlable anchor links with real href targets. A styled button with only an event handler is not an equivalent navigation pattern. Use descriptive anchors that explain the destination instead of repeating “learn more” without context.
Test links from the deployed page, not just the source directory. A relative link such as images/diagram.webp on /guides/static-website-seo/ resolves inside that guide's directory. If the asset actually lives at /images/diagram.webp, use the correct path generated for your site's base configuration. Sites hosted under a subdirectory need to account for that base rather than blindly changing every path to start at /.
Check navigation, breadcrumbs, article cards, pagination, and in-content links after a template change. A guide linked only from a draft index is not discoverable through the intended public path. Confirm that each linked page exists and that links use the final preferred URL rather than an avoidable redirect.
An orphan-page review needs a known URL inventory as well as the crawl's discovered pages: a crawler cannot report an unknown page it never encountered. Compare published records or sitemap URLs against actual incoming links. Screpy's internal link building mistakes guide explains common navigation and relevance problems worth investigating.
Make images and interactive features fast on mobile
Prebuilt HTML reduces the work needed to generate a page on request. It does not prevent a visitor from downloading oversized images, waiting for heavy scripts, or trying to use a layout that keeps moving.
Start with the actual page and its visitors. Test an important mobile route, identify the largest visible content element, and inspect the requests and scripts that delay useful interaction.
| Problem | What to inspect | Practical improvement | Verification |
|---|---|---|---|
| Oversized hero image | Delivered dimensions, file weight, and loading timing | Generate suitable sizes, use efficient formats, and avoid unnecessarily delaying the main image | The intended image loads at a suitable size without degrading its usefulness |
| Layout moves as images load | Missing dimensions or reserved space | Supply accurate dimensions or an appropriate aspect ratio | Loading the image no longer pushes nearby content unexpectedly |
| Small widget loads a large script on every page | Bundle and third-party requests | Load the widget only where needed; reduce unnecessary hydration | Unrelated pages stop downloading that code and still function |
Use the image pipeline that actually runs in your deployment. A raw asset can bypass framework processing, and a Markdown image may follow a different path from an image component. Check generated output instead of assuming all images were optimized.
For Next.js static exports, the default runtime image optimizer is not available in the same way as a server deployment. Choose an appropriate custom loader, preprocessed images, or another supported delivery pipeline. Merely replacing an HTML image with a component does not settle that deployment requirement.
Write alt text for informative images according to their purpose. Decorative images can correctly use empty alt text. Avoid treating every empty value as an SEO error or filling it with keywords.
Use real-user Core Web Vitals where data is available, alongside controlled tests for diagnosis. Web.dev's Core Web Vitals guidance defines good thresholds at the 75th percentile: LCP at or below 2.5 seconds, INP at or below 200 milliseconds, and CLS at or below 0.1. INP reflects interactions; a page-load lab test alone does not measure every real visitor's responsiveness.
A new or low-traffic page may have no URL-level field sample. That is missing evidence, not proof of excellent performance. Check the scope of any origin-level data, then use lab results to investigate specific causes. The Core Web Vitals guide explains how to interpret these measurements.
After making a change, test the same page under comparable conditions and use it like a visitor. Check navigation, forms, and important interactions. A lighter page that breaks its main task is not a successful optimization.
Preserve useful URLs when moving to a static site
Before replacing a CMS, save an inventory of useful existing pages and assets. Include the URLs that receive search visits, attract links, help customers, or support other important pages. Preserve their content purpose as well as their addresses.
If a URL can remain unchanged, a redesign does not require changing it. Where the address must change, identify the genuinely equivalent destination and implement the redirect in the hosting layer that will serve the old request.
An illustrative migration map might look like this:
| Old URL | New destination | Intended behavior | Verification |
|---|---|---|---|
/guides/static-seo/ |
/guides/static-website-seo/ |
Permanent redirect to the updated equivalent guide | Destination returns the guide and declares its own canonical |
/pricing/ |
/pricing/ |
Preserve the public URL | New template keeps accurate pricing content and links |
/downloads/checklist.pdf |
Same file or equivalent replacement | Preserve access or redirect appropriately | Download still works from old links |
| An obsolete page with no useful replacement | None | Appropriate 404 or 410 response |
Remove it from current discovery files and internal links |
Do not send every old URL to the homepage. That loses the reader's intended destination and conceals which content was actually removed.
Check more than redirects: the new template may have dropped an author, description, canonical, image, tracking configuration, or ownership-verification file. Compare representative pages before and after the move. When language versions exist, keep their equivalent-page annotations consistent rather than pointing every locale to one unrelated page.
Google's site-move guidance recommends preparation, URL mapping, redirects, and monitoring. Search visibility can fluctuate while changed URLs are recrawled and processed; no migration checklist can guarantee an immediate, loss-free transition.
Monitor the old and new paths in your crawl results and Search Console. A broken destination is a fixable release error. An indexed URL being replaced by its new equivalent is a different process, and its timing is not controlled by the static site generator.
Verify each release and monitor what happens next
Make the checks repeatable. An AI edit, layout change, or CMS field adjustment can affect many pages even when the developer intended to update only one. Keep the release's expected URL changes and acceptance criteria with the work.
Test the generated output before deployment
Choose the homepage, one page per important template, a newly eligible article, an old redirected URL, and a deliberately nonexistent path. Expand the sample when a shared component affects more routes.
Automate deterministic checks where practical: required fields, canonical origin, generated routes, parseable JSON, eligible sitemap entries, and valid internal targets. Editorial decisions still need a reader-focused review. A script can detect an empty title; it cannot establish that the page answers the right question.
Check representative live URLs after deployment
Keep a small record of what was tested, when, and against which deployment:
| Check | Passing condition | Responsible layer |
|---|---|---|
| Content and metadata | Production matches the intended page and current template | Content source and rendering |
| Status and redirects | Direct requests reach the right content or intentional error | Hosting and routes |
| Index controls | Public search pages are not unintentionally blocked or noindex |
Environment and templates |
| Discovery | Eligible URLs appear in the intended public indexes and current sitemap | Build or runtime discovery generation |
| Links and assets | Important navigation and resources resolve correctly | Templates, content and asset delivery |
| User experience | Mobile reading and key interactions work without new regressions | Frontend and third-party code |
Inspect a fresh response rather than relying on an already open tab. If output is stale, determine whether the wrong build, application cache, or delivery layer is responsible before changing unrelated SEO settings.
A Screpy Website Audit helps investigate page, link, and image findings across a crawl. Compare relevant results after the fix ships, keeping crawl settings and scope comparable. A successful Screpy crawl supports your investigation; it does not prove that Google received identical content or has indexed it.
If you use an AI assistant, Screpy SEO MCP can retrieve project-scoped crawl and Search Console evidence. A useful request is: “Using these two completed crawl IDs, identify pages whose HTTP status or canonical changed and show the affected URLs.” Keep the response tied to the selected project and available records. Editing templates, deploying files, and scheduling release jobs require their own supported tools and permissions.
Separate indexing progress from search performance
Track five different outcomes: the content was saved, the page is live, it is eligible for indexing, Google has indexed it, and it receives useful visits. None automatically establishes the next.
After resolving a documented access or rendering problem, inspect the affected URL and monitor Google's reported state. If the page is already indexed, investigate its queries and reader fit instead of requesting indexing repeatedly. Evaluate leads or completed tasks alongside clicks when those outcomes matter to the business.
Good static website SEO is a maintained publishing process. Each important page needs useful content, consistent search signals, a working discovery path, and evidence that the deployed result matches the intent.