Referencia Tecnica -- Ofertas Bepex¶
IDs, credenciais, field keys, activity types, dados de teste e snippets para operar o sistema.
IDs dos Workflows n8n¶
| Workflow | ID n8n | Status | Trigger | Nos |
|---|---|---|---|---|
| WF-Oferta-Launcher | ud1VP04JVajsAfGK |
Inativo (manual) | Manual Trigger | 8 |
| WF-Oferta-Dispatcher | LJS7oHdIzQBnjI9O |
ATIVO (desde 2026-06-11) | 2 Crons (8h + 14h BRT, seg-sex) | 6 |
| WF-Oferta-Worker | fQRxspKUKIj2o8b0 |
ATIVO (desde 2026-06-11) | Webhook GET /webhook/oferta-worker |
35 |
URL base n8n: https://n8n.bepex.com.br URL base webhooks: https://n8n-hook.bepex.com.br
URLs de execucoes:
- Launcher: https://n8n.bepex.com.br/workflow/ud1VP04JVajsAfGK/executions
- Dispatcher: https://n8n.bepex.com.br/workflow/LJS7oHdIzQBnjI9O/executions
- Worker: https://n8n.bepex.com.br/workflow/fQRxspKUKIj2o8b0/executions
Webhook URLs¶
| Workflow | URL | Metodo |
|---|---|---|
| WF-Oferta-Worker | https://n8n-hook.bepex.com.br/webhook/oferta-worker |
GET |
| WF-Resumo-IA (dependencia) | https://n8n-hook.bepex.com.br/webhook/gera-resumo-ia |
POST |
Credenciais no n8n¶
| Nome no n8n | ID | Tipo | Uso |
|---|---|---|---|
| Pipedrive account | CHj11AO6T3756SqM |
pipedriveApi (rw) | CRUD de atividades e persons |
| Bepex Enrico | n5IiwdsiIB3dAUQE |
pipedriveApi (ro) | Leitura complementar |
| Bepex Openrouter | SW7yige5BeCOqaRU |
OpenRouter | google/gemini-2.5-flash (temp 0.4) |
| AWS account | kqmbhAWS0tyL5fuI |
AWS | Amazon SES (us-east-2) |
| Chatwoot Bepex Header Auth | FzLnFD8cohSYSYIN |
Header Auth | API Chatwoot chat.bepex.com.br account 2 |
Workflow dependente¶
| Workflow | ID n8n | Chamado por | Metodo |
|---|---|---|---|
| WF-Resumo-IA | BL3me3JQiVmSbzn3 |
WF-Oferta-Worker | POST /webhook/gera-resumo-ia com {person_id} |
Campos customizados do Pipedrive¶
| Campo | Field key | Tipo | Opcoes/Notas |
|---|---|---|---|
| aceita_comunicacao | 19bc9c4cde5a4a5959809e45e7f032ae7dd9c3a7 |
enum | 394=So Email, 395=So WhatsApp, 396=Email e WhatsApp, 397=Nao aceita |
| Resumo de IA | 366d9e84fbb893e50d04f7d5ec40336fd4ebf970 |
text | Gerado pelo WF-Resumo-IA |
| nutricao_contexto_ia | 9b4cdfbf6c48e938cfc7fb613625d27ee999dfa3 |
text | Contexto acumulado de interacoes |
| WhatsApp Frio Atribuido | 8778c52fdebd7863e34e9c026436d8e26b385cfe |
varchar | ID 9099. Criado 2026-06-10 (campo 100/100) |
Activity Types do Pipedrive¶
| Nome | key_string | ID | Canal |
|---|---|---|---|
| Oferta Email | oferta_email |
54 | So email |
| Oferta WhatsApp | oferta_whatsapp |
55 | So WhatsApp |
| Oferta Email+WhatsApp | oferta_emailwhatsapp |
56 | Email + WhatsApp |
Atividades sao criadas pelo Launcher com done: 0 e marcadas done: 1 pelo Worker apos processamento.
Chatwoot -- Inboxes WhatsApp (pool)¶
Base URL: https://chat.bepex.com.br/api/v1/accounts/2
| Inbox | ID | Descricao |
|---|---|---|
| Prospeccao 3 | 64 | Numero de prospeccao |
| WhatsApp pre-vendas frio | 61 | Numero pre-vendas |
Round-robin: o Code "Prepara WhatsApp" distribui entre as inboxes do pool [64, 61].
Amazon SES -- Padrao de envio (CRITICO)¶
Bug do n8n: HTTP Request node com AWS predefined credential double-encodes @ quando usa contentType: "form-urlencoded". Causa erro "Missing final '@domain'" no SES.
Workaround obrigatorio:
Node: HTTP Request
- Method: POST
- URL: https://email.us-east-2.amazonaws.com
- Authentication: Predefined Credential -> AWS (kqmbhAWS0tyL5fuI)
- Service: ses
- Region: us-east-2
- Send Body: ON
- Content Type: Raw
- rawContentType: application/x-www-form-urlencoded
- Body (expression):
={{ 'Action=SendEmail&Source=' + encodeURIComponent($json.email_from) + '&Destination.ToAddresses.member.1=' + encodeURIComponent($json.email_to) + '&Message.Subject.Data=' + encodeURIComponent($json.email_subject) + '&Message.Body.Text.Data=' + encodeURIComponent($json.email_body) }}
NUNCA usar:
- Node nativo n8n-nodes-base.awsSes (mesmo bug)
- contentType: "form-urlencoded" com AWS auth
- SMTP node (nao configurado)
Email senders: FEITO -- relacionamento@bepexmkt.com.br (criado 2026-06-10) e contato@bepexmkt.com.br (reativado 2026-06-10, estava suspenso). Ambos ativos no Hostinger. Round-robin via person_id % 2 no Code "Prepara Email" do Worker.
Unsubscribe: Link automatico no rodape de cada email aponta pro WF4 — Opt-out Email (paffbqyOJHAafePk), reaproveitado do Conteudo Infinito. URL: https://n8n-hook.bepex.com.br/webhook/unsubscribe?pessoa_id={person_id}. Ao clicar, o lead tem aceita_comunicacao atualizado no Pipedrive (394→397, 396→395). O Worker ja checa esse campo em "Checa Aceita Comunicacao" e pula leads com 397.
Dados de teste¶
| Item | Valor |
|---|---|
| Lead 1 | Rafael Teste Ofertas (person_id: 59985), phone +5527981155155, email rafaelrcguzzo@gmail.com |
| Lead 2 | Rafael Bepex Teste (person_id: 59986), phone +5519999009995, email rafaelrcguzzo@gmail.com |
| Filtro Pipedrive | TESTE OFERTAS CLAUDE (filter_id: 136451) |
Para rodar teste E2E:
1. Editar Config do Launcher com filter_id: 136451, campaign_name: "Teste E2E", tipo_atividade: "oferta_emailwhatsapp"
2. Executar Launcher manualmente
3. Verificar que atividades foram criadas para os 2 leads de teste
4. Ativar Dispatcher e Worker
5. Monitorar execucoes do Worker
6. Verificar email em rafaelrcguzzo@gmail.com e WhatsApp nos telefones de teste
Config do Launcher (Set node editavel)¶
Parametros que o operador deve editar antes de cada campanha:
| Parametro | Tipo | Exemplo | Descricao |
|---|---|---|---|
filter_id |
number | 136451 |
ID do filtro Pipedrive com os leads da campanha |
campaign_name |
string | "Promo Inverno 2026" |
Nome da campanha (vai no subject da atividade) |
tipo_atividade |
string | "oferta_emailwhatsapp" |
Canal: oferta_email, oferta_whatsapp ou oferta_emailwhatsapp |
Horario comercial (Guard)¶
| Parametro | Valor |
|---|---|
| Janela manha | 8h - 12h BRT |
| Janela tarde | 14h - 18h BRT |
| Dias | Segunda a Sexta (1-5) |
| Timezone | America/Sao_Paulo |
Implementado em 2 lugares: 1. Dispatcher -- Guard Horario antes de acionar Worker 2. Worker -- Guard Horario Final antes de self-trigger
Resultado Teste E2E (2026-06-10)¶
Pipeline testado ponta a ponta com 2 leads de teste. Ambos processados com sucesso.
| Lead | Person ID | Execucao | Email SES | WhatsApp Chatwoot | Marca Done | IA |
|---|---|---|---|---|---|---|
| Rafael Teste Ofertas | 59985 | 521475 SUCCESS | Enviado | msg 2392953, inbox 61, conv 118892 | act 426256 DONE | Mensagem personalizada |
| Rafael Bepex Teste | 59986 | 521493 SUCCESS | Enviado | msg 2392982 | act 426257 DONE | Mensagem personalizada |
30 nos rodaram em cada execucao (pipeline completo).
Bugs corrigidos durante o E2E:
- Busca 1 Atividade — Pipedrive
GET /v1/activitiesexclui custom types da listagem geral. Fix: query cada tipo explicitamente com&type=oferta_emailetc. (Code node com loop) - Envia Email SES — credential key
awsApinao existe, tipo correto eaws. Fix: alteradocredentialsenodeCredentialType. - Marca Done — HTTP Request com expression
={"done":1}avalia como JS block+label retornando1. Fix: convertido para Code node comthis.helpers.httpRequest()e referencia explicita$('Extrai Atividade').first().json.activity_id. - Webhook 500 response —
responseMode: "lastNode"retornava output do ultimo no (vazio quando Guard bloqueia). Fix: alterado para"onReceived"(responde 200 imediatamente). - False-positive contact matching no WhatsApp — Chatwoot
/contacts/search?q=e busca fuzzy que tambem faz match no campoidentifier(substring). Resultado: lead 59986 foi associado ao contato 44903 (identifier55199990099951513602559continha5519999009995como substring). Fix: Code "Processa Contato" agora itera todos os resultados e so aceita match sephone_numbernormalizado bater com o telefone do lead. Se nenhum match por telefone, forca criacao de contato novo (needs_create_contact: true). - Marca Done (Skip) — Mesmo bug expression-mode do #3 (
={"done":1}→1). Atividades de leads com aceita_comunicacao=397 nao estavam sendo marcadas done. Fix: convertido para Code node comthis.helpers.httpRequest()(2026-06-10).
Guard Horario Final: Funcionou corretamente — bloqueou self-trigger as 12:50 (almoco) e as 15:55 (tarde, mas sem mais atividades).
Salva Inbox Pipedrive: Codigo ainda comentado (TODO). Nao impede funcionamento.
Pendencias¶
| Item | Status | Detalhes |
|---|---|---|
| Teste E2E | FEITO | 2 leads processados com sucesso (2026-06-10). Ver secao acima. |
| Email senders | FEITO | relacionamento@ criado + contato@ reativado em bepexmkt.com.br (2026-06-10). Round-robin no Worker. |
| Campo WhatsApp Frio Atribuido | FEITO | Field key 8778c52fdebd7863e34e9c026436d8e26b385cfe, id 9099. Placeholder substituido no Worker (2026-06-10) |
| Fix contact matching WhatsApp | FEITO + TESTADO | "Processa Contato" valida phone_number. Re-teste exec 522708: contact_id=749 (correto, antes era 44903), msg 2394296 enviada, conv 118970. |
| Unsubscribe automatico | FEITO | Link pro WF4 (/webhook/unsubscribe?pessoa_id=X) no rodape de cada email. Reusa mecanismo do Conteudo Infinito (2026-06-10). |
| Salva Inbox Pipedrive | TODO | Code no Worker esta comentado. Nao-critico — campo existe, so falta descomentar e testar. |
| Ativacao para primeira campanha | FEITO | Campanha "Reengajamento Jun 2026" lancada em 2026-06-11. Ver secao abaixo. |
| Aviso equipe comercial | FEITO | Enrico (conv 56), Gustavo (conv 428), Raissa (conv 429) notificados via WhatsApp Bepex em 2026-06-12. |
Campanha 1: Reengajamento Jun 2026 (2026-06-11)¶
| Parametro | Valor |
|---|---|
| Campanha | Reengajamento Jun 2026 |
| Filtro Pipedrive | 215 (filtro do Gustavo) |
| Tipo atividade | oferta_emailwhatsapp |
| Leads no filtro | 1974 |
| Leads elegiveis (apos filtro) | 1565 |
| Atividades criadas | 1565 |
| Descartados | 409 (sem email+telefone, ou aceita_comunicacao=397) |
| Launcher exec ID | 525867 (success) |
| Worker status | ATIVO |
| Dispatcher status | ATIVO (cron 8h + 14h BRT seg-sex) |
Segmentacao IA: 2 segmentos — Arquitetura (brises, fachadas metalicas decorativas, projetos, galeria de obras) e Industrial (perfurados/expandidos, materia-prima, preco). IA decide pelo Resumo de IA (366d9e84...), nome da empresa e contexto.
Prompt IA v2 (2026-06-11): Reescrito para campanha de reengajamento. campaign_type: 'reengajamento' hardcoded no Code "Monta Contexto" (fixado em 2026-06-11). Tom "falamos um tempo atras". Usa {resumo_ia} como fonte principal de segmentacao (mesmo padrao do Conteudo Infinito). URL correta: https://bepex.com.br/galeria/ (redireciona pra /galeria-de-projetos/). IA NAO declara nome proprio nem cargo. Sem corporatives.
Wait entre leads: Aleatorio 5-15 min (expressao ={{ Math.floor(Math.random() * 11) + 5 }}). Alterado de fixo 10min em 2026-06-11.
Fix tecnico Launcher: Timeout de 300s do servidor impedia criar 1565 atividades com delay de 500ms. Fix: (1) logica de dedup para pular atividades ja criadas, (2) delay reduzido para 100ms a cada 5 criados. Execucao total: ~200s.