Promoaction · toolkit WhatsApp
Todas as capacidades de monitoramento/distribuição identificadas no projeto de referência, em forma de toolkit — ainda não ligadas a um WhatsApp real. Os simuladores exercitam o pipeline inteiro sem Evolution: mensagem → allowlist → parser → classificação → afiliação. A doc completa com as simulações explicadas está em docs/toolkit-whatsapp.md.
1 · Evolution API (config)
A Evolution é o gateway de WhatsApp self-hosted. Configure aqui quando tiver uma rodando (baseUrl + apiKey global + instância default). Sem config, os simuladores funcionam igual — só os botões "ao vivo" (health/grupos/envio) ficam indisponíveis.
2 · Simulador do webhook de entrada ⭐
Cole um payload messages.upsert (igual ao que a Evolution POSTaria em /api/whatsapp/webhook/inbound) e veja o pipeline decidir. O exemplo pré-preenchido cobre: grupo que precisa estar na allowlist (seção 3), título em negrito, 2 preços, cupom, link meli.la e a linha de convite do grupo parceiro (que o corpo tratado remove). Afiliação automática usa o que já existe no projeto (sessão ML / credenciais Shopee / tag Amazon) — e explica o que falta.
3 · Allowlist de grupos monitorados
O webhook recebe de TODOS os grupos da instância; só os da allowlist ingerem. Cada grupo tem um perfil de parser (formato da mensagem). A reconciliação desativa grupos de onde a conta saiu (preservando a config) — só com lista não-vazia.
Reconciliação de presença (simular)
Cole os jids que a conta vê AGORA (um por linha) — grupos ativos fora da lista serão desativados.
4 · Parser · corpo tratado · card
Teste isolado das peças de transformação: o parser extrai a oferta do texto (por perfil); o corpo tratado troca a 1ª URL pelo nosso redirect, limpa tag de terceiro das demais e remove convite do parceiro; o card monta a caption final (estruturada e raw).
5 · Distribuição (broadcast)
Destinos = seus grupos próprios. O envio usa o card da seção 4 e o log impede reenvio da mesma oferta pro mesmo destino (anti-duplicata do projeto de referência). Requer Evolution configurada — sem ela, cadastra/visualiza, mas o envio devolve erro claro.
Fila com intervalo aleatório (anti-padrão-robô)
Envios saem por UM worker, espaçados por sorteio entre min e max (nunca rajada, nunca intervalo constante), respeitando a janela de horário — mandar oferta 3h da manhã é assinatura de bot. Falha → retry com novo sorteio (até 3×). Padrões do ActionPacer/TimingRule do projeto de referência.