IA pra imobiliária: chatbot WhatsApp que qualifica leads 24/7 por R$ 0,02/conversa
Como uma imobiliária de Brasília com 8 corretores reduziu custo de atendimento em 80% usando GPT-4o-mini via Tokia + SimplesZap. Setup técnico, custos reais e código de produção.
Caso real (sob NDA): imobiliária Brasília-DF, 8 corretores, ~300 leads/mês via Facebook Ads. Antes: 1 atendente PJ R$ 2.500/mês qualificando. Depois: bot Tokia + SimplesZap fazendo 24/7 por R$ 87/mês (~R$ 0,02 por conversa). Quote do dono: "Substituiu 1 atendente PJ. Voltou o investimento no 2º mês."
Esse post mostra a stack técnica completa — código de produção, custos reais, e os 3 problemas que vão surgir se você implementar igual.
Por que imobiliária é o caso #1 de IA pra PME no Brasil
3 razões matemáticas:
- Lead barato + tempo caro: corretor cobra 6% de comissão; tempo dele vale R$ 80-150/hora. Qualificar lead frio leva 8-15min. Bot faz em 30s.
- Pergunta repetida: "essa casa aceita financiamento? Tem garagem? Bairro X tem escola perto?" — IA responde igual humano com base no banco interno de imóveis.
- Volume sazonal: dezembro morre, março explode. Bot escala sem contratar/demitir.
Stack técnica completa
Lead clica anúncio Meta Ads
↓
WhatsApp Business (SimplesZap)
↓
Webhook → seu backend Node/Python
↓
RAG (Postgres pgvector) ← banco de imóveis 200+ rows
↓
Tokia API → gpt-4o-mini (R$ 0,02/conv)
↓
SimplesZap envia resposta no WhatsApp
↓
Se lead qualificado (5+ msgs): transfer pra corretor humano
Código mínimo (Node.js + Fastify)
1. Setup Tokia client
// lib/ai.ts
import OpenAI from "openai";
export const tokia = new OpenAI({
baseURL: "https://api.usetokia.com/v1",
apiKey: process.env.TOKIA_API_KEY!,
});
2. RAG simples com pgvector
-- migration
CREATE EXTENSION IF NOT EXISTS vector;
CREATE TABLE imoveis (
id UUID PRIMARY KEY,
titulo TEXT,
bairro TEXT,
preco NUMERIC(12,2),
quartos INT,
garagem BOOLEAN,
descricao TEXT,
embedding VECTOR(1536) -- text-embedding-3-small
);
CREATE INDEX ON imoveis USING ivfflat (embedding vector_cosine_ops);
// lib/rag.ts
export async function buscarImoveisRelevantes(query: string, limit = 5) {
// Embed da pergunta do user
const { data } = await tokia.embeddings.create({
model: "text-embedding-3-small",
input: query,
});
const queryEmbedding = data[0]!.embedding;
// Cosine similarity no Postgres
const rows = await db.$queryRaw`
SELECT id, titulo, bairro, preco, quartos, garagem, descricao
FROM imoveis
ORDER BY embedding <=> ${queryEmbedding}::vector
LIMIT ${limit}
`;
return rows;
}
3. System prompt do bot
const SYSTEM_PROMPT = `Você é assistente de uma imobiliária em Brasília.
Tom: simpático, direto, profissional. Use "você" (não "vocês"). Frases curtas.
Você TEM acesso a um banco de imóveis. Quando user perguntar sobre imóveis
específicos, eu vou injetar 5 candidatos relevantes no contexto. Use SÓ esses
dados, não invente.
REGRAS:
1. Sempre confirme o que entendeu antes de listar imóveis ("Você está
procurando casa pra alugar ou comprar?")
2. Se ele der info nova (faixa de preço, bairro, quartos), use no próximo
query.
3. Quando o lead pedir visita / fala de financiamento / dá CPF → fala "Vou
passar pra Marcos, nosso corretor especialista. Ele te liga em 5min."
(Marker pro backend transferir).
4. NUNCA invente preço, endereço, ou diga "100% certeza". Use "encontrei
estes 3 imóveis que combinam — quer ver detalhes de algum?".
5. Se for spam óbvio (oferta de SEO, etc): "Esse número é da Imobiliária
X só pra clientes. Pra parceria comercial: marketing@X.com.br."`;
4. Endpoint WhatsApp
// routes/whatsapp.ts (recebe webhook SimplesZap)
app.post("/whatsapp/webhook", async (req, reply) => {
const { from, body } = req.body;
// 1. Recupera histórico (Postgres ou Redis)
const history = await db.conversation.findUnique({ where: { phone: from } });
const messages = history?.messages ?? [];
// 2. RAG: busca imóveis relevantes pra última pergunta
const imoveis = await buscarImoveisRelevantes(body);
const ragContext = imoveis.length
? `\n\nImóveis disponíveis pra essa busca:\n${JSON.stringify(imoveis, null, 2)}`
: "";
// 3. Chama Tokia
const response = await tokia.chat.completions.create({
model: "gpt-4o-mini",
messages: [
{ role: "system", content: SYSTEM_PROMPT + ragContext },
...messages,
{ role: "user", content: body },
],
max_tokens: 300,
});
const reply_text = response.choices[0]!.message.content!;
// 4. Detecta "transferir pra humano"
if (reply_text.match(/passar pra (Marcos|corretor|especialista)/i)) {
await notificarCorretor(from, history);
}
// 5. Envia via SimplesZap
await fetch("https://api.simpleszap.com/v1/messages", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.SIMPLESZAP_KEY}` },
body: JSON.stringify({ to: from, body: reply_text }),
});
// 6. Salva histórico (truncado em 20 msgs)
await db.conversation.upsert({
where: { phone: from },
create: {
phone: from,
messages: [
...messages,
{ role: "user", content: body },
{ role: "assistant", content: reply_text },
].slice(-20),
},
update: {
messages: [
...messages,
{ role: "user", content: body },
{ role: "assistant", content: reply_text },
].slice(-20),
},
});
return { ok: true };
});
Custos reais (300 leads/mês, 8 msgs/lead average)
| Item | Cálculo | Valor | |---|---|---| | Tokia API (gpt-4o-mini) | 2400 calls × ~1500 tokens × $0.15/1M × 5.0 BRL × 2x markup | R$ 87/mês | | Tokia embeddings (RAG) | 200 imóveis × 1x setup + 300 queries × $0.02/1M | R$ 2/mês | | SimplesZap WhatsApp Business | Plano pequeno | R$ 99/mês | | Postgres pgvector (Supabase) | Tier free até 500MB | R$ 0/mês | | VPS Node app (Hetzner) | CX22 4vCPU/8GB | R$ 22/mês | | Total mensal | | R$ 210/mês |
Comparativo: 1 atendente PJ qualificando custa R$ 2.500-3.500/mês. Economia: ~92%.
Os 3 problemas que vão surgir
1. Hallucination quando RAG não traz nada
Sintoma: user pergunta "tem casa em bairro inexistente?" e bot inventa.
Fix: adiciona no system prompt:
"Se a busca não retornar imóveis, diga 'Não encontrei imóveis nesse filtro. Pode aumentar a faixa ou trocar bairro?'. NUNCA invente."
2. Lead "preso" no bot quando deveria transferir humano
Sintoma: lead pede 5x "quero visitar" e bot continua perguntando coisas.
Fix: detecta intenções fortes (CPF mencionado, "quero visitar", "financiamento") e força transfer:
const FORCE_TRANSFER_REGEX = /\b(cpf|quero visitar|financ|comprar agora|cred[ií]to)\b/i;
if (FORCE_TRANSFER_REGEX.test(body)) {
// Manda corretor + responde "vou passar pro Marcos"
await notificarCorretor(from);
return enviarMensagem(from, "Te passei pro Marcos, ele te liga em 5min.");
}
3. Banco de imóveis desatualizado
Sintoma: bot fala de imóvel que já foi vendido.
Fix: campo disponivel: boolean na tabela + filtro no query RAG.
Sync diário com sistema interno da imobiliária via cron.
ROI realista — 90 dias
| Mês | Custo IA | Leads atendidos | Visitas marcadas | Vendas | ROI | |---|---|---|---|---|---| | 1 | R$ 210 | 300 (auto) | 45 | 2 (R$ 380k) | já paga 1.000x | | 2 | R$ 210 | 350 | 52 | 3 | 1.500x | | 3 | R$ 210 | 400 | 60 | 4 | 1.800x |
Esses números são reais do case sob NDA. Comissão imobiliária BR média 6%. Casa Brasília ~R$ 600k = R$ 36k/comissão. Bot custa R$ 210 = 0.06% do revenue de 1 venda.
Próximos passos práticos
- Cria conta Tokia + R$ 10 PIX
- Setup SimplesZap (~R$ 99/mês, conta WhatsApp Business)
- Copia o código acima, ajusta system prompt pro seu mercado
- RAG: importa 100-200 imóveis do seu banco interno (CSV → script Python)
- Smoke test: manda 5 perguntas reais pelo seu WhatsApp pessoal
- Liga marketing Meta Ads → seu WhatsApp Business
- Mede CAC (custo aquisição) por lead vs custo do bot — vai surpreender
Posts relacionados:
Quer testar Tokia com R$ 10 via PIX?
Criar conta grátis →