AI Search Readiness Report · one finding
Important content depends on rendering
Recommended action: Put meaningful title, heading, and primary copy in the server-delivered HTML.
Fix principle: Make critical content available in build-time or request-time server output; diagnose browser-only data paths rather than treating framework client-component syntax as proof that initial HTML is missing.
Implementation for your setup
Confirm first: View source lacks critical content that appears after rendering. A non-rendering fetch receives a shell or materially incomplete page. Critical content, a real navigable link, or the page's true destination or route only exists after a script runs — including content gated behind a click or scroll interaction, a client-side redirect, hash-only routing, or a connection type (such as WebSocket) Googlebot does not support.
Do not apply when: Critical content is already present in the initial HTML and only presentation is hydrated. The observed difference comes from personalization that is intentionally unavailable to crawlers. The content, link, or route is reachable without any click, scroll, or persistent client-side connection, and any redirect to it is a real HTTP or meta-refresh redirect rather than a JavaScript-only one.
Likely control points: cms-app · server · edge-cdn
Choose the layer that owns the final response.
Generic HTTP / HTML
Steps
- Choose build-time prerendering for content known at release time or request-time server rendering for content needed per request.
- Render the critical title, heading, links, and main content into the response, then hydrate only the interactions that need a browser.
- Reveal important content in the DOM without requiring a click, tab switch, or scroll to trigger it — Google Search does not interact with the page, so use CSS or an interaction-independent method (for example IntersectionObserver-based lazy loading) instead of loading content only on user action.
- Replace a client-side-only redirect with a real server-side HTTP redirect (or, when that is not feasible, a meta refresh); use a JavaScript redirect only as a last resort, since a rendering failure can mean Google never observes it.
- Replace hash-only routes (for example /#/products) with real, individually navigable URLs served through the History API or server-side routing, so each state has its own crawlable address.
- If content depends on a WebSocket or WebRTC connection established client-side, provide an HTTP-reachable equivalent or fallback for that same critical content, since Googlebot only retrieves content over HTTP.
Verify on this platform
- Fetch the final public response without executing JavaScript and compare its critical content with the rendered page and Search Console live test.
- Confirm important content and primary navigation links are present in the rendered DOM without simulating a click, tab switch, or scroll, and that the page's real destination and individual routes resolve to distinct HTTP-fetchable URLs rather than only a hash fragment or a WebSocket-delivered update.
Rollback
- Restore the prior renderer, redirect method, or routing approach while retaining the confirmed working response path if the change breaks user functionality.
Caveats
- Do not default to user-agent-based dynamic rendering; Google describes it as a workaround rather than a recommended long-term solution.
- Trace data loaded only in effects, browser-only APIs, disabled SSR, or an app shell before changing the rendering architecture.
- A rendered page that looks like a soft 404 is usually the same underlying defect at its most severe: confirm whether content is simply late, hidden behind interaction, or genuinely absent, and apply the matching step above rather than treating it as a distinct problem.
Official sources
- Google: JavaScript SEO basics verified
- Google: dynamic rendering is a workaround verified
- Google Search Console: URL Inspection verified
- Google: fix lazy-loaded content (Google Search does not interact with your page) verified
- Google: 301 redirects (use JavaScript redirects only as a last resort; rendering can fail) verified
- Google: fix search-related JavaScript problems (Googlebot has no WebSocket/WebRTC support) verified
Next.js / Vercel
Steps
- In the App Router, keep critical fetching and document content in server-rendered output; isolate only interactive code behind Client Component boundaries.
- In the Pages Router, use static generation or request-time server rendering for critical content instead of loading it only after mount.
- Remove an unintended dynamic import with ssr: false, useEffect-only fetch, browser-only guard, or app-shell dependency from the critical path.
Verify on this platform
- Inspect the deployed response without executing JavaScript, then rerun Render Gap and the Search Console live test on the same production URL.
Rollback
- Revert the affected route or component boundary if the deployment causes a functional regression.
Caveats
- A Next.js "use client" directive does not by itself mean missing initial HTML: Client Components are prerendered on the first load.
- Skipping SSR with ssr: false is supported only for Client Components and can intentionally remove their server-rendered output.
- A client-side router.push() redirect, hash-only route, or client-established WebSocket is a code-level defect independent of the App/Pages Router choice — apply the generic-http-html guidance above (server-side redirect, History-API routing, HTTP fallback) at the component that owns that behavior.
Official sources
Vue / Nuxt
Steps
- For Nuxt 4, keep universal rendering enabled for the route or prerender the route when its content is known at build time.
- Deploy with the Nuxt preset that matches the real host and verify the server or static output is being served.
- For plain Vue, select and verify the actual SSR architecture and host before applying implementation steps.
Verify on this platform
- Fetch the deployed route without browser execution and confirm the critical content exists in the response; then rerun Render Gap.
Rollback
- Restore the prior Nuxt route rule, prerender list, or deployment preset if the route regresses.
Caveats
- Plain Vue implementation is not verified by this recipe unless the site’s real SSR setup and deployment host are identified.
- Client-only data fetching can still create a gap even when the application uses an SSR-capable framework.
- A router-only (hash mode) route, a client-side redirect, or a client-established WebSocket is a Vue Router or application-code defect independent of Nuxt's rendering mode — apply the generic-http-html guidance above at the component or router configuration that owns it.
Official sources
- Vue: server-side rendering verified
- Nuxt 4: rendering modes verified
- Nuxt 4: deployment verified
- Nuxt 4: prerendering verified
WordPress
Steps
- For a classic theme, render the intended entry content through the selected template and the_content().
- For a block theme, keep the Post Content block in the applicable template and verify the template hierarchy selects it.
Verify on this platform
- View the logged-out public response and confirm the native template emits the critical content before browser scripts run.
Rollback
- Restore the prior native template or template part if the published layout or content regresses.
Caveats
- These steps cover native classic and block themes only.
- A page builder or headless WordPress frontend is owner-managed; use that rendering system’s verified workflow instead of assuming core theme controls own the output.
- Content gated behind a click/tab/accordion, a JavaScript-only redirect, or hash-only navigation added by a theme or plugin script is a separate defect from template output — apply the generic-http-html guidance above at the script that owns that behavior.
Official sources
- WordPress: classic theme template files verified
- WordPress: template hierarchy verified
- WordPress: block theme templates verified
- WordPress: the_content() verified
Shopify
Steps
- Duplicate the active theme and make the rendering correction in the duplicate Liquid or JSON template.
- Preview representative product, collection, and content routes before publishing the corrected theme.
Verify on this platform
- Inspect the preview and then published storefront response without browser execution and confirm the critical content is present.
Rollback
- Republish the previous theme if the new theme regresses storefront content or functionality.
Caveats
- These steps apply only to Shopify Online Store Liquid/JSON themes.
- An app-owned storefront or Hydrogen implementation is owner-managed and needs its own verified rendering workflow.
- Content gated behind a click/tab, a JavaScript-only redirect, or hash-only navigation added by a theme script or app embed is a separate defect from template output — apply the generic-http-html guidance above at the script that owns that behavior.
Official sources
- Shopify: theme architecture verified
- Shopify: theme templates verified
- Shopify: JSON templates verified
- Shopify: theme performance verified
- Shopify Help: duplicate a theme verified
- Shopify Help: publish a theme verified
Platform-managed / ask the vendor
Implementation is controlled by the platform or vendor.
Verify on this platform
- Ask the vendor to demonstrate the uncached initial HTML returned to crawlers and users.
Caveats
- Escalate when the platform cannot expose or configure its rendering mode.
- Require one production-URL response comparison rather than accepting a claim that the browser eventually renders the content.
- Ask the vendor to confirm content is not gated behind interaction, redirects are not JavaScript-only, and routes are not hash-only.
Official sources
- Google: JavaScript SEO basics verified
- Google: dynamic rendering is a workaround verified
- Google Search Console: URL Inspection verified
- Google: fix lazy-loaded content (Google Search does not interact with your page) verified
- Google: 301 redirects (use JavaScript redirects only as a last resort; rendering can fail) verified
How to verify
- Fetch the public URL without JavaScript.
- Compare initial HTML and rendered DOM for the same title, H1, primary links, and content.
- Confirm important content and links are reachable without simulating a click, tab switch, or scroll, any redirect resolves at the HTTP or meta-refresh layer rather than only via JavaScript, and routes are individually fetchable rather than hash-only.
- Rerun Render Gap after deployment.
Escalate when
Escalate when the rendering layer is vendor-controlled, server rendering changes routing or authentication, or the raw and rendered views cannot be reproduced consistently.