What does Google say about SEO? /
Quick SEO Quiz

Test your SEO knowledge in 5 questions

Less than a minute. Find out how much you really know about Google search.

🕒 ~1 min 🎯 5 questions

Official statement

It is better to use pushState in conjunction with static links to ensure that the content remains accessible and crawlable, whether or not JavaScript is understood.
53:40
🎥 Source video

Extracted from a Google Search Central video

⏱ 58:30 💬 EN 📅 25/04/2014 ✂ 15 statements
Watch on YouTube (53:40) →
Other statements from this video 14
  1. 6:23 Google réécrit-il vos balises title sans vous prévenir ?
  2. 14:00 Comment protéger votre site UGC des malwares sans nuire à votre SEO ?
  3. 18:58 Les pages en noindex dans le sitemap XML pénalisent-elles vraiment tout le site ?
  4. 19:58 Les résultats mobile et desktop sont-ils vraiment identiques dans Google ?
  5. 23:05 Bloquer temporairement Googlebot dans robots.txt : une erreur vraiment réversible ?
  6. 25:15 Les petits sites sont-ils vraiment traités de la même manière que les géants du web par Google ?
  7. 31:30 Pourquoi votre site ne remonte-t-il toujours pas après la levée d'une pénalité manuelle ?
  8. 38:29 Faut-il vraiment noindexer vos pages de faible qualité pour améliorer votre SEO ?
  9. 40:04 Une mauvaise implémentation de rel=prev/next fait-elle vraiment chuter votre classement ?
  10. 40:31 Faut-il vraiment désavouer les liens spam au niveau du domaine plutôt que page par page ?
  11. 43:05 Pourquoi Google n'indexe-t-il pas toutes les URL de votre Sitemap en même temps ?
  12. 49:09 Un serveur lent tue-t-il vraiment votre classement Google ?
  13. 50:54 Les prix affichés sur vos fiches produits influencent-ils votre référencement naturel ?
  14. 55:02 Google News fonctionne-t-il vraiment sans intervention éditoriale humaine ?
📅
Official statement from (12 years ago)
TL;DR

Google recommends using pushState alongside static HTML links for backup. The goal is to ensure that your content remains crawlable even if JavaScript fails or is not executed. In practice, every change of URL via pushState should rely on a functional <a href> link, not just on a JS event listener. This is a double-layer security that prevents losing pages in indexing.

What you need to understand

Why does Google emphasize this dual approach?

Google has been urging developers for years to stop relying solely on JavaScript. The reasoning lies in the very architecture of crawling and indexing: Googlebot operates in two stages. First, it fetches the raw HTML. Then, it queues the pages for JS rendering, which can take hours or even days.

If your links only exist in JavaScript (via onClick event listeners without a real href), Googlebot will not discover them during the first pass. You waste time, crawl budget, and risk certain pages never being discovered if the rendering queue is saturated.

What is pushState and why do we use it?

The History.pushState() API allows modifying the visible URL in the browser without reloading the entire page. It is the foundation of Single Page Applications (SPA) and sites that want to provide smooth and fast navigation.

The problem? pushState creates no visible HTML signal in the source. If you change the URL from /page-a to /page-b with pushState, but there is no static link pointing to /page-b, Googlebot will never find that page unless it executes your JS—and even then, there's no guarantee it will click on your virtual button.

How do static links change the game?

A static link is a good old <a href="/page-b"> in the HTML. No JS dependency, no conditions, just a crawlable link immediately.

When you combine pushState and static links, you maintain the modern user experience (fast navigation without reloading) while offering Googlebot a direct fallback path. If JS crashes, if rendering is delayed, if an older bot crawls, the link remains discoverable.

  • pushState handles smooth user experience and URL consistency on the client side
  • Static links ensure discoverability for crawlers and accessibility without JS
  • This dual approach covers all scenarios: active JS, disabled JS, delayed rendering, third-party bots
  • Crawl budget is better utilized since Googlebot discovers everything on the first HTML pass
  • Pages become indexable faster, without waiting for the JavaScript rendering queue

SEO Expert opinion

Is this recommendation really followed in practice?

Let’s be honest: the majority of modern JS frameworks (React Router, Vue Router, Next.js in SPA mode) generate static links by default. If you use a <Link> or <router-link> component, it typically produces a valid HTML href, even if it intercepts the click in JS to perform pushState.

The problem arises on custom sites or older projects where developers manually coded the navigation with clickable divs, buttons without href, or data attributes parsed in JS. These implementations completely slip under the radar of Googlebot during the first pass.

When does this rule not suffice?

Having static links is good. But if your content itself is only loaded in JS after the click, you've only addressed part of the problem. Google will discover the URL, yes, but it will still need to execute the JavaScript to see the actual content.

In this case, you remain dependent on the rendering queue. True strength is having critical content in the initial HTML (SSR or SSG), and progressively enriching it with JS. [To be verified] on very large sites: even with perfect static links, if you have 500,000 pages and all content requires JS rendering, you will saturate your crawl budget and slow down indexing.

Does Google really need this crutch in 2025?

Googlebot has been executing JavaScript for years, and its rendering engine has improved. So why continue to insist on static links? Because JS rendering costs Google money in server resources.

Every page that requires rendering consumes CPU, memory, and adds latency. Google will always prefer a site that does the work for it with raw HTML. Additionally, not all bots are Googlebot: Bing, Yandex, social media scrapers, accessibility tools… many do not execute JavaScript or do so poorly. Static links are a universal insurance policy.

Practical impact and recommendations

How can you check that your site complies with this rule?

First step: inspect the raw HTML source. Right-click > View page source (not the inspector, which shows the DOM after JS). Look for your navigation links. If they appear with a valid href pointing to the correct URLs, that's a good sign.

Second step: completely disable JavaScript in your browser (Chrome DevTools > Settings > Preferences > Debugger > Disable JavaScript). Navigate your site. If the links work and lead to the correct pages (even if the design is broken or the content is incomplete), it means the link structure is solid.

What critical errors should you avoid?

Never rely on navigation solely through onClick event listeners without href. A button or div with onclick="navigateTo('/page')" without an associated <a href> is invisible to Googlebot during the first pass.

Another classic pitfall: links with href="#" or href="javascript:void(0)". Technically, it is a link, but it points nowhere. Googlebot will never follow that. If you use pushState, the href must contain the real destination URL, even if you intercept the click in JS to load content dynamically.

What architecture should you adopt to combine the two?

The ideal is server-side rendering (SSR) or static site generation (SSG). Next.js, Nuxt, SvelteKit, and their peers do this natively: they generate full HTML with all links, then hydrate with JS to activate pushState and client-side navigation.

If you are stuck with pure SPA, at a minimum, set up a prerendering system for key pages, or use dynamic rendering (serving static HTML to bots, JS to users). And ensure that every route accessible via pushState has an <a href> link somewhere in your initial HTML or in a menu.

  • Check that all your navigation links use <a href> tags with complete URLs
  • Test navigation with JavaScript disabled: the links should lead to the correct pages
  • Inspect the raw HTML source (not the DOM after JS) to confirm the presence of href
  • Avoid href="#" or href="javascript:void(0)": they break discoverability
  • If you use a JS framework, ensure that Link components generate valid HTML hrefs
  • For SPAs, set up SSR, SSG, or at least prerendering for strategic pages
Combining pushState and static links ensures that your site remains crawlable, indexable, and accessible in all scenarios. It’s a simple rule, but often overlooked in projects where developers prioritize the JS experience without considering SEO. If this dual architecture seems complex to audit or fix on an existing site, engaging a technical SEO agency can save you valuable time and help avoid costly visibility mistakes.

❓ Frequently Asked Questions

Peut-on utiliser pushState sans liens statiques si on fait du SSR ?
Même en SSR, les liens statiques restent indispensables pour la découvrabilité initiale. Le SSR génère le contenu HTML, mais si tes liens n'ont pas de href valides, Googlebot ne pourra pas naviguer entre les pages lors du crawl. Les deux se complètent.
Les frameworks comme Next.js gèrent-ils automatiquement cette double approche ?
Oui, Next.js (et Nuxt, SvelteKit, etc.) génèrent des liens HTML avec href valides par défaut quand tu utilises leurs composants Link. Ils interceptent ensuite le clic en JS pour faire du pushState. C'est exactement ce que Google recommande.
Que se passe-t-il si mes liens statiques pointent vers des pages vides sans JS ?
Google crawlera les URLs, mais si le contenu n'apparaît qu'après rendu JS, tu restes dépendant de la file de rendu. L'idéal est d'avoir au moins le contenu critique dans le HTML initial, même minimaliste, pour accélérer l'indexation.
Est-ce que cette règle s'applique aussi aux filtres et facettes e-commerce ?
Absolument. Si tes filtres modifient l'URL via pushState, chaque variation doit être accessible via un lien HTML statique (checkbox avec label cliquable contenant un href, par exemple). Sinon, Google ne découvrira pas ces URLs de filtres.
Comment tester rapidement si mes liens sont crawlables sans JS ?
Désactive JavaScript dans Chrome DevTools, ou utilise un outil comme Screaming Frog en mode crawl sans rendu JS. Si tes pages et liens apparaissent, c'est bon. Sinon, tu as un problème de structure HTML.
🏷 Related Topics
Content Crawl & Indexing JavaScript & Technical SEO Links & Backlinks

🎥 From the same video 14

Other SEO insights extracted from this same Google Search Central video · duration 58 min · published on 25/04/2014

🎥 Watch the full video on YouTube →

Related statements

💬 Comments (0)

Be the first to comment.

2000 characters remaining
🔔

Get real-time analysis of the latest Google SEO declarations

Be the first to know every time a new official Google statement drops — with full expert analysis.

No spam. Unsubscribe in one click.