SEO · 8 min read
Is JavaScript Bad for SEO? How to Tell If Google Sees It
Summary
Google renders JavaScript — it just never clicks. Here is the 60-second test to see what Googlebot got, plus the four patterns that hide your copy.
By Hyder Shah, Founder & CEO · Published July 13, 2026 · Updated July 13, 2026
Someone told you your site is 'built in JavaScript' and that this is why you are not ranking. That diagnosis is usually wrong, and it usually costs you a rebuild you did not need.
The honest answer is no, but. Google does run your JavaScript. It just runs it late, and it will not click anything. Those two facts explain almost every real case of missing content on a service-business website.
Does Google actually index JavaScript content?
Yes. Google processes JavaScript pages in three phases — crawling, rendering, and indexing — and executes the JavaScript with an evergreen version of Chromium before indexing what comes out. That is straight from Google's JavaScript SEO documentation.
The catch is timing. Google says pages get queued for rendering, and that a page may stay on this queue for a few seconds, but it can take longer than that. Rendering happens once Google's resources allow. Nobody outside Google can tell you how long that is for your site.
So client-side rendering is a delay tax, not a death sentence. Google's own doc still says server-side or pre-rendering is a great idea, because it is faster for users and crawlers, and because not every bot runs JavaScript at all — which increasingly matters when AI crawlers are fetching your pages.
The rule that actually decides your fate is one line in Google's web-components guidance: if the content is not visible in the rendered HTML, Google cannot index it. Everything below is a way that rule bites you.
How do you check what Googlebot really sees on your page in 60 seconds?
Open Search Console, run URL Inspection on the page, click Test Live URL, then View Tested Page, then the HTML tab — that is the rendered HTML Google actually got. Ctrl+F for a sentence from your own service copy. If it is not there, Google does not have it.
| Step | What you do | What it proves |
| 1 | URL Inspection on the exact page URL | Google has (or has not) crawled it |
| 2 | Test Live URL, then View Tested Page, then HTML | You are looking at rendered HTML, not your source |
| 3 | Ctrl+F for a full sentence of your service copy | Whether your money copy exists to Google |
| 4 | Ctrl+F for a reviewer's name from your testimonials | Whether third-party widget text is on your page |
| 5 | Ctrl+F for a city name from your locations list | Whether a JS-loaded location list rendered |
| 6 | Read the Screenshot tab | Whether the render broke visually or timed out |
The Rich Results Test does the same job and does not need Search Console access, so it works on a prospect's site. Google names both tools as the way to check rendered output.
Do not use your browser's View Source for this. View Source shows the HTML your server sent. Right-click, Inspect shows the DOM after your browser ran the JavaScript. Neither one is what Google stored. Only the rendered HTML in Search Console is. This is step one of any real technical SEO audit.
Is your service copy hidden behind a tab or accordion?
Content inside a tab or accordion is fine — as long as the text is already in the rendered HTML and the click only shows or hides it with CSS. Google explicitly permits moving content into accordions or tabs, provided the content is equivalent to your desktop version.
The version that kills you is the one where the tab fetches its copy on click. Your 'Root Canals' tab is empty markup until someone taps it, and then JavaScript pulls the text from an API. Googlebot never taps. Google's guidance is blunt: it will not load content that requires user interactions such as swiping, clicking, or typing.
You cannot tell these two apart by looking at the page. They look identical in a browser. The only way to know is the rendered-HTML check above: open the tab-hidden text, copy a sentence, and search for it in Google's rendered HTML.
This is the single most expensive pattern for service businesses, because the tabs are almost always where the service descriptions live — the exact copy that is supposed to rank you for 'emergency AC repair' or 'estate planning attorney'.
Why are your client-side review widgets invisible to Google?
Most review widgets fail one of two ways: they render inside an iframe, which means the review text belongs to the widget vendor's page and not yours, or they inject the text only after a scroll or click event, which Googlebot never fires.
A widget that writes review text straight into your page's DOM on load is fine — Google renders it and can index it. Check with the same Ctrl+F test: search the rendered HTML for a reviewer's first name. If the name is missing, your testimonials contribute nothing to the page.
One more trap: if you add Review or AggregateRating structured data, Google's guidance is that your structured data must match the visible text on the page. Marking up reviews that are not in the rendered HTML is not a clever workaround — it is a mismatch.
The lazy fix is boring and it works: publish a handful of real reviews as plain text in your page's HTML, and let the widget be a bonus on top.
Do load-more buttons and JS location lists get crawled?
No — not unless each item has a real link. Google can only crawl a link if it is an anchor element with an href attribute. Google's link best practices doc lists what fails, including span elements pretending to be links and anchors that only carry an onclick handler.
| Markup | Crawlable? | Why |
| a href='/service-areas/tampa' | Yes | A real anchor with a real URL |
| a href='/tampa' onclick='goTo()' | Yes | The href is still there and resolves |
| a onclick='goto(...)' with no href | Not recommended | Google may attempt it, but it is not reliable |
| span with a click handler | Not recommended | It is not a link, it is a script event |
| a href='javascript:goTo(...)' | Not recommended | It does not resolve to a web address |
| a href='#/service-areas' fragment route | No | The AJAX crawling scheme was deprecated in 2015 |
So a Load More button that appends the next 10 service areas is a dead end for crawling. Same with a locations map that pulls its list from an API and prints city names as div elements. Every one of those city pages is orphaned unless another page links to it.
For anything paginated, Google asks for the same three things: give each chunk a persistent unique URL, keep the content on that URL stable, and link sequentially to those URLs so a crawler can walk the set. If your locations list has 40 cities, you need 40 anchor tags in the rendered HTML. That is the whole requirement.
Which platforms cause this most — Wix, Webflow, or custom React?
Custom React and Vue builds cause it most, by a wide margin. Wix and Webflow serve your main body copy in HTML by default; the risk on those platforms lives in the widgets and apps you bolt on, not in the platform itself.
| Platform | Default rendering | Where it usually breaks | The fix |
| Webflow | Static HTML | Third-party embeds, CMS filter widgets, custom-code sliders | Keep body copy in native Webflow elements, not embeds |
| Wix | Server-rendered HTML | App-market widgets (reviews, booking, galleries) | Duplicate the key text as native page text |
| WordPress | Server-rendered PHP | JS tab/accordion plugins that fetch on click | Use a plugin that ships the text and hides it with CSS |
| Custom React / Vue (CSR) | Client-side only | Whole page is empty until JS runs; routes on fragments | Move to SSR or static pre-rendering |
| Next.js / Astro (SSR or static) | HTML from the server | Rarely breaks; check client-only components | Verify rendered HTML after each release |
Verdict: the platform is almost never the problem — the pattern is. A React site rendered on the server is fine. A Webflow site whose entire service list is a third-party embed is not. Judge the rendered HTML, not the logo in the footer. If you are choosing a stack now, we lay out the tradeoff in Next.js vs WordPress for a marketing site.
Two more limits worth knowing on custom builds. Google's rendering service clears cookies, local storage, and session storage between page loads, so anything gated behind saved state will not render. And Googlebot declines browser permission requests, so a page that demands camera or location access before showing content shows Googlebot nothing.
When is JavaScript actually the wrong tool for a marketing page?
When JavaScript is the only way your primary content exists. Client-side rendering is the wrong choice for the four page types that carry your revenue: service pages, location pages, pricing, and the blog posts feeding them.
Everything on those pages that a search engine — or an AI engine — needs to read should arrive as HTML from the server. Use JavaScript for what it is good at: booking widgets, chat, form validation, image galleries, maps. None of that has to be indexable.
If your primary content is client-side today, you do not need a rebuild. You need server-side rendering or static pre-rendering for the templates that matter. We walk through the choice in static generation vs server rendering for a marketing site, and it is usually a week of work, not a quarter.
Do the 60-second check first. Half the sites accused of a JavaScript problem do not have one, and the other half have one specific broken widget. Either way, you now know which.
If the rendered HTML is missing your service copy and you would rather someone else own the fix, our technical SEO service starts with exactly this render audit — month-to-month, no lock-in, no ranking guarantees. Get my free audit.
Where does this fit in your stack?
If you're running a US service business, the playbook in this post pairs with our full services lineup and applies cleanly across our supported industries and US locations. If you want help implementing it, book a free strategy call — we'll review your current setup and prioritize the next three moves.
For the deeper engagement details, see our SEO service. New to the terminology here? Our SEO & marketing glossary defines every acronym in this post.
What are the most common questions about this topic?
Common questions readers send us about this topic.
Does Google render JavaScript on every page?
Google queues every page returning a 200 status code for rendering, unless a robots meta tag tells it not to index the page. So rendering is the default, not the exception. The uncertainty is timing: Google says a page may sit in the render queue for a few seconds, but it can take longer, and rendering happens when Google's resources allow. Server-rendered HTML skips that queue entirely.
Is content inside an accordion or tab indexed by Google?
Yes, if the text is already in the rendered HTML and the click only toggles CSS visibility. Google explicitly says you can move content into accordions or tabs for a better mobile experience, as long as the content is equivalent to the desktop version. What does not get indexed is a tab that fetches its copy from an API when clicked, because Google will not load content that requires clicking, swiping, or typing to appear.
Why don't my testimonials show up in Google's rendered version of the page?
Usually one of two reasons. Either the review widget lives inside an iframe, so the text belongs to the widget vendor's page rather than yours, or the widget injects the reviews only after a scroll or click event that Googlebot never fires. Search the rendered HTML in URL Inspection for a reviewer's first name. If it is missing, publish a few real reviews as plain HTML text on the page instead.
Does client-side rendering hurt rankings for a small site?
It does not carry a penalty, but it adds risk and delay for no benefit on a marketing site. Your pages wait in the render queue, any content behind a user interaction is lost, and non-Google crawlers that do not run JavaScript see an empty shell. Google's own documentation still recommends server-side rendering or pre-rendering because it is faster for users and crawlers alike.
How do I see the rendered HTML Googlebot got?
In Search Console, run URL Inspection on the page, click Test Live URL, then View Tested Page, then open the HTML tab. That panel is the rendered HTML — the DOM after Google executed your JavaScript. The Rich Results Test shows the same output and does not require Search Console access. Your browser's View Source and Inspect panel both show something different, so neither is a valid check.
Are Wix and Webflow sites bad for SEO because of JavaScript?
No. Both platforms serve your main body copy as HTML, so the core content is visible to Google without any rendering gymnastics. The JavaScript risk on those platforms comes from what you add: app-market review widgets, booking embeds, filtered CMS lists, and custom-code sliders. Test each one in the rendered HTML. If a widget's text is not there, duplicate the important parts as native page text.
Should a service business use server-side rendering?
For service pages, location pages, pricing, and blog posts — yes. Those pages carry your revenue and every word on them should arrive as HTML from the server, where Google, Bing, and AI crawlers can read it without running any code. JavaScript is still the right tool for booking widgets, chat, maps, and form validation, none of which need to be indexed.
Do load-more buttons and infinite scroll get crawled?
Not on their own. Google can only crawl a link that is an anchor element with an href attribute, and it never clicks a button. For infinite scroll or pagination, Google asks that each chunk gets its own persistent, unique URL, that the content on each URL stays stable, and that you link sequentially to those URLs so a crawler can walk the whole set.
About the author
Hyder Shah
Founder & CEO, Foundgrove
Hyder Shah is the founder of Foundgrove, an SEO and GEO agency for US service businesses. See our editorial policy for how these guides are researched and reviewed.
Related reading
Other tactical pieces from the Foundgrove blog.
- Web Design · 10 min read
Static Generation vs SSR: Which for a Marketing Site?
SSG, SSR, ISR, edge — Next.js gives you four rendering strategies. For 95% of marketing pages, the answer is SSG. Here is the decision tree.
Read the web design playbook → - Web Design · 12 min read
Next.js vs WordPress for Marketing Sites in 2026
WordPress runs 41.5% of the web, but service businesses are leaving for Next.js. Speed, security, dev velocity — the honest head-to-head.
Read the web design playbook → - SEO · 12 min read
Technical SEO Audit for Service Business Websites (2026)
Run a technical SEO audit on a small service site: fix Search Console indexation errors, validate schema, and pass Core Web Vitals first.
Read the seo playbook → - SEO · 8 min read
See What Googlebot Does Without a Log File Analyzer
Every result for log file analysis SEO sells you a tool. For a 60-page service site, Google's free Crawl Stats report covers the 90% that matters.
Read the seo playbook → - SEO · 8 min read
Soft 404 Errors: What They Mean and How to Fix Them
Google flags live pages as soft 404s when it judges them empty. Here are the five pages on a service site that trigger it, and the fix for each.
Read the seo playbook → - Web Design · 8 min read
How to Reduce TTFB on a Service-Business Website
If your server takes 1.4 seconds to answer, no image plugin saves you. Measure TTFB, learn the real thresholds, and see what each hosting tier buys.
Read the web design playbook →
Want help applying this to your business?
Book a free 30-minute call. We'll review your current acquisition stack and show you the three highest-leverage moves for your industry and state. Or read how our SEO service works.