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

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ávelOrigemTipoObrigatórioDescriçãoUso no Fluxo
valor_liberadoinput.valor_liberadostring/numberNãoValor liberado na ofertaDefine flow.valor_liberado
valor_parcelainput.valor_parcelastring/numberNãoValor da parcela na ofertaDefine flow.valor_parcela
banco_destinoinput.banco_destinostringNãoBanco para onde o valor será enviadoDefine flow.banco_destino
nameinput.namestringSimNome completo do clienteDefine flow.nameuser.name
campaigninput.campanhastringSimNome da campanha que originou o leadDefine flow.campaign
prazoinput.prazonumberNãoPrazo da operação em mesesDefine flow.prazo
phoneinput.phonestringSimTelefone do clienteDefine flow.phoneflow.user_phone
cpfinput.cpfstringSimCPF do clienteDefine flow.cpfuser.cpf
banco_origeminput.banco_origemstringNãoBanco de origem para a operaçãoDefine flow.banco_origem
comissaoinput.comissaostring/numberNãoValor da comissão projetada (pode ser “null”)Define flow.projected_commission
convenio2input.convenio2stringNãoSegundo convênio do cliente (pode ser “null”)Define flow.convenio2
template_typeinput.template_typestringNãoTipo de template usado na campanhaDefine flow.template_type
tipo_de_campanhainput.tipo_de_campanhastringSimTipo da campanhaDefine flow.tipo_de_campanha
idinput.idstringNãoCorrelation ID ou Protocol ID (depende do Jump)Define flow.correlation_idflow.protocol
body.cpf18-request (response)stringCondicionalCPF do lead retornado pelo lead-inputValidação em 19b-conditional
body.hubspot.deal_created18-request (response)booleanCondicionalIndica se um negócio foi criado no HubSpotCondição em 19b-conditional
body.*18-request (response)objectNãoDiversos 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ávelCriada emTipoFonteDescriçãoDependências
flow.valor_liberado1-flow-variablesstringinput.valor_liberadoValor liberado conforme inputN/A
flow.valor_parcela1-flow-variablesstringinput.valor_parcelaValor da parcela conforme inputN/A
flow.banco_destino1-flow-variablesstringinput.banco_destinoBanco de destino conforme inputN/A
flow.name1-flow-variablesstringinput.nameNome completo do cliente2-user-variables20b-flow-variable
flow.campaign1-flow-variablesstringinput.campanhaNome da campanha5-code18-request, analytics events
flow.prazo1-flow-variablesstringinput.prazoPrazo da operaçãoN/A
flow.phone1-flow-variablesstringinput.phoneTelefone do cliente20b-flow-variable
flow.cpf1-flow-variablesstringinput.cpfCPF do cliente2-user-variables18-request20b-flow-variable
flow.banco_origem1-flow-variablesstringinput.banco_origemBanco de origemN/A
flow.projected_commission1-flow-variables4-flow-variablenumberinput.comissao (tratado por 3-code)Comissão projetada, tratada para ser numérica5-code
flow.convenio21-flow-variablesstringinput.convenio2Segundo convênioN/A
flow.template_type1-flow-variablesstringinput.template_typeTipo de template UXN/A
flow.tipo_de_campanha1-flow-variablesstringinput.tipo_de_campanhaTipo da campanhaN/A
flow.utm_source1-flow-variablesstringHardcoded: HYPERFLOWOrigem do UTM para analytics18-request
flow.utm_medium1-flow-variablesstringHardcoded: disparo_rcsMeio do UTM para analytics18-request
flow.utm_type1-flow-variablesstringHardcoded: ativoTipo do UTM para analytics18-request
flow.channel1-flow-variablesstringHardcoded: rcsCanal de comunicaçãoAnalytics events
flow.engagement_type6-flow-variablestringinput.touch_level (de 5-code)Nível de engajamento do leadN/A
flow.equipe6-flow-variablestringinput.equipe (de 5-code)Equipe responsável pelo leadN/A
flow.produto6-flow-variablestringinput.produto (de 5-code)Produto relacionado ao leadN/A
flow.touch_level6-flow-variablestringinput.touch_level (de 5-code)Nível de toque/engajamento (low/high)N/A
flow.correlation_id8-flow-variablestringinput.id (do jump 7)ID de correlação para rastreamentoJumps, analytics events
flow.protocol11-flow-variablestringinput.protocol (do jump 10)Protocolo da conversa no Desk HF18-request21b-hubspot
flow.lead_input_error19a-flow-variablebooleanHardcoded: trueIndica se houve erro na requisição lead-input20a-rotulo
flow.registry_number20b-flow-variablestringinput.body.registry_numberNúmero de matrícula do leadN/A
flow.department_description20b-flow-variablestringinput.body.department_descriptionDescrição do departamentoN/A
flow.covenant_name20b-flow-variablestringinput.body.covenant_nameNome do convênioN/A
flow.first_name20b-flow-variablestringinput.body.first_namePrimeiro nome do leadN/A
flow.margem_emprestimo_total20b-flow-variablenumberinput.body.margem_emprestimo_totalMargem total para empréstimoN/A
flow.margem_emprestimo_disponivel20b-flow-variablenumberinput.body.margem_emprestimo_disponivelMargem disponível para empréstimoN/A
flow.valor_liberado_emprestimo20b-flow-variablenumberinput.body.valor_liberado_emprestimoValor liberado para empréstimoN/A
flow.margem_beneficio_total20b-flow-variablenumberinput.body.total_withdraw_benefit_card_marginMargem total do cartão benefícioN/A
flow.margem_beneficio_disponivel20b-flow-variablenumberinput.body.available_withdraw_benefit_card_marginMargem disponível do cartão benefícioN/A
flow.valor_liberado_beneficio20b-flow-variablenumberinput.body.valor_liberado_beneficioValor liberado do benefícioN/A
flow.valor_parcela_beneficio20b-flow-variablenumberinput.body.valor_parcela_beneficioValor da parcela do benefícioN/A
flow.margem_cartao_total20b-flow-variablenumberinput.body.total_credit_card_marginMargem total do cartãoN/A
flow.margem_cartao_disponivel20b-flow-variablenumberinput.body.available_credit_card_marginMargem disponível do cartãoN/A
flow.valor_liberado_cartao20b-flow-variablenumberinput.body.valor_liberado_cartao_creditoValor liberado do cartão de créditoN/A
flow.valor_parcela_cartao20b-flow-variablenumberinput.body.valor_parcela_cartao_creditoValor da parcela do cartão de créditoN/A
flow.valor_liberado_cartoes20b-flow-variablenumberinput.body.valor_liberado_cartoesValor total liberado de cartõesN/A
flow.deal_id20b-flow-variablestringinput.body.hubspot.deal_id ?? input.body.hubspot.existing_deal_idID do negócio no HubSpot21b-hubspot, analytics events
flow.owner_name20b-flow-variablestringinput.body.owner_nameNome do proprietário do negócioN/A
flow.owner_id20b-flow-variablestringinput.body.owner_idID do proprietário do negócioN/A
flow.owner_email20b-flow-variablestringinput.body.owner_emailEmail do proprietário do negócioN/A
flow.creation_blocked20b-flow-variablebooleaninput.body.hubspot.deal_creation_blockedIndica se a criação do negócio foi bloqueada22b-conditional
flow.contactId20b-flow-variablestringinput.body.hubspot.contact_idID do contato no HubSpotN/A
flow.flow_slug14b-jumpstring(implícita no payload)Slug do fluxo atualAnalytics events
flow.cadence_slug14-jumpstring(implícita no payload)Slug da cadênciaAnalytics events
flow.template14-jump14b-jumpstring(implícita no payload)Template de mensagemAnalytics events
flow.classification15-jumpstring(implícita no payload)Classificação do engajamentoAnalytics events

Variáveis do Usuário (User Context)

VariávelOrigemTipoDescriçãoUso no Fluxo
user.name2-user-variablesstringNome do usuário, salvo no contextoPara personalização de mensagens
user.cpf2-user-variablesstringCPF do usuário, salvo no contextoPara identificação e consultas
user.senderImplícitostringTelefone do remetente (usuário)Payload de eventos de analytics
user.id18-request (Body)stringID do usuário (telefone ou ID de contexto)Payload da requisição lead-input
user.channelImplícitostringCanal de comunicação do usuário (e.g., rcs)Payload de eventos de analytics

Variáveis Computadas

ExpressãoLocal de UsoTipo ResultanteDescrição
tratarComissao(flow.projected_commission)3-code---tratar-projected-commissionnumberNormaliza 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_typeequipeprodutotouch_level5-code---engagement-typestringExtrai 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

PropriedadeAçãoValorNó ResponsávelFluxo/API Relacionado
deal_idREAD/UPDATE{{flow.deal_id}} ou {{input.body.hubspot.deal_id}}21b-hubspot---atualizar-negocio19b-conditionalHubSpot API
protocolo_da_conversa_hfUPDATEhttps://desk.hyperflow.global/all-chats/{{flow.protocol}}21b-hubspot---atualizar-negocioHubSpot API
deal_createdREAD{{input.body.hubspot.deal_created}}19b-conditional-validacao-hubspot18-request (response)
deal_creation_blockedREAD{{input.body.hubspot.deal_creation_blocked}}22b-conditional---criacao-bloqueada18-request (response)

Sistema: N8N (Lead Input / Error Handler)

PropriedadeAçãoValorNó ResponsávelFluxo/API Relacionado
phonehyperflow_protocolutm_sourceutm_mediumutm_typecampaigncpfanswer_messageCREATE{{user.id}}{{flow.protocol}}{{flow.utm_source}}, etc.18-request---lead-input hyperflow-unified-lead-3https://n8n.konsi.dev/webhook/lead-input/hyperflow-unified-lead
userflowmessageCREATE{{user}}{{flow}}, “criação bloqueada no disparo ativo”21a-request---enviar-erro-para-slackhttps://n8n.konsi.dev/webhook/hyperflow/error
userflowmessageCREATE{{user}}{{flow}}, “criação bloqueada no disparo ativo”23b-request---enviar-erro-para-slackhttps://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 em 19b-conditional-validacao-hubspot para determinar se o lead foi encontrado na base; se undefined ou null, o fluxo segue para tratamento de erro.

Fluxo Detalhado

Fase 1: Inicialização e Processamento de Variáveis

Nós1-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. 1-flow-variables: Coleta variáveis de input (como valor_liberadonamecampaigncpfcomissao, etc.) e as salva no contexto do flow. Hardcodes utm_sourceutm_mediumutm_typechannel para HYPERFLOWdisparo_rcsativorcs respectivamente.
  2. 2-user-variables---salvar-variaveis-de-user: Salva name e cpf do flow para o contexto do user.
  3. 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. 4-flow-variable--- projected-commission: Atualiza flow.projected_commission com o valor tratado pelo nó anterior.
  5. 5-code---engagement-type: Executa um código JS para determinar equipeproduto, e touch_level a partir do flow.campaign. Define touch_level como ‘high’ ou ‘low’ baseado em regras de negócio (e.g., produto nqb ou saquecom sempre ‘high’).
  6. 6-flow-variable---produto- equipe-convenio-tipo-de-engajamento: Salva os resultados (engagement_typeequipeprodutotouch_level) do nó de código anterior no contexto do flow.

Variáveis criadas:

  • flow.valor_liberadoflow.valor_parcelaflow.banco_destinoflow.nameflow.campaignflow.prazoflow.phoneflow.cpfflow.banco_origemflow.projected_commissionflow.convenio2flow.template_typeflow.tipo_de_campanhaflow.utm_sourceflow.utm_mediumflow.utm_typeflow.channel
  • user.nameuser.cpf
  • flow.engagement_typeflow.equipeflow.produtoflow.touch_level

Variáveis usadas:

  • input.valor_liberadoinput.valor_parcelainput.banco_destinoinput.nameinput.campanhainput.prazoinput.phoneinput.cpfinput.banco_origeminput.comissaoinput.convenio2input.template_typeinput.tipo_de_campanha
  • flow.nameflow.cpfflow.campaignflow.projected_commission

Fase 2: Geração de IDs e Criação de Disparo

Nós7-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:

  1. 7-jump-buc-con-generate-correlation-id: Chama um subfluxo para gerar um correlation_id para a conversa.
  2. 8-flow-variable---salvar-correlation_id: Salva o id retornado pelo subfluxo como flow.correlation_id.
  3. 9-jump---cria-disparo: Chama o subfluxo BUC/BUER - Cria Disparo, passando todo o contexto flow.
  4. 10-jump---init-update attendance: Chama o subfluxo BUC/BUER - Init/Update Attendance, passando todo o contexto flow.
  5. 11-flow-variable---definir-protocol: Salva o protocol retornado pelo subfluxo 10 como flow.protocol.

Variáveis criadas:

  • flow.correlation_id
  • flow.protocol

Variáveis usadas:

  • flow.correlation_id (enviado ao subfluxo)
  • flow (enviado aos subfluxos 9 e 10)
  • input.id (retorno do jump 7)
  • input.protocol (retorno do jump 10)

Fase 3: Inatividade e Roteamento Inicial

Nós12-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 Engajamento13a-jump---roteamento-de-proposta-por-time-rcs (Branch A)
    • Caminho de Mensagem Enviada13b-end-inactivity-debug (Branch B)

Branch A: Atendimento RCS (Engajamento do Cliente)

Nós13a-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}}
  • Retornotrue

Variáveis usadasflow (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}}"
      }
    }
  • Retornotrue

Variáveis usadasflow.correlation_idflow.deal_idflow.cadence_sluguser.senderflow.templateuser.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}}"
      }
    }
  • Retornotrue

Variáveis usadasflow.correlation_idflow.deal_iduser.senderuser.channelflow.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

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:

  • URLhttps://n8n.konsi.dev/webhook/lead-input/hyperflow-unified-lead

  • MétodoPOST

  • 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 usadasuser.idflow.protocolflow.utm_sourceflow.utm_mediumflow.utm_typeflow.campaignflow.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ós13b-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}}"
      }
    }
  • Retornotrue

Variáveis usadasflow.correlation_idflow.flow_sluguser.senderflow.templateuser.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ós19b-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 avaliadainput.body.cpfinput.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)
  • 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)
  • 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)
  • Senão:
    • Caminho para 24b-finish-attendance---erro (Sub-Branch A.1)

Sub-Branch A.1: Tratamento de Erro no Lead Input

Nós19a-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 criadasflow.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:

  • URLhttps://n8n.konsi.dev/webhook/hyperflow/error

  • MétodoPOST

  • Headers: N/A

  • Body:

    {
      "user": "{{user}}",
      "flow": "{{flow}}",
      "message": "criação bloqueada no disparo ativo"
    }

Variáveis usadasuser (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ós20b-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 HFhttps://desk.hyperflow.global/all-chats/{{flow.protocol}}

Variáveis usadasflow.deal_idflow.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)

Variável avaliadaflow.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ós23b-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:

  • URLhttps://n8n.konsi.dev/webhook/hyperflow/error

  • MétodoPOST

  • Headers: N/A

  • Body:

    {
      "user": "{{user}}",
      "flow": "{{flow}}",
      "message": "criação bloqueada no disparo ativo"
    }

Variáveis usadasuser (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ós23c-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ós25-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)

FluxoPropósitoDados EnviadosRetorno Esperado
BUC - CON - Generate Correlation ID7-jump-buc-con-generate-correlation-idGerar um correlation_id para a conversa{"correlation_id": "{{flow.correlation_id}}" (pode ser vazio inicialmente){"id": "correlation_id_gerado"}
BUC/BUER - Cria Disparo9-jump---cria-disparoCriar um novo evento de disparo{{flow}} (todo o contexto do fluxo)true
BUC/BUER - Init/Update Attendance10-jump---init-update attendanceInicializar 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-rcsRoteamento de proposta baseado no time responsável.{{flow}} (todo o contexto do fluxo)true
BUC - Utils - Store Analytics Event14-jump---envia-evento-campaign.message.receivedArmazenar evento de message.received{"event_type": "campaign.message.received", "correlation_id": "...", "payload": {...}}true
BUC - Utils - Store Analytics Event14b-jump---envia-evento.campaign.message.sentArmazenar evento de message.sent{"event_type": "campaign.message.sent", "correlation_id": "...", "payload": {...}}true
BUC - Utils - Store Analytics Event15-jump---envia-evento-campaign.message.engagedArmazenar evento de message.engaged{"event_type": "campaign.message.engaged", "correlation_id": "...", "payload": {...}}true

Webhooks / APIs

Lead Input (N8N)

  • EndpointPOST https://n8n.konsi.dev/webhook/lead-input/hyperflow-unified-lead

  • Query Params: N/A

  • 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)

  • EndpointPOST https://n8n.konsi.dev/webhook/hyperflow/error

  • Query Params: N/A

  • 21a-request---enviar-erro-para-slack23b-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 esperada200 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_commissionflow.equipeflow.produtoflow.touch_levelflow.engagement_typeflow.correlation_idflow.protocol, diversas propriedades do lead (namecpfphone, etc.), deal_id e protocolo_da_conversa_hf no HubSpot.
  • Eventos registrados: campaign.message.receivedcampaign.message.engaged, potenialmente outros eventos iniciados pelos Jumps.
  • Status do atendimento: Encerrado (Sucesso via 23c-finish-attendance---sucesso).
  • Escala para humano: Sim (implicitamente, pelo rótulo Interessado e 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.receivedcampaign.message.engaged, potenialmente outros eventos iniciados pelos Jumps.
  • Status do atendimento: Encerrado (Não resolvido via 24b-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:

  1. 19b-conditional-validacao-hubspot detecta input.body.cpf como undefined ou null (lead não encontrado/inválido).
  2. 19b-conditional-validacao-hubspot avalia Senão (caso não caia em nenhuma das condições específicas).
  3. 22b-conditional---criacao-bloqueada detecta flow.creation_blocked como true (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)

EventoMomentoPayload
campaign.message.received14-jump---envia-evento-campaign.message.receivedApó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.engaged15-jump---envia-evento-campaign.message.engagedApó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.sent14b-jump---envia-evento.campaign.message.sentApó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ótuloCondiçãoSignificado
Interessado, RCS16-label---interessado-rcsSempre após campaign.message.engagedIndica que o cliente demonstrou interesse na campanha RCS e está seguindo para interação via chat.
Error lead input - BUER20a-rotulo---error-lead-inputQuando 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étricaValorDescrição
Tempo de inatividade1440 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ção 18-request. É fundamental que o endpoint n8n.konsi.dev/webhook/lead-input/hyperflow-unified-lead mantenha 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 para cpf == undefined || cpf == null deve idealmente ser avaliada antes de tentar acessar campos aninhados como input.body.hubspot.deal_created para evitar erros de referência se input.body não estiver totalmente preenchido.
  • 22b-conditional---criacao-bloqueada: Este nó lida especificamente com a propriedade flow.creation_blocked que vem da resposta do lead-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 um deal_id válido. A Lógica de deal_id ?? existing_deal_id no 20b-flow-variable tenta mitigar problemas de deal_id ausente.

Troubleshooting

Erros Comuns

ErroCausa ProvávelSolução
Error lead input - BUERinput.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 InactivityA 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 HubSpotFalha 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 input e output dos nós.
  • N8N: Logs do workflow lead-input e hyperflow/error.
  • HubSpot: Logs de atividades da API em CRM > Relatórios > Integrações de Dados > Histórico de API.

Changelog

DataVersãoAlteraçãoAutor
2023-11-201.0Documento 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]

33 items under this folder.