š 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?