Disparo RCS
Visão Geral
Este fluxo executa disparo de campanha RCS, focando na qualificação de leads por touch level e rastreamento de engajamento através de eventos. Ele processa dados de leads na entrada, padroniza valores financeiros, determina níveis de engajamento e coordena com vários subfluxos a geração de ID de correlação e registro de eventos de analytics. Também se integra ao N8N para notificações de erro enviadas ao slack.
Objetivo
O objetivo principal é otimizar o gerenciamento de leads para campanhas RCS, garantindo que os dados sejam processados de forma eficiente e as interações sejam rastreadas. Isso inclui:
- Padronização de Dados: Garantir que valores financeiros, como a
projected_commission, sejam formatados sempre como valos numéricos. - Qualificação e Roteamento de Leads: Identificar os níveis de engajamento apropriados (
touch_level) e rotear os leads para subfluxos especializados para processamento adicional ou interação de agentes. - Rastreamento e Analytics: Registrar eventos chave como mensagens enviadas, recebidas e engajadas para análise de desempenho da campanha.
- Integração com CRM: Criação ou atualização do negócio no HubSpot com protocolo de conversa e informações outros dados do lead.
- Tratamento de Erros: Notificar responsáveis via Slack em caso de erros no processamento de leads ou na integração com o HubSpot, minimizando perdas e agilizando a correção.
Referências
Fluxos Relacionados
- Generate Correlation ID (não documentado)
- Cria Disparo (não documentado)
- Update Attendance (não documentado)
- Roteamento de Proposta por Time (RCS) (não documentado)
- Store Analytics Event (não documentado)
Diagrama de Fluxo
graph TD A[1-flow-variables<br/>Flow Variables] --> B[2-user-variables---salvar-variaveis-de-user<br/>User Variables] B --> C[3-code---tratar-projected-commission<br/>Code] C --> D[4-flow-variable---projected-commission<br/>Flow Variables] D --> E[5-code---engagement-type<br/>Code] E --> F[6-flow-variable---produto-equipe-convenio-tipo-de-engajamento<br/>Flow Variables] F --> G[7-jump-buc-con-generate-correlation-id<br/>Jump] G --> H[8-flow-variable---salvar-correlation_id<br/>Flow Variables] H --> I[9-jump---cria-disparo<br/>Jump] I --> J[10-jump---init-update attendance<br/>Jump] J --> K[11-flow-variable---definir-protocol<br/>Flow Variables] K --> L[12-start-Inactivity---1-dia<br/>Start Inactivity] L --> M1[13a-jump---roteamento-de-proposta-por-time-rcs<br/>Jump] L --> M2[13b-end-inactivity-debug<br/>End Inactivity] M1 --> N1[14-jump---envia-evento-campaign.message.received<br/>Jump] N1 --> O1[15-jump---envia-evento-campaign.message.engaged<br/>Jump] O1 --> P1[16-label---interessado-rcs<br/>Label] P1 --> Q1[17-chat---rcs-receptivo<br/>Chat] Q1 --> R1[18-request---lead-input hyperflow-unified-lead-3<br/>HTTP Request] M2 --> N2[14b-jump---envia-evento.campaign.message.sent<br/>Jump] N2 --> O2[15b-end-flow-1<br/>End Flow] R1 --> S1{19b-conditional-validacao-hubspot<br/>Condition} R1 --> S2[19a-flow-variable---lead-input-error<br/>Flow Variables] S2 --> T1[20a-rotulo---error-lead-input<br/>Label] T1 --> U1[21a-request---enviar-erro-para-slack<br/>HTTP Request] S1 -->|Lead nao encontrado| X1[24b-finish-attendance---erro<br/>Finish Attendance] S1 -->|Lead HBSPT OK| T2[20b-flow-variable---lead-input<br/>Flow Variables] S1 -->|Senao| X1 T2 --> U2[21b-hubspot---atualizar-negocio<br/>HubSpot] U2 --> V1{22b-conditional---criacao-bloqueada<br/>Condition} V1 -->|Criacao Bloqueada| W1[23b-request---enviar-erro-para-slack<br/>HTTP Request] V1 -->|Senao| W2[23c-finish-attendance---sucesso<br/>Finish Attendance] U1 --> X1 W1 --> X1 X1 --> Y1[25-end-inactivity<br/>End Inactivity] W2 --> Y1 Y1 --> Z1[26-end-flow<br/>End Flow] classDef inicio fill:#e1f5ff classDef decisao fill:#ffe1e1 classDef erro fill:#ffcccc classDef sucesso fill:#ccffcc class A,B,C,D,E,F,G,H,I,J,K inicio class L,S1,V1 decisao class S2,T1,U1,X1,W1 erro class W2,Z1 sucesso
Variáveis do Fluxo
Variáveis de Entrada (Input)
| Variável | Origem | Tipo | Obrigatório | Descrição | Uso no Fluxo |
|---|---|---|---|---|---|
valor_liberado | input.valor_liberado | string/number | Não | Valor liberado na oferta | Define flow.valor_liberado |
valor_parcela | input.valor_parcela | string/number | Não | Valor da parcela na oferta | Define flow.valor_parcela |
banco_destino | input.banco_destino | string | Não | Banco para onde o valor será enviado | Define flow.banco_destino |
name | input.name | string | Sim | Nome completo do cliente | Define flow.name, user.name |
campaign | input.campanha | string | Sim | Nome da campanha que originou o lead | Define flow.campaign |
prazo | input.prazo | number | Não | Prazo da operação em meses | Define flow.prazo |
phone | input.phone | string | Sim | Telefone do cliente | Define flow.phone, flow.user_phone |
cpf | input.cpf | string | Sim | CPF do cliente | Define flow.cpf, user.cpf |
banco_origem | input.banco_origem | string | Não | Banco de origem para a operação | Define flow.banco_origem |
comissao | input.comissao | string/number | Não | Valor da comissão projetada (pode ser “null”) | Define flow.projected_commission |
convenio2 | input.convenio2 | string | Não | Segundo convênio do cliente (pode ser “null”) | Define flow.convenio2 |
template_type | input.template_type | string | Não | Tipo de template usado na campanha | Define flow.template_type |
tipo_de_campanha | input.tipo_de_campanha | string | Sim | Tipo da campanha | Define flow.tipo_de_campanha |
id | input.id | string | Não | Correlation ID ou Protocol ID (depende do Jump) | Define flow.correlation_id, flow.protocol |
body.cpf | 18-request (response) | string | Condicional | CPF do lead retornado pelo lead-input | Validação em 19b-conditional |
body.hubspot.deal_created | 18-request (response) | boolean | Condicional | Indica se um negócio foi criado no HubSpot | Condição em 19b-conditional |
body.* | 18-request (response) | object | Não | Diversos campos do lead, como nome, telefone, dados de margem, etc. | Definem várias flow.variáveis no 20b-flow-variable |
Variáveis Internas (Flow Variables)
| Variável | Criada em | Tipo | Fonte | Descrição | Dependências |
|---|---|---|---|---|---|
flow.valor_liberado | 1-flow-variables | string | input.valor_liberado | Valor liberado conforme input | N/A |
flow.valor_parcela | 1-flow-variables | string | input.valor_parcela | Valor da parcela conforme input | N/A |
flow.banco_destino | 1-flow-variables | string | input.banco_destino | Banco de destino conforme input | N/A |
flow.name | 1-flow-variables | string | input.name | Nome completo do cliente | 2-user-variables, 20b-flow-variable |
flow.campaign | 1-flow-variables | string | input.campanha | Nome da campanha | 5-code, 18-request, analytics events |
flow.prazo | 1-flow-variables | string | input.prazo | Prazo da operação | N/A |
flow.phone | 1-flow-variables | string | input.phone | Telefone do cliente | 20b-flow-variable |
flow.cpf | 1-flow-variables | string | input.cpf | CPF do cliente | 2-user-variables, 18-request, 20b-flow-variable |
flow.banco_origem | 1-flow-variables | string | input.banco_origem | Banco de origem | N/A |
flow.projected_commission | 1-flow-variables, 4-flow-variable | number | input.comissao (tratado por 3-code) | Comissão projetada, tratada para ser numérica | 5-code |
flow.convenio2 | 1-flow-variables | string | input.convenio2 | Segundo convênio | N/A |
flow.template_type | 1-flow-variables | string | input.template_type | Tipo de template UX | N/A |
flow.tipo_de_campanha | 1-flow-variables | string | input.tipo_de_campanha | Tipo da campanha | N/A |
flow.utm_source | 1-flow-variables | string | Hardcoded: HYPERFLOW | Origem do UTM para analytics | 18-request |
flow.utm_medium | 1-flow-variables | string | Hardcoded: disparo_rcs | Meio do UTM para analytics | 18-request |
flow.utm_type | 1-flow-variables | string | Hardcoded: ativo | Tipo do UTM para analytics | 18-request |
flow.channel | 1-flow-variables | string | Hardcoded: rcs | Canal de comunicação | Analytics events |
flow.engagement_type | 6-flow-variable | string | input.touch_level (de 5-code) | Nível de engajamento do lead | N/A |
flow.equipe | 6-flow-variable | string | input.equipe (de 5-code) | Equipe responsável pelo lead | N/A |
flow.produto | 6-flow-variable | string | input.produto (de 5-code) | Produto relacionado ao lead | N/A |
flow.touch_level | 6-flow-variable | string | input.touch_level (de 5-code) | Nível de toque/engajamento (low/high) | N/A |
flow.correlation_id | 8-flow-variable | string | input.id (do jump 7) | ID de correlação para rastreamento | Jumps, analytics events |
flow.protocol | 11-flow-variable | string | input.protocol (do jump 10) | Protocolo da conversa no Desk HF | 18-request, 21b-hubspot |
flow.lead_input_error | 19a-flow-variable | boolean | Hardcoded: true | Indica se houve erro na requisição lead-input | 20a-rotulo |
flow.registry_number | 20b-flow-variable | string | input.body.registry_number | Número de matrícula do lead | N/A |
flow.department_description | 20b-flow-variable | string | input.body.department_description | Descrição do departamento | N/A |
flow.covenant_name | 20b-flow-variable | string | input.body.covenant_name | Nome do convênio | N/A |
flow.first_name | 20b-flow-variable | string | input.body.first_name | Primeiro nome do lead | N/A |
flow.margem_emprestimo_total | 20b-flow-variable | number | input.body.margem_emprestimo_total | Margem total para empréstimo | N/A |
flow.margem_emprestimo_disponivel | 20b-flow-variable | number | input.body.margem_emprestimo_disponivel | Margem disponível para empréstimo | N/A |
flow.valor_liberado_emprestimo | 20b-flow-variable | number | input.body.valor_liberado_emprestimo | Valor liberado para empréstimo | N/A |
flow.margem_beneficio_total | 20b-flow-variable | number | input.body.total_withdraw_benefit_card_margin | Margem total do cartão benefício | N/A |
flow.margem_beneficio_disponivel | 20b-flow-variable | number | input.body.available_withdraw_benefit_card_margin | Margem disponível do cartão benefício | N/A |
flow.valor_liberado_beneficio | 20b-flow-variable | number | input.body.valor_liberado_beneficio | Valor liberado do benefício | N/A |
flow.valor_parcela_beneficio | 20b-flow-variable | number | input.body.valor_parcela_beneficio | Valor da parcela do benefício | N/A |
flow.margem_cartao_total | 20b-flow-variable | number | input.body.total_credit_card_margin | Margem total do cartão | N/A |
flow.margem_cartao_disponivel | 20b-flow-variable | number | input.body.available_credit_card_margin | Margem disponível do cartão | N/A |
flow.valor_liberado_cartao | 20b-flow-variable | number | input.body.valor_liberado_cartao_credito | Valor liberado do cartão de crédito | N/A |
flow.valor_parcela_cartao | 20b-flow-variable | number | input.body.valor_parcela_cartao_credito | Valor da parcela do cartão de crédito | N/A |
flow.valor_liberado_cartoes | 20b-flow-variable | number | input.body.valor_liberado_cartoes | Valor total liberado de cartões | N/A |
flow.deal_id | 20b-flow-variable | string | input.body.hubspot.deal_id ?? input.body.hubspot.existing_deal_id | ID do negócio no HubSpot | 21b-hubspot, analytics events |
flow.owner_name | 20b-flow-variable | string | input.body.owner_name | Nome do proprietário do negócio | N/A |
flow.owner_id | 20b-flow-variable | string | input.body.owner_id | ID do proprietário do negócio | N/A |
flow.owner_email | 20b-flow-variable | string | input.body.owner_email | Email do proprietário do negócio | N/A |
flow.creation_blocked | 20b-flow-variable | boolean | input.body.hubspot.deal_creation_blocked | Indica se a criação do negócio foi bloqueada | 22b-conditional |
flow.contactId | 20b-flow-variable | string | input.body.hubspot.contact_id | ID do contato no HubSpot | N/A |
flow.flow_slug | 14b-jump | string | (implícita no payload) | Slug do fluxo atual | Analytics events |
flow.cadence_slug | 14-jump | string | (implícita no payload) | Slug da cadência | Analytics events |
flow.template | 14-jump, 14b-jump | string | (implícita no payload) | Template de mensagem | Analytics events |
flow.classification | 15-jump | string | (implícita no payload) | Classificação do engajamento | Analytics events |
Variáveis do Usuário (User Context)
| Variável | Origem | Tipo | Descrição | Uso no Fluxo |
|---|---|---|---|---|
user.name | 2-user-variables | string | Nome do usuário, salvo no contexto | Para personalização de mensagens |
user.cpf | 2-user-variables | string | CPF do usuário, salvo no contexto | Para identificação e consultas |
user.sender | Implícito | string | Telefone do remetente (usuário) | Payload de eventos de analytics |
user.id | 18-request (Body) | string | ID do usuário (telefone ou ID de contexto) | Payload da requisição lead-input |
user.channel | Implícito | string | Canal de comunicação do usuário (e.g., rcs) | Payload de eventos de analytics |
Variáveis Computadas
| Expressão | Local de Uso | Tipo Resultante | Descrição |
|---|---|---|---|
tratarComissao(flow.projected_commission) | 3-code---tratar-projected-commission | number | Normaliza o valor da comissão projetada (string ou número com símbolos) para um número float, convertendo “null”, vazio ou inválidos para 0. |
engagement_type, equipe, produto, touch_level | 5-code---engagement-type | string | Extrai equipe e produto do flow.campaign. Define touch_level como ‘high’ se produto for ‘nqb’ ou ‘saquecom’; caso contrário, é ‘low’ para a equipe ‘csapp’ com comissão < 500, e ‘high’ nos demais casos. |
Propriedades Externas Manipuladas
Sistema: HubSpot
| Propriedade | Ação | Valor | Nó Responsável | Fluxo/API Relacionado |
|---|---|---|---|---|
deal_id | READ/UPDATE | {{flow.deal_id}} ou {{input.body.hubspot.deal_id}} | 21b-hubspot---atualizar-negocio, 19b-conditional | HubSpot API |
protocolo_da_conversa_hf | UPDATE | https://desk.hyperflow.global/all-chats/{{flow.protocol}} | 21b-hubspot---atualizar-negocio | HubSpot API |
deal_created | READ | {{input.body.hubspot.deal_created}} | 19b-conditional-validacao-hubspot | 18-request (response) |
deal_creation_blocked | READ | {{input.body.hubspot.deal_creation_blocked}} | 22b-conditional---criacao-bloqueada | 18-request (response) |
Sistema: N8N (Lead Input / Error Handler)
| Propriedade | Ação | Valor | Nó Responsável | Fluxo/API Relacionado |
|---|---|---|---|---|
phone, hyperflow_protocol, utm_source, utm_medium, utm_type, campaign, cpf, answer_message | CREATE | {{user.id}}, {{flow.protocol}}, {{flow.utm_source}}, etc. | 18-request---lead-input hyperflow-unified-lead-3 | https://n8n.konsi.dev/webhook/lead-input/hyperflow-unified-lead |
user, flow, message | CREATE | {{user}}, {{flow}}, “criação bloqueada no disparo ativo” | 21a-request---enviar-erro-para-slack | https://n8n.konsi.dev/webhook/hyperflow/error |
user, flow, message | CREATE | {{user}}, {{flow}}, “criação bloqueada no disparo ativo” | 23b-request---enviar-erro-para-slack | https://n8n.konsi.dev/webhook/hyperflow/error |
Entrada (Input)
Estrutura Esperada
{
"valor_liberado": "string | number",
"valor_parcela": "string | number",
"banco_destino": "string | null",
"name": "string",
"campaign": "string",
"prazo": "string | number",
"phone": "string",
"cpf": "string",
"banco_origem": "string | null",
"comissao": "string | number | null",
"convenio2": "string | null",
"template_type": "string | null",
"tipo_de_campanha": "string",
"body": {
"name": "string",
"cpf": "string | undefined | null",
"phone": "string",
"registry_number": "string",
"department_description": "string",
"covenant_name": "string",
"first_name": "string",
"margem_emprestimo_total": "number",
"margem_emprestimo_disponivel": "number",
"valor_liberado_emprestimo": "number",
"total_withdraw_benefit_card_margin": "number",
"available_withdraw_benefit_card_margin": "number",
"valor_liberado_beneficio": "number",
"valor_parcela_beneficio": "number",
"total_credit_card_margin": "number",
"available_credit_card_margin": "number",
"valor_liberado_cartao_credito": "number",
"valor_parcela_cartao_credito": "number",
"valor_liberado_cartoes": "number",
"deal_id": "string | undefined | null",
"owner_name": "string | undefined",
"owner_id": "string | undefined",
"owner_email": "string | undefined",
"deal_creation_blocked": "boolean | undefined",
"contact_id": "string | null | undefined",
"hubspot": {
"deal_created": "boolean",
"deal_id": "string | undefined | null",
"existing_deal_id": "string | undefined | null",
"deal_creation_blocked": "boolean",
"contact_id": "string | null"
}
}
}Validações
input.body.cpf: Avaliado em19b-conditional-validacao-hubspotpara determinar se o lead foi encontrado na base; seundefinedounull, o fluxo segue para tratamento de erro.
Fluxo Detalhado
Fase 1: Inicialização e Processamento de Variáveis
Nós: 1-flow-variables → 2-user-variables---salvar-variaveis-de-user → 3-code---tratar-projected-commission → 4-flow-variable--- projected-commission → 5-code---engagement-type → 6-flow-variable---produto- equipe-convenio-tipo-de-engajamento
Ações:
- 1-flow-variables: Coleta variáveis de input (como
valor_liberado,name,campaign,cpf,comissao, etc.) e as salva no contexto doflow. Hardcodesutm_source,utm_medium,utm_type,channelparaHYPERFLOW,disparo_rcs,ativo,rcsrespectivamente. - 2-user-variables---salvar-variaveis-de-user: Salva
nameecpfdoflowpara o contexto douser. - 3-code---tratar-projected-commission: Executa um código JS para normalizar o valor
flow.projected_commission, convertendo-o para um número float e tratando casos nulos ou formatos de moeda. - 4-flow-variable--- projected-commission: Atualiza
flow.projected_commissioncom o valor tratado pelo nó anterior. - 5-code---engagement-type: Executa um código JS para determinar
equipe,produto, etouch_levela partir doflow.campaign. Definetouch_levelcomo ‘high’ ou ‘low’ baseado em regras de negócio (e.g., produtonqbousaquecomsempre ‘high’). - 6-flow-variable---produto- equipe-convenio-tipo-de-engajamento: Salva os resultados (
engagement_type,equipe,produto,touch_level) do nó de código anterior no contexto doflow.
Variáveis criadas:
flow.valor_liberado,flow.valor_parcela,flow.banco_destino,flow.name,flow.campaign,flow.prazo,flow.phone,flow.cpf,flow.banco_origem,flow.projected_commission,flow.convenio2,flow.template_type,flow.tipo_de_campanha,flow.utm_source,flow.utm_medium,flow.utm_type,flow.channeluser.name,user.cpfflow.engagement_type,flow.equipe,flow.produto,flow.touch_level
Variáveis usadas:
input.valor_liberado,input.valor_parcela,input.banco_destino,input.name,input.campanha,input.prazo,input.phone,input.cpf,input.banco_origem,input.comissao,input.convenio2,input.template_type,input.tipo_de_campanhaflow.name,flow.cpf,flow.campaign,flow.projected_commission
Fase 2: Geração de IDs e Criação de Disparo
Nós: 7-jump-buc-con-generate-correlation-id → 8-flow-variable---salvar-correlation_id → 9-jump---cria-disparo → 10-jump---init-update attendance → 11-flow-variable---definir-protocol
Ações:
- 7-jump-buc-con-generate-correlation-id: Chama um subfluxo para gerar um
correlation_idpara a conversa. - 8-flow-variable---salvar-correlation_id: Salva o
idretornado pelo subfluxo comoflow.correlation_id. - 9-jump---cria-disparo: Chama o subfluxo
BUC/BUER - Cria Disparo, passando todo o contextoflow. - 10-jump---init-update attendance: Chama o subfluxo
BUC/BUER - Init/Update Attendance, passando todo o contextoflow. - 11-flow-variable---definir-protocol: Salva o
protocolretornado pelo subfluxo10comoflow.protocol.
Variáveis criadas:
flow.correlation_idflow.protocol
Variáveis usadas:
flow.correlation_id(enviado ao subfluxo)flow(enviado aos subfluxos9e10)input.id(retorno do jump7)input.protocol(retorno do jump10)
Fase 3: Inatividade e Roteamento Inicial
Nós: 12-start-Inactivity---1-dia (ponto de decisão/divisão do fluxo)
Ações:
- O fluxo aguarda por um período de inatividade antes de prosseguir.
- Após o período de inatividade, o fluxo se divide em dois caminhos principais: um para o roteamento de propostas e engajamento (
Branch A), e outro para o tratamento de mensagens enviadas e o término do fluxo (Branch B).
Variável avaliada:
- Tempo decorrido de inatividade (1440 minutos / 1 dia)
Decisões:
- Após inatividade:
- Caminho de Engajamento:
13a-jump---roteamento-de-proposta-por-time-rcs(Branch A) - Caminho de Mensagem Enviada:
13b-end-inactivity-debug(Branch B)
- Caminho de Engajamento:
Branch A: Atendimento RCS (Engajamento do Cliente)
Nós: 13a-jump---roteamento-de-proposta-por-time-rcs → 14-jump---envia-evento-campaign.message.received → 15-jump---envia-evento-campaign.message.engaged → 16-label---interessado-rcs → 17-chat---rcs-receptivo → 18-request---lead-input hyperflow-unified-lead-3
Contexto: Este branch é acionado após a inatividade e foca no engajamento do cliente, roteamento e processamento do lead.
Nó 13a-jump---roteamento-de-proposta-por-time-rcs: Roteamento de Proposta
Tipo: Jump
Configuração:
- Fluxo de destino: BUC/BUER - Roteamento de Proposta por Time (RCS)
- Data:
{{flow}} - Retorno:
true
Variáveis usadas: flow (todo o contexto)
Ação: Chama um subfluxo para rotear a proposta com base no time responsável via RCS.
Nó 14-jump---envia-evento-campaign.message.received: Registrar Mensagem Recebida
Tipo: Jump
Configuração:
-
Fluxo de destino: BUC - Utils - Store Analytics Event
-
Data:
{ "event_type": "campaign.message.received", "correlation_id": "{{flow.correlation_id}}", "deal_id": "{{flow.deal_id}}", "payload": { "cadence_slug": "{{flow.cadence_slug}}", "user_phone": "{{user.sender}}", "template": "{{flow.template}}", "channel": "{{user.channel}}" } } -
Retorno:
true
Variáveis usadas: flow.correlation_id, flow.deal_id, flow.cadence_slug, user.sender, flow.template, user.channel
Ação: Envia um evento de analytics campaign.message.received para rastrear que uma mensagem da campanha foi recebida pelo cliente.
Nó 15-jump---envia-evento-campaign.message.engaged: Registrar Engajamento de Mensagem
Tipo: Jump
Configuração:
-
Fluxo de destino: BUC - Utils - Store Analytics Event
-
Data:
{ "event_type": "campaign.message.engaged", "correlation_id": "{{flow.correlation_id}}", "deal_id": "{{flow.deal_id}}", "payload": { "user_phone": "{{user.sender}}", "channel": "{{user.channel}}", "classification": "{{flow.classification}}" } } -
Retorno:
true
Variáveis usadas: flow.correlation_id, flow.deal_id, user.sender, user.channel, flow.classification
Ação: Envia um evento de analytics campaign.message.engaged para rastrear o engajamento do cliente com a mensagem da campanha.
Nó 16-label---interessado-rcs: Aplicar Rótulo de Interesse
Tipo: Label
Configuração:
- Rótulo: Interessado, RCS
Variáveis usadas: N/A
Ação: Aplica os rótulos “Interessado” e “RCS” no contexto do chat/atendimento.
Nó 17-chat---rcs-receptivo: Mensagem de Boas-Vindas RCS
Tipo: Chat
Configuração:
- Conteúdo: Ótimo! Vamos continuar pelo WhatsApp.
- Rodapé: N/A
- Botões: N/A
- Opções:
- Aguardar resposta do usuário:
false - Tratar mensagem fora de contexto:
false - Continuar automaticamente:
true
- Aguardar resposta do usuário:
Variáveis usadas: N/A
Ação: Envia uma mensagem para o cliente, indicando a transição para o WhatsApp, e continua automaticamente para o próximo nó.
Nó 18-request---lead-input hyperflow-unified-lead-3: Envio de Lead para N8N
Tipo: HTTP Request
Configuração:
-
URL:
https://n8n.konsi.dev/webhook/lead-input/hyperflow-unified-lead -
Método:
POST -
Headers: N/A
-
Body:
{ "phone": "{{user.id}}", "hyperflow_protocol": "{{flow.protocol}}", "utm_source": "{{flow.utm_source}}", "utm_medium": "{{flow.utm_medium}}", "utm_type": "{{flow.utm_type}}", "campaign": "{{flow.campaign}}", "cpf": "{{flow.cpf}}", "answer_message": "sim" }
Variáveis usadas: user.id, flow.protocol, flow.utm_source, flow.utm_medium, flow.utm_type, flow.campaign, flow.cpf
Ação: Envia os dados do lead para um webhook no N8N para processamento unificado e registro. A resposta desta requisição é crucial para as próximas etapas.
Branch B: Mensagem Enviada (Finalização do Fluxo)
Nós: 13b-end-inactivity-debug → 14b-jump---envia-evento.campaign.message.sent → 15b-end-flow-1
Contexto: Este branch é acionado após a inatividade e foca em registrar que a mensagem foi enviada e encerrar o fluxo para este caminho específico (sem engajamento).
Nó 13b-end-inactivity-debug: Finalizar Inatividade (Debug)
Tipo: End Inactivity
Configuração: N/A
Variáveis usadas: N/A
Ação: Interrompe o monitoramento de inatividade em andamento, provavelmente para fins de debug ou para garantir que o fluxo não fique “preso” se o outro branch não for engajado.
Nó 14b-jump---envia-evento.campaign.message.sent: Registrar Mensagem Enviada
Tipo: Jump
Configuração:
-
Fluxo de destino: BUC - Utils - Store Analytics Event
-
Data:
{ "event_type": "campaign.message.sent", "correlation_id": "{{flow.correlation_id}}", "payload": { "flow_slug": "{{flow.flow_slug}}", "user_phone": "{{user.sender}}", "template": "{{flow.template}}", "channel": "{{user.channel}}" } } -
Retorno:
true
Variáveis usadas: flow.correlation_id, flow.flow_slug, user.sender, flow.template, user.channel
Ação: Envia um evento de analytics campaign.message.sent para rastrear que uma mensagem da campanha foi enviada ao cliente.
Nó 15b-end-flow-1: Finalizar Fluxo (Caminho de Envio)
Tipo: End Flow
Configuração: N/A
Variáveis usadas: N/A
Ação: Finaliza a execução do fluxo atual.
Fase 4: Validação de Lead e Integração HubSpot
Nós: 19b-conditional-validacao-hubspot (ponto de decisão)
Contexto: Após o envio do lead para o N8N (18-request), este módulo processa a resposta da requisição, validando o status do lead e a criação/atualização no HubSpot. Contém ramificação para erros ou sucesso.
Condição: Avalia a resposta da requisição 18-request (input.body)
Variável avaliada: input.body.cpf, input.body.hubspot.deal_created
Decisões:
- Condição 1 (Lead não encontrado na base):
{{ input.body.cpf == undefined || input.body.cpf == null }}- TRUE: Caminho para
24b-finish-attendance---erro(Sub-Branch A.1)
- TRUE: Caminho para
- Condição 2 (Lead criado no HubSpot):
{{ input.body.hubspot.deal_created == true }}- TRUE: Caminho para
20b-flow-variable---lead-input(Sub-Branch A.2)
- TRUE: Caminho para
- Condição 3 (Criação bloqueada no HubSpot):
{{ input.body.hubspot.deal_created == false }}- TRUE: Caminho para
20b-flow-variable---lead-input(Sub-Branch A.2)
- TRUE: Caminho para
- Senão:
- Caminho para
24b-finish-attendance---erro(Sub-Branch A.1)
- Caminho para
Sub-Branch A.1: Tratamento de Erro no Lead Input
Nós: 19a-flow-variable---lead-input-error → 20a-rotulo---error-lead-input → 21a-request---enviar-erro-para-slack → 24b-finish-attendance---erro
Contexto: Este sub-branch é ativado quando o nó 18-request falha ou o CPF do lead não é encontrado (19b-conditional).
Nó 19a-flow-variable---lead-input-error: Marcar Erro de Lead Input
Tipo: Flow Variables
Configuração:
{
"lead_input_error": true
}Variáveis criadas: flow.lead_input_error (true)
Ação: Define uma flag no flow para indicar que houve um erro no processamento do lead-input.
Nó 20a-rotulo---error-lead-input: Aplicar Rótulo de Erro
Tipo: Label
Configuração:
- Rótulo: Error lead input - BUER
Variáveis usadas: N/A
Ação: Aplica um rótulo no contexto do atendimento indicando um erro na entrada do lead.
Nó 21a-request---enviar-erro-para-slack: Notificar Erro no Slack
Tipo: HTTP Request
Configuração:
-
URL:
https://n8n.konsi.dev/webhook/hyperflow/error -
Método:
POST -
Headers: N/A
-
Body:
{ "user": "{{user}}", "flow": "{{flow}}", "message": "criação bloqueada no disparo ativo" }
Variáveis usadas: user (todo o contexto), flow (todo o contexto)
Ação: Envia uma notificação de erro para um canal do Slack, informando sobre um problema de “criação bloqueada no disparo ativo”.
Nó 24b-finish-attendance---erro: Finalizar Atendimento com Erro
Tipo: Finish attendance
Configuração:
- Classificação: Error na automação
- Status: Não resolvido
- Continuar automaticamente: Sim
Variáveis usadas: N/A
Ação: Finaliza o atendimento marcando-o como “Não resolvido” devido a um erro na automação, e o fluxo continua para 25-end-inactivity.
Sub-Branch A.2: Processamento e Atualização HubSpot do Lead
Nós: 20b-flow-variable---lead-input → 21b-hubspot---atualizar-negocio → 22b-conditional---criacao-bloqueada (ponto de decisão)
Contexto: Este sub-branch é ativado quando o lead é encontrado ou criado via 18-request, seguindo para a atualização de dados no flow e integração com HubSpot.
Nó 20b-flow-variable---lead-input: Salvar Variáveis do Lead
Tipo: Flow Variables
Configuração:
{
"name": "{{input.body.name}}",
"cpf": "{{input.body.cpf}}",
"phone": "{{input.body.phone}}",
"registry_number": "{{input.body.registry_number}}",
"department_description": "{{input.body.department_description}}",
"covenant_name": "{{input.body.covenant_name}}",
"first_name": "{{input.body.first_name}}",
"margem_emprestimo_total": "{{input.body.margem_emprestimo_total}}",
"margem_emprestimo_disponivel": "{{input.body.margem_emprestimo_disponivel}}",
"valor_liberado_emprestimo": "{{input.body.valor_liberado_emprestimo}}",
"margem_beneficio_total": "{{input.body.total_withdraw_benefit_card_margin}}",
"margem_beneficio_disponivel": "{{input.body.available_withdraw_benefit_card_margin}}",
"valor_liberado_beneficio": "{{input.body.valor_liberado_beneficio}}",
"valor_parcela_beneficio": "{{input.body.valor_parcela_beneficio}}",
"margem_cartao_total": "{{input.body.total_credit_card_margin}}",
"margem_cartao_disponivel": "{{input.body.available_credit_card_margin}}",
"valor_liberado_cartao": "{{input.body.valor_liberado_cartao_credito}}",
"valor_parcela_cartao": "{{input.body.valor_parcela_cartao_credito}}",
"valor_liberado_cartoes": "{{input.body.valor_liberado_cartoes}}",
"deal_id": "{{input.body.hubspot.deal_id ?? input.body.hubspot.existing_deal_id}}",
"owner_name": "{{input.body.owner_name}}",
"owner_id": "{{input.body.owner_id}}",
"owner_email": "{{input.body.owner_email}}",
"creation_blocked": "{{ input.body.hubspot.deal_creation_blocked}}",
"contactId": "{{input.body.hubspot.contact_id || 'null'}}"
}Variáveis criadas: Várias flow.variáveis baseadas na resposta de input.body do nó 18-request.
Ação: Salva diversas propriedades do lead retornadas pelo lead-input no contexto do flow.
Nó 21b-hubspot---atualizar-negocio: Atualizar Negócio no HubSpot
Tipo: HubSpot
Configuração:
- Entidade: Negócios
- Operação: Atualizar
- Campos: Protocolo da conversa HF
- ID:
{{flow.deal_id}} - Protocolo da conversa HF:
https://desk.hyperflow.global/all-chats/{{flow.protocol}}
Variáveis usadas: flow.deal_id, flow.protocol
Ação: Atualiza o negócio correspondente no HubSpot com o protocolo da conversa do Hyperflow.
Nó 22b-conditional---criacao-bloqueada: Condicional de Criação Bloqueada
Tipo: Condition
Configuração:
- Condição 1:
{{ flow.creation_blocked == true }}- Nome da condição: criação bloqueada
- Segue para:
[[23b-request---enviar-erro-para-slack]](Sub-Branch A.2.1)
- Senão:
- Segue para:
[[23c-finish-attendance---sucesso]](Sub-Branch A.2.2)
- Segue para:
Variável avaliada: flow.creation_blocked
Decisões:
- TRUE (Criação bloqueada): Segue para
23b-request---enviar-erro-para-slack - FALSE (Criação não bloqueada): Segue para
23c-finish-attendance---sucesso
Sub-Branch A.2.1: Notificação de Criação Bloqueada
Nós: 23b-request---enviar-erro-para-slack → 24b-finish-attendance---erro
Contexto: Gerenciado quando a criação/atualização do lead foi bloqueada no HubSpot.
Nó 23b-request---enviar-erro-para-slack: Notificar Bloqueio no Slack
Tipo: HTTP Request
Configuração:
-
URL:
https://n8n.konsi.dev/webhook/hyperflow/error -
Método:
POST -
Headers: N/A
-
Body:
{ "user": "{{user}}", "flow": "{{flow}}", "message": "criação bloqueada no disparo ativo" }
Variáveis usadas: user (todo o contexto), flow (todo o contexto)
Ação: Envia uma notificação de erro para um canal do Slack, informando sobre o bloqueio de criação no HubSpot.
Sub-Branch A.2.2: Sucesso na Criação/Atualização do Lead
Nós: 23c-finish-attendance---sucesso
Contexto: O lead foi processado com sucesso e não há bloqueio de criação.
Nó 23c-finish-attendance---sucesso: Finalizar Atendimento com Sucesso
Tipo: Finish attendance
Configuração:
- Classificação: Encerramento de fluxo
- Status: Sucesso
- Continuar automaticamente: Sim
Variáveis usadas: N/A
Ação: Finaliza o atendimento marcando-o como “Sucesso”, e o fluxo continua para 25-end-inactivity.
Fase 5: Finalização
Nós: 25-end-inactivity → 26-end-flow
Contexto: Esta fase representa o ponto de convergência dos diferentes caminhos do fluxo e sua finalização.
Nó 25-end-inactivity: Interromper Monitoramento de Inatividade
Tipo: End Inactivity
Configuração: N/A
Variáveis usadas: N/A
Ação: Garante que qualquer monitoramento de inatividade em andamento associado a este fluxo seja interrompido, liberando recursos.
Nó 26-end-flow: Encerrar Fluxo Principal
Tipo: End Flow
Configuração: N/A
Variáveis usadas: N/A
Ação: Finaliza a execução do fluxo principal.
Dependências Externas
Fluxos Chamados (Jumps)
| Fluxo | Nó | Propósito | Dados Enviados | Retorno Esperado |
|---|---|---|---|---|
| BUC - CON - Generate Correlation ID | 7-jump-buc-con-generate-correlation-id | Gerar um correlation_id para a conversa | {"correlation_id": "{{flow.correlation_id}}" (pode ser vazio inicialmente) | {"id": "correlation_id_gerado"} |
| BUC/BUER - Cria Disparo | 9-jump---cria-disparo | Criar um novo evento de disparo | {{flow}} (todo o contexto do fluxo) | true |
| BUC/BUER - Init/Update Attendance | 10-jump---init-update attendance | Inicializar ou atualizar um atendimento | {{flow}} (todo o contexto do fluxo) | {"protocol": "protocolo_do_atendimento"} |
| BUC/BUER - Roteamento de Proposta por Time (RCS) | 13a-jump---roteamento-de-proposta-por-time-rcs | Roteamento de proposta baseado no time responsável. | {{flow}} (todo o contexto do fluxo) | true |
| BUC - Utils - Store Analytics Event | 14-jump---envia-evento-campaign.message.received | Armazenar evento de message.received | {"event_type": "campaign.message.received", "correlation_id": "...", "payload": {...}} | true |
| BUC - Utils - Store Analytics Event | 14b-jump---envia-evento.campaign.message.sent | Armazenar evento de message.sent | {"event_type": "campaign.message.sent", "correlation_id": "...", "payload": {...}} | true |
| BUC - Utils - Store Analytics Event | 15-jump---envia-evento-campaign.message.engaged | Armazenar evento de message.engaged | {"event_type": "campaign.message.engaged", "correlation_id": "...", "payload": {...}} | true |
Webhooks / APIs
Lead Input (N8N)
-
Endpoint:
POST https://n8n.konsi.dev/webhook/lead-input/hyperflow-unified-lead -
Query Params: N/A
-
Nó:
18-request---lead-input hyperflow-unified-lead-3 -
Fluxo relacionado: n8n workflow for Unified Lead Processing
-
Headers: N/A
-
Body:
{ "phone": "{{user.id}}", "hyperflow_protocol": "{{flow.protocol}}", "utm_source": "{{flow.utm_source}}", "utm_medium": "{{flow.utm_medium}}", "utm_type": "{{flow.utm_type}}", "campaign": "{{flow.campaign}}", "cpf": "{{flow.cpf}}", "answer_message": "sim" } -
Resposta esperada:
{ "body": { "cpf": "string | undefined | null", "hubspot": { "deal_created": "boolean", "deal_id": "string | null", "existing_deal_id": "string | null", "deal_creation_blocked": "boolean", "contact_id": "string | null" }, "name": "string", "phone": "string", // ...outros campos do lead } } -
Critérios/Regras: A resposta é crucial para determinar se o lead existe, foi criado no HubSpot ou teve a criação bloqueada.
Erro para Slack (N8N)
-
Endpoint:
POST https://n8n.konsi.dev/webhook/hyperflow/error -
Query Params: N/A
-
Nó:
21a-request---enviar-erro-para-slack,23b-request---enviar-erro-para-slack -
Fluxo relacionado: n8n workflow for Hyperflow Error Notifications
-
Headers: N/A
-
Body:
{ "user": "{{user}}", "flow": "{{flow}}", "message": "string" // Ex: "criação bloqueada no disparo ativo" } -
Resposta esperada:
200 OK(geralmente sem corpo específico)
Saída (Output)
Cenários de Finalização
Cenário 1: Sucesso na Criação/Atualização do Lead no HubSpot
Caminho: Fase 1 → Fase 2 → Fase 3 (Branch A) → Fase 4 (Sub-Branch A.2 → Sub-Branch A.2.2) → Fase 5
Estado final:
- Rótulos aplicados:
Interessado, RCS - Propriedades alteradas:
flow.projected_commission,flow.equipe,flow.produto,flow.touch_level,flow.engagement_type,flow.correlation_id,flow.protocol, diversas propriedades do lead (name,cpf,phone, etc.),deal_ideprotocolo_da_conversa_hfno HubSpot. - Eventos registrados:
campaign.message.received,campaign.message.engaged, potenialmente outros eventos iniciados pelos Jumps. - Status do atendimento: Encerrado (
Sucessovia23c-finish-attendance---sucesso). - Escala para humano:
Sim(implicitamente, pelo rótuloInteressadoe comunicação para continuar por WhatsApp).
Condição de ativação: O lead-input retorna um lead válido, e a criação/atualização no HubSpot não foi bloqueada.
Cenário 2: Erro no Processamento do Lead Input ou Criação Bloqueada
Caminho: Fase 1 → Fase 2 → Fase 3 (Branch A) → Fase 4 (Sub-Branch A.1 OU Sub-Branch A.2 → Sub-Branch A.2.1) → Fase 5
Estado final:
- Rótulos aplicados:
Error lead input - BUER - Propriedades alteradas:
flow.lead_input_error(true). - Eventos registrados:
campaign.message.received,campaign.message.engaged, potenialmente outros eventos iniciados pelos Jumps. - Status do atendimento: Encerrado (
Não resolvidovia24b-finish-attendance---erro). - Escala para humano:
Sim(implícito pela notificação de erro no Slack e status “Não resolvido”).
Condição de ativação:
19b-conditional-validacao-hubspotdetectainput.body.cpfcomoundefinedounull(lead não encontrado/inválido).19b-conditional-validacao-hubspotavaliaSenão(caso não caia em nenhuma das condições específicas).22b-conditional---criacao-bloqueadadetectaflow.creation_blockedcomotrue(criação bloqueada no HubSpot).
Cenário 3: Mensagem Enviada (Não Engajado)
Caminho: Fase 1 → Fase 2 → Fase 3 (Branch B)
Estado final:
- Rótulos aplicados: N/A
- Propriedades alteradas: N/A
- Eventos registrados:
campaign.message.sent, potencialmente outros eventos iniciados pelos Jumps. - Status do atendimento: Finalizado (
15b-end-flow-1) - Escala para humano:
Não(O fluxo é encerrado neste caminho).
Condição de ativação: O fluxo segue o caminho de “não engajamento” após a inatividade (o cliente não interagiu dentro do tempo limite).
Eventos de Analytics
Eventos Sempre Disparados (dentro dos respectivos branches)
| Evento | Nó | Momento | Payload |
|---|---|---|---|
campaign.message.received | 14-jump---envia-evento-campaign.message.received | Após roteamento de proposta (Branch A) | {"correlation_id": "{{flow.correlation_id}}", "deal_id": "{{flow.deal_id}}", "payload": {"cadence_slug": "{{flow.cadence_slug}}", "user_phone": "{{user.sender}}", "template": "{{flow.template}}", "channel": "{{user.channel}}"}} |
campaign.message.engaged | 15-jump---envia-evento-campaign.message.engaged | Após mensagem recebida (Branch A) | {"correlation_id": "{{flow.correlation_id}}", "deal_id": "{{flow.deal_id}}", "payload": {"user_phone": "{{user.sender}}", "channel": "{{user.channel}}", "classification": "{{flow.classification}}"}} |
campaign.message.sent | 14b-jump---envia-evento.campaign.message.sent | Após o fim da inatividade (Branch B) | {"event_type": "campaign.message.sent", "correlation_id": "{{flow.correlation_id}}", "payload": {"flow_slug": "{{flow.flow_slug}}", "user_phone": "{{user.sender}}", "template": "{{flow.template}}", "channel": "{{user.channel}}"}} |
Rótulos/Tags Aplicados
| Rótulo | Nó | Condição | Significado |
|---|---|---|---|
Interessado, RCS | 16-label---interessado-rcs | Sempre após campaign.message.engaged | Indica que o cliente demonstrou interesse na campanha RCS e está seguindo para interação via chat. |
Error lead input - BUER | 20a-rotulo---error-lead-input | Quando ocorre um erro no lead-input (CPF nulo/indefinido ou outro erro na requisição 18-request) | Sinaliza um problema na etapa de entrada de dados do lead, requerendo investigação. |
Métricas e Tempos
| Métrica | Valor | Descrição |
|---|---|---|
| Tempo de inatividade | 1440 minutos (1 dia) | Período que o fluxo aguarda (12-start-Inactivity---1-dia) antes de seguir para os caminhos de engajamento ou de finalização de envio da mensagem. |
Notas Técnicas
Sobre Variáveis
flow.projected_commission: O nó3-code---tratar-projected-commissioné crítico para garantir que este valor seja sempre um número, evitando erros em cálculos ou comparações posteriores. Valores nulos, vazios ou em formato de moeda são convertidos para 0 ou para seu equivalente numérico.- Variáveis do
input.body: Muitas variáveis são extraídas diretamente do corpo da resposta da requisição18-request. É fundamental que o endpointn8n.konsi.dev/webhook/lead-input/hyperflow-unified-leadmantenha a consistência de sua estrutura de saída.
Sobre Condições
19b-conditional-validacao-hubspot: A ordem das condições importa. A condição paracpf == undefined || cpf == nulldeve idealmente ser avaliada antes de tentar acessar campos aninhados comoinput.body.hubspot.deal_createdpara evitar erros de referência seinput.bodynão estiver totalmente preenchido.22b-conditional---criacao-bloqueada: Este nó lida especificamente com a propriedadeflow.creation_blockedque vem da resposta dolead-input, determinando o fluxo para notificação de erro ou sucesso.
Sobre Integrações
- N8N Lead Input: O fluxo depende fortemente da disponibilidade e resposta do webhook
n8n.konsi.dev/webhook/lead-input/hyperflow-unified-lead. Falhas neste endpoint impactarão diretamente o processamento do lead e a integração com HubSpot. - HubSpot: As operações de atualização no HubSpot (
21b-hubspot---atualizar-negocio) requerem umdeal_idválido. A Lógica dedeal_id ?? existing_deal_idno20b-flow-variabletenta mitigar problemas dedeal_idausente.
Troubleshooting
Erros Comuns
| Erro | Causa Provável | Solução |
|---|---|---|
Error lead input - BUER | input.body.cpf nulo/indefinido ou falha na requisição 18-request. | Verificar logs do 18-request e do webhook lead-input no N8N. Garantir que os dados de entrada do fluxo original são válidos e que N8N está respondendo corretamente. |
criação bloqueada no disparo ativo (Slack) | flow.creation_blocked é true retornado pelo lead-input. | Verificar as regras de criação no N8N e as configurações do HubSpot que podem estar bloqueando a criação/atualização de negócios para este lead. |
Fluxo preso no Start Inactivity | A condição para sair da inatividade pode não ter sido atendida ou um problema na plataforma. | Verificar o tempo decorrido no nó 12-start-Inactivity---1-dia e se os eventos de saída estão sendo disparados. Reiniciar o fluxo se necessário. |
| Dados incorretos no HubSpot | Falha na extração ou salvamento de variáveis do lead-input ou na chamada 21b-hubspot. | Conferir as definições do 20b-flow-variable e os logs da API do HubSpot para a atualização do negócio. |
Logs Relevantes
- Plataforma Hyperflow: Logs de execução de cada nó, dados de
inputeoutputdos nós. - N8N: Logs do workflow
lead-inputehyperflow/error. - HubSpot: Logs de atividades da API em
CRM > Relatórios > Integrações de Dados > Histórico de API.
Changelog
| Data | Versão | Alteração | Autor |
|---|---|---|---|
| 2023-11-20 | 1.0 | Documento inicial gerado a partir de arquivos merged.md e template-doc-fluxo.md. | IA |
Referências
- [Link para o Jira/tickets relacionados]
- [Link para dashboards de monitoramento]
- [Documentação específica da API do HubSpot]