transbordo-app

Visão Geral

Subfluxo-módulo da sequência de fluxos ‘Disparo Qualificação WhatsApp’. Usado para comunicações low-touch, envia um template com link de acesso ao app. Implementa estratégia de recuperação do lead via mensagens automáticas e CTAs para o aplicativo antes de escalar para atendimento humano.

Objetivo

Reduzir custos operacionais de atendimento humano através de automação inteligente que:

  1. Identifica leads inativos após 23 horas sem interação
  2. Envia CTAs direcionando para o aplicativo
  3. Verifica se já existe acompanhamento ativo nas últimas 23 horas
  4. Escala para atendimento humano apenas quando necessário (com intenção de compra e sem acompanhamento ativo)

Diagrama de Fluxo

graph TD
    A[1-flow--salvar-variaveis-do-csv<br/>Flow Variables] --> B[2-start-inactivity<br/>Start Inactivity]
    B --> C{3-conditional-low-ou-tech<br/>is_weekend == sim?}
    C -->|Sim| D[4-rotulo-low-touch<br/>Label: Low Touch - Interessado]
    D --> E[5-flow-app_cta_message_slug<br/>Flow Variables]
    E --> F[6-jump-send event chat.app_cta.sent<br/>Jump: Store Analytics Event]
    F --> G[7-start-inactivity---23-horas<br/>Start Inactivity: 1380 min]
    G --> H[8a-chat---va-pro-app<br/>Chat: Proposta te espera]
    G --> I[8b-request-procurar-acompanhamento<br/>HTTP Request]
    H --> J[9a-rotulo---low-touch-respondeu<br/>Label: Low Touch - Respondeu]
    I --> K[9b-end-inactivity<br/>End Inactivity]
    J --> L[10a-flow-variable----answer-message<br/>Flow Variables]
    K --> M{10b-conditional---criou-acompanhamento<br/>deals.length >= 1?}
    L --> N[11a-jump---classificar-interacao-app-cta<br/>Jump: Classificar Interacao]
    M -->|Sim| O[11b-finish-attendance---criou-acompanhamento<br/>Finish Attendance]
    M -->|Nao| P[11c-jump---send-event-chat.conversation.transferred<br/>Jump: Store Analytics Event]
    N --> Q[12a-flow-variable---classification<br/>Flow Variables]
    O --> R[12b-rotulo---acompanhamento-low-touch<br/>Label: Acompanhamento Low Touch]
    P --> S[12c-request-update-inatividade-lowtouch<br/>HTTP Request]
    Q --> T[13a-jump---send-event-chat.app_cta.engaged<br/>Jump: Store Analytics Event]
    R --> U[13b-end-flow<br/>End Flow]
    S --> V[13c-end-flow<br/>End Flow]
    T --> W[14a-chat---reforcar-acesse-o-app-e-finalizacao<br/>Chat: Acesse o app]
    W --> X[15a-jump---send-event chat.conversation.ended<br/>Jump: Store Analytics Event]
    X --> Y[16-end-inactivity<br/>End Inactivity]

Variáveis do Fluxo

Variáveis de Entrada (Input)

VariávelOrigemTipoObrigatórioDescriçãoUso no Fluxo
deal_idinput.deal_idstringSimID do negócio no HubSpotIdentificação do negócio em todas as requisições e eventos de analytics
transfer_reasoninput.transfer_reasonstringNão (default: ”)Motivo da transferênciaEnviado em eventos de analytics quando há transferência
owner_emailinput.owner_emailstringNãoEmail do proprietário do negócio no HubSpotUsado para identificar se já há proprietário atribuído
owner_idinput.owner_idstringNãoID do proprietário no HubSpotIdentificação do responsável pelo negócio
owner_nameinput.owner_namestringNãoNome do proprietárioUsado para personalização de mensagens
is_aiinput.aibooleanNão (default: false)Indica se é atendimento por IAFlag para diferenciar atendimento automático vs humano
correlation_idinput.correlation_idstringSimID de correlação para rastreamentoUsado em todos os eventos de analytics para rastreabilidade
greetinginput.greetingbooleanNão (default: true)Define se deve enviar saudaçãoControla se mensagem inicial é enviada
is_weekendinput.is_weekendstringSimIndica se é final de semana (‘sim’/‘não’)Decisão de roteamento: low touch vs tech touch
cpfuser.cpfstringSimCPF do usuárioUsado para buscar deals relacionados nas últimas 15h

Variáveis Internas (Flow Variables)

VariávelCriada emTipoFonteDescriçãoDependências
app_cta_message_slugNó 5stringHardcodedSlug da mensagem de CTA: ‘proposta-app-contrate-tire-duvidas-v1’Usado em eventos de analytics
answer_messageNó 10astringinput.textTexto da resposta do usuário ao chatEnviado para classificação de interação
classificationNó 12astringinput.classificationClassificação retornada pelo fluxo de IAResultado da análise da resposta do usuário

Variáveis do Usuário (User Context)

VariávelOrigemTipoDescriçãoUso no Fluxo
user.cpfContexto do usuáriostringCPF do usuário logadoBusca de deals relacionados
user.nameContexto do usuáriostringNome completo do usuárioPersonalização de mensagens (primeiro nome extraído via split)
user.phoneContexto do usuáriostringTelefone do usuárioEnviado em eventos de analytics
user.receiverContexto do usuáriostringCanal de recebimento (formato: ‘canal|dados’)Extração do canal via split

Variáveis Computadas

ExpressãoLocal de UsoTipo ResultanteDescrição
user.name.split(" ")[0]Nós 8a, 14astringExtrai primeiro nome do usuário para personalização
user.receiver.split("|")[0]Variável channel (não usada neste fluxo)stringExtrai canal de comunicação
input.body.deals.lengthNó 10bnumberQuantidade de deals encontrados na verificação

Propriedades do HubSpot Manipuladas

PropriedadeAçãoValorNó ResponsávelFluxo Relacionado
inatividade_lowtouchUPDATEtrue12c-request-update-inatividade-lowtouchDispara: hook-atualizar-inatividade-lowtouch
cpf_unico_syncREAD-8b-request-procurar-acompanhamentoVia webhook cpf-deals-konsigleads
fup_idREAD-8b-request-procurar-acompanhamentoVerifica existência de follow-up
createdateREAD-8b-request-procurar-acompanhamentoFiltro: últimas 15 horas

Entrada (Input)

Estrutura Esperada

{
  "deal_id": "string",
  "transfer_reason": "string | undefined",
  "owner_email": "string | undefined",
  "owner_id": "string | undefined", 
  "owner_name": "string | undefined",
  "ai": "boolean | undefined",
  "correlation_id": "string",
  "greeting": "boolean | undefined",
  "is_weekend": "string",
  "user": {
    "cpf": "string",
    "name": "string",
    "phone": "string"
  }
}

Validações

  • deal_id: Obrigatório
  • correlation_id: Obrigatório
  • is_weekend: Deve ser “sim” para seguir para Low Touch
  • user.cpf: Obrigatório para busca de acompanhamentos

Fluxo Detalhado

Fase 1: Inicialização

Nós: 1-flow--salvar-variaveis-do-csv2-start-inactivity

Ações:

  1. Captura todas as variáveis de entrada do fluxo
  2. Salva no contexto de flow variables
  3. Inicia monitoramento de período de inatividade de 24 dia

Variáveis criadas:

  • flow.deal_id
  • flow.transfer_reason
  • flow.owner_email
  • flow.owner_id
  • flow.owner_name
  • flow.is_ai
  • flow.correlation_id
  • flow.greeting
  • flow.is_weekend
  • flow.cpf

Fase 2: Classificação de Estratégia

Nós: 3-conditional-low-ou-tech 4-rotulo-low-touch

Condição: flow.is_weekend == "sim"

Decisão:

  • TRUE: Segue para estratégia Low Touch (documentado neste fluxo)
  • FALSE: Estratégia Tech Touch (ramificação não documentada)

Ação:

  • Aplica rótulo: “Low Touch - Interessado”

Fase 3: Preparação do CTA

Nós: 5-flow-app_cta_message_slug6-jump-send event chat.app_cta.sent

Ações:

  1. Define slug da mensagem de CTA
  2. Registra evento de analytics indicando envio de CTA

Variáveis criadas:

  • flow.app_cta_message_slug = "proposta-app-contrate-tire-duvidas-v1"

Evento registrado:

{
  "event_type": "chat.app_cta.sent",
  "correlation_id": "{{flow.correlation_id}}",
  "deal_id": "{{flow.deal_id}}",
  "payload": {
    "flow_slug": "{{flow.flow_slug}}",
    "user_phone": "{{user.phone}}",
    "app_cta_message_slug": "{{flow.app_cta_message_slug}}",
    "template": "{{flow.template}}"
  }
}

Fluxo chamado: BUC - Utils - Store Analytics Event


Fase 4: Espera e Bifurcação (23 horas)

: 7-start-inactivity---23-horas

Configuração: Aguarda 1380 minutos (23 horas) de inatividade

Bifurcação: Após o período, dispara 2 processos paralelos


Branch A: Interação com Cliente

Nó 8a: Envio de Mensagem

Tipo: Chat Aguarda resposta: Sim

Conteúdo:

{{user.name.split(" ")[0]}}, sua proposta te espera! 🚀
Contrate e tire suas dúvidas direto no app! 😉📱

Botão: “Acessar app Konsi” (deep link para o app)

Variáveis usadas:

  • user.name (extraído primeiro nome)

Nó 9a: Rotulagem de Resposta

Condição: Usuário respondeu ao chat

Ação: Aplica rótulo “Low Touch - Respondeu”


Nó 10a: Captura da Resposta

Tipo: Flow Variables

Variável criada:

  • flow.answer_message = input.text

Fonte: Mensagem enviada pelo usuário no chat


Nó 11a: Classificação da Resposta

Tipo: Jump (chamada de fluxo externo)

Fluxo chamado: BUER - Classificar Interacao App CTA

Dados enviados:

{
  "answer_message": "{{flow.answer_message}}"
}

Retorno esperado:

  • input.classification (string)

Nó 12a: Salvamento da Classificação

Tipo: Flow Variables

Variável criada:

  • flow.classification = input.classification

Nó 13a: Registro de Engajamento

Tipo: Jump

Fluxo chamado: BUC - Utils - Store Analytics Event

Evento registrado:

{
  "event_type": "chat.app_cta.engaged",
  "correlation_id": "{{flow.correlation_id}}",
  "deal_id": "{{flow.deal_id}}",
  "payload": {
    "flow_slug": "{{flow.flow_slug}}",
    "user_phone": "{{user.phone}}",
    "app_cta_message_slug": "{{flow.app_cta_message_slug}}",
    "classification": "{{flow.classification}}",
    "channel": "{{flow.channel_on}}"
  }
}

Nó 14a: Reforço do CTA

Tipo: Chat Aguarda resposta: Não

Conteúdo:

{{user.name.split(" ")[0]}}, para tirar dúvidas sobre sua proposta, 
acesse o app Konsi e fale com nosso suporte! 😉📱

Botão: “Acessar app Konsi”


Nó 15a: Finalização da Conversa

Tipo: Jump

Fluxo chamado: BUC - Utils - Store Analytics Event

Evento registrado:

{
  "event_type": "chat.conversation.ended",
  "correlation_id": "{{flow.correlation_id}}",
  "payload": {
    "flow_slug": "{{flow.flow_slug}}",
    "user_phone": "{{user.phone}}",
    "channel": "{{flow.channel_on}}"
  }
}

Nó 16: Fim de Inatividade

Tipo: End Inactivity

Ação: Encerra monitoramento de inatividade


Branch B: Verificação de Acompanhamento

Nó 8b: Busca de Deals Recentes

Tipo: HTTP Request

Requisição:

  • Método: GET
  • URL: https://webhook.kloudbr.net/webhook/cpf-deals-konsigleads?cpf={{flow.cpf}}

Propósito: Verifica se o CPF possui negócios criados nas últimas 15 horas com fup_id preenchido

Variáveis usadas:

  • flow.cpf

Fluxo relacionado: hook-deals-hs-por-cpf-ultimas-23h

Resposta esperada:

{
  "deals": ["deal_id_1", "deal_id_2", ...]
}

Nó 9b: Fim de Inatividade

Tipo: End Inactivity

Ação: Encerra monitoramento antes da decisão


Nó 10b: Decisão de Escalação

Tipo: Condition

Condição: input.body.deals.length >= 1

Variável avaliada:

  • input.body.deals.length (quantidade de deals encontrados)

Decisões:

  • TRUE: Já existe acompanhamento ativo → Finaliza sem escalar
  • FALSE: Não existe acompanhamento → Escala para humano

Branch B1: Existe Acompanhamento (TRUE)

Nó 11b: Finalização de Atendimento

Tipo: Finish Attendance

Ação: Marca atendimento como concluído


Nó 12b: Rotulagem

Tipo: Label

Ação: Aplica rótulo “Acompanhamento Low Touch”


Nó 13b: Fim do Fluxo

Tipo: End Flow

Ação: Encerra fluxo sem mais ações


Branch B2: Não Existe Acompanhamento (FALSE)

Nó 11c: Registro de Transferência

Tipo: Jump

Fluxo chamado: BUC - Utils - Store Analytics Event

Evento registrado:

{
  "event_type": "chat.conversation.transferred",
  "correlation_id": "{{flow.correlation_id}}",
  "deal_id": "{{flow.deal_id}}",
  "payload": {
    "flow_slug": "{{flow.flow_slug}}",
    "user_phone": "{{user.phone}}",
    "app_cta_message_slug": "{{flow.app_cta_message_slug}}",
    "classification": "{{flow.classification}}",
    "channel": "{{flow.channel_on}}",
    "transfer_reason": "low touch inatividadade 15h"
  }
}

Nó 12c: Marcação para Distribuição

Tipo: HTTP Request

Requisição:

  • Método: POST
  • URL: https://webhook.kloudbr.net/webhook/update-inatividade_lowtouch
  • Body:
{
  "dealId": "{{flow.deal_id}}"
}

Propósito: Atualiza propriedade inatividade_lowtouch no HubSpot para true

Fluxo disparado: hook-atualizar-inatividade-lowtouch

Variáveis usadas:

  • flow.deal_id

Nó 13c: Fim do Fluxo

Tipo: End Flow

Ação: Encerra fluxo aguardando distribuição por outro workflow


Dependências Externas

Fluxos Chamados (Jumps)

FluxoPropósitoDados EnviadosRetorno Esperado
BUC - Utils - Store Analytics Event6, 13a, 11c, 15aRegistro de eventos de analyticsevent_type, correlation_id, deal_id, payloadtrue
BUER - Classificar Interacao App CTA11aClassificação de resposta do usuário via IAanswer_messageclassification (string)

Webhooks / APIs

Webhook: Busca de Deals por CPF

  • Endpoint: GET https://webhook.kloudbr.net/webhook/cpf-deals-konsigleads
  • Query Params: cpf={{flow.cpf}}
  • : 8b-request-procurar-acompanhamento
  • Fluxo relacionado: hook-deals-hs-por-cpf-ultimas-23h
  • Resposta:
{
  "deals": ["deal_id_1", "deal_id_2"]
}
  • Critérios de busca (realizados pelo webhook):
    • cpf_unico_sync == cpf
    • createdate >= Date.now() - 15 horas
    • fup_id HAS_PROPERTY

Webhook: Atualização de Inatividade

  • Endpoint: POST https://webhook.kloudbr.net/webhook/update-inatividade_lowtouch
  • : 12c-request-update-inatividade-lowtouch
  • Fluxo disparado: hook-atualizar-inatividade-lowtouch
  • Body:
{
  "dealId": "{{flow.deal_id}}"
}
  • Ação resultante: Atualiza properties.inatividade_lowtouch = true no HubSpot

Fluxos Relacionados (Não Chamados Diretamente)

FluxoTipo de RelaçãoDescrição
hook-atualizar-inatividade-lowtouchDisparado por webhookAtualiza propriedade inatividade_lowtouch no HubSpot após requisição do nó 12c
hook-deals-hs-por-cpf-ultimas-23hImplementa webhookProcessa requisição GET do nó 8b, retornando deals filtrados
distribuicao-times-inatividade-low-touchDisparado por gatilho HubSpotAcionado quando propriedade inatividade_lowtouch = true, distribui para times

Saída (Output)

Cenários de Finalização

Cenário 1: Cliente Respondeu ao CTA

Caminho: Branch A completo

Estado final:

  • Rótulo aplicado: “Low Touch - Respondeu”
  • Interação classificada via IA
  • Eventos registrados:
    • chat.app_cta.sent
    • chat.app_cta.engaged
    • chat.conversation.ended
  • Conversa encerrada
  • Não escala para humano

Variáveis finais:

  • flow.answer_message: texto da resposta
  • flow.classification: classificação da IA

Cenário 2: Já Possui Acompanhamento Ativo

Caminho: Branch B → TRUE

Estado final:

  • Rótulo aplicado: “Acompanhamento Low Touch”
  • Evento registrado:
    • chat.app_cta.sent
  • Atendimento finalizado
  • Não escala para humano
  • Não envia mensagem adicional

Condição: deals.length >= 1 (encontrou deals recentes com fup_id)


Cenário 3: Sem Acompanhamento - Escala para Humano

Caminho: Branch B → FALSE

Estado final:

  • Propriedade HubSpot alterada: inatividade_lowtouch = true
  • Eventos registrados:
    • chat.app_cta.sent
    • chat.conversation.transferred
  • Aguarda distribuição por: distribuicao-times-inatividade-low-touch
  • Fluxo encerrado
  • Lead será atribuído a um atendente humano

Condição: deals.length == 0 (não encontrou deals recentes com fup_id)

Transfer reason: “low touch inatividadade 15h”

Eventos de Analytics

Eventos Sempre Disparados

EventoMomentoPayload
chat.app_cta.sent6Após rotulagem inicialflow_slug, user_phone, app_cta_message_slug, template

Eventos Condicionais

EventoCondiçãoPayload Adicional
chat.app_cta.engagedUsuário respondeu13aclassification, channel
chat.conversation.endedUsuário respondeu15achannel
chat.conversation.transferredSem acompanhamento11cclassification, channel, transfer_reason

Rótulos Aplicados

RótuloCondiçãoSignificado
Low Touch - Interessado4Sempre (se is_weekend == ‘sim’)Lead classificado para estratégia low touch
Low Touch - Respondeu9aUsuário respondeu ao chatLead demonstrou engajamento
Acompanhamento Low Touch12bJá possui deal recente com fup_idLead já está sendo acompanhado

Métricas e Tempos

MétricaValorDescrição
Tempo de espera inicialNão especificadoNó 2-start-inactivity
Tempo de espera principal1380 minutos (23 horas)Nó 7-start-inactivity-23-horas
Janela de verificação de acompanhamento15 horasCritério na busca de deals
Timeout de resposta do usuárioNão especificadoConfigurado no nó 8a

Notas Técnicas

Sobre Variáveis de Usuário

  • user.cpf: Deve estar no formato esperado pelo HubSpot (cpf_unico_sync).

Sobre Condições

  • is_weekend: Espera string “sim”, não booleano. Qualquer outro valor cai no branch FALSE (não documentado).
  • deals.length >= 1: Array vazio retorna 0, considerado como “sem acompanhamento”.

Sobre Sincronicidade

  • Branches A e B são paralelos: usuário pode responder enquanto verificação ocorre.
  • Não há tratamento explícito para quando ambos os branches concluem.
  • URLs do app Konsi usam Adjust para tracking:
    • Campaign: whatsapp
    • Adgroup: buer_disparo_cs_v3
    • Creative: low_ticket

Limitações Identificadas

  1. Não há retry em caso de falha nas requisições HTTP
  2. Não há validação de formato do CPF antes da busca

Changelog

DataVersãoAlteraçãoAutor
2024-01-151.0Documentação inicial do fluxo[Max]

27 items under this folder.