Technical SEO. Crawlability

Links Google Cannot Follow: When JavaScript Navigation Quietly Blocks Your Whole Site

Looks fineIdentical to a shopper
No hrefNothing for a crawler to follow
No authorityEquity stops dead
CommonEspecially in footers and menus

Quick answer

If a link on your site is built as a JavaScript click handler rather than a real anchor with an href attribute, search engines cannot follow it. The page looks and behaves normally for a shopper, but the crawler sees no destination, so the target page may never be discovered and no internal authority passes to it. This is a different problem from client-side rendering: there the content is missing, here the connections are missing. The fix is to make every navigational link a genuine anchor with a real href, with JavaScript enhancing it rather than replacing it.

There is a failure mode that hides better than almost any other technical SEO problem, because nothing about it looks wrong. Every menu works. Every footer link works. Click anything and you go where you expect. And yet a crawl shows large parts of the site unreachable, internal authority pooling uselessly on the homepage, and important pages either undiscovered or crawled as though they were orphans. The cause is that the links are not links. They are elements with JavaScript attached that move the browser when a human clicks them, and to a crawler they are invisible.

I found exactly this on a large marketplace audit: anchor elements throughout the navigation and footer that carried no href attribute at all, relying entirely on scripted navigation. For users, flawless. For search engines, an entire layer of the site’s internal link graph simply did not exist, which meant no discovery and, just as importantly, no authority flowing to the pages those links pointed at.

Why This Is Not the Same as the JavaScript Rendering Problem

These two issues get conflated constantly, and separating them matters because the diagnosis and fix are different. Client-side rendering is about content: the page’s text and products are drawn by JavaScript after load, so a crawler may receive an empty shell. The problem is what is on the page. This issue is about connections: the page content may be perfectly rendered server-side, but the links between pages are not real links, so the crawler cannot travel. The problem is how pages join to each other.

A site can have either problem independently. A perfectly server-rendered site can have unfollowable navigation, and a site with excellent crawlable links can serve empty JavaScript shells. Sites with both are common, and the symptoms overlap enough that teams often fix one, see partial improvement, and never realise the other is still capping them.

A link Google can follow vs a link it cannotBoth look identical to a shopper. Only one passes authority. Illustrative.A REAL LINKA JAVASCRIPT CLICK HANDLER<a href=”/category/”>Shop</a><a onclick=”go()”>Shop</a>Crawler discovers the destinationAuthority flows to the target pagePage enters the index normallyCrawler sees no destinationNo authority passes anywherePage may never be discoveredDiscoverable and supported.Invisible, however good the page is.RamKrShukla.com
Identical to a user, opposite to a crawler. One passes authority; the other passes nothing. Illustrative.

What Actually Breaks

1
Discovery stops

Crawlers find pages primarily by following links. If the only path to a page is a scripted click, that page may never be discovered at all, unless it appears in a sitemap or is linked from elsewhere. Sitemaps help, but they are a weaker signal than being genuinely linked, and they do not solve the next three problems.

2
Internal authority never flows

This is the expensive one. Link equity moves through real links. A scripted click passes nothing, so pages that appear well-linked in your navigation receive no support at all. Sites in this state often have a homepage hoarding all their authority and deep pages that cannot rank however good they are.

3
Your internal link graph is fiction

Every internal linking strategy, every hub page, every deliberate route you designed, is void wherever the links are not real. Teams work hard on internal linking plans that are technically not being implemented, and the reports look fine because the plan says the links exist.

4
Crawl paths become shallow and narrow

With navigation unfollowable, crawlers reach only what is linked in content or sitemaps, so effective crawl depth increases dramatically across the site. Pages you consider two clicks from home are, to a crawler, unreachable or far deeper, which compounds every crawl-budget problem you already have.

How to Detect It in Ten Minutes

The good news is that this is trivially checkable once you know to look, and the checks require nothing more than a browser and, ideally, a crawler.

The unfollowable-link audit:

  • Right-click a navigation or footer link and choose inspect: does the element have an href attribute with a real URL, or only an onclick or a script handler
  • Try opening a menu link in a new tab, or middle-click it: real links open normally, scripted ones typically do nothing
  • View the page source and search for your key category URLs: if they do not appear as href values, they are not being linked
  • Run a crawler and compare its discovered URL count against your sitemap count: a large gap points at unfollowable navigation
  • In the crawler, check the internal link count for key pages: important pages showing very few inbound internal links despite being in the main menu is the fingerprint
  • Check whether href values are real paths, some frameworks output href of hash or javascript void, which is equally unfollowable

The middle-click test is the one I recommend to non-technical owners, because it takes five seconds and needs no tools. If middle-clicking your main menu items does not open them in new tabs, you probably have this problem, and it is worth escalating to whoever built the site before another quarter of SEO investment is spent on a site that cannot distribute it.

The Fix, and How to Talk About It With Developers

The fix is conceptually simple and usually straightforward to implement: every navigational link should be a genuine anchor element with a real href pointing at the destination URL. JavaScript can still do whatever it needs to do, intercept the click, animate a transition, load content dynamically, but it should enhance a working link rather than replace it. This is a well-established principle in front-end development, and most modern frameworks support it directly through their routing components, which output real hrefs by default when used correctly.

1
Say href, not SEO

Developers respond better to a specific technical requirement than to a general SEO complaint. The ask is precise: navigational elements must be anchor tags with href attributes containing real, absolute or root-relative URLs. That is checkable, testable, and unambiguous.

2
Framework routing components usually do this correctly

Most single-page application frameworks provide link components that render proper anchors with hrefs while still handling navigation client-side. The problem usually comes from custom click handlers written to solve a styling or behaviour issue, not from the framework itself. Point the team at their own routing component.

3
Beware href of hash and javascript void

Some implementations technically have an href but its value is a hash or a script call. That is not a link either. The requirement is a real destination path, which is why the audit checks values and not just the presence of the attribute.

4
Test it as an acceptance criterion

Add it to the definition of done for navigation work: every menu and footer link must open correctly in a new tab and must appear as an href in the page source. That single acceptance test prevents this problem returning with the next redesign.

What to Expect After Fixing It

The recovery pattern here is one of the more dramatic in technical SEO, because you are not improving a signal, you are switching one on. Crawlers begin discovering pages through navigation, which usually shows up first as a jump in crawled and indexed pages in Search Console. Internal authority begins flowing to pages that had been receiving none, and the pages that benefit most are exactly the ones your navigation was always supposed to be supporting, category and hub pages, which often move over the following weeks and months.

The effect compounds with everything else. Internal linking strategies that were void suddenly take effect. Crawl depth improves across the board without touching the architecture, because paths that were broken now function. Pages that seemed stubbornly stuck sometimes move without any change to the pages themselves. That is the signature of an unblocked structural problem: broad improvement in places you did not directly touch.

The wider lesson is worth carrying into every technical audit: check that the mechanisms you are relying on actually exist before optimising them. An internal linking plan assumes links are links. A crawl budget strategy assumes crawlers can travel. When the foundation is quietly absent, months of sophisticated work sit on top of nothing, and the reports will not tell you, because the reports measure the plan rather than the implementation. Verify the plumbing first. It is rarely the interesting part of the job, and it is regularly the part that decides the outcome.

Where This Problem Comes From, and Why It Keeps Returning

Understanding the origin helps you prevent recurrence, because this is rarely incompetence. It usually starts with a legitimate front-end need: a mega menu that must open and close smoothly, a mobile drawer, a filter panel that updates without a page reload, an animated page transition. A developer solves the interaction with a click handler, the interaction works beautifully, and nobody notices that the underlying anchor lost its href along the way, because nothing visible broke. It is a side effect, not a decision, which is exactly why it survives code review.

It returns for the same reason: the next redesign, the next framework migration, the next well-meaning refactor of the navigation component. Unless the requirement is written down as an acceptance criterion and ideally checked automatically, it is one refactor away from coming back. Teams that have been burned once usually add a simple automated test that asserts every navigational anchor has a non-empty, non-hash href, which takes an afternoon to write and prevents years of silent damage.

The Wider Family of Links Crawlers Cannot Follow

1
Buttons used as links

A button element with a click handler navigating the user is the same problem in different clothing. Buttons are for actions, anchors are for destinations, and search engines treat that distinction literally.

2
Links behind interactions

Navigation only rendered after a hover, tap, or scroll event may not exist in the crawled HTML at all. If the destination is important, it should be present in the markup regardless of interaction state, even if it is visually hidden until needed.

3
Form-based and search-only routes

Pages reachable only by submitting a form or performing an internal search are effectively unreachable to crawlers, which do not fill in forms. Any page that matters needs a genuine linked path, not just a search result path.

4
Infinite scroll and load-more

The pagination equivalent of this problem: content loaded on interaction with no crawlable URL behind it. It is covered in more depth in the pagination guide, and the underlying principle is identical, if it needs a click to exist, a crawler will not see it.

The common thread across all of these is a single question worth adding to every technical review: can a crawler reach this page by following markup that exists in the served HTML. If the honest answer is no, then whatever else is true about that page, it is operating at a disadvantage no amount of content quality will overcome.

Common Questions

Can Google follow JavaScript links?

Not reliably, and not at all when the element has no href attribute. Google can execute JavaScript, but link discovery works primarily by parsing anchor elements with real href values. A scripted click handler with no href gives the crawler no destination to follow, so the target may never be discovered and no authority passes.

How is this different from client-side rendering problems?

Client-side rendering is about missing content: the page text is drawn by JavaScript so the crawler may see an empty shell. This is about missing connections: the content may render fine, but the links between pages are not real links, so the crawler cannot travel between them. A site can have either problem or both.

How do I test whether my links are crawlable?

Inspect a navigation link and confirm it has an href attribute with a real URL. Middle-click it: real links open in a new tab, scripted ones usually do nothing. Then view the page source and search for your key URLs as href values. A crawler comparison against your sitemap confirms the scale of the issue.

Is href of hash or javascript void acceptable?

No. Those are not real destinations, so they are as unfollowable as having no href at all. The requirement is a genuine path to the destination page. This catches many implementations that technically have an href attribute but nothing usable inside it.

Do sitemaps solve this problem?

Only partially. A sitemap can help pages get discovered, but it does not pass internal authority, does not establish relationships between pages, and is a weaker signal than genuine internal linking. Relying on a sitemap to compensate for unfollowable navigation leaves most of the damage in place.

What should I ask my developer to do?

Ask for a specific, testable change: every navigational element must be an anchor tag with an href containing a real URL, with JavaScript enhancing rather than replacing it. Most framework routing components do this correctly by default. Add it as an acceptance criterion so it does not return with the next redesign.

Menus that work perfectly and pass no authority?

This problem hides in plain sight and quietly voids every internal linking plan you have. I audit whether your navigation is actually crawlable and give your developers a precise, testable fix.

Technical SEO ServicesGet an SEO Audit

Tags: Technical SEOJavaScript SEOCrawlabilityInternal Linking

Client Results, Not Claims

5x D2C revenue in 18 months via SEO
10x SaaS trials, zero new blog posts
120K Monthly organic visitors from zero

Free Resource

Steal My 40 Point SEO Audit Checklist

The exact list I run on every paid audit. Score your site in 30 minutes.

Get the checklist →

Is your site invisible to AI search?

Ask ChatGPT to recommend brands in your category. If you are not the answer, we should talk.

Book a Free Strategy Call