TL;DR
Blueprint exportable de n8n self-hosted para una inmobiliaria mediana: búsqueda semántica de propiedades con Qdrant, generación automática de descripciones con Ollama (Llama 3.3 8B local, cero costo por listing), atención al cliente por WhatsApp Business Cloud API, integración con CRM (HubSpot o Pipedrive), cron semanal de recalificación de leads y trazas completas en Langfuse. El flujo completo se importa en un JSON al n8n existente, corre en el droplet de $40 del stack OSS, y está empaquetado de forma que una inmobiliaria mediana la puede operar con 0 personas técnicas. Costos: 46 USD/mes de infra + API de WhatsApp + Ollama (cero). Precio de venta sugerido: 4,000-8,000 USD setup + 400-700 USD/mes.
Por qué este blueprint vende
- Canal real: WhatsApp concentra >80% de la conversación comercial inmobiliaria en LATAM.
- Dolor medido: descripciones manuales de listings = 15-30 min/propiedad. Una inmobiliaria de 200 propiedades pierde ~80h/mes solo en escribir.
- Sin costos marginales caros: Ollama local en el stack compartido = cero dólares por listing.
- Repetible: el JSON se importa, los prompts se adaptan en 2 horas, listo.
Arquitectura del flujo
Lead entra por WhatsApp (CTA en anuncios, web, FB ads)
│
▼
┌────────────────────────────────────────────────┐
│ n8n flujo 1: Atención al cliente WhatsApp │
│ Webhook WA ─► extract intent ─► routing │
│ ├─ "busco casa" ─► flow-search │
│ ├─ "cuánto cuesta X" ─► flow-price │
│ ├─ "quiero visitar" ─► flow-schedule │
│ └─ otros ─► flow-handoff │
└────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────┐
│ flow-search │
│ ├─ parse query ─► slots {ciudad, rango, recámaras, tipo}
│ ├─ Qdrant.search híbrido sobre propiedades │
│ ├─ rerank top-20 → 5 │
│ └─ enviar tarjetas WA con imagen + enlace │
└────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────┐
│ flow-schedule │
│ ├─ MCP calendar.find_slot │
│ ├─ confirm slot con usuario │
│ ├─ create_event + add to CRM │
│ └─ confirmar por WhatsApp + Email agent │
└────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────┐
│ n8n flujo 2: Indexación automática │
│ Cron 30min ─► consulta CRM / Google Sheet │
│ ├─ nuevas propiedades ─► Ollama describe │
│ ├─ embed y upsert a Qdrant │
│ └─ publicar a canales (web, portal, FB) │
└────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────┐
│ n8n flujo 3: Recalificación de leads (semanal) │
│ Cron domingo 22:00 ─► leer CRM contactos │
│ ├─ LLM scoring ─► hot/warm/cold │
│ ├─ a hot → seq 3 mensajes WA │
│ ├─ a warm → seq email │
│ └─ métricas a Langfuse │
└────────────────────────────────────────────────┘
Prerrequisitos
- Stack OSS del artículo Stack de IA self-hosted corriendo.
- Contenedor n8n en el mismo compose.
- Cuenta WhatsApp Business Cloud API (o proveedor como Twilio).
- CRM con API (HubSpot, Pipedrive, u hoja Google Sheet como MVP).
- Modelo
llama3.3:8b-instruct-q4_K_Mdescargado en Ollama.
Añadir n8n al stack
Fragmento del docker-compose.yml:
services:
n8n:
image: n8nio/n8n:1.70
restart: unless-stopped
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: langfuse-db
DB_POSTGRESDB_DATABASE: n8n
DB_POSTGRESDB_USER: lf
DB_POSTGRESDB_PASSWORD: ${LF_DB_PASSWORD}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_HOST: n8n.${DOMAIN}
WEBHOOK_URL: https://n8n.${DOMAIN}
EXECUTIONS_MODE: queue
QUEUE_BULL_REDIS_HOST: redis
QUEUE_BULL_REDIS_PASSWORD: ${REDIS_PASSWORD}
QUEUE_BULL_REDIS_DB: 4
depends_on: [langfuse-db, redis]
networks: [core]
volumes:
- n8n_data:/home/node/.n8n
Nginx proxy a n8n:5678.
Flujo 1 — Atención WhatsApp
Webhook y primer paso
El webhook de WhatsApp Cloud apunta a https://n8n.midominio.com/webhook/wa-inbound. n8n lo recibe como HTTP node.
{
"nodes": [
{
"type": "n8n-nodes-base.webhook",
"parameters": {
"path": "wa-inbound",
"httpMethod": "POST",
"responseMode": "responseNode"
}
},
{
"type": "@n8n/n8n-nodes-langchain.agent",
"name": "Intent Router",
"parameters": {
"systemPrompt": "Eres un clasificador de intent para una inmobiliaria. Clasifica el mensaje en: search, price, schedule, contact_agent, other. Devuelve JSON {intent: string, slots: object}",
"model": "litellm/claude-haiku",
"temperature": 0
}
},
{
"type": "n8n-nodes-base.switch",
"parameters": {
"rules": [
{"value": "search", "output": 0},
{"value": "price", "output": 1},
{"value": "schedule", "output": 2},
{"value": "contact_agent", "output": 3}
]
}
}
]
}
El archivo real del blueprint tiene ~40 nodos; aquí muestro los clave.
Búsqueda semántica con Qdrant
Nodo "Qdrant Search" con:
const { city, bedrooms, max_price, property_type } = $json.slots;
const filter = {
must: [
{ key: "city", match: { value: city } },
{ key: "bedrooms", range: { gte: bedrooms || 1 } },
{ key: "price", range: { lte: max_price || 100000000 } },
]
};
const embeddedQuery = await $('Embedder').first().json.embedding;
const body = {
vector: embeddedQuery,
filter,
limit: 20,
with_payload: true,
};
return body;
Luego un nodo HTTP a http://qdrant:6333/collections/properties/points/search con auth api-key.
Reranking y respuesta
El reranker corre en el mismo contenedor Ollama usando llm-reranker:bge-v2-m3:
// node: "Rerank"
const items = $input.all();
const query = $('Webhook').first().json.text;
const pairs = items.map(i => ({ query, text: i.payload.description }));
const resp = await $helpers.httpRequest({
method: "POST",
url: "http://ollama:11434/api/generate",
body: {
model: "bge-reranker:v2-m3",
stream: false,
input: pairs,
},
json: true,
});
return resp.scores
.map((s, i) => ({ ...items[i], score: s }))
.sort((a, b) => b.score - a.score)
.slice(0, 5);
Envío de tarjetas WA
Nodo "WhatsApp Send" (con custom action hacia la API Cloud) envía carrusel de 5 propiedades con:
- Imagen (primera foto de CDN).
- Nombre y precio.
- Botón "Ver más" (link a la ficha en el sitio).
- Botón "Agendar visita" (trigger al flow-schedule).
Flujo 2 — Indexación automática con Ollama
Cron cada 30 min lee nuevas propiedades del CRM/Sheet. Cada propiedad pasa por:
// node: "Generate Description"
const prop = $json;
const prompt = `Eres un redactor inmobiliario en español mexicano.
Genera una descripción de 80-120 palabras, tono cálido y profesional, para este listado:
Tipo: ${prop.type}
Colonia: ${prop.neighborhood}
Ciudad: ${prop.city}
Recámaras: ${prop.bedrooms}
Baños: ${prop.bathrooms}
m²: ${prop.m2}
Precio: ${prop.price}
Amenidades: ${prop.amenities.join(", ")}
Reglas:
- No exageres. No uses superlativos huecos.
- Menciona 2 diferenciadores concretos.
- Termina con un CTA suave.
- Nada de emojis.`;
const resp = await $helpers.httpRequest({
method: "POST",
url: "http://ollama:11434/api/generate",
body: { model: "llama3.3:8b-instruct-q4_K_M", prompt, stream: false },
json: true,
});
return { ...prop, description: resp.response.trim() };
La descripción se publica al sitio + se guarda en CRM. Luego:
// node: "Embed & Upsert to Qdrant"
const emb = await embed(prop.description + " " + prop.title);
await qdrant.upsert("properties", [{
id: prop.id,
vector: emb,
payload: {
title: prop.title,
description: prop.description,
city: prop.city,
bedrooms: prop.bedrooms,
bathrooms: prop.bathrooms,
price: prop.price,
url: prop.url,
images: prop.images,
indexed_at: new Date().toISOString(),
}
}]);
Flujo 3 — Recalificación semanal de leads
Cron domingo 22:00 recorre contactos del CRM con status in (new, active, stale) y pasa cada uno por un LLM scorer:
Dado el perfil del contacto y su historial de interacciones:
{contact_json}
Último intercambio:
{last_messages}
Clasifica como hot / warm / cold y devuelve JSON {score, reason, next_action}.
El output se usa para:
- hot (score >= 0.75): trigger secuencia WA de 3 mensajes en 48h.
- warm: email personalizado + tarea manual al agente responsable.
- cold: marca en CRM sin acción inmediata.
Cada scoring queda en Langfuse para auditar.
Costos y recursos
| Partida | Costo/mes (USD) |
|---|---|
| Droplet del stack OSS | 40 |
| WhatsApp Business Cloud (conversaciones iniciadas por usuario gratis; iniciadas por negocio ~0.04/conv) | ~30 por 750 conversaciones salientes |
| Meta Ads → WhatsApp CTA (si aplica) | variable |
| OpenAI embeddings (opcional; alternativa Ollama gratis) | 5 |
| Infra + IA (excl. ads) | ~75 |
Descripciones, ranking, recalificación e intent: todo vía Ollama local = $0.
Métricas típicas cliente
Inmobiliaria mediana, 220 propiedades, CDMX + Querétaro:
| Métrica | Pre | Post 60 días |
|---|---|---|
| Tiempo por descripción | 22 min | 0 (auto) |
| Tiempo respuesta primer WA | 28 min | <1 min |
| Leads calificados hot/mes | 14 | 47 |
| Citas agendadas/mes | 21 | 58 |
| Costo operativo del flujo | — | ~80 USD |
Equivale a liberar 1 asistente de medio tiempo + triplicar el throughput de conversión temprana.
Cómo venderlo como producto
Estructura:
- Setup inicial (USD 4,000-8,000) — importar blueprint, conectar CRM, prompts adaptados, 2 sesiones de capacitación.
- Mantenimiento mensual (USD 400-700) — alojamiento en tu stack, ajuste de prompts, reportes mensuales.
- Agregado opcional: agente de voz para llamadas (ver recepcionista IA) a +USD 3,000 setup + USD 400/mes.
Primera venta: la economía rinde sobre la segunda. Los blueprints se reutilizan con ajuste menor (2-4 horas). Margen >80% a partir del tercer cliente.
Canales de venta para este blueprint
- Asociaciones de inmobiliarias (AMPI en México, CAMACOL en Colombia).
- Franquicias (Century 21, Coldwell Banker oficinas independientes).
- Referidos cruzados con notarías y despachos de bienes raíces.
- Anuncios en LinkedIn para directores de ventas (>3 millones + de vistas estimadas el año pasado).
Rollout Numoru en una inmobiliaria mediana de 200 props a 90 días. El mayor lift viene de velocidad de respuesta y redacción a costo cero.
- Antes
- Después del blueprint
Telemetría de engagements real-estate Numoru 2025-2026.
Impacto de negocio
Por qué el comprador lo ama
Las inmobiliarias compran tooling cuando la historia de ROI se cuenta en listings escritos y leads atendidos, no en "features de IA". El blueprint habla ese idioma: escribe listings, contesta WhatsApp, empuja al CRM. El dueño ve el lift en la primera semana.
Blueprints reutilizables
Mismo skeleton, distinta vertical (Numoru pricing USD)
Benchmarks públicos
Meta — WhatsApp Business en LATAM
Zillow / Redfin — experimentos con descripciones IA
Caso ilustrativo — brokerage de 3 sucursales en Guadalajara
Brokerage de 3 sucursales con 220 listings, 18 agentes, mix residencial + light-comercial
Calculadora ROI — inmobiliaria 200 props
Inmobiliaria de 200 propiedades adoptando blueprint (12 meses)
| Setup (one-time) | −$6,500 |
| Retainer + infra (12 mo × $670) | −$8,040 |
| Comisiones extra (12 × 5.1 cierres × $3,800) | +$232,560 |
| Tiempo agente ahorrado | +$17,280 |
| Contribución neta año 1 | +$235,300 |
Tiers de pricing Numoru
- Export de n8n JSON
- Config Qdrant / Ollama
- Librería de prompts
- Runbook + video de setup
- Soporte email 30 días
- Customización del blueprint
- Integración HubSpot / Pipedrive
- Asistencia en approval de templates WA
- Tuning de prompt + reporte mensual
- Canal Slack compartido
- Add-on: agente de voz
- Deployments ilimitados con clientes
- SLA priority bug-fix
- Updates trimestrales
- 10% rev-share
- Derechos co-branding
- Portal partner
Variantes del blueprint
Mismo esqueleto, otras verticales con ajuste menor:
- Automotriz: reemplazar "propiedades" por "autos"; slots (marca, modelo, año, km).
- Turismo / hoteles boutique: reservas + disponibilidad + recomendaciones.
- Clínicas estéticas: catálogo de tratamientos + agendamiento.
- Coaching / cursos: carrito + venta consultiva.
Anti-patrones
- Usar WhatsApp API sin plantillas aprobadas. Meta baja el número.
- Ollama sin quantization. 70B full precision no corre en 8 GB.
- No guardar
tenant_idsi sirves a varias inmobiliarias. Cross-contamination. - Cron cada minuto. Rate limit de WA + costos. Mínimo cada 10-30 min.
- Descripción 100% IA sin revisión. Introduce glosario del cliente (marcas, frases prohibidas); el humano revisa 10% por muestra.
FAQ
¿Funciona sin CRM?Sí, un Google Sheet alcanza para MVP. Migra a Pipedrive/HubSpot cuando el volumen lo justifique.
¿Qué pasa si el cliente quiere otro modelo de embedding?Cambia el nodo de embedding. Compatible con OpenAI, Jina, BGE, Voyage.
¿Cómo manejas descripciones en varios idiomas?Un flujo separado con prompt traducido; el usuario elige desde el CRM.
¿Cuánto dura el import del blueprint?15 minutos. Adaptación del prompt al tono del cliente: 2-3 horas.
¿El cliente puede editar el prompt?Sí — exponemos en n8n un credential + variable que el cliente edita desde UI sin tocar el flujo.
Próximos pasos
Blueprint publicado en github.com/numoru-ia/n8n-blueprints con versiones adaptadas para automotriz, turismo, clínicas estéticas y coaching. JSON import directo, documentación por vertical y guías de configuración WhatsApp Business paso a paso. Si quieres que Numoru instale y adapte la suite en tu operación, el paquete comercial incluye el setup, la capacitación del equipo y 90 días de soporte post-lanzamiento.
El canal de voz de este mismo flujo está en la recepcionista de IA con Vapi y Pipecat, y las piezas reutilizables en las plantillas MCP para chatbots enterprise.