AtendeLink.
Atendimento pelo WhatsApp com várias pessoas no mesmo número e um agente de IA que segue o fluxo desenhado pela empresa.


O problema
Processo manual
Pequenas empresas atendem pelo WhatsApp com várias pessoas dividindo o mesmo número. Elas precisam saber quem está com cada cliente, automatizar o começo da conversa e vender pelo próprio chat, sem perder o controle do que o robô responde. O AtendeLink não é omnichannel, por escolha: é WhatsApp mais chat interno, integrado ao ERP Web da LinkDev.
O que construí
O AtendeLink é um produto da LinkDev, onde trabalho desde 2021. Nele, construí o flow builder visual com o bloco de Agente IA, que responde em texto e voz, e um playground que simula o fluxo sem mandar nada para o WhatsApp. Fiz a base de conhecimento com RAG, as vendas pelo WhatsApp (pedido pelo fluxo, carrinho abandonado e comissão), o CRM de leads, clientes e documentos e a assinatura na Stripe, com Checkout, Portal e webhook. Também fiz os módulos por empresa, migrei as telas para shadcn e Tailwind 4, corrigi o isolamento entre empresas e escrevi as specs que guiaram cada etapa.
Decisões técnicas
01Conhecimento separado por empresa, chave guardada no servidor
Cada empresa tem a própria base. O texto é quebrado em trechos, vira embedding com text-embedding-3-small e vai para o pgvector, e a busca só olha os trechos daquela empresa. A chave de IA nunca volta numa listagem nem pelo socket, e as falhas usam erros tipados (ERR_AI_*) para a tela saber o que deu errado.
Onde está no código: services/KnowledgeServices/chunkText.ts · embeddings.ts · searchKnowledge.ts
02O fluxo é um grafo, e dá para simular
O fluxo desenhado no front com @xyflow/react é salvo como grafo e validado ao salvar. O motor percorre os blocos: início, mensagem, menu, pergunta, agente IA, catálogo, checkout, condição, transferência e encerramento. O mesmo motor tem um modo de simulação, e o playground simula a conversa pelo fluxo, inclusive o bloco de agente, sem mandar nada ao WhatsApp.
Onde está no código: services/FlowServices/FlowEngine.ts · flowGraph.ts · SimulateFlowService.ts · aiAgent.ts · salesTools.ts
03Webhook da Stripe conferido nos bytes
A rota do webhook recebe o corpo cru, antes de qualquer parser de JSON, porque a Stripe assina os bytes exatos. Evento sem assinatura válida é recusado. Um POST forjado não ativa plano nenhum.
04Spec antes do código
Features, regras e a padronização das telas foram escritas primeiro como spec, e a padronização andou em etapas.
Onde está no código: docs/specs/
Números
64
models no produto
210
migrações
40
páginas
Stack
- Node.js
- TypeScript
- Express
- Sequelize
- PostgreSQL 16
- pgvector
- Redis
- Bull
- Socket.io
- Baileys
- OpenAI SDK
- Stripe
- React 19
- Vite
- Tailwind 4
- shadcn/ui
- Electron
- Docker
Telas



Kaelith