Property-Pros
Construimos Property-Pros, una plataforma inmobiliaria IDX para el mercado mexicano, de cero a producción. Partimos de una observación simple: el problema no está en las propiedades ni en los agentes, está entre ellos — en la relación que ningún portal modela. Así que pusimos esa relación en el centro: cada par agente-propiedad genera su propia URL y shortCode, y desde ahí todo cuelga — la atribución del lead, la analítica, el OG personalizado. Conectamos el feed del MLS (RESO) por OAuth2 con sincronización cada 15 minutos y proxy en tiempo real, levantamos un API REST de 68 endpoints con validación Zod en cada entrada, y entregamos un frontend Next.js bilingüe de 36 páginas con SEO serio (JSON-LD, hreflang, sitemap dinámico) y analítica first-party que cumple LFPDPPP sin Google Analytics. La prueba está en la escala y en la operación: 12 modelos de datos, 4 roles con RBAC, 61 tests, y un despliegue real en producción con CI/CD y Docker Compose. Y cuando un bug amenazó con perder leads en la resolución de propiedad, lo cerramos en producción con resolución triple (mlsId, slug, ObjectId) — porque en este negocio, perder un lead es perder la venta.
Categoría
Inmobiliaria
Stack
Next.js, Node.js, TypeScript
El problema
En el mercado inmobiliario mexicano las propiedades viven en un feed MLS compartido, pero los agentes no tienen forma de hacerlas suyas: comparten el mismo listado genérico y, cuando entra un prospecto, nadie sabe a quién pertenece el lead. El problema no está en las propiedades ni en los agentes por separado: está en el espacio entre ellos, en la relación agente-propiedad que ningún portal modela. El resultado es atribución difusa, leads que se pierden o se pelean, y cero analítica por agente.
Lo que construimos
- —Modelo central agente-propiedad (AgentProperty): cada par genera una URL única /a/{agente}/{propiedad} y un shortCode de 8 caracteres, con restricción única por agente+propiedad para que un agente solo tenga un link por inmueble.
- —Atribución de leads infalible: el formulario de contacto en cualquier link de agente crea un Lead ligado a ESE agente, con resolución robusta de la propiedad (por mlsId, slug u ObjectId) para que nunca se pierda un prospecto.
- —Sincronización con el MLS (RESO Web API) vía OAuth2: un sync-worker que actualiza el feed cada 15 minutos más un proxy en tiempo real, con mapeo RESO→base de datos como capa de transformación.
- —API REST completa: 68 endpoints en 14 módulos (auth, propiedades, agentes, leads, áreas, desarrollos, dashboard, admin, analytics, auditoría, media, búsqueda, settings) con validación Zod en cada entrada.
- —Sitio bilingüe EN/ES de extremo a extremo: 36 páginas con next-intl, rutas localizadas, hreflang, sitemap dinámico y aviso de privacidad LFPDPPP.
- —Analítica first-party sin cookies de terceros: conteo de vistas, visitantes únicos y conversión por par agente-propiedad, con IP hasheada SHA-256 + salt rotativo diario para cumplir con privacidad.
- —Panel de agente y consola de administración: dashboard con gráficas de desempeño, gestión de leads, asignación/reasignación de propiedades, gestión de zonas y desarrollos, y log de auditoría de acciones admin.
- —RBAC con 4 roles (agent, premier_agent, broker, admin) y matriz de permisos granular; auth con NextAuth en el frontend y JWT en el API.
- —Pipeline de medios: subida a S3/R2 con procesamiento Sharp (WebP, thumbnails 150/400/800/1200px) y URLs prefirmadas.
- —SEO inmobiliario serio: 5 tipos de structured data JSON-LD, OG/Twitter Cards personalizadas por agente, renderizado SSR/ISR de Next.js para que cada propiedad indexe.
- —Conversión de moneda con tipo de cambio FIX del Banxico (USD como fuente de verdad, MXN derivado) y mapa interactivo con Leaflet/MapTiler.
- —Despliegue en producción con Docker Compose (5 servicios), CI/CD con build en runner y registry, y suite de 61 tests.
Resultados
12 modelos de datos y 9 enums en el esquema Prisma
68 endpoints REST en 14 módulos de rutas
36 páginas (públicas, dashboard de agente y consola admin), 44 componentes React
Plataforma bilingüe completa con 13 namespaces de traducción EN/ES
61 tests automatizados (5 suites unitarias + 4 de integración)
4 roles con matriz de permisos RBAC granular
Sincronización con el MLS cada 15 minutos + proxy en tiempo real
Pipeline de imágenes con 4 resoluciones (150/400/800/1200px) en WebP
En producción con CI/CD (build-en-runner + registry) y Docker Compose de 5 servicios