JavaScript SEO
JavaScript SEO is how search engines handle pages built or filled by JavaScript. If your content or links arrive only after scripts run, crawlers may miss them. This page shows what to fix and how to check it in minutes.
By Théophile Louvart, founder of Porteur · Updated 14 September 2026 · Markdown
What JavaScript SEO means for a small site
JavaScript SEO covers how search engines handle pages built or filled by JavaScript. For a small site, it decides if your /pricing, /blog/how-it-works and /guides/getting-started get indexed, or sit unseen.
Googlebot renders pages with an evergreen Chromium in a second wave. Content that only exists after rendering may be indexed later, and when rendering fails, not at all. Bing renders some JavaScript. Most AI crawlers, such as OAI-SearchBot, PerplexityBot and ClaudeBot, do not execute it, so script-only text is invisible to them as of 2026.
How Googlebot renders your pages
Google first crawls HTML, then queues the page to render. If the HTML already contains your product name, price, and copy, indexing is quick. If those arrive by script, indexing waits for the render queue and may fail if scripts block or error.
Pick a key URL
Choose a template that matters for search, for example /features, /blog/your-post or a category page.
Use Search Console’s URL Inspection tool
Enter the URL and view “HTML after JavaScript”. This is the rendered HTML Google saw.
Check the critical bits exist in HTML
Look for the H1, body copy, product names, prices and internal links. If they are missing, fix your rendering path.
Fetch a fresh crawl
If you ship a fix, request indexing once. Then monitor the Performance report for impressions on queries like “yourproduct pricing” or your post title.
What breaks JavaScript SEO
- Links that are not anchors. Links must be <a> elements with an href. Click handlers, buttons or divs are not crawled as links.
- Content behind clicks, scroll events or hash fragments. Googlebot does not trigger your “Load more” or read #tabs. Put the text in the HTML or provide real paginated URLs.
- Client side rendering only. A blank HTML shell relies on the render queue and can fail. Hydration without HTML content has the same risk.
- Blocked assets. If your scripts or APIs are blocked by robots.txt, Googlebot cannot render the page state.
- Race conditions. Data fetched after render or on user interaction never reaches the rendered HTML snapshot.
A fixed /pricing page returns HTML with the plan names and prices, and its “Start trial” and “Compare plans” links are <a href="/signup"> and <a href="/pricing#compare"> plus a real compare page at /pricing/compare.
Framework choices that help
Server side rendering, static generation and hydration are the answers frameworks give. The goal is the same: ship HTML with the content, then enhance it with JavaScript.
| Approach | When to choose | What to check |
|---|---|---|
| Static generation | Marketing pages, docs, blog | HTML includes copy and links, rebuild on publish |
| Server side rendering | Personalised or frequently updated pages | Fast TTFB and complete HTML on first response |
| Client side only | Prototypes or app-only areas after login | Use noindex or accept weak SEO reach |
Whatever you use, ensure internal navigation is real anchors with href to clean URLs, for example <a href="/guides/getting-started"> rather than a button with onClick. For infinite lists, use paginated URLs like /blog?page=2 and link to them.
How to measure and iterate
- Rendered HTML parity: for each template, diff server HTML against the post-render DOM. Aim for the copy and links to match.
- Indexation: in Search Console, watch “Crawled, currently not indexed” and “Discovered, currently not indexed” for JS-heavy templates.
- Query coverage: in the Performance report, check impressions for exact titles, for example quotes around “How to use yourproduct”. No impressions means Google did not see the text.
- AI visibility: sample key pages with an AI crawler that does not execute JS. If it returns an empty body, your script-only text is invisible to them.
Questions
It is making JavaScript-built pages readable and indexable by crawlers. You ensure the HTML sent to crawlers already contains the content and links, because Google renders later and most AI crawlers do not render at all.
Yes. You can ship fast, rich sites with JavaScript and rank. The constraint is how you render. Use static generation or server side rendering for public pages so crawlers see full HTML.
It is as friendly as your rendering path. Client side only is fragile for SEO because content arrives after scripts run. SSR or SSG with hydration gives you HTML for crawlers and interactivity for users.
Choose the mode, not the logo. Any framework that supports static generation or server side rendering can work. For search pages, prefer modes that output complete HTML and use real <a href> links for navigation.
Replace clickable divs or buttons with anchor elements that have href values to real URLs. Keep the onClick for tracking if you need it, but the crawler must have an <a href> to follow.
Expose paginated URLs such as /blog, /blog?page=2 and link to them with anchors. Keep infinite scroll for users, but let crawlers reach page 2, 3 and so on with real links.
Sources
Check my site, free
Paste your homepage URL to see if your public pages ship their copy and links in HTML, and which rivals already rank on those searches, in about thirty seconds.
- Free check, no card
- Read-only, your own accounts
- Readable by your agent
Read next
- GuideHow to use the URL Inspection tool in Search Console
- GuideTechnical SEO checklist for a small site
- GuideInternal linking for a small site: which pages link to which
- GlossaryIndexation
- GuideOrphan pages: finding the pages nothing links to
- Guiderobots.txt for AI crawlers: GPTBot, ClaudeBot, PerplexityBot and what to allow
- GlossaryRendering
- GuideJavaScript rendering: what Google sees, what the AI crawlers do not