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:
- Identifica leads inativos após 23 horas sem interação
- Envia CTAs direcionando para o aplicativo
- Verifica se já existe acompanhamento ativo nas últimas 23 horas
- 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ável | Origem | Tipo | Obrigatório | Descrição | Uso no Fluxo |
|---|---|---|---|---|---|
deal_id | input.deal_id | string | Sim | ID do negócio no HubSpot | Identificação do negócio em todas as requisições e eventos de analytics |
transfer_reason | input.transfer_reason | string | Não (default: ”) | Motivo da transferência | Enviado em eventos de analytics quando há transferência |
owner_email | input.owner_email | string | Não | Email do proprietário do negócio no HubSpot | Usado para identificar se já há proprietário atribuído |
owner_id | input.owner_id | string | Não | ID do proprietário no HubSpot | Identificação do responsável pelo negócio |
owner_name | input.owner_name | string | Não | Nome do proprietário | Usado para personalização de mensagens |
is_ai | input.ai | boolean | Não (default: false) | Indica se é atendimento por IA | Flag para diferenciar atendimento automático vs humano |
correlation_id | input.correlation_id | string | Sim | ID de correlação para rastreamento | Usado em todos os eventos de analytics para rastreabilidade |
greeting | input.greeting | boolean | Não (default: true) | Define se deve enviar saudação | Controla se mensagem inicial é enviada |
is_weekend | input.is_weekend | string | Sim | Indica se é final de semana (‘sim’/‘não’) | Decisão de roteamento: low touch vs tech touch |
cpf | user.cpf | string | Sim | CPF do usuário | Usado para buscar deals relacionados nas últimas 15h |
Variáveis Internas (Flow Variables)
| Variável | Criada em | Tipo | Fonte | Descrição | Dependências |
|---|---|---|---|---|---|
app_cta_message_slug | Nó 5 | string | Hardcoded | Slug da mensagem de CTA: ‘proposta-app-contrate-tire-duvidas-v1’ | Usado em eventos de analytics |
answer_message | Nó 10a | string | input.text | Texto da resposta do usuário ao chat | Enviado para classificação de interação |
classification | Nó 12a | string | input.classification | Classificação retornada pelo fluxo de IA | Resultado da análise da resposta do usuário |
Variáveis do Usuário (User Context)
| Variável | Origem | Tipo | Descrição | Uso no Fluxo |
|---|---|---|---|---|
user.cpf | Contexto do usuário | string | CPF do usuário logado | Busca de deals relacionados |
user.name | Contexto do usuário | string | Nome completo do usuário | Personalização de mensagens (primeiro nome extraído via split) |
user.phone | Contexto do usuário | string | Telefone do usuário | Enviado em eventos de analytics |
user.receiver | Contexto do usuário | string | Canal de recebimento (formato: ‘canal|dados’) | Extração do canal via split |
Variáveis Computadas
| Expressão | Local de Uso | Tipo Resultante | Descrição | |
|---|---|---|---|---|
user.name.split(" ")[0] | Nós 8a, 14a | string | Extrai primeiro nome do usuário para personalização | |
user.receiver.split("|")[0] | Variável channel (não usada neste fluxo) | string | Extrai canal de comunicação | |
input.body.deals.length | Nó 10b | number | Quantidade de deals encontrados na verificação |
Propriedades do HubSpot Manipuladas
| Propriedade | Ação | Valor | Nó Responsável | Fluxo Relacionado |
|---|---|---|---|---|
inatividade_lowtouch | UPDATE | true | 12c-request-update-inatividade-lowtouch | Dispara: hook-atualizar-inatividade-lowtouch |
cpf_unico_sync | READ | - | 8b-request-procurar-acompanhamento | Via webhook cpf-deals-konsigleads |
fup_id | READ | - | 8b-request-procurar-acompanhamento | Verifica existência de follow-up |
createdate | READ | - | 8b-request-procurar-acompanhamento | Filtro: ú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óriocorrelation_id: Obrigatóriois_weekend: Deve ser “sim” para seguir para Low Touchuser.cpf: Obrigatório para busca de acompanhamentos
Fluxo Detalhado
Fase 1: Inicialização
Nós: 1-flow--salvar-variaveis-do-csv → 2-start-inactivity
Ações:
- Captura todas as variáveis de entrada do fluxo
- Salva no contexto de flow variables
- Inicia monitoramento de período de inatividade de 24 dia
Variáveis criadas:
flow.deal_idflow.transfer_reasonflow.owner_emailflow.owner_idflow.owner_nameflow.is_aiflow.correlation_idflow.greetingflow.is_weekendflow.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_slug → 6-jump-send event chat.app_cta.sent
Ações:
- Define slug da mensagem de CTA
- 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)
Nó: 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)
| Fluxo | Nó | Propósito | Dados Enviados | Retorno Esperado |
|---|---|---|---|---|
| BUC - Utils - Store Analytics Event | 6, 13a, 11c, 15a | Registro de eventos de analytics | event_type, correlation_id, deal_id, payload | true |
| BUER - Classificar Interacao App CTA | 11a | Classificação de resposta do usuário via IA | answer_message | classification (string) |
Webhooks / APIs
Webhook: Busca de Deals por CPF
- Endpoint:
GET https://webhook.kloudbr.net/webhook/cpf-deals-konsigleads - Query Params:
cpf={{flow.cpf}} - Nó: 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 == cpfcreatedate >= Date.now() - 15 horasfup_id HAS_PROPERTY
Webhook: Atualização de Inatividade
- Endpoint:
POST https://webhook.kloudbr.net/webhook/update-inatividade_lowtouch - Nó: 12c-request-update-inatividade-lowtouch
- Fluxo disparado: hook-atualizar-inatividade-lowtouch
- Body:
{
"dealId": "{{flow.deal_id}}"
}- Ação resultante: Atualiza
properties.inatividade_lowtouch = trueno HubSpot
Fluxos Relacionados (Não Chamados Diretamente)
| Fluxo | Tipo de Relação | Descrição |
|---|---|---|
| hook-atualizar-inatividade-lowtouch | Disparado por webhook | Atualiza propriedade inatividade_lowtouch no HubSpot após requisição do nó 12c |
| hook-deals-hs-por-cpf-ultimas-23h | Implementa webhook | Processa requisição GET do nó 8b, retornando deals filtrados |
| distribuicao-times-inatividade-low-touch | Disparado por gatilho HubSpot | Acionado 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.sentchat.app_cta.engagedchat.conversation.ended
- Conversa encerrada
- Não escala para humano
Variáveis finais:
flow.answer_message: texto da respostaflow.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.sentchat.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
| Evento | Nó | Momento | Payload |
|---|---|---|---|
chat.app_cta.sent | 6 | Após rotulagem inicial | flow_slug, user_phone, app_cta_message_slug, template |
Eventos Condicionais
| Evento | Condição | Nó | Payload Adicional |
|---|---|---|---|
chat.app_cta.engaged | Usuário respondeu | 13a | classification, channel |
chat.conversation.ended | Usuário respondeu | 15a | channel |
chat.conversation.transferred | Sem acompanhamento | 11c | classification, channel, transfer_reason |
Rótulos Aplicados
| Rótulo | Nó | Condição | Significado |
|---|---|---|---|
| Low Touch - Interessado | 4 | Sempre (se is_weekend == ‘sim’) | Lead classificado para estratégia low touch |
| Low Touch - Respondeu | 9a | Usuário respondeu ao chat | Lead demonstrou engajamento |
| Acompanhamento Low Touch | 12b | Já possui deal recente com fup_id | Lead já está sendo acompanhado |
Métricas e Tempos
| Métrica | Valor | Descrição |
|---|---|---|
| Tempo de espera inicial | Não especificado | Nó 2-start-inactivity |
| Tempo de espera principal | 1380 minutos (23 horas) | Nó 7-start-inactivity-23-horas |
| Janela de verificação de acompanhamento | 15 horas | Critério na busca de deals |
| Timeout de resposta do usuário | Não especificado | Configurado 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.
Sobre Deep Links
- URLs do app Konsi usam Adjust para tracking:
- Campaign:
whatsapp - Adgroup:
buer_disparo_cs_v3 - Creative:
low_ticket
- Campaign:
Limitações Identificadas
- Não há retry em caso de falha nas requisições HTTP
- Não há validação de formato do CPF antes da busca
Changelog
| Data | Versão | Alteração | Autor |
|---|---|---|---|
| 2024-01-15 | 1.0 | Documentação inicial do fluxo | [Max] |