📑 Fluxo Financeiro WhatsApp (n8n + WAHA)
Este fluxo integra o WhatsApp com Google Sheets para gerenciar finanças pessoais de forma conversacional.
O usuário interage enviando mensagens no WhatsApp, e o sistema interpreta, classifica e registra automaticamente.
🔄 Visão Geral da Experiência do Usuário
-
Usuário envia mensagem no WhatsApp.
-
O bot marca a mensagem como lida.
-
O sistema interpreta a intenção do usuário:
-
1 → Lançar Transação (entrada/saída).
-
2 → Pedir Resumo.
-
3 → Ajustar Saldo manual.
-
4 → Pagamento de Fatura.
-
-
O fluxo atualiza as planilhas do Google Sheets:
-
Contas
→ saldos/limites. -
Transacoes
→ histórico. -
MemoriaTemporaria
→ estado da conversa.
-
-
O usuário recebe feedback em mensagens de confirmação ou resumo.
🧩 Nodos Detalhados
1. Webhook
-
Função: Ponto de entrada. Recebe mensagens do WhatsApp via WAHA.
-
Saída: Payload com dados crus (quem enviou, texto, horário, etc.).
2. Preparar_Dados_Mensagem (Set
)
-
Função: Extrai campos úteis do payload inicial.
-
Atributos extraídos:
-
session
→ ID da sessão WhatsApp. -
chatId
→ ID do chat. -
pushName
→ Nome do contato. -
payload_id
→ ID da mensagem. -
event
→ Tipo de evento (ex:message
). -
message
→ Texto enviado. -
fromMe
→ Se a msg foi enviada pelo próprio bot. -
messageTime
→ Timestamp atual.
-
3. Marcar_Mensagem_Como_Lida (WAHA - Send Seen
)
- Função: Marca a mensagem recebida como “visualizada”.
4. Filtrar_Conversas_Autorizadas (Switch
)
-
Função: Permite apenas mensagens de números cadastrados (Yan e Raquel).
-
Condição:
{{ $('Dados').item.json.chatId == ('[email protected]' || '[email protected]') && ($('Dados').item.json.event=='message') }}
5. É_Resposta_Numérica? (If
)
-
Função: Verifica se a mensagem é apenas um número (regex
^\d+$
). -
Caminhos:
-
✅ Sim → Buscar memória e continuar fluxo de transação.
-
❌ Não → Envia para classificação de intenção.
-
6. Classificar_Intencao_Usuario (AI Agent
)
-
Função: Classifica a mensagem do usuário em 4 intenções.
-
Prompt de Sistema:
Você é um assistente classificador de intenções para um bot de finanças pessoais. Responda APENAS com o número da categoria. Categorias: 1. Lançar Transação 2. Pedir Resumo 3. Ajustar Saldo 4. Pagar Fatura
7. Roteamento_Intencao (Switch
)
-
Função: Direciona para o subfluxo certo.
-
Saídas:
-
1
→ Fluxo de Transação. -
2
→ Fluxo de Resumo. -
3
→ Fluxo de Ajuste. -
4
→ Fluxo de Pagamento.
-
🚀 Fluxo 1 — Lançar Transação
8. Extrair_Detalhes_Transacao (AI Agent
)
-
Função: Estrutura a mensagem em JSON financeiro.
-
Prompt de Sistema:
Sua única função é extrair informações financeiras de uma mensagem e formatá-las em JSON. Estrutura: { "pessoa": "Nome Pessoa", "data": "AAAA-MM-DD", "mes": "Nome do Mês", "transacao": "Descrição", "tipo": "Entrada ou Despesa", "entrada": 0.00, "saida": 0.00 }
9. Validar_JSON_Transacao (Code
)
const rawOutput = $input.first().json.output;
const match = rawOutput.match(/{[\s\S]*}/);
if (match && match[0]) {
return JSON.parse(match[0]);
}
return { error: "Nenhum JSON válido foi encontrado na resposta." };
10. Validar_Valores (Switch
)
-
Condição:
-
Se
entrada == 0 && saida == 0
→ erro. -
Caso contrário → segue.
-
11. Guardar_Memoria_Temporaria (Google Sheets
)
- Função: Salva a transação temporariamente até a conta ser escolhida.
12. Buscar_Contas_Disponiveis (Google Sheets
)
- Função: Lista as contas cadastradas.
13. Formatar_Pergunta_Conta (Code
)
const contas = $('Buscar_Contas').all();
let mensagem = "Entendido! Onde foi essa despesa?\n\n";
contas.forEach((conta) => {
mensagem += `${conta.json.ID}. ${conta.json['Nome da Conta']}\n`;
});
return { mensagem };
14. Enviar_Pergunta_Conta (WAHA - Send Text
)
- Envia lista de contas para escolha.
15. Identificar_Conta (Google Sheets
)
- Busca a conta pelo número digitado.
16. Selecionar_Ultima_Memoria (Code
)
const todasMemorias = $('Buscar_na_Memoria').all();
todasMemorias.sort((a, b) => b.json.Timestamp - a.json.Timestamp);
return todasMemorias[0];
17. Registrar_Transacao_Final (Google Sheets
)
- Grava a transação na aba
Transacoes
.
18. Calcular_Novo_Saldo (Code
)
const conta = $('Identificar_Conta').first().json;
const tipoConta = conta.Tipo;
let saldoAntigo = parseFloat(conta['Saldo / Limite Disponível']);
if (Number.isNaN(saldoAntigo)) saldoAntigo = 0;
const memoria = $('Pegar_Ultima_Memoria').first().json;
const tipoTransacao = memoria.Tipo;
let valorTransacao = parseFloat(memoria.Valor);
if (Number.isNaN(valorTransacao)) valorTransacao = 0;
let novoSaldo = saldoAntigo;
if (tipoConta === 'Débito') {
novoSaldo += (tipoTransacao === 'Entrada' ? valorTransacao : -valorTransacao);
} else if (tipoConta === 'Crédito') {
novoSaldo += (tipoTransacao === 'Entrada' ? valorTransacao : -valorTransacao);
}
return { novoSaldo: novoSaldo.toFixed(2) };
19. Atualizar_Saldo_Conta (Google Sheets
)
- Atualiza saldo/limite disponível.
20. Limpar_Memoria_Temporaria (Google Sheets
)
- Apaga a memória usada.
21. Confirmar_Registro (WAHA - Send Text
)
- Mensagem final:
✅ “Transação registrada com sucesso!”
🚀 Fluxo 2 — Pedir Resumo
22. Buscar_Saldos (Google Sheets
)
- Recupera todos os saldos.
23. Formatar_Resumo_Financeiro (Code
)
const contas = $('Buscar_Saldos').all();
let mensagem = "📊 *Resumo Financeiro Atual* 📊\n\n";
const contasDebito = contas.filter(c => c.json.Tipo === 'Débito');
if (contasDebito.length > 0) {
mensagem += "💰 *Saldos em Conta (Débito):*\n";
contasDebito.forEach(conta => {
let saldo = parseFloat(conta.json['Saldo / Limite Disponível']);
if (Number.isNaN(saldo)) saldo = 0;
mensagem += `- ${conta.json['Nome da Conta']}: R$ ${saldo.toFixed(2)}\n`;
});
}
const contasCredito = contas.filter(c => c.json.Tipo === 'Crédito');
if (contasCredito.length > 0) {
mensagem += "\n💳 *Limites Disponíveis (Crédito):*\n";
contasCredito.forEach(conta => {
let limite = parseFloat(conta.json['Saldo / Limite Disponível']);
if (Number.isNaN(limite)) limite = 0;
mensagem += `- ${conta.json['Nome da Conta']}: R$ ${limite.toFixed(2)}\n`;
});
}
return { mensagem };
24. Enviar_Resumo_Financeiro (WAHA - Send Text
)
- Envia o resumo formatado.
🚀 Fluxo 3 — Ajustar Saldo
25. Extrair_Detalhes_Ajuste (AI Agent
)
-
Prompt de Sistema:
Sua única função é extrair o nome da conta e o novo valor de uma mensagem de ajuste de saldo. Responda APENAS com: {"nome_conta": "Nome da Conta", "novo_valor": 1500.00}
26. Validar_JSON_Ajuste (Code
)
const rawOutput = $input.first().json.output;
const match = rawOutput.match(/{[\s\S]*}/);
if (match && match[0]) {
return JSON.parse(match[0]);
}
return { error: "Nenhum JSON válido foi encontrado na resposta." };
27. Buscar_Todas_Contas (Google Sheets
)
- Puxa lista de contas.
28. Filtrar_Conta_Ajuste (Code
)
const nomeBusca = $('AI Extrair Ajuste').first().json.nome_conta.toLowerCase();
const todasAsContas = $('Encontrar_Conta_para_Ajuste').all();
const contaEncontrada = todasAsContas.find(item =>
item.json['Nome da Conta'].toLowerCase().includes(nomeBusca)
);
if (contaEncontrada) return contaEncontrada;
return { error: "Nenhuma conta encontrada com esse nome." };
👉 (Faltam conexões no fluxo para atualizar o saldo diretamente e enviar mensagem de confirmação.)
🚀 Fluxo 4 — Pagamento de Fatura
29. Extrair_Detalhes_Pagamento (AI Agent
)
-
Prompt de Sistema:
Sua função é extrair de uma mensagem de pagamento de fatura o nome do cartão de crédito e o valor pago. Responda APENAS com: {"nome_cartao": "Nome do Cartão", "valor_pago": 1200.00}
👉 (Assim como no ajuste, falta conexão final para atualizar limite e confirmar pagamento.)
📌 Pontos de Melhoria
-
Adicionar mensagem de confirmação para Ajuste e Pagamento.
-
Criar tratamento de erros unificado (respostas amigáveis quando IA não entende).
-
Melhorar UX do Resumo → separar “contas principais” em destaque.
👉 Quer que eu monte também um diagrama em Mermaid (fluxo visual) para anexar ao .md
, ou prefere manter só a documentação textual detalhada?