← Voltar para a documentação da arquitetura

VPS Elainne Ourives · 24 a 29 de setembro de 2026

Saneamento do Suporte IA

O que foi analisado e corrigido na estrutura que sustenta a IA de atendimento: Chatwoot, n8n e o banco Supabase. Cada frente mostra o problema encontrado, a causa confirmada nos dados, a solução aplicada e o resultado medido depois.

~27 milalunos que a IA não achava pelo CPF passaram a ser encontrados
382compras que tinham ficado incompletas ou fora do banco foram recuperadas
150 → 0,8 mstempo da busca das faturas de um aluno
~800 → 96linhas de erro por dia no error_log (média da semana anterior vs. 28/09 até as 13h UTC)
17 s → 0,3 stempo da ferramenta da IA para localizar um aluno
106atendimentos reais seguidos sem nenhum erro depois dos ajustes do agente

Banco de dados sem índices

Resolvido
Problema
Consultas simples ao Supabase levavam de 10 a 860 segundos e derrubavam execuções do n8n.
Causa
Nenhuma coluna usada em filtros tinha índice. Cada busca lia a tabela inteira; a de interesses foi lida por completo 69 milhões de vezes.
Solução
10 índices criados sem travar as tabelas: contatos (CPF, e-mail, telefone), faturas, pagamentos, produtos, ofertas, UTMs e interesses.
Resultado
Consultas que levavam de 20 a 150 ms passaram a responder em menos de 1 ms.

n8n caindo com carrinhos abandonados

Resolvido
Problema
O workflow lead.abandoned_checkout estourava a memória. O n8n reiniciou 11 vezes, interrompendo atendimentos da IA em andamento.
Causa
Produtos e ofertas duplicados no banco faziam cada carrinho virar cerca de 51 mil itens, e cada item gerava uma consulta. Além disso, a gravação dos interesses estava desligada desde 21/09.
Solução
Nova versão que busca uma única linha por produto e oferta, religa a gravação do interesse, não trata duplicata como erro e tem limite de 5 minutos por execução.
Resultado
Cada execução caiu de 4 a 30 minutos para cerca de 1 segundo, e os carrinhos voltaram a ser registrados.

Compras gravadas pela metade

Resolvido
Problema
426 falhas em 7 dias no invoice_created. A fatura era gravada sem produtos e ofertas, e a IA achava o aluno mas não sabia qual curso ele comprou.
Causa
  • UTMs e endereços com vírgula ou parênteses quebravam o filtro da busca.
  • O nó que registrava o erro gerava um JSON inválido e escondia a falha real.
  • Faturas com 2 ou mais produtos perdiam a ligação entre produto e oferta.
  • Filtros sem o operador de comparação faziam o fluxo criar uma oferta nova a cada compra, origem das até 2.635 cópias da mesma oferta.
Solução
Quatro versões testadas no ambiente de desenvolvimento com compras reais que tinham falhado. A v4 corrige todos os pontos e processa um produto por vez.
Resultado
No primeiro dia em produção: todas as compras gravadas sem erro, em média 4 segundos cada, sem novas ofertas duplicadas.

Recuperação das compras perdidas

Resolvido
Problema
Compras dos dias 25 a 28/09 tinham ficado incompletas ou nem tinham chegado ao banco.
Solução
Backup completo das tabelas antes de começar, um teste com uma fatura e depois o processamento uma a uma, com conferência de cada resultado.
Resultado
369 faturas ganharam os produtos e ofertas que faltavam, e 13 compras que não existiam foram gravadas por completo.

Ficaram de fora 11 faturas que já tinham parte dos produtos. Elas serão completadas junto com a limpeza de duplicatas, para não vincular o mesmo produto duas vezes.

Busca de alunos pela IA

Resolvido
Problema
Alunos com cadastro não eram encontrados, e a busca demorava a ponto de a IA ficar sem resposta.
Causa
  • A busca exigia o CPF exatamente como gravado, e 26 mil CPFs estavam sem o zero à esquerda. Outros mil estavam com pontuação.
  • Faltava índice na ligação entre aluno e fatura: cada busca lia cerca de 660 MB.
  • Uma entrada vazia ou um CPF zerado devolvia dados de outras pessoas.
  • A ferramenta acessava o banco pelo endereço público, que às vezes travava até o limite de 10 segundos.
Solução
A ferramenta de consulta procura o CPF em todos os formatos, valida o dígito verificador e, se não achar, tenta o e-mail e depois o WhatsApp da conversa, com e sem o 9 do celular. O agente passou a consultar pelo WhatsApp antes de pedir o CPF, e a ferramenta passou a usar o endereço interno do banco. Cada ajuste no agente foi validado antes em teste A/B isolado, sem mensagens a alunos.
Resultado
Os alunos sem o zero à esquerda voltaram a ser encontrados, quem só lembra o e-mail é atendido, quem não informa nada é reconhecido pelo WhatsApp e entradas inválidas não retornam ninguém. A consulta leva de 0,2 a 0,4 segundo.

IA sem resposta por limite de tempo

Resolvido
Problema
Em alguns atendimentos a IA não respondia. Houve 7 casos em 2 dias.
Causa
O modelo de linguagem do agente não tinha tempo máximo definido, e a chamada era cortada em cerca de 10 segundos sempre que a resposta demorava um pouco mais.
Solução
Limite de 60 segundos com 2 novas tentativas no modelo, e novas tentativas automáticas no download e na transcrição de áudio, na nota privada e nas chamadas ao Chatwoot. Não há nova tentativa no envio da resposta, para o aluno não receber mensagem duplicada.
Resultado
106 atendimentos reais seguidos sem nenhum erro depois dos ajustes.

Transferência e encerramento de atendimento

Resolvido
Problema
A IA recebia erro ao transferir para um atendente humano, e a ferramenta de encerrar a conversa nunca funcionava.
Causa
A transferência acontecia, mas a notificação do grupo, com token inválido, fazia a ferramenta responder erro ao agente. O encerramento usava uma sintaxe antiga do n8n que não funciona dentro do agente.
Solução
A notificação passou a não interromper a transferência, e o encerramento foi reescrito na sintaxe atual. Os dois foram testados com o Chatwoot simulado, sem tocar em conversas reais.
Resultado
A transferência conclui mesmo com a notificação falhando, e a IA volta a encerrar conversas resolvidas.

Encaminhamento para atendimento humano

Resolvido
Problema
Em 7 dias, a IA pediu 110 transferências para um atendente e só 7 chegaram a alguém (6%). Quando a transferência falhava, o aluno esperava em mediana 2h35 por uma resposta humana, e 15 conversas nunca foram atendidas.
Causa
  • Só recebia transferência quem estava "online" no Chatwoot, e quem está atendendo aparece como "ocupado". Em horário comercial, 67 de 69 pedidos falharam por isso.
  • Sem atendente, a conversa continuava com a IA, fora da fila da equipe, sem etiqueta nem aviso.
  • A IA dizia ao aluno que a solicitação estava registrada, sem que nada tivesse sido registrado, e tentava transferir de novo a cada mensagem.
  • Depois de uma transferência, a IA ficava desligada naquela conversa para sempre.
Solução
  • Se a conversa já estiver com um atendente, ele é mantido. O sorteio só acontece quando a conversa está com a IA ou sem ninguém.
  • A transferência vai para um atendente "online" ou "ocupado", com preferência para quem está online.
  • Sem ninguém disponível, a conversa entra na fila do time Suporte com a etiqueta aguardando_humano e uma nota interna, e a IA para de responder.
  • O aluno recebe a posição real na fila até a 6ª. Acima disso, recebe a informação de que está na fila, sem número.
  • A mensagem ao aluno sai pronta da ferramenta, inclusive quando a transferência falha, para a IA nunca prometer o que não aconteceu.
  • Quando o atendente resolve a conversa, uma IA lê o histórico. Sem pendência, a IA volta a atender esse aluno. Com pendência, a conversa fica com o último atendente, com uma nota explicando o motivo.
Resultado
Testado com o Chatwoot simulado em todos os casos (atendente online, ocupado, atendente já na conversa, fila, fila cheia, falha, com e sem pendência), sem tocar em conversas reais. Em produção desde 29/09, sem erros. Na primeira transferência real, o aluno recebeu o nome da atendente e foi respondido em 26 segundos; na primeira conversa resolvida, a IA foi reativada com a nota explicando o motivo.

Plataformas externas como último recurso

Resolvido
Problema
Alunos que ainda não estavam no banco, como compras recentes com falha de gravação, ficavam sem atendimento.
Solução
  • Quando CPF, e-mail e WhatsApp não encontram o aluno, a IA consulta a Entrega Digital (Elainne e Holo) pelo e-mail e, por último, a Hubla pelo CPF ou e-mail.
  • A Hubla é acessada por uma chave que só permite buscar faturas, com limite de 10 consultas por minuto e 300 por dia, pausa automática de 15 minutos após 3 falhas seguidas e resultado guardado por até 24 horas.
  • Todo aluno encontrado só fora do banco fica registrado para ser sincronizado depois.
Resultado
Em produção, o aluno fora do banco é encontrado com nome, e-mail, faturas e cursos. Quem já está no banco não gera nenhuma consulta externa.

Como cada mudança entrou no ar

Nenhuma versão substituiu outra sem teste. O processo foi o mesmo em todas:

EtapaO que acontece
BackupO workflow ou a tabela é salvo antes de qualquer alteração.
CópiaA correção é feita numa cópia inativa, sem tocar na versão em uso.
TesteA cópia roda contra o ambiente de desenvolvimento com dados reais das execuções que falharam.
TrocaA versão antiga é desativada e a nova ativada em seguida. A antiga fica guardada para voltar em segundos.
AcompanhamentoAs primeiras execuções reais são conferidas antes de seguir para o próximo item.

Próximos passos

ItemSituaçãoDepende de
Notificação de transferência para o grupoFalhandoToken novo da uazapi
Limpeza de produtos, ofertas e contatos duplicadosA fazerJanela com backup
Painel para cadastrar, editar e ocultar cursosA fazerDefinir quem vai usar