
Plataforma PropTech End-to-End (Auge Urbano)
Portal inmobiliario desplegado en VPS: 159 rutas Flask sobre MySQL 8 con 45 tablas, CRM propio, portales de colegas y captadores, agentes IA integrados y una pila SEO/GEO/AEO con IndexNow. ~43.000 lineas de Python que operan el negocio completo, no una landing con formulario.
Auge Urbano opera venta de propiedad raiz en Medellin y el Valle de Aburra. La plataforma no es un brochure: es el sistema con el que corre el negocio — catalogo de inmuebles con ~900 fotos, CRM de leads y cierres, portal para colegas inmobiliarios, portal de captadores de calle, blog, finanzas y un motor de posicionamiento pensado tanto para Google como para LLM.
Capturas reales del sistema en operacion.
El reto
- 1Un solo sistema para tres audiencias con sesion propia: comprador, colega inmobiliario y captador de calle.
- 2Operar el negocio sin CRM externo: leads, contactos, citas, cierres, ingresos y gastos en el mismo admin.
- 3Posicionar un catalogo pequeno en un mercado saturado y hacerlo citable por LLM, no solo indexable por Google.
- 4Servir ~25 fotos por inmueble sin destruir el LCP en moviles de gama media.
- 5Normalizar la geografia del Valle de Aburra (municipio → comuna/corregimiento → barrio) para filtros, URLs y senales GEO.
- 6Exponer agentes IA a internet sin abrir la puerta a prompt injection ni a fuga de claves de integracion.
El enfoque
Monolito Flask modularizado
159 rutas en un solo proceso, con el dominio partido en 33 modulos Python (geo, amenidades, SEO, IA, finanzas, pagos, correo) importados como paquetes en vez de un framework nuevo por feature.
Persistencia dual conmutable
MySQL 8 InnoDB utf8mb4 en produccion (45 tablas, 440 columnas, 21 claves ajenas, 115 indices) con SQLite como modo de rescate via AUGE_FORCE_SQLITE; el mismo codigo crea y completa el esquema en ambos motores.
Portales con auth propia
Admin sin enlace publico, portal /colega (registro, inmuebles, agenda, pedidos, recuperacion por correo) y portal de captadores con deduplicacion por telefono + municipio y bono liquidado al cierre de venta.
Pila SEO/GEO/AEO propia
14 landings de intencion mas landings dinamicas por barrio, JSON-LD RealEstateListing/FAQPage, sitemap-index con 99 URLs y 800 imagenes, y notificacion automatica a IndexNow y Google Indexing API al publicar.
IA integrada, no de demo
Asesor comercial en landings, copiloto de negocio que responde sobre KPIs con graficos Chart.js y generacion masiva de SEO/AEO por ficha; OpenAI o Gemini con fallback entre proveedores y presets de prompt versionados en BD.
Pipeline WebP con auditoria
Conversion automatica al subir imagenes, log por archivo en BD y modal de optimizacion en admin: 1.338 conversiones registradas, de 459 MB a 53 MB de origen.

Nginx (TLS, apex canonico, 301 desde www) → Gunicorn 3 workers x 2 threads → monolito Flask modular con 159 rutas → MySQL 8 InnoDB (45 tablas) mas volumen de subidas; encima, agentes IA (asesor publico, copiloto de negocio, SEO de fichas) y el paquete de descubrimiento sitemaps + llms.txt + ai.txt.
Capas del sistema
- 01Nginx: TLS Let's Encrypt, 301 www → apex, body hasta 300 MB
- 02Gunicorn: 3 workers x 2 threads, timeout 120s
- 03Flask: 159 rutas (publico, admin, /colega, /captador, API JSON)
- 04Dominio: 33 modulos Python (geo, amenidades, SEO, IA, finanzas, pagos)
- 05MySQL 8 InnoDB utf8mb4: 45 tablas con esquema autocreado e idempotente
- 06Volumen /app/instance: BD de rescate y subidas de leads/captadores
- 07IA: OpenAI/Gemini con fallback, guards y claves en integration_settings
- 08Descubrimiento: robots, sitemap-index, sitemap-images, llms.txt, ai.txt, catalogo JSON-LD
Stack aplicado
- Python 3.12
- Flask
- Gunicorn
- MySQL 8 / InnoDB
- PyMySQL
- Jinja2
- Pillow
- OpenAI + Gemini
- Bold Link API
- GA4 + Search Console
- Docker
- Nginx
Decisiones de diseno
MySQL 8 en produccion con SQLite como fallback conmutable
El catalogo con ~900 medios, los agregados de negocio y la maestra geografica piden InnoDB e indices reales; SQLite queda como via de recuperacion si MySQL o sus credenciales fallan, ejecutando el mismo codigo de esquema.
Monolito modular en vez de microservicios
Un negocio operado por un equipo pequeno no necesita limites de red: los limites se marcan por modulo Python y el coste operativo se queda en un contenedor y un proxy.
Esquema idempotente al arrancar en vez de migraciones
Funciones ensure_*_schema mas seeds crean y completan tablas en cada arranque; despliegue reproducible sin mantener un runner de migraciones para un solo operador.
AEO y GEO como datos, no como plantilla
Cada ficha guarda pregunta primaria, snippet de respuesta, FAQ extra y coordenadas: lo que un LLM puede citar se edita en el admin, no se improvisa en el HTML.
Guards propios antes de exponer IA al publico
Marcadores internos, deteccion de prompt injection y SQLi, honeypot y rate limit en memoria: proteccion suficiente sin sumar dependencias ni un WAF de pago.
Resultados
- 159
- Rutas Flask en produccion
- 45
- Tablas InnoDB (440 columnas, 21 FKs)
- -88%
- Peso de imagen tras WebP (459 → 53 MB)
- 597
- Nodos geo normalizados (22 municipios · 232 zonas · 343 barrios)
- 99
- Tests automatizados con pytest
- 20
- Tipos de evento en telemetria propia
Puntos clave
- Despliegue real: contenedor Gunicorn tras Nginx con TLS Let's Encrypt y apex canonico — no un demo local.
- CRM inmobiliario completo (leads, contactos, citas, cierres, referidos, ingresos y gastos) sin renta por asiento.
- Agentes IA expuestos a internet con guards de prompt injection y SQLi, honeypot y rate limit en formularios publicos.
- Costos de cierre colombianos codificados en el simulador: notariado 0,54%, beneficencia 1%, registro 0,67% y retencion 1% / 2,5% segun umbral.
- Telemetria de embudo propia (form_start → form_change → form_submit) para no depender solo de GA4.
Encaje / como contratar
Contrata esto si necesitas un full-stack que entienda el vertical inmobiliario de punta a punta — catalogo, CRM, portales de terceros, pagos, SEO/AEO y agentes IA — y lo deje corriendo en tu propia infraestructura, no repartido entre cinco SaaS. Discovery → producto operable → automatizacion e IA cuando el volumen lo justifique.
Agendar llamada tecnica






