TL;DR
Exportable self-hosted n8n blueprint for a mid-size real estate agency: semantic property search with Qdrant, automatic listing description generation with Ollama (Llama 3.3 8B local, zero cost per listing), customer service via WhatsApp Business Cloud API, integration with CRM (HubSpot or Pipedrive), weekly lead recalibration cron and full Langfuse traces. The whole flow imports as a JSON into your existing n8n, runs on the $40 droplet from the OSS stack, and is packaged so a mid-size agency can operate it with 0 technical staff. Costs: $46/month infra + WhatsApp API + Ollama (zero). Suggested sale price: $4,000-8,000 setup + $400-700/month.
Why this blueprint sells
- Real channel: WhatsApp concentrates >80% of LATAM real estate commercial conversation.
- Measured pain: manual listing descriptions = 15-30 min/property. A 200-property agency loses ~80h/month just writing.
- No expensive marginal costs: local Ollama on the shared stack = zero dollars per listing.
- Repeatable: import the JSON, adapt prompts in 2 hours, done.
Flow architecture
Lead enters via WhatsApp (CTA from ads, web, FB ads)
│
▼
┌────────────────────────────────────────────────┐
│ n8n flow 1: WhatsApp customer service │
│ Webhook WA ─► extract intent ─► routing │
│ ├─ "looking for a house" ─► flow-search │
│ ├─ "how much is X" ─► flow-price │
│ ├─ "I want to visit" ─► flow-schedule │
│ └─ other ─► flow-handoff │
└────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────┐
│ flow-search │
│ ├─ parse query ─► slots {city, range, beds, type}
│ ├─ Qdrant.search hybrid over properties │
│ ├─ rerank top-20 → 5 │
│ └─ send WA cards with image + link │
└────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────┐
│ flow-schedule │
│ ├─ MCP calendar.find_slot │
│ ├─ confirm slot with user │
│ ├─ create_event + add to CRM │
│ └─ confirm via WhatsApp + Email agent │
└────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────┐
│ n8n flow 2: Auto indexing │
│ Cron 30 min ─► query CRM / Google Sheet │
│ ├─ new properties ─► Ollama describes │
│ ├─ embed and upsert to Qdrant │
│ └─ publish to channels (web, portal, FB) │
└────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────┐
│ n8n flow 3: Weekly lead recalibration │
│ Cron Sunday 22:00 ─► read CRM contacts │
│ ├─ LLM scoring ─► hot/warm/cold │
│ ├─ to hot → seq 3 WA messages │
│ ├─ to warm → email seq │
│ └─ metrics to Langfuse │
└────────────────────────────────────────────────┘
Prerequisites
- OSS stack from Self-hosted AI stack running.
- n8n container in the same compose.
- WhatsApp Business Cloud API account (or provider like Twilio).
- CRM with API (HubSpot, Pipedrive, or a Google Sheet as MVP).
llama3.3:8b-instruct-q4_K_Mmodel downloaded in Ollama.
Adding n8n to the stack
docker-compose.yml fragment:
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 proxies to n8n:5678.
Flow 1 — WhatsApp customer service
Webhook and first step
The WhatsApp Cloud webhook points to https://n8n.mydomain.com/webhook/wa-inbound. n8n receives it as an 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": "You are an intent classifier for a real estate agency. Classify the message as: search, price, schedule, contact_agent, other. Return 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}
]
}
}
]
}
The actual blueprint file has ~40 nodes; here we show the key ones.
Semantic search with Qdrant
"Qdrant Search" node:
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;
Then an HTTP node to http://qdrant:6333/collections/properties/points/search with api-key auth.
Reranking and reply
The reranker runs in the same Ollama container using 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);
Sending WA cards
"WhatsApp Send" node (with custom action to the Cloud API) sends a 5-property carousel with:
- Image (first photo from CDN).
- Name and price.
- "View more" button (link to the listing on the site).
- "Schedule visit" button (triggers flow-schedule).
Flow 2 — Auto indexing with Ollama
A cron every 30 min reads new properties from the CRM/Sheet. Each property goes through:
// node: "Generate Description"
const prop = $json;
const prompt = `You are a real estate copywriter writing in Mexican Spanish.
Generate an 80-120 word description, warm and professional tone, for this listing:
Type: ${prop.type}
Neighborhood: ${prop.neighborhood}
City: ${prop.city}
Bedrooms: ${prop.bedrooms}
Bathrooms: ${prop.bathrooms}
m²: ${prop.m2}
Price: ${prop.price}
Amenities: ${prop.amenities.join(", ")}
Rules:
- Don't exaggerate. Don't use empty superlatives.
- Mention 2 concrete differentiators.
- End with a soft CTA.
- No 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() };
The description is published to the site + saved in CRM. Then:
// 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(),
}
}]);
Flow 3 — Weekly lead recalibration
Sunday 22:00 cron walks CRM contacts with status in (new, active, stale) and runs each through an LLM scorer:
Given the contact profile and interaction history:
{contact_json}
Last exchange:
{last_messages}
Classify as hot / warm / cold and return JSON {score, reason, next_action}.
Output is used for:
- hot (score >= 0.75): trigger a 3-message WA sequence within 48h.
- warm: personalized email + manual task to the responsible agent.
- cold: mark in CRM with no immediate action.
Each scoring lands in Langfuse for audit.
Costs and resources
| Item | USD/month |
|---|---|
| OSS stack droplet | 40 |
| WhatsApp Business Cloud (user-initiated convs free; business-initiated ~$0.04/conv) | ~30 for 750 outbound conversations |
| Meta Ads → WhatsApp CTA (if applicable) | variable |
| OpenAI embeddings (optional; Ollama alternative is free) | 5 |
| Infra + AI (excl. ads) | ~75 |
Descriptions, ranking, recalibration and intent: all via local Ollama = $0.
Typical client metrics
Mid-size agency, 220 properties, CDMX + Querétaro:
| Metric | Pre | 60 days post |
|---|---|---|
| Time per description | 22 min | 0 (auto) |
| First WA response time | 28 min | <1 min |
| Hot leads/month | 14 | 47 |
| Visits booked/month | 21 | 58 |
| Operational flow cost | — | ~$80 |
That's equivalent to freeing 1 part-time assistant + tripling early-conversion throughput.
How to sell it as a product
Structure:
- Initial setup ($4,000-8,000 USD) — import blueprint, connect CRM, adapt prompts, 2 training sessions.
- Monthly maintenance ($400-700 USD) — hosting on your stack, prompt tuning, monthly reports.
- Optional add-on: voice agent for calls (see AI receptionist) at +$3,000 setup + $400/month.
First sale: economy works on the second. Blueprints are reused with minor tuning (2-4 hours). Margin >80% from the third client.
Sales channels for this blueprint
- Real estate associations (AMPI in Mexico, CAMACOL in Colombia).
- Franchises (Century 21, Coldwell Banker independent offices).
- Cross-referrals with notaries and real estate firms.
- LinkedIn ads for sales directors (3M+ estimated views last year).
Typical Numoru rollout on a 200-property mid-sized brokerage over 90 days. Most lift comes from faster lead response and zero-cost listing copy.
- Before
- After blueprint
Numoru real-estate engagements telemetry 2025-2026.
Business & commercial impact
Why buyers love the blueprint
Real-estate brokerages buy workflow tools when the ROI story is told in listings written and leads answered, not in "AI features." The blueprint speaks that language: it writes listings, answers WhatsApp, and pushes to CRM. Owners see the productivity lift in week one.
Reusable blueprint verticals
Same skeleton, different vertical (Numoru pricing, USD)
Public benchmarks supporting the pitch
Meta — WhatsApp Business in LATAM
Zillow / Redfin — AI listing description experiments
Illustrative case — 3-branch brokerage in Guadalajara
3-branch brokerage with 220 listings, 18 agents, mixed residential + light-commercial
ROI calculator — 200-property agency
200-property brokerage adopting n8n blueprint (12 months)
| Setup (one-time) | −$6,500 |
| Retainer + infra (12 mo × $670) | −$8,040 |
| Extra commission (12 × 5.1 deals × $3,800) | +$232,560 |
| Agent time saved | +$17,280 |
| Net year-1 contribution | +$235,300 |
Pricing tiers Numoru sells
- n8n JSON export
- Qdrant / Ollama config
- Prompt library
- Runbook + setup video
- 30-day email support
- Blueprint customization
- HubSpot / Pipedrive integration
- WA template approval assist
- Prompt tuning + monthly report
- Shared Slack channel
- Add-on: voice agent
- Unlimited end-client deployments
- Priority bug-fix SLA
- Quarterly blueprint updates
- 10% rev-share
- Co-branding rights
- Partner portal
Blueprint variants
Same skeleton, other verticals with minor tuning:
- Automotive: swap "properties" for "cars"; slots (make, model, year, mileage).
- Boutique tourism / hotels: bookings + availability + recommendations.
- Aesthetic clinics: treatment catalog + booking.
- Coaching / courses: cart + consultative sales.
Anti-patterns
- Using the WhatsApp API without approved templates. Meta suspends the number.
- Ollama without quantization. 70B full precision doesn't fit in 8 GB.
- Not storing
tenant_idif you serve multiple agencies. Cross-contamination. - Cron every minute. WA rate limits + costs. Minimum every 10-30 min.
- 100% AI description without review. Introduce a client glossary (brands, forbidden phrases); the human reviews 10% sample.
FAQ
Does it work without a CRM?Yes, a Google Sheet is enough for MVP. Migrate to Pipedrive/HubSpot when volume justifies it.
What if the client wants another embedding model?Change the embedding node. Compatible with OpenAI, Jina, BGE, Voyage.
How do you handle descriptions in multiple languages?A separate flow with translated prompt; the user picks from the CRM.
How long does importing the blueprint take?15 minutes. Adapting the prompt to the client's tone: 2-3 hours.
Can the client edit the prompt?Yes — we expose in n8n a credential + variable the client edits from the UI without touching the flow.
Next steps
Blueprint published at github.com/numoru-ia/n8n-blueprints with versions adapted for automotive, tourism, aesthetic clinics and coaching. Direct JSON import, per-vertical documentation and step-by-step WhatsApp Business setup guides. If you want Numoru to install and adapt the suite in your operation, the commercial package includes setup, team training and 90 days of post-launch support.