tutorial

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:

  1. 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.
  2. 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.
  3. 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

  1. Cria conta Tokia + R$ 10 PIX
  2. Setup SimplesZap (~R$ 99/mês, conta WhatsApp Business)
  3. Copia o código acima, ajusta system prompt pro seu mercado
  4. RAG: importa 100-200 imóveis do seu banco interno (CSV → script Python)
  5. Smoke test: manda 5 perguntas reais pelo seu WhatsApp pessoal
  6. Liga marketing Meta Ads → seu WhatsApp Business
  7. Mede CAC (custo aquisição) por lead vs custo do bot — vai surpreender

Começa com R$ 10 PIX →


Posts relacionados:

#imobiliaria#chatbot#whatsapp#qualificacao-leads#pme

Quer testar Tokia com R$ 10 via PIX?

Criar conta grátis →