Google can render JavaScript, but a page that depends on client-side code has more opportunities to lose its main content: a blocked script, failed API call, or rendering error can leave an empty shell.
Google's JavaScript SEO documentation describes crawling, rendering, and indexing as separate steps. Rendering may happen quickly or take longer. There is no public queue-position metric or guaranteed per-page delay to measure from your server logs.
Check the initial HTML
Google can find ordinary <a href> links in the first response before rendering. A page containing useful text and links gives it more to work with than a root element and script tags alone.
Fetch the page without executing JavaScript:
curl -s https://example.com/products/widget
Inspect the status and headers separately, and check the HTML for the title, canonical, robots directives, primary content, and links.
Google queues 200 pages for rendering unless an indexing directive causes it to skip that work. If the initial response says noindex, do not rely on JavaScript later removing it.
Compare the rendered page
Use a browser with console and network recording, then compare its output with URL Inspection's rendered HTML and screenshot when available.
| Check | What it shows |
|---|---|
| Raw HTTP response | Content returned before JavaScript runs |
| Browser DOM, console, and network | Content produced under your test conditions and failed dependencies |
| URL Inspection live result | What Google's test fetched and rendered at that time |
The live test is not the indexed copy and does not reveal when Google last processed the page for indexing.
Look for:
- scripts or styles blocked by
robots.txtor the CDN; - API calls returning
401,403,429, or5xx; - browser-only checks that fail in the test environment;
- content that appears only after a click or scroll;
- inconsistent JavaScript changes to canonical or robots tags;
- an exception before the main content reaches the DOM.
Send essential content with the page
In Next.js, keep primary text and links in server-rendered content while enhancing actions such as add-to-cart on the client. This component sketch illustrates the split; adapt route props, types, and data fetching to your installed Next.js version:
import AddToCartButton from './AddToCartButton';
import ProductDetail from './ProductDetail';
export default async function ProductPage({ params }: Props) {
const { slug } = await params;
const product = await fetchProduct(slug);
return (
<main>
<ProductDetail product={product} />
<AddToCartButton productId={product.id} />
</main>
);
}
The product remains readable if the cart code fails or hydration is slow.
In Laravel, fetch primary data in the controller or application service and pass it to Blade:
public function show(Product $product): View
{
return view('products.show', [
'product' => $product,
'relatedProducts' => $product->related()->limit(4)->get(),
]);
}
Client code can improve galleries, filtering, or availability without being the only place the product name, description, and related links exist.
Keep “load more” pages reachable
Google's crawlers generally do not click buttons. Provide linked pagination underneath an interactive “load more” interface so later products or articles have a crawlable path. Test whether lazy-loaded content appears without an interaction the crawler never performs.
Monitor failures you can observe
Use logs to find blocked resources, crawler errors, slow responses, and API routes that require cookies or browser-specific headers. Compare those events with deployments and URL Inspection results.
Use browser performance traces, Lighthouse, and real-user data to assess large bundles and long tasks. There is no defensible fixed bundle-size cutoff that tells you exactly when Google will stop rendering.
After a repair, repeat the raw and rendered comparison. Confirm the page's meaning survives an interaction failure, then check Google's later crawl and indexing result separately.
