TremSend é uma interface focada em envio automatizado de mensagens para leads via WhatsApp, com personalização por contato, controle de intervalo (fixo ou aleatório), análise de dados e recursos de armazenamento de modelos, arquivos e conjuntos de mensagens.
- Facilitar o envio automático de mensagens para leads no WhatsApp, filtrando e reconstruindo números, validando o dígito 9, adicionando o prefixo
55quando necessário, e gerando PDF com a análise final. - Permitir criação e uso de “conjuntos de mensagens” (mensagens 1, 2 e 3), envio de link de arquivo/imagem, salvamento de dados (modelos e arquivos em base64) e estatísticas/ETA durante o envio.
reactereact-dom(SPA e estado)react-router-dom(rotas)react-scripts(build dev/prod)lucide-react(ícones)react-hot-toast(feedbacks)
tailwindcss(utilitários e responsividade)postcsseautoprefixer(pipeline CSS)
papaparse(CSV)xlsx(XLSX/XLS)
chart.js(gráficos no Dashboard)jspdf(PDF de análise final)
@supabase/supabase-js(persistência, RLS, RPCs)axios(requisições HTTP)- WAHA — WhatsApp HTTP API (envio efetivo de mensagem;
POST /api/sendText)
- Scripts
npm(start,build,test,deployvia Surge)
- Upload de planilha e mapeamento simplificado (campos padrão:
nomeetelefone; até 3 campos personalizados opcionais) - Normalização de números: remove símbolos, valida dígitos; adiciona
55para números brasileiros quando aplicável; opção de auto-DDD - Validações pré-envio: conta números curtos (<7 dígitos), detecta duplicados, apresenta estatísticas na confirmação
- Envio imediato do primeiro contato, com intervalo fixo ou aleatório entre mensagens
- Contagem regressiva visível, pausa/retomada/parada de envio; ETA e horário estimado de conclusão
- Personalização de mensagens com variáveis dinâmicas; lista de variáveis exibe inicialmente apenas
nomeetelefonee se expande conforme o usuário adiciona campos personalizados - Modelos de mensagem (salvar/usar/excluir) e conjuntos de mensagens (1–3) salvos e reaplicáveis
- Envio de arquivo por link (imagem/vídeo) e suporte a salvar arquivos em base64
- Exportação de CSV de pendentes e enviadas; geração de PDF analítico com
jspdf
- Upload da planilha (CSV/XLSX) e mapeamento das colunas.
- Confirmação com estatísticas: total, números curtos e duplicados; escolha do intervalo (fixo ou aleatório), exibição da estimativa de duração e horário de término.
- Worker inicia, envia o primeiro contato, atualiza contagem regressiva, e processa a fila até o fim (com pausa/retomada disponíveis).
- Mensagens personalizadas usam placeholders do mapeamento; conjuntos salvos podem preencher as três mensagens.
- Resultado acompanha enviados/erros; ao final, possível exportar CSVs e gerar PDF.
- Tabelas principais:
mensagens_modelos— modelos individuais de texto (públicos ou por usuário)mensagens_arquivos— arquivos em base64 (públicos ou por usuário)mensagens_conjuntos— conjuntos com até três mensagens
- Todas com Row Level Security (RLS) e policies para
anoneauthenticated(público:owner_id IS NULL; próprio:owner_id = auth.uid()). - Scripts de criação em
database-mensagens.sql. - Tabelas de uploads/itens (em
database-planilhas.sql) suportam o registro de importações e itens para envio.
- Endpoint:
POST {REACT_APP_WAHA_BASE_URL}/api/sendText - Body:
{ session, chatId, text } - Header:
X-Api-Key: <sua_api_key> chatId:{numero_normalizado}@c.us(remove símbolos; valida dígitos; se necessário, prefixa55).
REACT_APP_WAHA_BASE_URL— URL pública/local da WAHAREACT_APP_WAHA_API_KEY— chave da APIREACT_APP_WAHA_SESSION— sessão (ex.:default)REACT_APP_SUPABASE_URL— URL do projeto SupabaseREACT_APP_SUPABASE_ANON_KEY— chaveanondo Supabase
src/components/UploadCSV.js— fluxo de envio, mapeamento, pré-visualização, intervalos, ETA, conjuntos/modelossrc/components/Dashboard.js— indicadores e gráficos comchart.jssrc/components/Login.jsesrc/components/UserPanel.js— autenticação e gerenciamento de usuáriossrc/lib/waha.js— integração com WAHA (envio)src/lib/supabase.js— persistência (modelos, arquivos, conjuntos; uploads e itens)src/lib/utils.js— parsing de CSV/XLSX, normalização e utilitáriossrc/config/constants.js— constantes do app
- Construído com
tailwindcss(classes utilitárias), paleta escura e componentes responsivos. - Layouts em grid/flex; painéis colapsáveis; modais e listas com rolagem.
- UI otimizada para desktop e uso funcional em telas menores (inputs grandes, botões acessíveis, hierarquia visual clara).
npm start— ambiente de desenvolvimentonpm build— build de produçãonpm deploy— deploy via Surge (usado em ambientes de demonstração)npm test— testes (quando aplicáveis)npm run worker— inicia o worker em segundo plano (envio contínuo)
- Objetivo: continuar o envio mesmo se o navegador/aba fechar ou a máquina reiniciar o front-end.
- O worker lê a fila do banco (
v_upload_pendentes) e marca o status via RPCs (marcar_item_enviado,marcar_item_erro). - Requisitos:
.envconfigurado (REACT_APP_SUPABASE_URL,REACT_APP_SUPABASE_ANON_KEY,REACT_APP_WAHA_BASE_URL,REACT_APP_WAHA_API_KEY,REACT_APP_WAHA_SESSION). - Uso:
node scripts/worker.js --upload <uuid>— intervalo padrão 60snode scripts/worker.js --upload <uuid> --interval 30— intervalo fixonode scripts/worker.js --upload <uuid> --rand 10,50— intervalo aleatório entre 10s e 50s
- Observação: não é necessário criar duas tabelas (“pendentes” e “enviados”), pois a tabela
upload_itemsjá mantém o status e há viewsv_upload_pendentesev_upload_enviados. Isso simplifica a retomada pós-falha.
- Instale dependências:
npm install - Configure
.env(WAHA e Supabase) - Inicie:
npm start - Faça login e siga o fluxo de upload → confirmação → envio
- Para rodar em background: obtenha o
upload_idcriado na confirmação e execute o worker com os parâmetros acima.
