The short verdict
- If your page’s HTML is an empty shell filled in by JavaScript, some crawlers see nothing.
- Google can usually render it, but later and less reliably than plain HTML.
- Share previews and many AI crawlers do not run JavaScript at all.
01Two ways to send a page
When a browser asks for a page, the server can send it in one of two broad ways.
Server-rendered or static: the HTML arrives with the headline, the text and the links already in it. Anyone reading the file, human or crawler, sees the content straight away.
Client-rendered: the HTML arrives almost empty, usually a single div and a script tag. The browser downloads the JavaScript, runs it, and the script builds the page. Until that happens, there is nothing to read.
Several AI builders produce the second kind by default, because it is the standard way to build a React app with tools like Vite. For an app behind a login, that is fine. For pages you want found, it adds risk.
02What each kind of crawler sees
| Who | Runs JavaScript? | What it sees on a client-rendered page |
|---|---|---|
| Googlebot | Yes, in a second pass | The content, usually, after a delay |
| Bing | Partly | Often the content, less reliably |
| LinkedIn, Slack, X, WhatsApp previews | No | Only the base HTML tags |
| Many AI crawlers | Mostly no | An empty shell |
03The three problems that follow
1. Slower, less certain indexing
Google queues JavaScript pages for rendering after the first crawl. Most get rendered, but it costs time and crawl budget, and any script error means Google sees a blank page. New pages can take longer to appear.
2. Every page shares the same preview
The title and share tags are usually set once in the base HTML. Scripts may change them in the browser, but preview tools never run the script. So your pricing page, your blog post and your homepage all share the same card when someone posts them.
3. Invisible to AI search
More people now ask chat assistants for recommendations. The crawlers that feed those answers mostly read raw HTML. If your HTML is empty, you are not in the answer.
04How to check your own site
- View the source. Right-click, View Page Source (not Inspect). Search for a sentence from your hero. If it is not there, the page is client-rendered.
- Turn JavaScript off. In Chrome DevTools settings, disable JavaScript and reload. What you see is roughly what a non-rendering crawler sees.
- Use URL Inspection. In Google Search Console, inspect a page and view the crawled page’s HTML and screenshot.
- Test a share. Paste an inner page into a preview checker and see whose title comes up.
“If the content is not in the HTML, you are trusting every crawler to do extra work for you.”
05Your options
You can add pre-rendering, which generates an HTML snapshot of each page at build time. Some frameworks support it, but on exported builder code it often needs a developer and keeps needing one as the site changes. Or you can move the marketing pages to a platform that serves HTML by default, Webflow included, and keep the app part where it is.
06Questions people ask
Google says it renders JavaScript. Why worry?
It does, most of the time. But it happens later than for HTML pages, it fails silently when a script breaks, and Google is only one of the readers you care about.
Is a Next.js site from v0 client-rendered?
Not necessarily. Next.js can render on the server or at build time. It depends on how the components were written. View the source to check.
Do I need to rebuild my whole site?
Only the pages you want found. Many teams keep the app as it is and move the marketing pages in front of it.
Can you check what crawlers see on my site?
Yes. Send us the link and we will tell you what is in the raw HTML and what that means for you.