Cómo funciona esta comprobación
Scanaris descarga el HTML de tu página tal y como lo sirve el servidor, sin ejecutar JavaScript, le quita los scripts, los estilos, las etiquetas noscript, las plantillas y los SVG, y mide cuánto texto visible queda en el body. Solo abre un hallazgo, de severidad media, si se cumplen dos condiciones a la vez: que ese texto tenga menos de 250 caracteres y que el HTML contenga un contenedor vacío de aplicación de una sola página, es decir, un <div> con id root, app, __next, __nuxt o q-app sin nada dentro. Una web con renderizado en servidor o generación estática tiene texto en el HTML inicial y no se marca nunca; una web con poco contenido pero sin contenedor de SPA tampoco. El umbral es deliberadamente bajo para no dar falsos positivos.
Por qué importa
Googlebot ejecuta JavaScript, pero en una segunda pasada que puede tardar días y con un presupuesto limitado. Los rastreadores de los asistentes de IA (GPTBot, ClaudeBot, PerplexityBot) en general no lo ejecutan: leen el HTML que les llega y punto. Si tu HTML es un <div id="root"></div> y un script, para ellos tu web está vacía. No pueden indexar lo que no ven ni citar lo que no leen, así que cuando alguien le pregunta a ChatGPT por tu categoría de producto, tú no existes. Es el problema más común de las webs hechas con herramientas de IA que generan una aplicación React o Vue de cliente puro, y el más invisible, porque en el navegador todo se ve perfecto.
Cómo arreglarlo
- Activa el renderizado en servidor. En Nuxt viene activado por defecto (
ssr: true); si lo desactivaste, vuelve a activarlo. En Next.js, el App Router renderiza en servidor salvo que marques el componente con'use client'hasta arriba del todo. En Vite con React o Vue a secas no hay SSR: pasa a Next.js, Remix, Nuxt o Astro, o genera las páginas públicas como HTML estático. - Si migrar no es opción, prerenderiza: genera el HTML de las rutas públicas en el momento del build (Nuxt
nitro.prerender, Next.js exportación estática, Astro por defecto) o usa un servicio de prerenderizado que sirva HTML renderizado a los bots. - Como mínimo, pon el contenido esencial en el HTML: el titular, la descripción de lo que haces y los enlaces principales, aunque la aplicación los sustituya al cargar. Es lo que verán los bots.
- Comprueba las páginas que importan, no solo la home: el blog y las páginas de producto son las que los asistentes citan.
Comprueba que está arreglado
curl -s https://tudominio.com | sed -e 's/<script[^>]*>.*<\/script>//g' -e 's/<[^>]*>/ /g' | tr -s ' \n' ' ' | wc -c
Si el resultado se queda en unas pocas decenas de caracteres, el contenido lo pinta JavaScript. Debería contar miles. Otra forma: en el navegador, desactiva JavaScript en las herramientas de desarrollo y recarga; lo que veas es lo que ven los bots.
Preguntas frecuentes
Google me indexa bien. ¿Por qué me importa?
Porque cada vez más gente pregunta a un asistente en lugar de buscar, y esos asistentes no ejecutan tu JavaScript. Y porque incluso en Google, el renderizado diferido retrasa la indexación de tus cambios días. Las cifras y el porqué están en por qué las apps hechas con IA son invisibles para la IA.
Mi app es un panel privado tras login. ¿Me afecta?
No: lo que está tras autenticación no debe indexarse. Esta comprobación importa para las páginas públicas, las que quieres que aparezcan. Si tu web es solo el panel más una landing, haz que la landing sea HTML.
Tengo SSR y aun así sale poco texto.
Entonces el HTML trae estructura pero poco contenido real, y conviene revisar que la landing cuente algo. Los encabezados que organizan ese contenido los mira encabezados.