Technical SEO. Crawlability
Links Google Cannot Follow: When JavaScript Navigation Quietly Blocks Your Whole Site
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.
What Actually Breaks
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.
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
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.
Related: when Google cannot see your content (the rendering counterpart), crawl depth and site architecture, internal linking at scale, and product page indexability. This is core to my technical SEO work.
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 AuditTags: Technical SEOJavaScript SEOCrawlabilityInternal Linking




