El reto
Renta Galicia gestiona alquiler de inmuebles en Galicia bajo dos marcas independientes que comparten infraestructura pero se presentan al mercado como negocios separados. Ambas operan con dos modelos de contrato distintos — explotación, donde la empresa paga una renta fija al propietario, y gestión, donde se cobra comisión sobre los ingresos del piso — y necesitaban una plataforma que reflejara esa lógica sin obligar al equipo a duplicar trabajo entre marcas.
El encargo era claro: un único panel, dos marcas visibles, tres tipos de usuario (administrador, propietario, inquilino) y los flujos completos de gestión inmobiliaria, contabilidad, facturación, cobros recurrentes y soporte.
Lo que hemos construido
Un panel multi-marca y multi-rol que cubre toda la operativa del negocio:
- Detección de marca por subdominio. El mismo código sirve a las dos marcas con branding, colores, logos y series de facturación distintos. El admin alterna entre marcas con un selector en la barra superior.
- Roles y portales separados. El propietario solo ve sus pisos en gestión, su contabilidad y sus liquidaciones. El inquilino ve su contrato, sus pagos y puede guardar tarjeta para cobros automáticos. El admin tiene visibilidad cross-marca.
- Gestión completa de inmuebles. Pisos, habitaciones, contratos con propietarios (explotación o gestión), contratos con inquilinos, CRM de captación de leads, registro de inmobiliarias colaboradoras y subida de documentos por propietario.
- Contabilidad real. Ingresos y gastos categorizados por piso, dos series de facturación, generación de PDF, importación y conciliación de extractos bancarios, y exportación CSV trimestral lista para asesoría.
- Cobros recurrentes con Stripe. Tarjeta guardada por el inquilino, suscripciones, cargo manual off-session y aprobación de transferencias por parte del admin. Un cron diario procesa los cobros del día y avisa por email cuando algo falla.
- Liquidaciones automáticas a propietarios. Un click calcula ingresos − gastos − comisión, emite la factura correspondiente y registra el pago al propietario.
- Soporte integrado. Incidencias con adjuntos de imagen, badge en el menú con tickets sin responder, plantillas de email editables y bandeja de actividad auditable.
- Asistente IA. Drawer lateral con un asistente que puede consultar y modificar datos — crear facturas, marcar pagos, liquidar mes, eliminar entidades — siempre con confirmación explícita del admin para acciones destructivas. Uso de tokens y coste mensual estimado visible desde Ajustes.
- Funciones de apoyo al equipo. Modo claro/oscuro/sistema sincronizado entre dispositivos, impersonación de usuarios para soporte, autenticación 2FA, registro completo de auditoría, plantillas de email para todas las notificaciones del sistema y página de ayuda interna.
Decisiones técnicas
El stack es deliberadamente sobrio: PHP con PDO, MariaDB, nginx, Tailwind CDN y Alpine.js, sin Laravel, sin npm, sin pasos de build. Por encima de las 10.000 líneas de PHP, sin un solo framework pesado. Esa decisión la tomamos con el cliente al inicio para que cualquier desarrollador pueda abrir el proyecto, leerlo y mantenerlo en su propio servidor sin dependencias externas. Composer solo para tres librerías estrictamente necesarias: dompdf para los PDF, stripe-php para la pasarela y PHPMailer para el SMTP.
La detección de marca se resuelve en el front controller leyendo el host HTTP. El routing soporta rutas con el mismo path declaradas para distintos roles, lo que permite que /incidencias lleve al inquilino a su portal y al admin al backoffice sin código duplicado. Las sesiones cruzan subdominios mediante una cookie de sesión compartida, que es lo que permite a un admin impersonar a un inquilino y volver a su cuenta con un click. Cloudflare en modo Flexible está previsto de fábrica: el IP real y el X-Forwarded-Proto se reescriben para que las cookies se marquen como seguras y los logs registren la IP real del visitante.
La capa de IA usa function calling con 22 herramientas registradas. Las acciones que modifican datos están bloqueadas detrás de un flag de confirmación: el asistente no puede ejecutar nada sin que el admin diga "sí" explícitamente, y las eliminaciones piden doble confirmación. Cada llamada queda registrada en una tabla de uso con tokens y coste estimado para que el cliente vea en todo momento cuánto está gastando.
Resultados
- Las facturas mensuales se emiten automáticamente cada día 1, 5 o 10 según el contrato, con cobro por tarjeta o aviso por email para transferencias.
- Las liquidaciones a propietarios pasan de ser un cálculo manual con riesgo de error a un click que cuadra ingresos, gastos y comisión.
- La asesoría recibe cada trimestre un CSV con todos los movimientos y NIFs, sin tocar un Excel.
- Los inquilinos abren incidencias desde su portal con foto; el admin ve un badge en el menú lateral si hay alguna sin responder.
- El asistente IA permite hacer consultas como "¿quién me debe dinero?" o "liquida el mes a un propietario concreto" y resolverlas en segundos.
Stack y arquitectura
Backend PHP · sin framework · arquitectura modular · MariaDB
Frontend Tailwind CDN · Alpine.js · sin pasos de build
Pagos Stripe · suscripciones · cron diario · cargos off-session · webhooks
IA Function calling · 22 herramientas · confirmación explícita · tracking de coste
PDF dompdf
Email PHPMailer · SMTP propio · plantillas editables
Seguridad 2FA · audit log · impersonación · sesiones cross-subdominio
Infra nginx · Cloudflare · reescritura de IP real · cron de facturación diaria