A JavaScript website can render perfectly for you and still send search engines an empty shell, conflicting canonical, soft 404, or blocked asset. Technical SEO starts by comparing what the server sends, what the browser renders, and what the crawler is allowed to index.
Google describes JavaScript processing as crawling, rendering, then indexing. Its current JavaScript SEO guide is the primary reference for the checks below.
Kill the default approach: plugin-only audits
An SEO plugin can flag missing metadata. It cannot prove that a deployed route returns the right status, renders its core content, links to its canonical, appears in the sitemap, or survives JavaScript failure.
Audit the production URL as a fetchable document first. Add keyword and content work after the technical contract holds.
By the end you will have
- A rendered-HTML inspection sequence
- A status, canonical, sitemap, and robots contract
- A JavaScript failure test
- The JavaScript SEO Release Gate
- A Search Console verification loop
Inspect the response before the browser
Fetch an important route directly:
curl -sS -D /tmp/page-headers.txt https://example.com/service \
-o /tmp/page.htmlCheck the status, title, description, canonical, main heading, core copy, and internal links in the saved HTML.
rg -n '<title|description|canonical|<h1|href=' /tmp/page.htmlFor a marketing or guide page, the primary meaning should exist in the server response. Search engines can render JavaScript, but server-rendered facts reduce dependency on a second processing step and improve resilience for browsers, link unfurlers, and AI systems that do not execute the full application.
You should see: the page's unique title, canonical, heading, core answer, and crawlable links without clicking or waiting for client state.
Make status codes tell the truth
Return:
200for a real page301or308for a permanent move404for a missing public resource401or403for protected content as appropriate500or503when the server cannot fulfil the request
A client-rendered "not found" message with 200 is a soft 404. Google explicitly recommends meaningful status codes for JavaScript sites. Test nonexistent routes and removed content with curl -I, not only a browser.
Redirect every hostname and protocol variant to one canonical origin. Avoid redirect chains. Internal links should point directly to the final URL.
Keep canonical signals consistent
Each indexable page needs one canonical that matches its intended public URL. Align:
- Canonical link
- Sitemap URL
- Internal links
- Open Graph URL
- Structured-data URL
- Redirect destination
Do not use JavaScript to replace a canonical from the initial HTML with a different value. Google's guidance recommends setting the canonical in HTML and keeping any JavaScript-generated value consistent.
Parameter pages need a deliberate policy. A filter or campaign parameter may canonicalize to the clean page; a materially different public page may deserve its own canonical. Do not canonicalize every page to the homepage.
Treat robots and sitemaps as separate controls
robots.txt controls crawling. A page-level noindex controls indexing when the crawler can access the page. Blocking a URL in robots.txt can prevent the crawler from seeing its noindex instruction.
A sitemap should contain canonical, indexable, successful URLs only. Remove redirects, missing pages, drafts, admin routes, and parameter variants.
Test the deployed files:
curl -sS https://example.com/robots.txt
curl -sS https://example.com/sitemap.xmlValidate that important routes appear once and resolve successfully.
Render with JavaScript disabled
Open the page with JavaScript disabled or block scripts in browser tooling. The site does not need full interactivity, but its public meaning and navigation should remain available when possible.
Then render normally and compare:
- Did the title or canonical change?
- Did core text appear only after a client fetch?
- Did an error boundary replace the page?
- Did navigation become non-links?
- Did consent or personalization hide the main content?
For content loaded from an API, ensure the crawler can access the endpoint and the page can render a stable result. Avoid requiring a user gesture to load the only copy that explains the page.
Verify metadata and structured data as visible truth
Give every indexable route a descriptive title and meta description. Avoid templates that produce identical text across hundreds of pages.
Structured data must match visible content. Do not add reviews, prices, locations, authors, or availability that a visitor cannot verify. Validate the generated JSON, then inspect the deployed page source to confirm the correct entity and canonical URL are present.
Schema can help systems interpret a page. It cannot make an unsupported page authoritative.
Build internal links around reader questions
Search engines and visitors use internal links to discover related pages. Link from a guide to the relevant service, case study, prerequisite, and next step using descriptive text.
A healthy cluster might connect:
company website launch checklist
-> technical SEO for JavaScript websites
-> performance and accessibility guide
-> Company Launch serviceDo not create orphan articles that appear only in a sitemap. Links inside the main content carry more context than a large footer list.
Magnet: JavaScript SEO Release Gate
# JavaScript SEO Release Gate
RESPONSE
[ ] Important URL returns the intended status
[ ] Unique title, description, canonical, H1, core copy, and links exist in HTML
[ ] Missing URL returns 404
[ ] Redirects reach one canonical origin without a chain
DISCOVERY
[ ] robots.txt permits intended crawl paths
[ ] Sitemap contains canonical 200 URLs only
[ ] Noindex pages remain crawlable when the directive must be seen
RENDER
[ ] Core meaning survives without client JavaScript
[ ] Rendered title and canonical match initial HTML
[ ] Public data loads without auth, gesture, or blocked resources
TRUST
[ ] Structured data matches visible facts
[ ] Internal links connect the page to prerequisites and the next step
[ ] Search Console inspection sees the intended canonical and rendered contentYou should see: matching signals from the raw response, rendered page, sitemap, and Search Console.
Failure modes
| Symptom | Likely cause | First check |
|---|---|---|
| Page works but is absent from search | Crawl, render, canonical, or quality issue | URL Inspection and raw HTML |
| Wrong URL appears in results | Conflicting canonical and internal links | Compare all canonical signals |
| Removed pages remain indexed | Soft 404 or weak redirects | Response status and redirect target |
| Metadata is identical | Global template overwrites route data | Rendered head for several routes |
| Rich result disappears | Structured data no longer matches the page | Visible facts and validator output |
When not to blame JavaScript
- The page is indexed but does not satisfy the query better than competing results
- A new property is still being processed and has too little data for conclusions
- The content has no internal links or external discovery
- The wrong audience or offer makes impressions commercially irrelevant
Technical correctness makes a page eligible and understandable. It does not guarantee indexing, ranking, or demand.
Use Search Console as the external check
After deployment, inspect the homepage, the main commercial page, and new guide routes. Compare Google's selected canonical, rendered HTML, indexing state, and discovered sources. Submit the sitemap once, then investigate patterns instead of requesting indexing for every routine edit.
Track impressions and clicks by page and query over enough time to separate processing delay from a durable issue. Pair search data with on-site actions so ranking gains do not become the only goal.
path
Need the discovery layer fixed with the site?
Company Launch includes technical SEO, structured data, sitemap and robots contracts, performance, analytics, deployment, and an ownership handoff.
Your next action: run the JavaScript SEO Release Gate against one commercial page using its production URL, then fix the first conflicting signal.