Caso: una app en React que Google recibía vacía
Contexto
regresoempresarial.com es el sitio de consultoría en insolvencia empresarial de Carlos Alberto Cardona O. Está construido en Base44, una plataforma que genera aplicaciones en React.
El problema medido
Lo que veía el navegador frente a lo que recibía Google
En el navegador, el sitio se veía completo. Pedido como Googlebot, el servidor entregaba una carcasa: el título y un contenedor vacío que solo se llena con JavaScript.
Síntomas técnicos
Rutas inexistentes que respondían como si existieran, redirecciones temporales en lugar de permanentes, y títulos y descripciones definidos en varios lugares que no coincidían entre sí.
Qué hice
Contenido servido desde el primer byte
Generé en el build una versión HTML de cada ruta con su contenido real, sus metadatos y sus datos estructurados.
Un Worker de Cloudflare delante del sitio
Redirecciones 301 reales, errores 404 reales y un sitemap que solo lista las rutas indexables.
Metadatos que no se contradicen
Una comprobación automática avisa si alguna copia de los títulos, las descripciones o las rutas se desvía de las demás.
Enlazado interno por diseño
Medido en septiembre de 2026 sobre las 24 rutas publicadas: 25 enlaces desde el texto hacia la página pilar y 69 enlaces a fuentes oficiales, como la Superintendencia de Sociedades, el Senado y la DIAN.
Cómo lo verifico: 19 comprobaciones antes de publicar
Antes de cada publicación corro 19 comprobaciones automáticas. Estas son algunas:
- que las preguntas visibles coincidan con las declaradas
- que el índice de cada artículo apunte a títulos que existen
- que no se filtre código al HTML servido
- que los enlaces internos lleven a rutas reales
- que los metadatos coincidan en todas sus fuentes
- que los datos estructurados no tengan referencias rotas
Después de publicar, reviso cada ruta en producción con el agente de Googlebot.
$ curl -sI https://regresoempresarial.com/sitemap.xml | grep x-edge-routerx-edge-router: authoritative-sitemap-xml$ curl -s -o /dev/null -w "%{http_code}" https://regresoempresarial.com/no-existe404
Lo que aprendí, incluidos mis errores
Hubo un momento en que el Worker se reemplazaba solo después de cada cambio. Culpé dos veces a la causa equivocada, y las dos veces los datos encajaban.
La causa real era otra integración escuchando el mismo evento. Desde entonces, antes de atribuir un problema, enumero todo lo que reacciona a ese evento.
Qué no puedo afirmar
Este caso no publica cifras de tráfico ni posiciones. Tampoco hay datos de usuarios reales de Chrome: el sitio aún no tiene tráfico suficiente para que Google los reporte.