Veinte años de trabajo, dos salas, 24 disciplinas, 18 instructores y más de cuatro mil clientes. Y una web que los buscadores no veían: la vieja instalación de Bitrix estaba infectada y además devolvía en cada respuesta la directiva noindex. Por mucho contenido que hubiera allí, para Google y Yandex el centro simplemente no existía. Reconstruimos el proyecto desde cero sobre Django, integramos un sistema de reservas propio y abrimos a indexación 116 páginas.
Cliente: centro de yoga «Praktika», Cheboksary · Categoría: web + SEO
Lo esencial
- Había 0 páginas indexadas, ahora hay 116. Toda la web estaba bajo noindex, para el buscador no existía.
- El Bitrix infectado se sustituyó por Django limpio, sin una sola línea de código heredado.
- Sistema de reservas propio con calendario en el panel y sincronización horaria del horario desde Yandex Calendar.
- 1132 preguntas de FAQ con marcado en 110 páginas: todo ese texto vivo lo acumuló el centro en veinte años.
- HTML de 26 KB, respuesta en 0,4 segundos, gzip y HTTPS.
- Todas las direcciones antiguas conservadas, incluidas las .php: los enlaces de publicaciones viejas siguen funcionando.
Stack tecnológico
- Backend: Python, Django 5.2 con renderizado en servidor, Phusion Passenger.
- Base de datos: MySQL 8, migrada desde una 5.7 heredada. En hosting compartido el driver estándar no compila, así que se usa PyMySQL puro.
- Infraestructura: nginx, Apache, Passenger, HTTPS con Let's Encrypt, gzip, redirección forzada a HTTPS.
- Reservas: aplicación Django propia, el panel funciona como interfaz de trabajo del personal.
- Integraciones: importación del horario desde Yandex Calendar por iCal, Yandex Metrica, cron.
- SEO y GEO: JSON-LD @graph, sitemap.xml, robots.txt, llms.txt y llms-full.txt.
El renderizado en servidor no se eligió por moda. El HTML se entrega ya montado, así que tanto los robots de búsqueda como los rastreadores de IA, que apenas ejecutan JavaScript, ven todo el contenido y el marcado de inmediato.
Cómo empezó todo
El centro llegó con una queja que se oye a menudo: «tenemos web y no trae clientes». Detrás suele haber textos flojos o carga lenta. Aquí la causa era otra y bastante peor.
Primero, el motor estaba infectado. La vieja instalación de Bitrix llevaba años sin actualizarse y alojaba código malicioso. Segundo, toda la web devolvía en la cabecera la directiva noindex, nofollow. Es decir, funcionaba con normalidad, mostraba horarios y precios, pero para los buscadores no existía.
Curar algo así no tiene sentido: los mismos agujeros devuelven el mismo problema. El proyecto se reconstruyó entero, el contenido se llevó a un registro único y la web antigua se retiró sin dejar el dominio caído.
Lista completa de funciones
🌐 Web y contenido
- 116 páginas: portada, catálogo de 24 disciplinas, 18 páginas personales de instructores, servicios, precios, contactos, blog
- Horario a tres semanas vista con desplazamiento por días y diseño móvil
- Blog de 50 artículos sobre yoga para consultas de búsqueda e informativas
- Bloque «Próximas prácticas» en la portada, en vivo, desde la misma fuente que el horario
- Registro único de contenido: páginas, disciplinas, instructores, textos, palabras clave y metadatos se editan en un solo sitio, los duplicados son imposibles por diseño
🗓 Sistema de reservas
- El calendario de clases como pantalla principal del panel, una clase se crea con un clic
- Salas con aforo, instructores, fichas de disciplinas, control de plazas sin condiciones de carrera
- Importación del horario desde Yandex Calendar para ambas sedes, automática cada hora
- Separación entre «el calendario no cargó» y «no hay clases»: la persona ve un estado correcto y no un error alarmante
🔍 SEO técnico y marcado
- Title propio de 30 a 60 caracteres y description de 120 a 160 en las 116 páginas, cero duplicados
- Canonical, indexación correcta, Open Graph y Twitter Card en cada página
- JSON-LD @graph: Organization, dos sedes como LocalBusiness con direcciones y horarios, WebSite, WebPage, Service para las disciplinas, Person para los instructores, FAQPage, BreadcrumbList, Article
- Migas de pan semánticas en 115 páginas, ligadas al esquema
- Bloques FAQ: 1132 preguntas en 110 páginas, con marcado construido del mismo texto que ve la persona
- Mapa del sitio, robots.txt, llms.txt y llms-full.txt como mapa de contenido para los buscadores con IA
🖼 Redes sociales y accesibilidad
- 116 tarjetas de 1200×630 para compartir: foto más franja corporativa con logotipo, generadas por script
- Etiquetas en los campos de formulario, nombres accesibles para enlaces-icono y botones, marcado correcto de las imágenes decorativas
🚚 Migración y lanzamiento
- El Bitrix infectado y sus bases se eliminaron, la web antigua se retiró sin caída del dominio
- Todas las direcciones anteriores se conservan, incluidas las .php
- Recorrimos el sitio en siete etapas: indexación, metadatos, marcado, migas, esquema de páginas, accesibilidad, contenido
- Revisamos la web en vivo por las 116 páginas hasta dos pasadas limpias seguidas
- Retiramos el noindex, abrimos el sitio a los buscadores y preparamos el mapa para Webmaster y Search Console
Resultados
| Indicador | Antes | Después |
|---|---|---|
| Páginas abiertas a indexación | 0, toda la web bajo noindex | 116 |
| Motor | Bitrix infectado | Django 5.2, código limpio |
| Title y description propios | no | 116 de 116, 0 duplicados |
| Marcado Schema.org | inexistente | 8+ tipos de entidades, @graph conectado |
| FAQ con marcado | no | 1132 preguntas en 110 páginas |
| Tarjetas para redes | logotipo genérico | 116 tarjetas de 1200×630 |
| Sistema de reservas | no | calendario en panel y sincronización horaria |
| Auditoría técnica | — | 0 hallazgos críticos en 116 páginas |

