El centro de yoga «Praktika» — dos salas, 24 disciplinas, 18 instructores y más de 4000 clientes — funcionaba sobre un Bitrix infectado que, además, mantenía toda la web bajo la directiva `noindex`: para los buscadores sencillamente no existía. Reconstruimos el proyecto desde cero en Django 5.2 con renderizado en servidor, migramos la base de datos a MySQL 8 y conservamos todas las URL antiguas. Integramos un sistema de reservas propio con calendario de administración y sincronización horaria del horario, y después abrimos a la indexación 116 páginas — con marcado Schema.org, 1132 preguntas de FAQ y un mapa de contenido para la búsqueda con IA.
El resultado en breve
- 🔓 De 0 a 116 páginas abiertas a la indexación (la web estaba totalmente cerrada con
noindex) - 🦠 De un Bitrix infectado a un Django limpio, sin una sola línea de código heredado
- 🗓 Sistema de reservas propio con calendario de administración y sincronización horaria del horario desde el calendario externo
- 🧩 1132 preguntas de FAQ y marcado Schema.org en 110 páginas
- ⚡ HTML de 26 KB, respuesta en 0,4 s, gzip, HTTPS — base técnica lista para crecer
El reto
El cliente es un centro de yoga en una ciudad rusa: dos salas, más de 20 disciplinas, 18 instructores y más de 4000 clientes en 20 años de actividad. La web antigua corría sobre una versión obsoleta de Bitrix que, al iniciar el proyecto, estaba infectada con código malicioso. Además, todo el sitio emitía en el <head> la directiva noindex, nofollow: era completamente invisible para Google y los buscadores. Por mucho contenido que tuviera, en la búsqueda simplemente no existía.
No se trataba de «ajustar el SEO», sino de reconstruir el proyecto entero: retirar el motor infectado, migrar el contenido a una plataforma gestionable, dar al centro una herramienta para el horario y las reservas, y levantar desde cero la higiene técnica de búsqueda, para que la web por fin empezara a indexarse.
Qué hicimos
La web se reconstruyó sobre Django 5.2 con renderizado en servidor: el HTML se entrega ya montado, no se ensambla en el navegador, 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.
El contenido se trasladó a un registro único: páginas, disciplinas, instructores, textos, palabras clave y metadatos, todo en un mismo lugar y editable de forma centralizada. Las 116 páginas se construyen a partir de ese registro, y los duplicados son imposibles por diseño.
El Bitrix infectado y sus bases de datos se eliminaron, y la web antigua se retiró sin caída del dominio en producción. Todas las URL anteriores (incluidas las .php) se conservaron, así que los enlaces antiguos no se pierden.
Stack tecnológico
- Backend: Python, Django 5.2 (SSR), Phusion Passenger
- Base de datos: MySQL 8 (migrada desde una 5.7 heredada; en el hosting compartido, donde el driver estándar no compila, se conectó PyMySQL puro)
- Infraestructura: nginx → Apache → Passenger, HTTPS (Let's Encrypt), gzip, redirección HTTP→HTTPS
- Sistema de reservas: aplicación Django propia, con el panel de administración como interfaz de trabajo
- Integraciones: importación del horario desde un calendario externo (iCal), analítica web, cron
- SEO/GEO: JSON-LD @graph, sitemap.xml, robots.txt, llms.txt, llms-full.txt
Funcionalidad implementada
Web y contenido
- 116 páginas: home, catálogo de 24 disciplinas, 18 páginas personales de instructores, secciones de servicios, precios y contactos, blog
- Horario a 3 semanas vista con desplazamiento por días y diseño adaptado a móvil
- Blog de 50 artículos SEO sobre yoga para consultas de búsqueda e informativas
- Bloque «Próximas prácticas» en la home, en vivo, desde la misma fuente que el horario
Sistema de reservas (interno)
- Calendario de clases como pantalla principal del panel, creación de una clase con un clic
- Salas con aforo, instructores, fichas de disciplina y control del límite de plazas sin condiciones de carrera
- Importación del horario desde el calendario externo para ambas sedes, automática cada hora
- Distinción entre «el calendario no cargó» y «no hay clases»: el usuario ve un estado correcto, no un error alarmante
SEO técnico y marcado
title(30–60 caracteres) ydescription(120–160) individuales 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, enlazadas con el esquema
- Bloques de FAQ: 1132 preguntas en 110 páginas, con el marcado construido a partir del mismo texto que ve el usuario
- Mapa del sitio, robots.txt y llms.txt / llms-full.txt — el mapa de contenido para los buscadores de IA
Redes sociales y accesibilidad
- 116 tarjetas 1200×630 para compartir (foto + placa de marca con el logotipo), generadas por script
- Accesibilidad: etiquetas en los campos de formulario, nombres accesibles para enlaces-icono y botones, marcado correcto de las imágenes decorativas
El proceso
- Auditoría y diagnóstico. Analizamos el Bitrix infectado, confirmamos que la web estaba totalmente cerrada a la indexación y trazamos el mapa del proyecto.
- Reconstrucción en Django. Trasladamos el contenido a un registro gestionable y montamos 116 páginas con renderizado en servidor.
- Migración de infraestructura. Desplegamos en el hosting de producción, migramos la BD a MySQL 8 y configuramos HTTPS y las URL antiguas.
- Sistema de reservas. Diseñamos e integramos el calendario, las salas y la importación del horario.
- SEO / GEO / A11y. Recorrimos la web en siete etapas: indexación, metadatos, marcado, migas, esquema de páginas, accesibilidad y contenido.
- Ciclo del auditor. Revisamos la web en vivo por las 116 páginas hasta dos pasadas limpias seguidas con estado CLEAN.
- Lanzamiento. Retiramos el
noindex, abrimos la web a los buscadores y preparamos el mapa para enviarlo a Search Console.
Resultados
| Indicador | Antes | Después |
|---|---|---|
| Páginas abiertas a la indexación | 0 (toda la web con noindex) | 116 |
| Motor | Bitrix infectado | Django 5.2, código limpio |
| title/description individuales | no | 116 de 116, 0 duplicados |
| Marcado Schema.org | ausente | 8+ tipos de entidad, un @graph coherente |
| FAQ con marcado | no | 1132 preguntas, 110 páginas |
| Tarjetas para redes sociales | logotipo genérico | 116 tarjetas 1200×630 |
| Sistema de reservas | no | calendario de admin + sincronización horaria |
| Auditoría técnica | — | STATUS: CLEAN, 0 críticos en 116 páginas |

