SaaS Multi-Tenant para Agencias SEO con IA, Integración Nativa GSC y Pipeline Automatizado de Informes
TTFB <300ms vía Precarga de Consultas, 90%+ de Reducción en Tiempo de Generación de Informes, Onboarding Multi-Tenant con Migración Heredada Sin Pérdida de Datos
El Cuello de Botella
Las agencias SEO que gestionaban portafolios multicliente operaban históricamente sobre monolitos single-tenant con acoplamientos a nivel de base de datos y scripts PHP directos. Los analistas extraían manualmente estadísticas de rastreo desde Screaming Frog, obtenían analíticas de búsqueda desde Google Search Console, recopilaban inteligencia competitiva desde SEMrush/DataForSEO, redactaban comentarios personalizados a mano y formateaban documentos Word de forma manual. Este flujo de trabajo imponía una sobrecarga operativa severa: era intensivo en mano de obra, propenso a errores y fundamentalmente no escalable.
Las consultas bajo demanda de datos GSC para informes complejos introducían latencias de varios segundos, mientras que la ausencia de aislamiento de tenants, facturación automatizada y capas de permisos por equipo hacía imposible la expansión comercial SaaS. La transición de sistemas internos heredados a una arquitectura cloud moderna arriesgaba la pérdida de registros históricos de clientes y exigía refactorizar acoplamientos profundos de base de datos hacia un modelo multi-tenant seguro con gestión de estado de APIs de terceros vía OAuth 2.0.
Arquitectura y Automatización
La plataforma es un SaaS containerizado construido sobre Laravel 13 y PHP 8.5+ utilizando Docker (Laravel Sail), transicionando código heredado single-tenant hacia una arquitectura MVC escalable con aislamiento estricto de tenants y facturación automatizada.
Aislamiento de Base de Datos y Multi-Tenancy: Una capa lógica de multi-tenancy se aplica mediante Global Scopes de Eloquent utilizando el trait BelongsToTenant. Esto aísla clientes, tareas, auditorías y facturación por tenant mientras preserva una ruta de migración heredada. El BillingController orquesta el onboarding de usuarios de bases de datos heredadas, agrupando y portando automáticamente registros preexistentes no asignados hacia un ID de tenant recién registrado sin pérdida de datos.
Pipeline Dual de Generación con IA: La redacción pesada de informes se descarga hacia LLMs mediante un enfoque híbrido. Las ejecuciones asincrónicas masivas se delegan a webhooks de n8n, con un endpoint dedicado recibirN8n que consume los informes de IA completados vía callback. Una ruta de respaldo directa consume las APIs de Gemini/OpenAI utilizando prompts estructurados almacenados dinámicamente en la tabla SeoPromptsConfig. Para mitigar la alucinación, las entradas de rastreo en bruto se depuran, formatean y se emparejan con prompts de sistema anti-alucinación estrictos antes de la ejecución.
Flujo de Autorización OAuth 2.0 Seguro para GSC: La plataforma gestiona el ciclo de vida completo de autorización de la API de Google Search Console—redirección, intercambio de código de autorización del cliente y gestión automatizada de tokens de refresco—para cachear y consultar datos GSC de forma segura en nombre de cada tenant.
Compilador Dinámico de Documentos: Gráficos de líneas y barras (clics, impresiones, países, dispositivos) se generan mediante la API de QuickChart. El InformeController compila posteriormente estas métricas en archivos Word (.docx) listos para el cliente utilizando PHPWord TemplateProcessor, procesando formateo estilo Markdown (negritas, itálicas, saltos de línea) de forma dinámica.
Motor Semántico de NLP: Un motor personalizado findRelatedKeywords filtra palabras vacías en español vía nlp.php y elimina patrones de consulta deficientes de los datos GSC para descubrir oportunidades de keywords semánticas y "victorias rápidas" (keywords posicionadas entre los puestos 4–10).
Procesamiento Asíncrono y Optimización de Activos: Operaciones de larga duración—escucha de colas, generación de respaldos locales SQL/ZIP, cargas a Google Drive y llamadas a IA externas—se delegan al driver de colas de Laravel para mantener las peticiones web responsivas. El pipeline de activos front-end utiliza Vite 8, PostCSS, Autoprefixer y TailwindCSS para entregar un bundle minificado libre de recursos bloqueantes del renderizado.
Mitigación de API vía Precarga de Consultas: En lugar de consultar Search Console bajo demanda para cada sección de informe, una función preloadCache por lotes extrae y cachea conjuntos masivos de datos URL/Query en una única petición. Las consultas subsecuentes leen desde Redis/memoria, reduciendo el TTFB por sección de informe al mínimo.
┌─────────────┐ ┌─────────────────────────────────────┐
│ Analista │────▶│ Contenedor SaaS Laravel 13 │
│ (Navegador)│ │ ┌────────┐ ┌────────┐ ┌────────┐ │
└─────────────┘ │ │ Tenant │ │Auditoria│ │Informe │ │
│ │ Scope │ │ Ctrl │ │ Ctrl │ │
│ │+Billing│ │TSV→JSON│ │.docx │ │
│ └───┬────┘ └───┬────┘ └───┬────┘ │
└──────┼──────────┼──────────┼───────┘
│ │ │
┌───────────────┘ │ │
▼ ▼ ▼
┌──────────────┐ ┌────────────┐ ┌───────────┐
│ MySQL 8.4 │ │ n8n │ │QuickChart │
│(Multi-Tenant)│ │ Webhook │ │ API │
│+ Legacy Port │ │ (Async AI) │ │ (Graphs) │
└──────┬───────┘ └─────┬──────┘ └─────┬─────┘
│ │ │
│ ▼ ▼
│ ┌────────────┐ ┌──────────┐
│ │OpenAI/Gemini│ │ PHPWord │
│ │ API │ │Template │
│ └─────┬──────┘ │Processor │
│ │ └────┬─────┘
▼ ▼ │
┌──────────────┐ ┌────────────┐ │
│ Redis Cache │◀───────│recibirN8n │─────────┘
│(GSC + Queue) │ │ (Callback) │
└──────────────┘ └────────────┘
┌──────────────┐ ┌────────────┐
│ Google Search│◀───────│ OAuth 2.0 │
│ Console API │ │(Refresh) │
└──────────────┘ └────────────┘
┌──────────────┐
│Stripe Cashier│◀────── Suscripción / Onboarding
└──────────────┘
ROI Medible
Tiempo de Generación de Informes:
Extracción manual de 4+ herramientas + redacción a mano + formateo manual de Word → Pipeline de IA automatizado con entradas depuradas y compilación .docx en un clic.
- Antes: 4–6 horas por informe mensual de cliente.
- DESPUÉS: <15 minutos desde la ingesta de rastreo hasta el entregable.
Latencia de Datos (TTFB):
Consultas bajo demanda a la API de GSC por sección de informe → Ingesta por lotes preloadCache con lecturas respaldadas por Redis.
- Antes: 2.5–4 segundos por sección bajo carga.
- DESPUÉS: <300ms para recuperación de métricas cacheadas.
Escalabilidad de Arquitectura:
Monolito single-tenant con scripts PHP directos y acoplamientos de base de datos → SaaS multi-tenant containerizado en Docker Sail con aislamiento vía Global Scope de Eloquent.
- Antes: Aprovisionamiento manual de entornos por cliente, granularidad nula en permisos de equipo.
- DESPUÉS: Un comando
sail up, onboarding automatizado de tenants con migración de datos heredados y control de acceso basado en roles.
Precisión de Salida de IA:
Generación cruda de LLM propensa a alucinaciones sobre datos de rastreo no vistos → Plantillas de prompts estructuradas con entradas pre-depuradas y guardarraíles anti-alucinación.
- Antes: 15–20% de retrabajo de verificación de hechos sobre comentarios generados.
- DESPUÉS: <3% de tasa de revisión en secciones de informe redactadas por IA.
Rendimiento Operativo:
Compilación síncrona de informes bloqueando el navegador del analista → Webhooks asíncronos de n8n + trabajos en segundo plano con colas para generación de respaldos, cargas a Drive y llamadas a IA.
- Antes: 1 informe concurrente por sesión de analista.
- DESPUÉS: Pipelines concurrentes ilimitados con escalado de workers de colas.
Velocidad de Facturación y Provisión de Tenants:
Sin gestión de suscripciones ni aislamiento de tenants → Integración Stripe Cashier con aplicación de cuotas por plan (límites de clientes, asientos de usuario, tope de ejecuciones IA) y migración heredada automatizada.
- Antes: Creación manual de facturas y aislamiento nulo de datos.
- DESPUÉS: Checkout de suscripción self-service con aprovisionamiento instantáneo de tenants y portación de registros históricos.
Escrito por
Miguel Ortiz
Growth Engineer & Technical SEO