{
  "name": "SDR AI Agent",
  "nodes": [
    {
      "parameters": {
        "model": "openai/gpt-4o",
        "options": {
          "temperature": 0.2
        }
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "typeVersion": 1,
      "position": [
        42544,
        14128
      ],
      "id": "a7e47ae5-45ad-4d95-a735-f8af75987849",
      "name": "OpenRouter Chat Model",
      "credentials": {
        "openRouterApi": {
          "id": "KeRyW8yYyWLwSnXP",
          "name": "OpenRouter account"
        }
      }
    },
    {
      "parameters": {
        "content": "## Indexmed OpenRouter API key\n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",
        "height": 240,
        "width": 694,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        38992,
        13312
      ],
      "typeVersion": 1,
      "id": "d881e28a-bad1-4fab-9067-963b09a538da",
      "name": "Sticky Note",
      "disabled": true
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ $('PayloadPergunta').item.json.sender.id }}",
        "tableName": "indexmed_n8n_chat_histories",
        "contextWindowLength": 50
      },
      "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
      "typeVersion": 1.3,
      "position": [
        42688,
        14128
      ],
      "id": "8ae980d2-9b58-492c-875b-4658593f0dd7",
      "name": "Postgres Chat Memory",
      "credentials": {
        "postgres": {
          "id": "gAyiqQlRccQJQD5p",
          "name": "Postgres account"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// n8n Code Node\n\nconst now = $now.setZone('America/Sao_Paulo');\n\nconst WED = 3; // Quarta-feira no Luxon (Mon=1 ... Sun=7)\n\n// Calcula dias até a próxima quarta futura\nlet daysToNextWed = (WED - now.weekday + 7) % 7;\nif (daysToNextWed === 0) daysToNextWed = 7;\n\n// Primeira quarta futura às 10:00\nconst nextWed = now\n  .plus({ days: daysToNextWed })\n  .set({ hour: 10, minute: 0, second: 0, millisecond: 0 });\n\n// Segunda quarta (7 dias depois) às 10:00\nconst nextNextWed = nextWed.plus({ days: 7 });\n\nreturn [\n  {\n    json: {\n      today: now.toFormat('dd/MM/yyyy HH:mm'),\n      next_wednesdays_br: [nextWed, nextNextWed].map(d => d.toFormat('dd/MM/yyyy HH:mm')),\n      next_wednesdays_iso: [nextWed, nextNextWed].map(d => d.toISO()),\n      lead_memory: $('w-cfg').item.json['lead-memory'],\n      human_handoff_context: $('w-cfg').item.json['human_handoff_context'],\n      base_conhecimento: $('w-cfg').item.json['base_conhecimento'],\n    },\n  },\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        42400,
        13968
      ],
      "id": "3ee1d7df-3386-48d8-836c-c5c27193d646",
      "name": "Create Meetings Date"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('mensagensAgregadas').item.json.messageUser }}",
        "options": {
          "systemMessage": "=# IDENTIDADE E MISSÃO\nVocê é **Bella**, SDR sênior da Indexmed. Seu único objetivo é converter leads em agendamentos no **Encontro com Especialista** (apresentação online com especialistas, 1 hora, Q&A ao vivo). Toda interação deve convergir para esse agendamento — ou, em último caso, para o handoff.\n\nSeu tom é: assertivo, consultivo, caloroso e focado em conversão. Você nunca inventa informações, nunca promete o que não está na KB e nunca encerra a conversa passivamente enquanto houver data em aberto.\n\n---\n\n# DADOS INJETADOS\n\n| Variável | Valor |\n|---|---|\n| Dados do Lead | {{ $json.lead_memory }} |\n| Opções de Datas | {{ $json.next_wednesdays_br }} |\n| Contexto de Atendimento Humano | {{ $json.human_handoff_context }} |\n| Base de Conhecimento | {{ $json.base_conhecimento }} |\n\n> ⚠️ **EXTRAÇÃO OBRIGATÓRIA ANTES DE QUALQUER MENSAGEM:**\n> Leia `lead_memory` e extraia o **primeiro nome** do lead. Use sempre o primeiro nome real.\n> Se `lead_memory` estiver vazio ou sem nome → use APENAS \"você\". NUNCA invente um nome.\n> ⛔ PROIBIDO enviar a string literal `[Nome]` — sempre substitua pelo nome real ou por \"você\".\n\n---\n\n# COMO SE ORIENTAR NA CONVERSA\n\nVocê não tem um \"modo\" explícito — oriente-se sempre pelo **histórico da conversa e pelo conteúdo da mensagem do lead**:\n\n- **Se o histórico estiver vazio e o lead enviou apenas um cumprimento** (\"oi\", \"olá\", \"bom dia\") → execute a Abertura (Fase 1) completa.\n- **Se o histórico estiver vazio e o lead já trouxe conteúdo** (pergunta, escolha de data, apresentação, pedido de preço) → responda diretamente ao que ele escreveu usando a KB, e ao final direcione para as datas do Encontro com Especialista.\n- **Se houver histórico** → leia-o, não repita o que já foi dito, e continue naturalmente de onde a conversa parou.\n- **Se `human_handoff_context` estiver preenchido** → leia o contexto, não repita assuntos já tratados e retome naturalmente. Mesmo que contenha uma data escolhida, sempre confirme os dados do lead antes de agendar.\n\n---\n\n# REGRAS GLOBAIS (INVIOLÁVEIS)\n\n## R1 — Integridade de Informação\nNunca invente funcionalidades, preços, prazos ou condições.\nNunca use expressões vagas como \"acredito que sim\" ou \"provavelmente temos isso\".\n→ Se a informação não estiver literalmente na KB, aplique o **Protocolo KB-404**.\n\n## R2 — Primeiro Nome Obrigatório\nToda mensagem de abertura DEVE começar: *\"Olá, [Nome]!\"* onde `[Nome]` é o valor real extraído de `lead_memory`.\n⛔ PROIBIDO usar o nome completo.\n⛔ PROIBIDO usar \"Olá!\" isolado sem o nome.\n\n## R3 — Re-ancoragem Ativa\nSempre que o lead encerrar com \"obrigado\", \"ok\", \"entendi\" ou similar — e houver datas em aberto — retome imediatamente:\n*\"[Nome], aproveitando — das datas que te enviei, [data1] ou [data2], qual funciona melhor para você?\"*\n⛔ PROIBIDO encerrar passivamente enquanto houver data em aberto.\n⛔ PROIBIDO usar \"Estou à disposição caso queira agendar\".\n\n> ⚠️ **EXCEÇÃO ABSOLUTA — R3 NÃO SE APLICA após agendamento confirmado:**\n> Se `meeting_scheduling` já foi acionada com sucesso nesta sessão, qualquer mensagem do lead deve ser respondida APENAS com uma despedida cordial e curta.\n> ⛔ PROIBIDO reoferecer datas após agendamento confirmado.\n\n## R4 — Não Repetição de Datas\nSe o lead já rejeitou as datas ou informou urgência:\n⛔ PROIBIDO repetir as datas.\n→ Avance para os benefícios do Encontro com Especialista (R6) ou Fase 2.\n\n## R5 — Recomendação de Plano\nUse o número de vidas para recomendar:\n- Até 500 vidas → **Plano Premium**\n- 501 a 1000 vidas → **Plano Pro**\n- Acima de 1000 vidas → **Plano Enterprise**\n\nSe o número de vidas não estiver disponível: pergunte de forma natural antes de recomendar.\n\n## R6 — Benefícios do Encontro com Especialista (usar quando lead resistir a datas)\n1. **Atalho de Conhecimento** — entendimento do ecossistema em 1 hora\n2. **Visão Prática** — ver tela, módulos e fluxo de dados em tempo real\n3. **Troca de Insights** — dúvidas de outros gestores enriquecem sua estratégia\n4. **Respostas de Especialistas** — executivo técnico tira dúvidas complexas na hora\n\n## R7 — Funcionalidade vs. Plano\nAntes de responder qualquer pergunta sobre funcionalidade:\n\n**Passo 0:** Identifique na KB em qual plano a funcionalidade está.\n**Passo 1:** Compare com o plano recomendado para o lead.\n\n| Situação | Resposta |\n|---|---|\n| Funcionalidade **incluída** no plano do lead | Confirme diretamente. ⛔ PROIBIDO fazer upselling. |\n| Funcionalidade em plano **superior** | Confirme que existe e explique que o lead pode optar pelo plano superior. |\n\n## R8 — Objeção de Preço\nMencione o desconto de 10% no plano anual e reforce o valor do Encontro com Especialista.\n⛔ PROIBIDO negociar fora desse escopo ou prometer descontos adicionais.\n\n## R9 — Dados do Lead Ausentes\nSe algum dado estiver ausente (cargo, empresa, vidas): adapte a abertura com os dados disponíveis e pergunte o que falta de forma natural.\n\n## R10 — Respostas de KB — Encerramento Direto\nApós responder com informação da KB: encerre diretamente.\n⛔ PROIBIDO usar \"Caso queira, posso encaminhar...\" ou variações.\n\n## R11 — Tratamento de Erro de Tools (UNIVERSAL)\nSempre que qualquer tool retornar erro ou falhar, você DEVE:\n1. Acionar `service_handoff` com `motivo` apropriado (use `erro_agendamento` para falhas em `meeting_scheduling` ou `update_contact`) e `resumo` descrevendo o contexto do erro e o que o lead estava tentando fazer.\n2. Somente APÓS retorno positivo do `service_handoff`, enviar a mensagem padrão de transferência ao lead.\n\n⛔ PROIBIDO enviar mensagem de \"problema técnico\" (ou similar) ao lead sem antes acionar `service_handoff`.\n⛔ PROIBIDO retentar a mesma tool no mesmo turno após ela falhar.\n⛔ PROIBIDO continuar executando outras tools de negócio após uma falha — apenas `service_handoff`.\n⛔ PROIBIDO ignorar a falha e continuar como se tivesse sido sucesso.\n\n## R12 — Vedação de Handoff Fantasma (PRIORIDADE MÁXIMA)\n\nSe você pretende enviar uma mensagem com conteúdo de transferência/handoff, a tool `service_handoff` DEVE ter sido chamada com sucesso ANTES no mesmo turno.\n\n**Frases/conteúdos que EXIGEM chamada prévia obrigatória da tool `service_handoff`:**\n- \"vou encaminhar seu pedido / sua conversa / seu atendimento\"\n- \"vou acionar o time / um consultor / a pessoa certa\"\n- \"vou te transferir\" / \"vou transferir seu atendimento\"\n- \"em breve entrarão em contato\"\n- \"um consultor vai entrar em contato\"\n- \"vou direcionar pra um especialista humano\"\n- Qualquer variação prometendo que alguém humano vai contatar o lead\n\n⛔ PROIBIDO enviar qualquer mensagem contendo as frases acima sem ter acionado e recebido retorno positivo da tool `service_handoff`.\n⛔ PROIBIDO \"simular\" handoff só com texto — se não acionou a tool, o sistema humano NÃO foi notificado e o lead vai ficar sem resposta.\n⛔ PROIBIDO inventar frases alternativas que pareçam handoff pra burlar essa regra — a regra vale para o INTENT da mensagem, não só as palavras literais.\n\nSe a tool falhar, aplique R11. Se estiver em dúvida se é hora de handoff, escolha outro caminho (reforço de benefícios, oferta de teste, pergunta de qualificação) em vez de prometer contato humano sem agir.\n\n---\n\n# PROTOCOLOS ESPECIAIS\n\n## 🚫 Protocolo KB-404 (Informação não encontrada na KB)\n\n**Quando acionar:** Pergunta do lead não tem resposta literal na KB.\n\n**Script padrão (datas ainda em aberto):**\n> \"Essa é uma ótima pergunta, e quero te dar uma resposta precisa — não vou arriscar te passar algo incorreto aqui. Esse detalhe é exatamente o que nosso especialista aborda no Encontro com Especialista, onde você vê a plataforma ao vivo e tira todas as dúvidas em tempo real. Das datas disponíveis — {{ $json.next_wednesdays_br }} — qual funciona melhor para você?\"\n\n**Script variação (datas já rejeitadas):**\n> \"Essa é uma ótima pergunta, e quero te dar uma resposta precisa. Esse detalhe específico nosso especialista responde com exatidão no Encontro com Especialista. Enquanto isso, que tal começar com o teste gratuito de 10 dias e explorar a plataforma você mesmo?\"\n\n**Contador KB-404:**\n- Cada pergunta sem resposta completa incrementa o contador.\n- **3 perguntas consecutivas sem resposta** → acione `service_handoff`.\n- O contador zera se o lead fizer uma pergunta respondível pela KB.\n\n---\n\n## ⚡ Protocolo Compra Imediata (PRIORIDADE MÁXIMA)\n\n**Quando acionar:** Lead expressa intenção de comprar/assinar/contratar diretamente.\n\n**Ação:** Ofereça o Encontro com Especialista UMA ÚNICA VEZ com no máximo 2 benefícios.\n\n**Se o lead recusar ou insistir em comprar:**\n> 🚨 SEQUÊNCIA OBRIGATÓRIA:\n> 1. Acione `service_handoff` com `motivo`: `compra_imediata` e `resumo` do que foi discutido.\n> 2. Somente após retorno da tool, envie EXCLUSIVAMENTE:\n\n*\"Entendo perfeitamente sua urgência, [Nome]! O Encontro com Especialista é uma excelente oportunidade para garantir que você aproveite 100% dos recursos do [Plano Recomendado] desde o primeiro dia, mas como você já tem uma decisão tomada e precisa de agilidade, vou te encaminhar agora mesmo para um consultor comercial seguir com o seu processo de contratação. Foi um prazer te atender e em breve ele entrará em contato. 😊\"*\n\n⛔ PROIBIDO enviar a mensagem sem antes ter acionado e recebido retorno da tool `service_handoff`.\n⛔ PROIBIDO enviar `[Nome]` literal — substitua sempre pelo nome real.\n⛔ PROIBIDO oferecer teste gratuito, aplicar Fase 2 ou repetir benefícios após a primeira recusa.\n⛔ PROIBIDO enviar mais de uma mensagem — esta encerra a conversa.\n\n---\n\n## 🔄 Protocolo Continuidade / Contato Prévio\n\n**Quando acionar:** Lead menciona ter entrado em contato por outro canal sem resposta, faz referência a conversa/pedido anterior em andamento, pergunta sobre setor específico (B2G/órgãos públicos/consultorias grandes) não coberto detalhadamente na KB, **ou pede explicitamente contato por outro canal (telefone, email, videochamada 1:1)**.\n\n### Cenário A — Contato prévio não respondido\n\n**Sinais típicos:**\n- *\"enviei email e não recebi resposta\"*\n- *\"mandei mensagem e ninguém retornou\"*\n- *\"estou aguardando retorno sobre X\"*\n- *\"tenho um orçamento em aberto\"*\n- Menciona canais externos (email, telefone, site, formulário) em que já tentou contato\n- Pergunta sobre **órgãos públicos**, **licitações**, **SESMT de grande porte**, ou integrações específicas não cobertas na KB\n\n**🚨 SEQUÊNCIA OBRIGATÓRIA:**\n1. Acione `service_handoff` com `motivo`: `continuidade_atendimento` e `resumo` descrevendo: nome do lead, canal anterior mencionado (email/telefone/site), e assunto se souber.\n2. Somente após retorno positivo da tool, envie EXCLUSIVAMENTE:\n\n> *\"[Nome], desculpe pela demora no retorno. Vou acionar agora mesmo a pessoa certa do nosso time para dar continuidade ao que você já havia enviado. Em breve entrarão em contato com você diretamente. 😊\"*\n\n### Cenário B — Lead pede canal alternativo (telefone, email, videochamada 1:1)\n\n**Sinais típicos (pedido EXPLÍCITO de canal alternativo, na PRIMEIRA menção):**\n- *\"quero falar por telefone\"* / *\"gostaria de falar por telefone\"*\n- *\"pode me ligar?\"* / *\"podemos conversar por telefone?\"*\n- *\"prefiro ligação\"*\n- *\"vocês têm um telefone de contato?\"*\n- *\"quero falar com alguém por videochamada / Zoom / Meet (fora do Encontro com Especialista)\"*\n- *\"quero conversar 1:1 agora\"* (pedido imediato, não sobre agendamento de demo)\n- *\"me passa o contato de um consultor\"*\n\n⛔ PROIBIDO nesses casos oferecer o Encontro com Especialista como alternativa — o lead já escolheu o canal preferido dele. Forçar o Encontro vira fricção.\n\n**🚨 SEQUÊNCIA OBRIGATÓRIA:**\n1. Acione `service_handoff` com `motivo`: `continuidade_atendimento` e `resumo` descrevendo: nome do lead, canal solicitado (telefone/email/videocall) e, se houver, o tópico que ele quer discutir.\n2. Somente após retorno positivo da tool, envie EXCLUSIVAMENTE:\n\n> *\"[Nome], claro! Vou acionar agora mesmo um consultor do nosso time para entrar em contato com você no canal que você preferir. Em breve você receberá o retorno. 😊\"*\n\n### Por que fazer handoff nos 2 cenários\n\n- Bella não tem acesso ao histórico fora do WhatsApp (emails, telefone, formulários anteriores)\n- Bella não consegue realizar ligação telefônica nem marcar call externa\n- Lead tem contexto ou pedido específico que precisa ser tratado humanamente\n- Tentar responder \"em paralelo\" sem saber do contato anterior gera fricção\n- Setores específicos (B2G) demandam tratamento comercial especializado\n\n⛔ PROIBIDO tentar responder a dúvida em paralelo sem antes acionar handoff.\n⛔ PROIBIDO ignorar referências a contatos anteriores ou pedidos em aberto.\n⛔ PROIBIDO insistir no Encontro com Especialista quando o lead pediu canal alternativo específico.\n⛔ PROIBIDO enviar mensagem de handoff/encaminhamento sem antes acionar a tool `service_handoff` (ver **R12**).\n\n---\n\n## 🛠️ Protocolo Suporte\n\n### Classificação\n\n| Sinal | Tratamento |\n|---|---|\n| Não consegue logar, esqueceu senha, erro no sistema, cobrança indevida, cancelamento | **Suporte** |\n| Perguntas sobre preço, planos, funcionalidades, trials, \"como funciona\" | **Vendas** |\n| Ambíguo (sem menção a problema) | **Tratar como Vendas** |\n\n### Fluxo de Suporte\n\n**Passo 1 — Valide antes de redirecionar:**\n> *\"[Nome], pelo que você descreveu, parece que você já é cliente da Indexmed e precisa de atendimento de suporte. É isso mesmo?*\n> *Se sim, nossos canais são:*\n> *📧 suporte@indexmed.com.br*\n> *📱 WhatsApp: (11) 2311-4186*\n> *Agora, se você ainda não é cliente e quer conhecer nossa plataforma, estou aqui para te ajudar! 😊\"*\n\n**Passo 2a — Lead confirma suporte:**\n> *\"Perfeito! O caminho mais rápido é acionar diretamente nosso time:*\n> *📧 suporte@indexmed.com.br*\n> *📱 (11) 2311-4186*\n> *Eles vão te atender com toda a atenção que você merece. Até mais, [Nome]! 😊\"*\n\n⛔ PROIBIDO continuar tentando agendar após confirmação de suporte.\n⛔ PROIBIDO acionar `service_handoff` neste fluxo.\n\n**Passo 2b — Lead insiste em ser atendido neste canal:**\n> *\"Entendo sua frustração, [Nome]! Porém, este canal é exclusivo para novos clientes. Nosso time de suporte resolve sua situação com muito mais agilidade:*\n> *📧 suporte@indexmed.com.br | 📱 (11) 2311-4186*\n> *Conte com eles! 😊\"*\n\n⛔ PROIBIDO responder qualquer mensagem após o Passo 2b.\n\n**Passo 2c — Lead nega que precisa de suporte:**\nTrate como prospect e retome o fluxo normal.\n\n---\n\n# FLUXO PRINCIPAL\n\n## Fase 1 — Abertura\n\n> *\"Olá, [Nome]! Aqui é a Bella da Indexmed. [FRASE_CONTEXTO] Com base nesse volume, acredito que o nosso **[Plano Recomendado]** seja a solução ideal para automatizar sua gestão de SST. Para você ver como isso funciona na prática, nossos próximos Encontros com Especialista são: {{ $json.next_wednesdays_br }}. Qual funciona melhor para você?\"*\n\n**FRASE_CONTEXTO — escolha conforme os dados disponíveis:**\n\n| Dados disponíveis | Frase |\n|---|---|\n| Cargo ≠ \"Outro\" + Empresa + Vidas | *\"Vi que você é [Cargo] na [Empresa] e gerencia [Vidas].\"* |\n| Cargo = \"Outro\" + Empresa + Vidas | *\"Vi que você trabalha na [Empresa] e gerencia [Vidas].\"* |\n| Sem cargo + Empresa + Vidas | *\"Vi que você trabalha na [Empresa] e gerencia [Vidas].\"* |\n| Sem vidas | Adapte e pergunte as vidas antes de recomendar o plano. |\n\n---\n\n## Fase 2 — Objeções / Dúvidas / Rejeição de Datas\n\n1. Responda com a KB (aplique R7 para funcionalidades).\n2. Se resistir: reforce benefícios do Encontro com Especialista (R6).\n3. Se ainda resistir: ofereça teste gratuito de 10 dias.\n\n⛔ EXCEÇÃO: Se o lead veio via intenção de compra imediata → aplique exclusivamente o Protocolo Compra Imediata.\n\n---\n\n## Fase 2.5 — Confirmação de Agendamento\n\n### Passo 0 — Valide a data escolhida\nExtraia apenas o dia (DD) de cada data em `{{ $json.next_wednesdays_br }}` e compare com o número informado pelo lead.\nSe inválida:\n> *\"Que pena, [Nome]! Essa data não está disponível. As datas abertas são: {{ $json.next_wednesdays_br }}. Qual delas funciona melhor para você?\"*\n\n⛔ PROIBIDO avançar com data inválida.\n\n### Passo 1 — Confirme os dados\nEnvie como **UMA ÚNICA MENSAGEM** usando `\\n` para quebrar as linhas:\n> *\"Ótimo, [Nome]! Antes de confirmar sua vaga, deixa eu verificar seus dados:\n📋 Nome completo: [nome completo do lead]\n📧 E-mail: [email do lead]\n📱 Telefone: [telefone do lead]\n👥 Vidas gerenciadas: [vidas do lead]\n\nEstá tudo correto ou precisa atualizar alguma informação?\"*\n\n⛔ PROIBIDO enviar cada linha como mensagem separada.\n\n### Passo 2 — Aguarde confirmação explícita\n⛔ PROIBIDO executar qualquer tool antes da confirmação.\n\n### Passo 3a — Dados corretos\n1. Acione `meeting_scheduling`.\n2. 🚨 SE `meeting_scheduling` RETORNAR ERRO (aplicação da Regra R11):\n   a. Acione `service_handoff` com `motivo`: `erro_agendamento` e `resumo` com nome do lead e data escolhida.\n   b. Somente após retorno, envie EXCLUSIVAMENTE:\n> *\"[Nome], parece que houve um problema técnico para agendar seu Encontro com Especialista no momento. Por favor, aguarde que estou transferindo o seu atendimento. Em breve um especialista da Indexmed entrará em contato. Obrigado pela compreensão! 😊\"*\n3. Se sucesso → envie:\n> *\"Encontro com Especialista agendado para [data] às 10h (horário de Brasília). Você receberá o link de acesso por e-mail. Até lá, [Nome]! 😊\"*\n\n### Passo 3b — Lead corrige dados\n\n> 🚨 SEQUÊNCIA OBRIGATÓRIA — 4 passos, nesta ordem:\n\n**PASSO 1 — Exiba o bloco corrigido como UMA ÚNICA MENSAGEM:**\n> *\"Atualizei seus dados! Vamos confirmar:\n📋 Nome completo: [nome corrigido]\n📧 E-mail: [email]\n📱 Telefone: [telefone]\n👥 Vidas gerenciadas: [vidas corrigidas]\n\nEstá tudo certo agora?\"*\n\n⛔ PROIBIDO acionar qualquer tool antes de exibir este bloco.\n\n**PASSO 2 — PARE e aguarde confirmação explícita do lead.**\n\n**PASSO 3 — Somente após confirmação, acione `update_contact` com os dados corrigidos.**\n🚨 SE `update_contact` RETORNAR ERRO: aplique a Regra R11 (acione `service_handoff` com `motivo`: `erro_agendamento` e `resumo` descrevendo que a atualização cadastral falhou) e PARE. NÃO chame `meeting_scheduling` após falha.\n\n**PASSO 4 — Somente após sucesso de `update_contact`, acione `meeting_scheduling`.**\n🚨 SE `meeting_scheduling` RETORNAR ERRO: aplique a Regra R11 (acione `service_handoff`, depois envie a mensagem de transferência).\n\n⛔ PROIBIDO acionar `meeting_scheduling` antes de `update_contact`.\n⛔ PROIBIDO acionar `meeting_scheduling` se `update_contact` falhou.\n⛔ PROIBIDO enviar cada linha como mensagem separada.\n\n---\n\n## Fase 3 — Handoff\n\n**Quando acionar `service_handoff`:**\n- Lead insiste em atendimento 1:1 pela **segunda vez** após oferta de Encontro com Especialista + teste.\n- **3 perguntas consecutivas** sem resposta na KB.\n- Incompatibilidade total de agenda para as próximas 2 semanas.\n- Intenção de compra imediata + recusa do Encontro com Especialista.\n- **Lead menciona contato prévio por outro canal (email/telefone/site) sem resposta** → ver Protocolo Continuidade / Contato Prévio.\n\n**🚨 SEQUÊNCIA OBRIGATÓRIA:**\n1. Acione `service_handoff` com `motivo` e `resumo` do atendimento.\n2. Somente após retorno, envie EXCLUSIVAMENTE:\n\n*\"Entendo perfeitamente sua urgência, [Nome]! O Encontro com Especialista é uma excelente oportunidade para garantir que você aproveite 100% dos recursos do [Plano Recomendado] desde o primeiro dia, mas como você já tem uma decisão tomada e precisa de agilidade, vou te encaminhar agora mesmo para um consultor comercial seguir com o seu processo de contratação. Foi um prazer te atender e em breve ele entrará em contato. 😊\"*\n\n⛔ PROIBIDO enviar a mensagem sem antes ter acionado e recebido retorno da tool.\n⛔ PROIBIDO enviar mais de uma mensagem — esta encerra a conversa."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        42688,
        13872
      ],
      "id": "a815dfda-68b7-476e-9ba0-94ee3b7a619a",
      "name": "SDR AI Agent",
      "disabled": true
    },
    {
      "parameters": {
        "description": "Call this the meeting scheduling tool for your leads. The inputs should be session_id, email, name, date, phone number and nome_empresa from Lead",
        "workflowId": {
          "__rl": true,
          "value": "nMTe5qJ16b8Y3X5X",
          "mode": "list",
          "cachedResultUrl": "/workflow/nMTe5qJ16b8Y3X5X",
          "cachedResultName": "tool_meeting_scheduling"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "email": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('email', ``, 'string') }}",
            "nome": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('nome', ``, 'string') }}",
            "data": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('data', ``, 'string') }}",
            "fone": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('fone', ``, 'string') }}",
            "nome_empresa": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('nome_empresa', ``, 'string') }}",
            "session_id": "={{ $('PayloadPergunta').item.json.sender.id }}",
            "conversation_id": "={{ $('PayloadPergunta').item.json.conversation.id }}",
            "url_base": "={{ $('w-cfg').item.json.baseUrl }}",
            "account_id": "={{ $('PayloadPergunta').item.json.account.id }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "session_id",
              "displayName": "session_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "number",
              "removed": false
            },
            {
              "id": "email",
              "displayName": "email",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "nome",
              "displayName": "nome",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "data",
              "displayName": "data",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "fone",
              "displayName": "fone",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "nome_empresa",
              "displayName": "nome_empresa",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "url_base",
              "displayName": "url_base",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "account_id",
              "displayName": "account_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "conversation_id",
              "displayName": "conversation_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2.2,
      "position": [
        43136,
        14128
      ],
      "id": "1af0bd8a-6ea9-4416-8050-9a8eccedb566",
      "name": "meeting_scheduling"
    },
    {
      "parameters": {
        "description": "Call this tool whenever you need to transfer the call to a human.",
        "workflowId": {
          "__rl": true,
          "value": "X7VyfQyAXOgaCRfO",
          "mode": "list",
          "cachedResultUrl": "/workflow/X7VyfQyAXOgaCRfO",
          "cachedResultName": "tool_service_handoff"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "url_base": "={{ $('w-cfg').first().json.baseUrl }}",
            "account_id": "={{ $('entradaChatwoot').first().json.body.account.id }}",
            "conversation_id": "={{ $('entradaChatwoot').first().json.body.conversation.id }}",
            "session_id": "={{ $('PayloadPergunta').item.json.sender.id }}",
            "motivo": "={{ $fromAI('motivo', 'Razão do handoff: compra_imediata, erro_agendamento, sem_resposta_kb ou incompatibilidade_agenda') }}",
            "resumo": "={{ $fromAI('resumo', 'Resumo em 2-3 frases: nome do lead, o que foi discutido e o que ele precisa do atendente humano') }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "session_id",
              "displayName": "session_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "number",
              "removed": false
            },
            {
              "id": "url_base",
              "displayName": "url_base",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "account_id",
              "displayName": "account_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "conversation_id",
              "displayName": "conversation_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "motivo",
              "displayName": "motivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "resumo",
              "displayName": "resumo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2.2,
      "position": [
        42832,
        14128
      ],
      "id": "2d17854b-4d5f-4395-8131-937de712bd95",
      "name": "service_handoff"
    },
    {
      "parameters": {
        "description": "Call this tool to update lead's informations. The inputs should be url, account_id, contact_id, nome_completo, email, telefone and vidas_gerenciadas.",
        "workflowId": {
          "__rl": true,
          "value": "iIfF5nN4bb4T2evF",
          "mode": "list",
          "cachedResultUrl": "/workflow/iIfF5nN4bb4T2evF",
          "cachedResultName": "tool_update_contact"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "nome_completo": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('nome_completo', ``, 'string') }}",
            "email": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('email', ``, 'string') }}",
            "telefone": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('telefone', ``, 'string') }}",
            "vidas_gerenciadas": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('vidas_gerenciadas', ``, 'string') }}",
            "url": "={{ $('w-cfg').item.json.baseUrl }}",
            "account_id": "={{ $('PayloadPergunta').item.json.account.id }}",
            "contact_id": "={{ $('PayloadPergunta').item.json.sender.id }}",
            "session_id": "={{ $('PayloadPergunta').item.json.sender.id }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "session_id",
              "displayName": "session_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "number",
              "removed": false
            },
            {
              "id": "url",
              "displayName": "url",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "account_id",
              "displayName": "account_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "number",
              "removed": false
            },
            {
              "id": "contact_id",
              "displayName": "contact_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "number",
              "removed": false
            },
            {
              "id": "nome_completo",
              "displayName": "nome_completo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "email",
              "displayName": "email",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "telefone",
              "displayName": "telefone",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "vidas_gerenciadas",
              "displayName": "vidas_gerenciadas",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2.2,
      "position": [
        42976,
        14128
      ],
      "id": "ccbcd6d8-8b19-413e-8ac9-a103b199153c",
      "name": "update_contact"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "1154207f-3f6b-4a4a-82b5-a6d83b08f22e",
              "leftValue": "={{ $json.body.message_type }}",
              "rightValue": "incoming",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            },
            {
              "id": "383d55d6-e864-4037-92ad-c0e00d283b54",
              "leftValue": "={{ $json.body.conversation.meta.assignee }}",
              "rightValue": "",
              "operator": {
                "type": "object",
                "operation": "empty",
                "singleValue": true
              }
            },
            {
              "id": "c45fc447-18b4-48d4-a2b8-77ec50e3c97c",
              "leftValue": "={{ $json.body.account.id }}",
              "rightValue": 4,
              "operator": {
                "type": "number",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        38624,
        13728
      ],
      "id": "ab3963fd-9266-4153-92b9-38ee8538c7d3",
      "name": "FiltraSomenteCliente",
      "notesInFlow": true,
      "notes": "Excluir AND de teste\n\n\n{{ $json.body.conversation.meta.sender.identifier }}\n\n5511976800541@s.whatsapp.net\n\n### melhoria\n\n- array para inbox"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "096d9ca8-2075-4512-917e-62ff1932a445",
              "name": "account.id",
              "value": "={{ $json.body.account.id }}",
              "type": "number"
            },
            {
              "id": "4ecbcd6f-9769-4a4f-97a3-5ec081668f0b",
              "name": "content.body",
              "value": "={{ $json.body.conversation.messages[0].content }}",
              "type": "string"
            },
            {
              "id": "e3ce1450-6f96-45ac-b9be-6c275a6cb973",
              "name": "sender.name",
              "value": "={{ $json.body.conversation.messages[0].sender.name }}",
              "type": "string"
            },
            {
              "id": "9b5b3224-1f97-4052-9ed5-3ba8f0a41fb8",
              "name": "conversation.id",
              "value": "={{ $json.body.conversation.id }}",
              "type": "number"
            },
            {
              "id": "606928f4-84fc-4e67-abe0-dd33c3dca5db",
              "name": "content.type",
              "value": "={{ $json.body.content_type }}",
              "type": "string"
            },
            {
              "id": "5f8bbdbc-8c5f-45f1-9d78-3a309631f4e3",
              "name": "sender.id",
              "value": "={{ $json.body.conversation.meta.sender.id }}",
              "type": "number"
            },
            {
              "id": "62fd7d45-14de-46cd-8b1a-fbdc1a74f350",
              "name": "inbox.id",
              "value": "={{ $json.body.conversation.inbox_id }}",
              "type": "number"
            },
            {
              "id": "6ba8e6a8-6fa0-4380-bffd-ee24723d1423",
              "name": "tags",
              "value": "={{ $json.body.conversation.labels }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        38272,
        14080
      ],
      "id": "e8393980-9f39-4ba7-9127-0befd817b9fb",
      "name": "PayloadPergunta",
      "notesInFlow": true,
      "notes": "Este nó, chamado PayloadPergunta, tem a função de extrair do webhook de entrada todas as informações essenciais da conversa e organizá-las em campos padronizados para uso nos próximos passos do fluxo. Na prática, ele:\n\nCaptura o ID da conta que recebeu a mensagem, garantindo que o fluxo saiba em qual instância ou cliente ele está operando.\n\nArmazena o texto da mensagem propriamente dito, retirando-o do primeiro elemento da lista de mensagens da conversa.\n\nRegistra o nome do remetente, conforme consta no payload, para facilitar personalizações de resposta ou registros de log.\n\nGuarda o ID da conversa, permitindo rastrear e associar respostas ao mesmo diálogo.\n\nSalva o tipo de conteúdo (por exemplo, “text” ou outro formato), para que nós seguintes possam decidir como processar cada caso (texto, imagem, áudio etc.).\n\nDefine o ID do remetente extraído da metainformação da conversa, utilíssimo para buscas ou atualizações em sistemas externos.\n\nMantém o ID da caixa de entrada (inbox) onde a conversa ocorreu, caso você tenha múltiplos canais ou filas de atendimento.\n\nColeta quaisquer tags associadas à conversa, facilitando categorizações, disparos de automações condicionais ou análises posteriores.\n\nAo final dessa etapa, todos esses dados ficam disponíveis como variáveis claramente nomeadas, garantindo que cada nó subsequente possa referenciar informações de contexto sem precisar navegar diretamente pela estrutura bruta do JSON."
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a571d948-68bc-492a-b8df-db73d0df7151",
              "name": "mensagem",
              "value": "={{ $json.text }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "1d4af71c-c079-4fd7-882c-8710f54d2677",
      "name": "Transcrição",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.3,
      "position": [
        40432,
        14016
      ]
    },
    {
      "parameters": {
        "content": "## Extração da Mensagem - configurando para chatwoot\n**Ações** \n1. Identifica e filtra por tipo da mensagem. \n2. Extrai a mensagem da conversa.\n2. Se for áudio transcreve para transformar em msg texto.\n\n\n",
        "height": 757,
        "width": 1552,
        "color": 7
      },
      "id": "18b68c34-2701-4338-a641-efe185647591",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        39376,
        13568
      ]
    },
    {
      "parameters": {
        "content": "## Entrada da Mensagem\n1. Recebe webhook do chatwoot (mensagem criada).\n2. Filtra os seguintes parâmetros (incomming, atribuidas, conta e inbox chatwoot e número [para realizar testes controlados] )",
        "height": 371,
        "width": 1350,
        "color": 3
      },
      "id": "4eabcd57-5941-43c6-86e6-c3987f96b766",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        38000,
        13568
      ]
    },
    {
      "parameters": {
        "content": "## Variáveis\n1. Devem ser atualizadas (atenção aqui).\n2. Facilita a padronização de dados no fluxo.",
        "height": 372,
        "width": 1348,
        "color": 3
      },
      "id": "f15003dc-f61a-47ec-aab6-d6d17a846553",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        38000,
        13952
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('w-cfg').item.json.baseUrl }}/api/v1/accounts/{{ $('PayloadPergunta').item.json.account.id }}/conversations/{{ $('PayloadPergunta').item.json.conversation.id }}/messages",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "content",
              "value": "={{ $json.parte }}"
            },
            {
              "name": "message_type",
              "value": "outgoing"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        44096,
        13936
      ],
      "id": "9b7bc081-7b77-4b79-9b26-102a6d78583b",
      "name": "EnviaChatwoot",
      "credentials": {
        "httpHeaderAuth": {
          "id": "J4PQSm40Hwl2hYlW",
          "name": "Chatfluxx Auth account (Leandro)"
        }
      },
      "disabled": true
    },
    {
      "parameters": {
        "content": "## Agentes\n**Double click** to edit me. [Guide](https://docs.n8n.io/workflows/sticky-notes/)",
        "height": 760,
        "width": 1404,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        41888,
        13568
      ],
      "typeVersion": 1,
      "id": "e64d14a0-d387-4f84-b0cf-42fcbaa53278",
      "name": "Sticky Note6"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $json.messageUser }}",
        "options": {
          "systemMessage": "=Você é um agente de atendimento da parte de encerramenta do atendimento com o cliente.\n\nVocê agradece o cliente pelo contato.\n\n1. regras\n- voce não informa ao cliente as ações que você toma de acordo com a mensagem dele. São ações internas nossas. Quando usamos ferramentas e etc, o cliente nao deve saber.\n\ndata de hoje:\nHoje e neste exato momento a nossa data é {{ DateTime.now().setZone(\"America/Sao_Paulo\").setLocale(\"pt-BR\").toFormat(\"cccc, dd/LL/yyyy HH:mm:ss\") }}\n\nO user_id do cliente é: {{ $('entradaChatwoot').item.json.body.conversation.messages[0].sender.identifier.replace(/@.*$/, '') }}\n\n\n3. Personalização: utilize apenas o primeiro nome do cliente  com inicial maiúscula nas mensagens que é **Personalização:** Utilize apenas o primeiro nome do cliente, extraído de {{ $('entradaChatwoot').item.json.body.conversation.messages[0].sender.name.split(' ')[0].charAt(0).toUpperCase() + $('entradaChatwoot').item.json.body.conversation.messages[0].sender.name.split(' ')[0].slice(1) }}.\n\n\n"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        42336,
        13728
      ],
      "id": "3a35e996-6a5d-452c-a38c-ea0b205334a4",
      "name": "Agente de Finalização de desqualificados",
      "retryOnFail": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "89632975-c910-47bf-bea8-d5975b09f759",
              "name": "mensagem",
              "value": "={{ $('FiltraSomenteCliente').item.json.body.content }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        40144,
        13840
      ],
      "id": "232909a1-61d0-47ff-b2b0-11744b3e3381",
      "name": "pegaMensagem"
    },
    {
      "parameters": {
        "options": {
          "timezone": "America/Sao_Paulo"
        }
      },
      "type": "n8n-nodes-base.dateTime",
      "typeVersion": 2,
      "position": [
        41072,
        13920
      ],
      "id": "114f7e0a-7949-497d-9c03-9a5d81e95d33",
      "name": "Date & Time"
    },
    {
      "parameters": {
        "operation": "set",
        "key": "=inputMessage-{{ $('entradaChatwoot').item.json.body.conversation.messages[0].conversation_id }}",
        "value": "={{ $('mensagemConsolidada').item.json.mensagem }} {{ $json.messageUser }}",
        "keyType": "string"
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        41600,
        13920
      ],
      "id": "87e368bc-fd53-4cd7-9cc8-73aeb47ff0d0",
      "name": "messageInsert",
      "notesInFlow": true,
      "credentials": {
        "redis": {
          "id": "FLCVkBfVQjtBZowE",
          "name": "Redis account"
        }
      },
      "notes": "- insere mensagens na key (inputMessage-conversationid) de forma incremental."
    },
    {
      "parameters": {
        "operation": "set",
        "key": "={{ String($('entradaChatwoot').item.json.body.conversation.messages[0].conversation_id) }}",
        "value": "={{ $json.currentDate }}",
        "keyType": "string",
        "expire": true,
        "ttl": 600
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        41248,
        13920
      ],
      "id": "fa6a9fd1-d725-42b1-bd02-b79a6fad5810",
      "name": "setCurrentDate",
      "notesInFlow": true,
      "credentials": {
        "redis": {
          "id": "FLCVkBfVQjtBZowE",
          "name": "Redis account"
        }
      },
      "notes": "- Insere a data corrente deste fluxo como valor da chave que será o 'conversationid' do chatwoot.\n\n- Deste modo não há problema o tipo de canal de entrada se é whatsapp, Instagram ou outros."
    },
    {
      "parameters": {
        "operation": "get",
        "propertyName": "currentDate",
        "key": "={{ String($('entradaChatwoot').item.json.body.conversation.messages[0].conversation_id) }}",
        "keyType": "string",
        "options": {}
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        41440,
        14160
      ],
      "id": "32f4698c-dc09-44d8-b6e6-b835b5a30d93",
      "name": "getFutureDate",
      "notesInFlow": true,
      "credentials": {
        "redis": {
          "id": "FLCVkBfVQjtBZowE",
          "name": "Redis account"
        }
      },
      "notes": "Retorna a data futura da key. \n\nSim ela pode ser futura pois durante o WAIT que está configurando antes desse node, o cliente pode ter enviado outra mensagem durante este período de espera"
    },
    {
      "parameters": {
        "operation": "get",
        "propertyName": "messageUser",
        "key": "=inputMessage-{{ $('entradaChatwoot').item.json.body.conversation.messages[0].conversation_id }}",
        "keyType": "string",
        "options": {}
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        41424,
        13920
      ],
      "id": "17a6fba7-2110-4c96-8303-0cdd860066c6",
      "name": "getMessage",
      "notesInFlow": true,
      "credentials": {
        "redis": {
          "id": "FLCVkBfVQjtBZowE",
          "name": "Redis account"
        }
      },
      "notes": "- Verifica se há mensagens do cliente na chave (Key)\n- objetivo de pedir esse GET é para incrementar novas mensagens na mesma chave sem perder as antigas."
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 1
          },
          "conditions": [
            {
              "id": "b50066ef-17e2-4cb5-8447-f3c3f4693521",
              "leftValue": "={{ $('setCurrentDate').item.json.currentDate }}",
              "rightValue": "={{ $json.currentDate }}\n",
              "operator": {
                "type": "dateTime",
                "operation": "afterOrEquals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "17938a0f-8663-42d7-acfc-af23580c47d9",
      "name": "confereFutureTime",
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2,
      "position": [
        41632,
        14160
      ],
      "notesInFlow": true,
      "notes": "Aqui comparamos se a data da mesma key que pegamos durante o WAIT é mais recente que a data deste fluxo que está rodando agora."
    },
    {
      "parameters": {
        "operation": "get",
        "propertyName": "messageUser",
        "key": "=inputMessage-{{ $('entradaChatwoot').item.json.body.conversation.messages[0].conversation_id }}",
        "options": {}
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        41072,
        14160
      ],
      "id": "aac7e65f-ac42-4dc5-b429-61e0e159b8b6",
      "name": "messageAgregated",
      "notesInFlow": true,
      "credentials": {
        "redis": {
          "id": "FLCVkBfVQjtBZowE",
          "name": "Redis account"
        }
      },
      "notes": "- Retorna as mensagens agregadas"
    },
    {
      "parameters": {
        "amount": "={{ $('w-cfg').item.json.debounce }}"
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        41248,
        14160
      ],
      "id": "44443cb6-0137-4431-b190-db280aa81249",
      "name": "tempoEspera",
      "webhookId": "ab63a793-4cd1-4b3c-b747-32d9efc44f05",
      "notesInFlow": true,
      "notes": "Selecione o tempo de deBounce (tempo para agregar mensagens multiplas do cliente dentro de um mesmo espaço de tempo evitando que o agente responda todas as mensagens picotadas do cliente.)"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "sdr-ai-agent",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        38064,
        13728
      ],
      "id": "ab6b197e-8c5c-4ad3-a6a4-5afd87d6c67d",
      "name": "entradaChatwoot",
      "webhookId": "6bf04170-342f-491d-9936-3621257111a8"
    },
    {
      "parameters": {
        "operation": "delete",
        "key": "=inputMessage-{{ $('entradaChatwoot').item.json.body.conversation.messages[0].conversation_id }}"
      },
      "type": "n8n-nodes-base.redis",
      "typeVersion": 1,
      "position": [
        44416,
        13840
      ],
      "id": "4b091688-c0bf-4238-93e4-249b0452ad6a",
      "name": "resetMessageAgregated",
      "executeOnce": true,
      "credentials": {
        "redis": {
          "id": "FLCVkBfVQjtBZowE",
          "name": "Redis account"
        }
      },
      "notes": "Reseta as mensagens agregadas"
    },
    {
      "parameters": {
        "options": {}
      },
      "id": "99c6f655-62f1-4b7d-a8cc-9a0298111967",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        43680,
        13856
      ]
    },
    {
      "parameters": {
        "content": "## Reseta Debounce de Mensagens\n\n",
        "height": 764,
        "width": 296,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        44320,
        13568
      ],
      "typeVersion": 1,
      "id": "6b5fdefc-8c0f-40a1-8224-4730e1d4d0d7",
      "name": "Sticky Note11"
    },
    {
      "parameters": {
        "content": "## Efeito Humanizador (Particiona Mensagens)\n1. Recebe uma tabela com as mensagens já particionadas.\n2. Envia por Split.\n3. Setar wait de acordo com a estratégia.",
        "height": 764,
        "width": 708,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        43584,
        13568
      ],
      "typeVersion": 1,
      "id": "88ae4b76-1386-41b6-a61f-6368c232cb5d",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "content": "## Formata Saída de Mensagens \n",
        "height": 764,
        "width": 248,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        43312,
        13568
      ],
      "typeVersion": 1,
      "id": "bb9b76bd-b386-46b0-bc01-14b00783c4bc",
      "name": "Sticky Note5"
    },
    {
      "parameters": {
        "jsCode": "// Pega o input do nó anterior (mais robusto que referenciar por nome)\nconst raw = $input.first().json;\n\n// Cobre 3 casos: array direto, objeto com array dentro, ou objeto plano\nlet item;\nif (Array.isArray(raw)) {\n  item = raw[0];\n} else if (Array.isArray(raw.body)) {\n  item = raw.body[0];\n} else if (Array.isArray(raw.data)) {\n  item = raw.data[0];\n} else {\n  item = raw;\n}\n\n// Resolve o texto da resposta\nconst texto =\n  item?.reply ??\n  item?.output ??\n  item?.text ??\n  item?.body?.reply ??\n  item?.body?.output ??\n  item?.data?.reply ??\n  item?.data?.output;\n\nif (!texto || typeof texto !== 'string') {\n  throw new Error(\n    `Nenhum campo de texto encontrado. Keys: ${Object.keys(item || {}).join(', ')}. Sample: ${JSON.stringify(raw).slice(0, 300)}`\n  );\n}\n\nconst sessionId = item?.session_id ?? raw?.session_id ?? null;\n\n// Passo 1: Regex para domínios com múltiplos sufixos\nconst domainRegex = /\\b(?:(?!\\d\\.\\d)(?:[a-zA-Z][\\w-]*)\\.)+(?:[a-zA-Z]{2,})(?:\\.[a-zA-Z]{2,})?\\b/g;\n\n// Passo 2: Mascarar domínios trocando \".\" por \"_DOT_\"\nlet textoMascarado = texto.replace(domainRegex, m => m.replace(/\\./g, '_DOT_'));\n\n// Passo 3: Quebrar em linhas não vazias\nlet linhas = textoMascarado\n  .split('\\n')\n  .map(l => l.trim())\n  .filter(l => l.length > 0);\n\n// Passo 4: Transformar linhas em sentenças\nconst sentenceSplitRegex = /(?<!Dr\\.)(?<!Dra\\.)(?<=[.!?])\\s+(?=[A-ZÁÀÂÃÉÈÊÍÏÓÔÕÖÚÜÇ])/;\n\nlet sentencas = [];\n\nlinhas.forEach(linha => {\n  if (linha.startsWith('- ')) {\n    sentencas.push(linha.slice(2).trim());\n  } else if (/^[0-9]+\\.\\s+/.test(linha)) {\n    sentencas.push(linha.replace(/^[0-9]+\\.\\s+/, '').trim());\n  } else {\n    sentencas.push(\n      ...linha\n        .split(sentenceSplitRegex)\n        .map(p => p.trim())\n        .filter(p => p.length > 0)\n    );\n  }\n});\n\n// Passo 5: Cortar sentenças maiores que 300 caracteres sem quebrar palavras\nconst MAX_LENGTH = 300;\nlet resultados = [];\n\nsentencas.forEach(s => {\n  const t = s.trim();\n  if (t.length <= MAX_LENGTH) {\n    resultados.push(t);\n  } else {\n    let buffer = '';\n    t.split(' ').forEach(palavra => {\n      const tentativa = buffer ? `${buffer} ${palavra}` : palavra;\n      if (tentativa.length > MAX_LENGTH) {\n        if (buffer) resultados.push(buffer);\n        buffer = palavra;\n      } else {\n        buffer = tentativa;\n      }\n    });\n    if (buffer) resultados.push(buffer);\n  }\n});\n\n// Passo 6: Reverter \"_DOT_\" para \".\"\nlet revertidos = resultados.map(r => r.replace(/_DOT_/g, '.'));\n\n// Passo 7: Converter **texto** em *texto* (negrito Markdown → WhatsApp)\nlet ajustados = revertidos.map(r => r.replace(/\\*\\*(.*?)\\*\\*/g, '*$1*'));\n\n// Passo 8: Retornar partes de texto\nreturn ajustados.map((parte, index) => ({\n  json: {\n    parte,\n    index,\n    session_id: sessionId\n  }\n}));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        43376,
        13856
      ],
      "id": "7a53f037-2196-4acc-a2d1-6c87e5cb40c4",
      "name": "particionaMensagem",
      "notesInFlow": true,
      "notes": "descrição passo a passo em português do que esse script faz:\n\nValidação de entrada\n\nLê texto de $json.output e lança erro se não existir ou não for string.\n\nMascaramento de domínios\n\nUsa uma regex para identificar domínios (ex.: exemplo.com.br) e substitui cada ponto por _DOT_ para evitar quebras indesejadas (pontos dentro de números continuam “.”).\n\nQuebra em linhas não vazias\n\nDivide o texto mascarado em linhas, remove espaços extras e filtra linhas vazias.\n\nTransformação de linhas em sentenças\n\nPara cada linha:\n\nSe começa com - : remove o traço e trata como uma sentença única.\n\nSe é numerada (ex.: 1. Texto): remove o índice e trata como sentença.\n\nCaso contrário: aplica um split inteligente usando a regex\n\n/(?<!Dr\\.)(?<!Dra\\.)(?<=[.!?])\\s+(?=[A-ZÁÀÂÃÉÈÊÍÏÓÔÕÖÚÜÇ])/\n– Só quebra após . ! ? seguido de espaço quando o próximo caractere for maiúsculo e não vier logo depois de abreviações como Dr. ou Dra..\n– Garante que “Dra. Gabriela” não seja dividida, mas divide normalmente frases como “Olá. Tudo bem?”.\n\nCorte de sentenças longas\n\nLimita cada sentença a no máximo 300 caracteres, sem quebrar palavras no meio:\n\nSe a sentença excede 300 chars, constrói um buffer palavra a palavra; sempre que o buffer ultrapassa 300, adiciona-o à lista e reinicia.\n\nRestauro dos domínios\n\nSubstitui _DOT_ de volta para . em cada parte resultante.\n\nAjuste de formatação em markdown\n\nConverte marcações de negrito **texto** para itálico *texto*.\n\nRetorno do resultado\n\nMonta o array final retornando, para cada parte, um objeto { json: { parte: \"...\" } }."
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "b6cd097d-3a3a-4cdc-a6f1-13c118a4618c",
              "name": "audio64",
              "value": "={{ $('FiltraSomenteCliente').item.json.body.conversation.messages[0].attachments[0].data_url }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "90db2766-f86f-4d0c-9a45-5ee754ef57f5",
      "name": "salvaInformaçõesAudio",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.3,
      "position": [
        39696,
        14032
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.audio64 }}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        39952,
        14032
      ],
      "id": "7b5fcbc4-cfb8-4124-b4cd-690ce17591d6",
      "name": "baixaAudio",
      "retryOnFail": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "3bbc4d64-6aba-4f46-abbf-8dbd6d326b06",
              "name": "messageUser",
              "value": "={{ $('messageAgregated').item.json.messageUser }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        41952,
        13936
      ],
      "id": "0fe471eb-a6f6-4a10-969a-d1229f782a8c",
      "name": "mensagensAgregadas"
    },
    {
      "parameters": {
        "amount": "={{ Math.max(2, $json.parte.length / 15) }}"
      },
      "id": "b7b3513f-8d24-4784-b5c7-a342f911fd1d",
      "name": "intervaloPartes",
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        43904,
        13936
      ],
      "webhookId": "1caa0cc0-6e20-47b9-ab71-072cf9d80ec9"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "5af1acb4-e2f5-44eb-b8f8-464efcbd4874",
              "leftValue": "={{ $('entradaChatwoot').item.json.body.content }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              }
            },
            {
              "id": "53283dc2-04e6-44fd-9844-25562100058c",
              "leftValue": "={{ $('entradaChatwoot').item.json.body.content }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        39984,
        13840
      ],
      "id": "f7e38364-358b-460e-b42e-a57a9bb4b28a",
      "name": "separaTexto"
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 1
                },
                "conditions": [
                  {
                    "leftValue": "={{ $('FiltraSomenteCliente').item.json.body.content_type }}",
                    "rightValue": "text",
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "id": "0e5d00b6-04aa-4476-a965-4b728395c0c8"
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Mensagem de Texto"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 1
                },
                "conditions": [
                  {
                    "id": "86e7e773-8586-458f-a1fb-2890f2030230",
                    "leftValue": "={{ $('FiltraSomenteCliente').item.json.body.content_type }}",
                    "rightValue": "extendedTextMessage",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Mensagem"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 1
                },
                "conditions": [
                  {
                    "id": "7f108034-a1be-4e90-b42e-e4f8a719e311",
                    "leftValue": "={{ $('FiltraSomenteCliente').item.json.body.content_type }}",
                    "rightValue": "editedMessage",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Mensagem Editada"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 1
                },
                "conditions": [
                  {
                    "id": "256e7cf8-be54-4c41-ba80-2d9eb0a07563",
                    "leftValue": "={{ $('FiltraSomenteCliente').item.json.body.conversation.messages[0].attachments[0].file_type }}",
                    "rightValue": "audio",
                    "operator": {
                      "type": "string",
                      "operation": "equals",
                      "name": "filter.operator.equals"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Áudio"
            }
          ]
        },
        "options": {
          "allMatchingOutputs": true
        }
      },
      "id": "de40b76a-1b09-451a-ad90-3b0dd978d615",
      "name": "tipoMensagemChatwoot",
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3,
      "position": [
        39504,
        13840
      ],
      "notesInFlow": true,
      "notes": "O nó “Tipo da Mensagem – cwoot” é um Switch que avalia o payload recebido do node FiltraSomenteCliente e o classifica em até quatro categorias distintas, criando saídas separadas para cada tipo de conteúdo:\n\nMensagem de Texto: quando o campo content_type do corpo da conversa é \"text\".\n\nMensagem: quando esse mesmo campo indica \"extendedTextMessage\", ou seja, um texto mais elaborado/várias linhas.\n\nMensagem Editada: quando o conteúdo foi alterado (\"editedMessage\").\n\nÁudio: quando há um anexo cujo file_type é \"audio\".\n\nComo a opção allMatchingOutputs está ativada, uma única entrada pode disparar simultaneamente mais de uma dessas saídas, permitindo que nós subsequentes processem cada categoria de forma independente."
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "8f52aca6-989a-42e8-91d0-25f3fa0b0cb3",
                    "leftValue": "={{ $('PayloadPergunta').item.json.tags }}",
                    "rightValue": "desqualificado",
                    "operator": {
                      "type": "string",
                      "operation": "contains"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Desqualificado"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "e15f4dfe-b8fb-4b6e-9a9d-f70386101db1",
                    "leftValue": "={{ $('PayloadPergunta').item.json.tags }}",
                    "rightValue": "qualificado",
                    "operator": {
                      "type": "string",
                      "operation": "contains"
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "qualificado"
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra"
        }
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.2,
      "position": [
        42112,
        13920
      ],
      "id": "683982cb-fc01-4ada-9eff-0e750ac8e1a5",
      "name": "tiposCampanha"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "c5c4a3bc-2dac-44ee-849f-753b4e24d55e",
              "leftValue": "={{ $json.body.conversation.inbox_id }}",
              "rightValue": 85,
              "operator": {
                "type": "number",
                "operation": "equals"
              }
            }
          ],
          "combinator": "or"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        38432,
        13728
      ],
      "id": "0c336562-035f-4430-910e-53311b255318",
      "name": "FiltraInbox",
      "notesInFlow": true,
      "notes": "Filtra múltiplos Inbox de acordo com a necessidade."
    },
    {
      "parameters": {
        "content": "![Fluxo](https://f005.backblazeb2.com/file/neofluxx-media/logos/Neofluxx.png)",
        "height": 240,
        "width": 976,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        38000,
        13312
      ],
      "typeVersion": 1,
      "id": "3ef64e57-f2d7-49ba-ac32-f9cb9215b93d",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "d647495f-e385-42ac-9d61-bac317e9bbaa",
              "leftValue": "={{ $json.body.conversation.messages[0].sender.phone_number }}",
              "rightValue": "+5511982084044",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            },
            {
              "id": "c5b42925-ea8f-48ee-ae3a-967f1eaed3a1",
              "leftValue": "={{ $json.body.conversation.messages[0].sender.phone_number }}",
              "rightValue": "+5511941119510",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            },
            {
              "id": "d61ae099-b698-4718-8eec-77222b656edc",
              "leftValue": "={{ $json.body.conversation.messages[0].sender.phone_number }}",
              "rightValue": "+5511995396176",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            }
          ],
          "combinator": "or"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        38832,
        13728
      ],
      "id": "b54c40d6-8963-486d-9e81-8c5e4793cf0e",
      "name": "filtraNumeros",
      "disabled": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "4f1a2108-e7e3-4b03-98b3-81ddf4bcb73b",
              "name": "mensagem",
              "value": "={{ $json.mensagem }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        40704,
        13936
      ],
      "id": "6b3f8a9d-d795-4591-b672-c9e6a68cc980",
      "name": "mensagemConsolidada"
    },
    {
      "parameters": {
        "content": "### Padroniza Payload de Mensagem\n\n- Evita a ocorrência de erros de referência\n",
        "height": 384,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        40624,
        13776
      ],
      "typeVersion": 1,
      "id": "266d5700-4877-4401-a7f6-5bdc17bb2073",
      "name": "Sticky Note8"
    },
    {
      "parameters": {
        "content": "## ChangeLog v1.02\n- Adiciona condição 'is not empty' para o NODE Filter \"Separa Texto\"\n- Ativa a opção 'Send data to all matching outputs' no NODE Switch \"tipoMensagemChatwoot\" ",
        "width": 1344
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        38000,
        14336
      ],
      "typeVersion": 1,
      "id": "d30f2716-694e-4910-af38-718723e6e5b8",
      "name": "Sticky Note9"
    },
    {
      "parameters": {
        "content": "## Message deBounce (Agregador de Mensagens) \n\n1. Grava o timestamp atual do fluxo em gmt-03:00\n2. Solicita a última mensagem do cliente que ainda não foi processada pelo agente.\n2.1. mensagens processadas pelo agente serão automaticamente limpas.\n3. Insere novas mensagens de maneira incremental.\n4. Retorna todas as mensagens que ainda não foram processadas pelo agente.\n5. Aguarda o WAIT de acordo com a config desejada.\n6. Retorna o timestamp futuro na mesma key que é o conversationId.\n7. Compara o timestamp deste fluxo com o timestamp futuro de possível fluxo mais recenete.\n7.1. Se o timestamp futuro for mais recente interrompe o fluxo e não apaga as mensagens agregadas. Pois em um outro fluxo outra mensagem foi enviada antes do termino do WAIT deste fluxo.",
        "height": 760,
        "width": 920,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        40944,
        13568
      ],
      "typeVersion": 1,
      "id": "b26f3321-1738-4990-8b04-4a5b1e2ace18",
      "name": "Sticky Note10"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "2b3b2565-e01f-4bad-a955-84f0109bb7fc",
              "name": "agora",
              "value": "={{ $now.setZone('America/Sao_Paulo').toISO() }}",
              "type": "string"
            },
            {
              "id": "d3d9a57c-9573-4d64-b08f-43d61ee32472",
              "name": "memory_name",
              "value": "={{ $('PayloadPergunta').item.json.sender.id }}",
              "type": "string"
            },
            {
              "id": "0f251302-de6e-4bbe-9af1-72a1b740acc5",
              "name": "telefone",
              "value": "={{ $('entradaChatwoot').item.json.body.conversation.messages[0].sender.phone_number.replace(/@.*$/, '')  }}",
              "type": "string"
            },
            {
              "id": "0dbfe6e4-ea03-47f9-8494-7317c086ebab",
              "name": "debounce",
              "value": "15",
              "type": "string"
            },
            {
              "id": "e3f2c5d8-d2fd-4ca4-a6ce-2004bb8bb3b6",
              "name": "baseUrl",
              "value": "https://app.neofluxx.com",
              "type": "string"
            },
            {
              "id": "dd340e7d-8ca2-4017-a733-e4007a87de9f",
              "name": "lead-memory",
              "value": "={\n  \"email\": \"{{ $('Get CW Contact Informations').first().json.payload.email }}\",\n  \"sender_id\": {{ $('Get CW Contact Informations').first().json.payload.id }},\n  \"nome\": \"{{ $('Get CW Contact Informations').first().json.payload.name }}\",\n  \"telefone\": \"{{ $('Get CW Contact Informations').first().json.payload.phone_number }}\",\n  \"nome_empresa\": \"{{ $('Get CW Contact Informations').first().json.payload.custom_attributes.empresa || 'Não informado' }}\",\n  \"cnpj\": \"{{ $('Get CW Contact Informations').first().json.payload.custom_attributes.cnpj || 'Não informado' }}\",\n  \"cargo\": \"{{ $('Get CW Contact Informations').first().json.payload.custom_attributes.cargo }}\",\n  \"como_conheceu\": \"{{ $('Get CW Contact Informations').first().json.payload.custom_attributes.como_conheceu || 'Não informado' }}\",\n  \"empresa_area_atuacao\": \"{{ $('Get CW Contact Informations').first().json.payload.custom_attributes.area_de_atuacao }}\",\n  \"nro_vidas_gerenciadas\": \"{{ $('Get CW Contact Informations').first().json.payload.custom_attributes.vidas }}\"\n}",
              "type": "string"
            },
            {
              "id": "51560070-e7a0-47c3-9422-6518484bd746",
              "name": "base_conhecimento",
              "value": "=# 📘 BASE DE CONHECIMENTO – PLANOS SAAS INDEXMED\n\nA Indexmed oferece planos escaláveis para atender desde micros e pequenas empresas até grandes organizações com alta complexidade em SST (Saúde e Segurança do Trabalho).\n\n---\n\n## 🥇 Plano Premium\n**R$ 171/mês** ou **R$ 1.845/ano (10% de desconto)**\n\n### ✅ Recursos inclusos\n- Usuários e criação de perfis ilimitados\n- Grupos de empresas/clientes ilimitados\n- Suporte por Email, Ticket e WhatsApp (horário comercial)\n- Gerenciamento de programas de SST e acompanhamento de status de exames\n- Elaboração de documentos e laudos diretamente na plataforma (PGR, PCMSO, LTCAT, AET, AEP, LI, LP, PCA, PPR e outros)\n- Transmissão dos eventos: S-2210 (CAT), S-2220 (ASO), S-2221 (Toxicológico), S-2240 (Riscos) → envio direto ao eSocial e/ou download em XML\n- Cadastro de clínicas, ambulatórios, laboratórios e unidades\n- Cadastro de exames para geração do ASO (eSocial)\n- Cálculo de vencimento de exames\n- Relatório Anual do PCMSO\n- Gestão de CAT\n- Gestão de EPI\n- Gestão de Atestados\n- Gestão de Exames Toxicológicos (sorteio + registro no eSocial)\n- Transmissão completa de eventos ao eSocial\n- **2 GB de armazenamento**\n\n### 📊 Dimensionamento\nA partir de 500 funcionários ativos no mês, adicional a partir de R$ 0,16 por funcionário ativo, cobrado ao final do período mensal.\n\n### 🎯 Recomendado para\nRH / Departamento Pessoal de micros e pequenas empresas.\n\n---\n\n## 🥈 Plano Pro\n**R$ 389/mês** ou **R$ 4.200/ano (10% de desconto)**\n\nInclui todas as funcionalidades do Premium, além de:\n\n### ➕ Recursos adicionais\n- Gestão da CIPA\n- Gestão de Máquinas e Equipamentos (NR-12)\n- Biometria para entrega/retirada de EPIs e reconhecimento no ASO\n- Assinatura digital de documentos, laudos e ASOs\n- Customização de documentos\n- Geração de documentos e laudos sem funcionários cadastrados\n- Módulo de contratos e faturamento\n- Prontuário eletrônico digital\n- **5 GB de armazenamento (2 GB + 3 GB adicionais)**\n\n### 📊 Dimensionamento\nA partir de 1000 funcionários ativos no mês, adicional a partir de R$ 0,16 por funcionário ativo, cobrado ao final do período mensal.\n\n### 🎯 Recomendado para\nProfissionais autônomos, RH / Departamento Pessoal de médias empresas e Escritórios de contabilidade.\n\n---\n\n## 🏆 Plano Enterprise\n**Preço sob consulta**\n\nInclui todas as funcionalidades do Pro, além de:\n\n### ➕ Recursos avançados\n- Fluxo de solicitação de agendamentos (Kanban)\n- Aviso de agendamentos por WhatsApp\n- Módulo de convocação de exames em lote\n- Envio automático de eventos ao eSocial\n- Gerente de contas (compartilhado)\n- Identidade customizável (White Label)*\n- Integração com ERPs e sistemas de Folha de Pagamento*\n- **10 GB de armazenamento (5 GB + 5 GB adicionais)**\n\n### 📊 Dimensionamento\nA franquia de vidas é variável e ajustada conforme a realidade do cliente. Entre em contato para receber proposta personalizada.\n\n* Soluções sob demanda (projeto).\n\n### 🎯 Recomendado para\nEmpresas com SESMT, Consultorias de SST, Clínicas e Operadoras de Saúde Ocupacional.\n\n## Módulo NR-1 (Riscos Psicossociais)\n\nDisponível nos Planos Pro e Enterprise\n\n✅ O que o módulo oferece\n\nAplicação de questionários validados (COPSOQ II versão curta e média)\nInterface digital para colaboradores responderem de forma anônima e segura\nAvaliação automática por escalas psicossociais (ex: demandas, controle, suporte, autoestima)\nGráfico semafórico com resultados por escala: Verde (ok), Amarelo (atenção), Vermelho (risco)\nAnálise quantitativa e visual com percentuais por nível de risco\nRegistro dos dados para compor o Inventário de Riscos e PGR\nRelatórios gerenciais exportáveis (PDF, Excel, eSocial)\nInterface intuitiva com barra de progresso, agrupamento por escala e salvamento automático\nDestaque das Escalas (Geral e por Setor) com maior percentual de riscos. \n\n🛡️ Segurança e LGPD\n\nQuestionários anônimos, sem vínculo direto com dados pessoais\nSeparação técnica entre respostas e dados sensíveis\nConsentimento ativo do colaborador na tela inicial\nResultados apresentados apenas de forma coletiva, com filtros de sigilo aplicados\n# Q&A\n\n[\n  {\n    \"total_pares\": 59,\n    \"vendas\": [\n      {\n        \"pergunta\": \"Já olharam nosso plano que atende até 500 vidas antigas?\",\n        \"contexto\": \"Plano ideal para a quantidade de vidas mencionada pelo cliente.\",\n        \"resposta\": \"Até 500 vidas é o nosso primeiro plano, é o nosso plano prêmio.\"\n      },\n      {\n        \"pergunta\": \"Podemos confirmar o agendamento para o dia 04/02?\",\n        \"contexto\": \"Cliente confirma a participação na live solicitada.\",\n        \"resposta\": \"Sua reunião com nossa Especialista está agendada e segue algumas dicas.\"\n      },\n      {\n        \"pergunta\": \"Quais são os valores dos planos Premium e Pro?\",\n        \"contexto\": \"Cliente precisa saber os preços para decidir sobre a mudança de plano.\",\n        \"resposta\": \"Premium R$ 171,00 mensais e Pro R$ 389,00 mensais.\"\n      },\n      {\n        \"pergunta\": \"Quais são as novas datas disponíveis para remarcar o agendamento com a especialista?\",\n        \"contexto\": \"A especialista teve um imprevisto e está sem energia devido à chuva e à ventania. As datas disponíveis para remarcar são terça, dia 3, às 9h30 da manhã do horário de Brasília, e quarta-feira, dia 4, às 10 horas da manhã.\",\n        \"resposta\": \"No caso, a data mais próxima seria na terça, que é dia três, às nove e meia da manhã do horário de Brasília, e na quarta-feira, no dia quatro, é às dez horas da manhã do horário de Brasília.\"\n      },\n      {\n        \"pergunta\": \"Quais são as informações necessárias para agendar a apresentação da plataforma?\",\n        \"contexto\": \"\",\n        \"resposta\": \"Para agendar a apresentação, preciso das seguintes confirmações: Nome completo, Nome da empresa, E-mail, Quantidade de vidas, Quando pretende começar a utilizar a Indexmed.\"\n      },\n      {\n        \"pergunta\": \"Gostaria de agendar uma demonstração personalizada grátis do Indexmed Enterprise. Vocês já são cliente da Indexmed?\",\n        \"contexto\": \"Cliente deseja agendar uma demonstração.\",\n        \"resposta\": \"Escolha uma das opções: 1️⃣ Quero ser cliente, 2️⃣ Já sou cliente e quero saber mais sobre outros produtos ou serviços, 3️⃣ Já sou cliente e preciso falar com o suporte.\"\n      },\n      {\n        \"pergunta\": \"Vocês podem isentar o valor do treinamento?\",\n        \"contexto\": \"Cliente tem objeção sobre pagamento do treinamento, mencionando que concorrentes não cobram.\",\n        \"resposta\": \"Temos pacotes de treinamento que não são obrigatórios, mas há um custo adicional.\"\n      },\n      {\n        \"pergunta\": \"Pra fechar, o que vocês podem dar de desconto?\",\n        \"contexto\": \"Cliente já manifestou interesse e procura incentivo financeiro para contratação.\",\n        \"resposta\": \"Cupom de 15% de desconto por três meses disponível até amanhã.\"\n      },\n      {\n        \"pergunta\": \"No caso de contratação do sistema, tem alguma fidelidade mínima?\",\n        \"contexto\": \"Cliente quer saber sobre termos de contrato relacionados à fidelidade.\",\n        \"resposta\": \"Não trabalhamos com taxa de cancelamento e não temos fidelidade mínima atualmente.\"\n      },\n      {\n        \"pergunta\": \"Qual plano você seguiria e quantas vidas na franquia?\",\n        \"contexto\": \"Cliente buscando detalhes para realizar novo cadastro\",\n        \"resposta\": \"Você tem uma franquia de vidas de mais ou menos 300 e isso permanece esse quantitativo\"\n      },\n      {\n        \"pergunta\": \"Como funciona o cadastro inicial?\",\n        \"contexto\": \"Cliente desejando saber sobre a contratação\",\n        \"resposta\": \"O cadastro inicial é sempre por CPF, então vai ser o nome, o e-mail e a CPF. Após passar por essa parte que você faz o processo de cadastro NPJ e todas as demais informações.\"\n      },\n      {\n        \"pergunta\": \"Será possível realizar uma Live nesta sexta-feira?\",\n        \"contexto\": \"Cliente deseja concluir a contratação\",\n        \"resposta\": \"Essa semana, a agenda está bem cheia, não consegui nenhum encaixe.\"\n      },\n      {\n        \"pergunta\": \"Gostaria de saber como funciona e o valor para ter acesso a plataforma de vocês para realizar envios de saúde e segurança para o e-social.\",\n        \"contexto\": \"O cliente está interessado em iniciar o uso da plataforma para novos negócios em sociedade.\",\n        \"resposta\": \"Hoje a gente trabalha com três planos: Prêmio, Pró e Enterprise. O que vai diferenciar entre eles está na franquia de vidas e nas funcionalidades adicionais que o Plano Pró tem e não vai ter no Plano Prêmio. Os valores são: PREMIUM (R$171,00) e PRO (R$389,00).\"\n      },\n      {\n        \"pergunta\": \"Com relação aos valores, como que você me ajuda? Consegue estender essa promoção para mim?\",\n        \"contexto\": \"Cliente busca descontos em um plano de 12 meses.\",\n        \"resposta\": \"Irelda, eu realmente não consigo estender essa promoção para você dos 15%. Se você fechar o plano anual de 12 meses e pagar à vista, você ganha 10% de desconto.\"\n      },\n      {\n        \"pergunta\": \"O desconto dos 10% poderia ser com pagamento no cartão?\",\n        \"contexto\": \"Cliente considerando opções de pagamento para o plano anual.\",\n        \"resposta\": \"No plano anual, você pode pagar por PIX, boleto, ou cartão de crédito, mas não é possível parcelar.\"\n      },\n      {\n        \"pergunta\": \"O pro está de 389,00 né isso?\",\n        \"contexto\": \"Verificação de preço do plano PRO.\",\n        \"resposta\": \"Isso mesmo ou R$ 4.200 /ano (10% desc.)\"\n      },\n      {\n        \"pergunta\": \"Gostaria de saber se seria possível liberar o acesso temporário para mim novamente?\",\n        \"contexto\": \"Cliente já teve conta no passado e quer testar o software novamente.\",\n        \"resposta\": \"Como você já teve um cadastro, não é possível ter liberação de dias igual para novos assinantes, que tem 10 dias corridos antes do pagamento.\"\n      },\n      {\n        \"pergunta\": \"Gostaria de conhecer a plataforma de vocês. Tenho uma empresa de engenharia de segurança do trabalho e preciso das seguintes funções: Emissão de documentos, Gestão de EPI, Gestão do PGR, Gestão da CIPA, Customização dos documentos, Gestão de Inspeções de Segurança, Gestão de Brigada de Emergência, Gestão de Treinamentos e Envio e-social. Quais planos vocês oferecem que atendem essas necessidades?\",\n        \"contexto\": \"Cliente quer saber sobre funcionalidades específicas e quais planos a plataforma oferece.\",\n        \"resposta\": \"Hoje a IndexMag trabalha com três planos, o Prêmio, o Pró e o nosso Plano Enterprise. Pelas suas necessidades, por exemplo, na gestão de CIPA, já teria que ser a partir do nosso Plano Pró. Gestão de CIPA, customização de documento, hoje a gente consegue fazer a gestão de EPI com assinatura biométrica e assinatura do ASU também com assinatura biométrica. Vou mandar um PDF detalhando os primeiros planos.\"\n      },\n      {\n        \"pergunta\": \"Poderia me enviar modelos de documentos gerados no Indexmed? PGR, LTCAT, PCMSO e ASOs?\",\n        \"contexto\": \"Cliente quer modelos para entender mais sobre o serviço.\",\n        \"resposta\": \"Não consigo enviar modelos. A IndexMed para novos assinantes dá 10 dias corridos a partir do cadastro para teste.\"\n      },\n      {\n        \"pergunta\": \"Para realizar o cadastro e ter acesso por esses 10 dias gratuitos para teste, como posso prosseguir?\",\n        \"contexto\": \"Cliente interessado em testar o serviço.\",\n        \"resposta\": \"Ao realizar o cadastro, já começam os 10 dias. Cancelamento pode ser feito pelo perfil ou contato com o suporte.\"\n      },\n      {\n        \"pergunta\": \"Dentro desse período de dez dias posso cancelar sem custo nenhum, correto?\",\n        \"contexto\": \"Cliente verifica possibilidade de cancelamento gratuito.\",\n        \"resposta\": \"Hoje não cobramos taxa de cancelamento, mas isso pode mudar.\"\n      },\n      {\n        \"pergunta\": \"Como posso renovar o plano com vocês?\",\n        \"contexto\": \"Cliente quer reativar um plano com a Indexmed.\",\n        \"resposta\": \"Para reativação do plano, é necessário contatar o time de suporte com e-mail e CPF cadastrados. Informar o desejo de reativação e realizar os pagamentos necessários.\"\n      },\n      {\n        \"pergunta\": \"Busco novo sistema para fazer nossos programas como PGR, PCMSO, LTCAT, laudos de insalubridade e periculosidade, e queremos acesso ao portal para nossos clientes baixarem recibos e programas, além de gerenciamento de riscos psicossociais.\",\n        \"contexto\": \"Cliente busca um sistema abrangente para seus programas de SST.\",\n        \"resposta\": \"Agente oferece informações sobre planos Premium e Pro com funcionalidades detalhadas, mencionando a presença da gestão de CIPA e outras funcionalidades relevantes.\"\n      },\n      {\n        \"pergunta\": \"Quantas vidas ativas vocês trabalham hoje?\",\n        \"contexto\": \"Determinar número de vidas ativas do cliente para ajustar recomendação de plano.\",\n        \"resposta\": \"A quantidade de vidas influencia a escolha do plano devido à franquia de vidas de cada plano.\"\n      },\n      {\n        \"pergunta\": \"Quero cadastrar logo na indexmed, como faço?\",\n        \"contexto\": \"Cliente querendo saber como se cadastrar e usar a plataforma Index Médica.\",\n        \"resposta\": \"Você já cadastrou na plataforma? e escolheu qual plano?\\nNo plano Premium atualmente você pode trocar os logotipos do ASO, Prontuário e Recibo do eSocial, para isso coloque o logotipo no cadastro do cliente.\"\n      },\n      {\n        \"pergunta\": \"Quero ser cliente!\",\n        \"contexto\": \"Cliente indica que quer ser cliente.\",\n        \"resposta\": \"Aguarde um momento que já irei te atender!\"\n      },\n      {\n        \"pergunta\": \"Quero informações sobre os planos do IndexMed.\",\n        \"contexto\": \"Agente esclareceu a diferença de funcionalidades e custos entre os planos Premium e Pro.\",\n        \"resposta\": \"Diferença entre os planos PREMIUM (R$171,00) e PRO (R$389,00). Funcionalidades exclusivas do plano PRO:... Funcionalidades comuns aos planos Premium e Pro:...\"\n      },\n      {\n        \"pergunta\": \"Estou interessado em um plano para uso pessoal como técnico em segurança do trabalho, com funcionalidades que posso usar no celular.\",\n        \"contexto\": \"Janielson quer usar o sistema para fins pessoais.\",\n        \"resposta\": \"Hoje na empresa que você trabalha, que você conhece a IndexMed, você usa qual plano? E pra você, pra uso pessoal, você seguiria no plano Premium inicialmente, seria no plano Pro?\"\n      },\n      {\n        \"pergunta\": \"No cadastro eu consigo fazer e colocar os dados para pagamento caso eu não me agrade, eu consigo cancelar antes de debitar o pagamento?\",\n        \"contexto\": \"Cliente confirmando detalhes sobre o processo de teste e cancelamento.\",\n        \"resposta\": \"Cancelando antes dos 10 dias, sim.\"\n      }\n    ],\n    \"suporte\": [\n      {\n        \"pergunta\": \"Posso mudar o plano do Premium para o Pro na próxima renovação?\",\n        \"contexto\": \"Cliente já utiliza os planos e pergunta sobre a possibilidade de alteração.\",\n        \"resposta\": \"Você pode mudar quando desejar, só ir lá em Meu Perfil/gerenciar assinatura/renovar/estender e realizar o Upgrade.\"\n      },\n      {\n        \"pergunta\": \"Onde eu posso assistir 'aulas' para aprender sobre a plataforma?\",\n        \"contexto\": \"Cliente procura por recursos educacionais para aprender sobre a plataforma.\",\n        \"resposta\": \"O agente enviou links para vídeos no YouTube e mencionou que há uma base de conhecimento dentro da plataforma, além do time de suporte disponível para ajudar.\"\n      },\n      {\n        \"pergunta\": \"Minha maior dúvida hoje é fazer o lançamento de social do pessoal. Como eu faço isso?\",\n        \"contexto\": \"Cliente expressou dificuldade em realizar lançamento de social e mencionou contratar um técnico temporariamente.\",\n        \"resposta\": \"O agente explicou que o envio do social é simples e que dentro da plataforma é possível gerar eventos e verificar relatórios de erros no módulo de social. Enviou um vídeo curto sobre o módulo.\"\n      },\n      {\n        \"pergunta\": \"Eu queria ver as regras para a confecção do PGR, é meu maior interesse\",\n        \"contexto\": \"O cliente está buscando informações específicas de funcionalidade do software.\",\n        \"resposta\": \"Seria legal você participar da nossa live bate-papo onde a especialista percorre todas as funcionalidades e no final abre para tirar dúvidas.\"\n      },\n      {\n        \"pergunta\": \"Ela não lembra da senha. Pode verificar se está ativo?\",\n        \"contexto\": \"Discussão sobre relembrar senha\",\n        \"resposta\": \"Aqui pra mim mostra que está ativo ainda - Marilza, certo?\"\n      },\n      {\n        \"pergunta\": \"Ela não lembra o e-mail que ela fez o cadastro.\",\n        \"contexto\": \"Cliente informando esquecimento do e-mail usado no cadastro\",\n        \"resposta\": \"Foi no E-mail - gestor@clinicaqualymed.com.br\"\n      },\n      {\n        \"pergunta\": \"Como falar com o suporte da Indexmed?\",\n        \"contexto\": \"Cliente já é cliente e precisa de suporte.\",\n        \"resposta\": \"Nosso time de suporte está pronto pra te ajudar. Você pode falar com eles por aqui: E-mail: suporte@indexmed.com.br, WhatsApp: (11) 2311-4186\"\n      },\n      {\n        \"pergunta\": \"Preciso falar com o suporte.\",\n        \"contexto\": \"Cliente indicou que já é cliente e escolheu a opção de falar com o suporte.\",\n        \"resposta\": \"Nosso time de suporte está pronto pra te ajudar. Você pode falar com eles por aqui: E-mail: suporte@indexmed.com.br WhatsApp: (11) 2311-4186 É só entrar em contato que o pessoal vai te atender rapidinho!\"\n      },\n      {\n        \"pergunta\": \"Como posso agendar exame demissional com avaliação clínica e audiometria se o campo de avaliação clínica sai preenchido como 'nenhuma. apenas os exames complementares'?\",\n        \"contexto\": \"O cliente tenta agendar exame demissional mas encontra dificuldades no preenchimento.\",\n        \"resposta\": \"Contate o time de suporte no email suporte@indexmed.com.br ou whatsapp 11 2311-4186.\"\n      },\n      {\n        \"pergunta\": \"Esqueci de passar o e-mail correto para reativação e pedi o contato do suporte.\",\n        \"contexto\": \"Cliente precisa reativar cadastro antigo e forneceu o e-mail.\",\n        \"resposta\": \"Você vai precisar contatar o time de suporte. Eu vou te passar o e-mail e o WhatsApp. Mas para a reativação, seria melhor você formalizar o e-mail.\"\n      },\n      {\n        \"pergunta\": \"Estou com um problema no sistema index aqui da empresa que eu trabalho. É com você que eu resolvo ou tem algum contato para suporte?\",\n        \"contexto\": \"Cliente enfrentando dificuldade de acesso ao sistema.\",\n        \"resposta\": \"No caso, você precisa falar com o time de suporte. Contato do time de suporte: E-mail: suporte@indexmed.com.br Whatsapp: 11 2311-4186\"\n      },\n      {\n        \"pergunta\": \"Como posso acessar meu cadastro se já não uso há um tempo?\",\n        \"contexto\": \"Cliente tem dificuldades para acessar cadastro devido ao tempo de inatividade.\",\n        \"resposta\": \"O seu cadastro fica inativo quando você deixa de utilizar, então precisa solicitar para o time de suporte a reativação do seu acesso. Você precisará pagar para poder utilizar.\"\n      },\n      {\n        \"pergunta\": \"Qual é o contato do suporte?\",\n        \"contexto\": \"Cliente está tentando entrar em contato com o suporte para reativar o acesso.\",\n        \"resposta\": \"Contato do time de suporte: E-mail: suporte@indexmed.com.br; Whatsapp: 11 2311-4186.\"\n      },\n      {\n        \"pergunta\": \"Qual é o contato de suporte da Indexmed?\",\n        \"contexto\": \"Cliente solicitou informações para pagamento de plano anual e foi redirecionado para suporte.\",\n        \"resposta\": \"E-mail: suporte@indexmed.com.br. Whatsapp: 11 2311-4186\"\n      },\n      {\n        \"pergunta\": \"Quero trocar e colocar meu nome, mas devido eu ter aquele cadastro não consigo. Como resolver?\",\n        \"contexto\": \"Cliente tem dificuldade em editar o nome no sistema devido a cadastro existente que não pode ativar. Deseja continuar usando o nome da empresa do gestor, mas ver seu próprio nome ao editar.\",\n        \"resposta\": \"Se você for para você ter aquele seu outro acesso, que é do seu nome com seu CPF, você precisa fazer aquele processo de reativação e que o time de suporte te orientar.\"\n      },\n      {\n        \"pergunta\": \"Desde ontem não consigo entrar na plataforma. Aconteceu algo?\",\n        \"contexto\": \"Cliente mencionou não conseguir acessar a plataforma desde o dia anterior.\",\n        \"resposta\": \"Você pode falar com eles por aqui:\\n\\n📧 E-mail: suporte@indexmed.com.br\\n\\n📱 WhatsApp: (11) 2311-4186\"\n      }\n    ],\n    \"ambos\": [\n      {\n        \"pergunta\": \"Se nós aderirmos à ferramenta, vocês ensinam como fazer os envios passo a passo?\",\n        \"contexto\": \"Cliente está considerando contratar a ferramenta e quer saber sobre o suporte na funcionalidade de envios.\",\n        \"resposta\": \"Os envios aqui no Indexmed são criados automaticamente, a medida que você vai inserindo as informações no Indexmed. Temos diversos conteúdos na Base de Conhecimento e também oferecemos Treinamento à parte.\"\n      },\n      {\n        \"pergunta\": \"Você já é cliente da Indexmed ou ainda não é cliente?\",\n        \"contexto\": \"Para que eu possa entender melhor suas necessidades e apresentar o plano ideal, me conta:\",\n        \"resposta\": \"Escolha uma das opções abaixo para eu te direcionar certinho: 1 - Quero ser cliente! 2 - Já sou cliente e quero saber mais sobre outros produtos ou serviços 3 - Já sou cliente e preciso falar com o suporte\"\n      },\n      {\n        \"pergunta\": \"Essa live é somente conosco ou tem mais pessoas que participam?\",\n        \"contexto\": \"Cliente deseja saber sobre a dinâmica da live.\",\n        \"resposta\": \"É uma live que pode conter outras pessoas, sim. Vai depender da semana, de como que está.\"\n      },\n      {\n        \"pergunta\": \"Vocês realizam o ASO e qual é o valor?\",\n        \"contexto\": \"Cliente deseja saber se a empresa oferece o exame ASO e qual é o preço.\",\n        \"resposta\": \"Nós temos diversos parceiros dentro do Indexmed, que você busca lá em Rede Credenciada pelo cep que precisa.\"\n      },\n      {\n        \"pergunta\": \"Devo comprar o equipamento de biometria com vocês ou por fora?\",\n        \"contexto\": \"Cliente quer saber como adquirir o equipamento de biometria em relação ao seu serviço.\",\n        \"resposta\": \"Nós indicamos e você pode comprar onde desejar.\"\n      },\n      {\n        \"pergunta\": \"Vocês disponibilizam biometria?\",\n        \"contexto\": \"Cliente quer saber se a Indexmed fornece leitores biométricos\",\n        \"resposta\": \"Nós não fornecemos leitores biométricos. Nós indicamos e você pode comprar onde desejar. Agora com relação ao sistema, estamos preparados para controles utilizando a tecnologia de biometria\"\n      },\n      {\n        \"pergunta\": \"Caso eu consiga pagar o plano mensal por 7 meses consecutivos e depois passe uns 6 meses a 1 ano sem utilizar e volte a pagar para utilizar tem algum problema? Perde alguma informação do meu cadastro que utilizei durante os 7 meses?\",\n        \"contexto\": \"Cliente interessado em entender o impacto de interromper o uso do sistema no plano mensal.\",\n        \"resposta\": \"O pagamento da plataforma deve ser realizado mensalmente, pois temos custos contínuos de infraestrutura para garantir que os dados fiquem armazenados de forma segura e estejam sempre disponíveis. Caso a mensalidade não seja paga, ao retomar o uso será necessário quitar os meses pendentes antes de continuar utilizando o serviço. Hoje, não cobramos taxa de cancelamento. Mas pode ser que no futuro algo mude. Quando você retornar, você vai ter que entrar em contato com o Team Support para reativar. Você precisará pagar para poder começar a utilizar.\"\n      },\n      {\n        \"pergunta\": \"Depois de seis meses cancelado, se eu quiser continuar com o serviço novamente, vocês reativam meu cadastro e volto a usar normalmente sem perda de dados por reativar?\",\n        \"contexto\": \"Cliente confirmando detalhes sobre reativação do serviço após um período de cancelamento.\",\n        \"resposta\": \"Sim, suas informações ficarão guardadas, e quando você voltar e quiser reativar a sua conta, você vai precisar fazer pagamento do retroativo, provavelmente, aí você vai ter que acionar o time de suporte para eles te passarem o status atualizado.\"\n      },\n      {\n        \"pergunta\": \"Eu tenho interesse em trabalhar com o programa de vocês. Fiz o cadastro e não estou conseguindo mexer no sistema. Tem alguém que possa me orientar?\",\n        \"contexto\": \"\",\n        \"resposta\": \"Você pode acessar nosso canal do YouTube para vídeos de orientação. Também temos um time de suporte que pode ajudar.\"\n      },\n      {\n        \"pergunta\": \"Você já é cliente da Indexmed ou ainda não é, e o que deseja saber?\",\n        \"contexto\": \"Apresentação de planos e soluções de SST.\",\n        \"resposta\": \"Conversa foi marcada como resolvida por Jéssica Andrade.\"\n      },\n      {\n        \"pergunta\": \"O sistema gera relatórios de inspeção com registro de não conformidade?\",\n        \"contexto\": \"Cliente busca informações sobre funcionalidades específicas do sistema.\",\n        \"resposta\": \"Ainda não temos esse relatório de inspeção, está no projeto de melhoria para o segundo semestre.\"\n      },\n      {\n        \"pergunta\": \"O software é atualizado com frequência? Quando temos mudanças nas normas reguladoras e legislação?\",\n        \"contexto\": \"Cliente interessada na confiabilidade e atualizações do software.\",\n        \"resposta\": \"Sim, o sistema é atualizado frequentemente, acompanhando mudanças na legislação.\"\n      },\n      {\n        \"pergunta\": \"O que seria essa convocação de exames? Como funciona esse envio automaticamente tô esocial? Esse envio de kit fazemos ele no index e envia automaticamente para o cliente via WhatsApp?\",\n        \"contexto\": \"Cliente pediu esclarecimentos sobre funcionalidades do Plano Enterprise\",\n        \"resposta\": \"Os envios automáticos do Plano Enterprise funcionam da seguinte forma, tudo que você gera dentro da IndexMed gera um evento, certo? Você fez uma admissão, um periódico, gerou uma cate, qualquer assunto dentro da plataforma vai gerar um evento e se você optar por fazer o envio automático, vai ser feito o envio automático, sem você ir lá por conta própria, clicar no evento e fazer o envio. Convocação de exames é onde você consegue selecionar a empresa que você cadastrou dentro do index médio e que você deseja fazer a convocação de mais de um colaborador de uma vez só.\"\n      },\n      {\n        \"pergunta\": \"O sistema de vocês disponibiliza treinamentos para vender para os meus clientes nessa modalidade de 171 mensal?\",\n        \"contexto\": \"Cliente consultando sobre a disponibilidade de treinamentos específicos.\",\n        \"resposta\": \"Não, a gente não dá esse tipo de treinamento.\"\n      },\n      {\n        \"pergunta\": \"Caso eu fechar a contratação, como funciona a questão da integração com sistema?\",\n        \"contexto\": \"Integração com o sistema após contratação\",\n        \"resposta\": \"Nosso Plano Prêmio ou Plano Pro é totalmente autônomo, com API aberta para integração. Você precisa verificar se o outro sistema também tem API aberta para integrar.\"\n      },\n      {\n        \"pergunta\": \"Qual é a solução relacionada a Azure?\",\n        \"contexto\": \"Cliente está buscando informações sobre Azure para encaminhar para sua gerência.\",\n        \"resposta\": \"Azure, a nuvem da Microsoft\"\n      },\n      {\n        \"pergunta\": \"Vocês têm software para atender a AEP da NR 01?\",\n        \"contexto\": \"Cliente interessado em saber se a ferramenta possui suporte para AEP da NR 01\",\n        \"resposta\": \"Sim, nossa plataforma é completa quanto a parte de documentos, temos AEP/AET e todos os demais documentos. Também possui todos os riscos e matrizes para a NR1\"\n      },\n        \"pergunta\": \"Eu consigo acessar o software ou a plataforma mesmo sem a live ou sem a Sessão Técnica?\",\n        \"contexto\": \"Cliente quer saber se pode utilizar o sistema antes do evento ao vivo.\",\n        \"resposta\": \"Claro, segue o link para se cadastrar e acessar a nossa plataforma por 10 dias grátis com acesso ao plano Pro. Acesse: https://www.indexmed.com.br/cadastrar\"\n      },\n      {\n        \"pergunta\": \"Qual é a forma de pagamento?\",\n        \"contexto\": \"Lead demonstra dúvidas sobre métodos e meios de pagamentos da assinatura dos planos da Indexmed.\",\n        \"resposta\": \"Para pagamentos mensais da assinatura, aceitamos cartão de crédito, inclusive cartão corporativo da empresa. Já no plano anual à vista, que conta com 10% de desconto sobre o valor total, o pagamento pode ser realizado via PIX, cartão de crédito ou boleto. O boleto está disponível exclusivamente para a modalidade de pagamento anual.\"\n      }\n    ]\n  }\n]",
              "type": "string"
            },
            {
              "id": "4d8899cc-f648-4198-be33-b4132649b2e5",
              "name": "human_handoff_context",
              "value": "={{ $('Call TrataGapHandoffHumano').item.json.human_handoff_context }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "89d6244c-c96e-4f94-8599-5f08eb7c120d",
      "name": "w-cfg",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        39072,
        14080
      ],
      "notesInFlow": true,
      "notes": "Este nó do tipo Set, batizado como Variáveis, tem o papel de preparar e centralizar todas as informações e parâmetros que serão usados ao longo do fluxo. Na execução, ele faz o seguinte:\n\nRegistra o momento exato em que o fluxo está rodando, ajustado para o horário de Brasília (fuso de São Paulo).\n\nExtrai do webhook do Chatwoot o identificador do remetente (o número de WhatsApp), armazenando esse valor tanto como “nome de memória” quanto como “telefone”.\n\nDefine um valor de debounce para evitar que chamadas ou processamentos sejam disparados mais de uma vez em sequência rápida.\n\nArmazena a URL base da API da sua instância de chat, de modo que todos os nós seguintes possam referenciar esse endereço de forma consistente.\n\nAo final, essas variáveis ficam disponíveis para qualquer nó subsequente, garantindo que dados de contexto (como timestamp, identificação do usuário e endereço de serviço) estejam sempre prontos para uso.\n\n\nse for usar/adicionar instancia_api de evolution(colocar o link sem a barra no final)"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "2a5f1168-e4ac-48c5-a397-4ab3347d2d4a",
              "leftValue": "={{ $('entradaChatwoot').item.json.body.conversation.labels[0] }}",
              "rightValue": "agent-off",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.3,
      "position": [
        39056,
        13728
      ],
      "id": "1c507b87-3017-4f41-a2b1-69b48fee34ad",
      "name": "FiltraAgentTag"
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT COUNT(*) as total\nFROM indexmed_n8n_chat_histories\nWHERE session_id = $1\n  AND message->>'type' = 'ai'",
        "options": {
          "queryReplacement": "={{ $('PayloadPergunta').item.json.sender.id }}"
        }
      },
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.6,
      "position": [
        38880,
        14080
      ],
      "id": "d4e4c58e-0d4d-4105-b6a6-2e9b505a70b1",
      "name": "VerificaHistorico",
      "credentials": {
        "postgres": {
          "id": "gAyiqQlRccQJQD5p",
          "name": "Postgres account"
        }
      }
    },
    {
      "parameters": {
        "url": "=https://app.neofluxx.com/api/v1/accounts/{{ $('PayloadPergunta').item.json.account.id }}/contacts/{{ $('PayloadPergunta').item.json.sender.id }}",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        38688,
        14080
      ],
      "id": "57654187-4659-403d-a9cd-34e073c7251b",
      "name": "Get CW Contact Informations",
      "credentials": {
        "httpHeaderAuth": {
          "id": "J4PQSm40Hwl2hYlW",
          "name": "Chatfluxx Auth account (Leandro)"
        }
      }
    },
    {
      "parameters": {
        "workflowId": {
          "__rl": true,
          "value": "4GJGO0OA2TWB4Q2s",
          "mode": "list",
          "cachedResultUrl": "/workflow/4GJGO0OA2TWB4Q2s",
          "cachedResultName": "TrataGapHandoffHumano"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "conversation_id": "={{ $('PayloadPergunta').item.json.conversation.id }}",
            "account_id": "={{ $('PayloadPergunta').item.json.account.id }}",
            "sender_id": "={{ $json.sender.id }}"
          },
          "matchingColumns": [
            "conversation_id",
            "account_id",
            "sender_id"
          ],
          "schema": [
            {
              "id": "account_id",
              "displayName": "account_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "number",
              "removed": false
            },
            {
              "id": "conversation_id",
              "displayName": "conversation_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "number",
              "removed": false
            },
            {
              "id": "sender_id",
              "displayName": "sender_id",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "number",
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        },
        "options": {}
      },
      "type": "n8n-nodes-base.executeWorkflow",
      "typeVersion": 1.2,
      "position": [
        38480,
        14080
      ],
      "name": "Call TrataGapHandoffHumano",
      "id": "49ffb0f2-3de1-44a0-b50d-37287684aacd"
    },
    {
      "parameters": {
        "resource": "audio",
        "operation": "transcribe",
        "binaryPropertyName": "={{ $('baixaAudio').item.binary.data }}",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 2.1,
      "position": [
        40160,
        14032
      ],
      "id": "503b41dc-2007-42bd-aced-e13fabd9fe5d",
      "name": "Transcribe a recording1",
      "retryOnFail": true,
      "credentials": {
        "openAiApi": {
          "id": "EF30Y6T1kx4OkgZ0",
          "name": "OpenAi account (Indexmed)"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ $('mensagensAgregadas').item.json.messageUser }}",
        "options": {
          "systemMessage": "=# IDENTIDADE E MISSÃO\nVocê é **Bella**, SDR sênior da Indexmed. Seu único objetivo é converter leads em agendamentos na **Sessão Técnica** (apresentação online com especialistas, 1 hora, Q&A ao vivo). Toda interação deve convergir para esse agendamento — ou, em último caso, para o handoff.\n\nSeu tom é: assertivo, consultivo, caloroso e focado em conversão. Você nunca inventa informações, nunca promete o que não está na KB e nunca encerra a conversa passivamente enquanto houver data em aberto.\n\n---\n\n# DADOS INJETADOS\n\n| Variável | Valor |\n|---|---|\n| Dados do Lead | {{ $json.lead_memory }} |\n| Opções de Datas | {{ $json.next_wednesdays_br }} |\n| Contexto de Atendimento Humano | {{ $json.human_handoff_context }} |\n| Base de Conhecimento | {{ $json.base_conhecimento }} |\n\n> ⚠️ **EXTRAÇÃO OBRIGATÓRIA ANTES DE QUALQUER MENSAGEM:**\n> Leia `lead_memory` e extraia o **primeiro nome** do lead. Use sempre o primeiro nome real.\n> Se `lead_memory` estiver vazio ou sem nome → use APENAS \"você\". NUNCA invente um nome.\n> ⛔ PROIBIDO enviar a string literal `[Nome]` — sempre substitua pelo nome real ou por \"você\".\n\n---\n\n# COMO SE ORIENTAR NA CONVERSA\n\nVocê não tem um \"modo\" explícito — oriente-se sempre pelo **histórico da conversa e pelo conteúdo da mensagem do lead**:\n\n- **Se o histórico estiver vazio e o lead enviou apenas um cumprimento** (\"oi\", \"olá\", \"bom dia\") → execute a Abertura (Fase 1) completa.\n- **Se o histórico estiver vazio e o lead já trouxe conteúdo** (pergunta, escolha de data, apresentação, pedido de preço) → responda diretamente ao que ele escreveu usando a KB, e ao final direcione para as datas da Sessão Técnica.\n- **Se houver histórico** → leia-o, não repita o que já foi dito, e continue naturalmente de onde a conversa parou.\n- **Se `human_handoff_context` estiver preenchido** → leia o contexto, não repita assuntos já tratados e retome naturalmente. Mesmo que contenha uma data escolhida, sempre confirme os dados do lead antes de agendar.\n\n---\n\n# REGRAS GLOBAIS (INVIOLÁVEIS)\n\n## R1 — Integridade de Informação\nNunca invente funcionalidades, preços, prazos ou condições.\nNunca use expressões vagas como \"acredito que sim\" ou \"provavelmente temos isso\".\n→ Se a informação não estiver literalmente na KB, aplique o **Protocolo KB-404**.\n\n## R2 — Primeiro Nome Obrigatório\nToda mensagem de abertura DEVE começar: *\"Olá, [Nome]!\"* onde `[Nome]` é o valor real extraído de `lead_memory`.\n⛔ PROIBIDO usar o nome completo.\n⛔ PROIBIDO usar \"Olá!\" isolado sem o nome.\n\n## R3 — Re-ancoragem Ativa\nSempre que o lead encerrar com \"obrigado\", \"ok\", \"entendi\" ou similar — e houver datas em aberto — retome imediatamente:\n*\"[Nome], aproveitando — das datas que te enviei, [data1] ou [data2], qual funciona melhor para você?\"*\n⛔ PROIBIDO encerrar passivamente enquanto houver data em aberto.\n⛔ PROIBIDO usar \"Estou à disposição caso queira agendar\".\n\n> ⚠️ **EXCEÇÃO ABSOLUTA — R3 NÃO SE APLICA após agendamento confirmado:**\n> Se `meeting_scheduling` já foi acionada com sucesso nesta sessão, qualquer mensagem do lead deve ser respondida APENAS com uma despedida cordial e curta.\n> ⛔ PROIBIDO reoferecer datas após agendamento confirmado.\n\n## R4 — Não Repetição de Datas\nSe o lead já rejeitou as datas ou informou urgência:\n⛔ PROIBIDO repetir as datas.\n→ Avance para os benefícios da sessão (R6) ou Fase 2.\n\n## R5 — Recomendação de Plano\nUse o número de vidas para recomendar:\n- Até 500 vidas → **Plano Premium**\n- 501 a 1000 vidas → **Plano Pro**\n- Acima de 1000 vidas → **Plano Enterprise**\n\nSe o número de vidas não estiver disponível: pergunte de forma natural antes de recomendar.\n\n## R6 — Benefícios da Sessão Técnica (usar quando lead resistir a datas)\n1. **Atalho de Conhecimento** — entendimento do ecossistema em 1 hora\n2. **Visão Prática** — ver tela, módulos e fluxo de dados em tempo real\n3. **Troca de Insights** — dúvidas de outros gestores enriquecem sua estratégia\n4. **Respostas de Especialistas** — executivo técnico tira dúvidas complexas na hora\n\n## R7 — Funcionalidade vs. Plano\nAntes de responder qualquer pergunta sobre funcionalidade:\n\n**Passo 0:** Identifique na KB em qual plano a funcionalidade está.\n**Passo 1:** Compare com o plano recomendado para o lead.\n\n| Situação | Resposta |\n|---|---|\n| Funcionalidade **incluída** no plano do lead | Confirme diretamente. ⛔ PROIBIDO fazer upselling. |\n| Funcionalidade em plano **superior** | Confirme que existe e explique que o lead pode optar pelo plano superior. |\n\n## R8 — Objeção de Preço\nMencione o desconto de 10% no plano anual e reforce o valor da Sessão Técnica.\n⛔ PROIBIDO negociar fora desse escopo ou prometer descontos adicionais.\n\n## R9 — Dados do Lead Ausentes\nSe algum dado estiver ausente (cargo, empresa, vidas): adapte a abertura com os dados disponíveis e pergunte o que falta de forma natural.\n\n## R10 — Respostas de KB — Encerramento Direto\nApós responder com informação da KB: encerre diretamente.\n⛔ PROIBIDO usar \"Caso queira, posso encaminhar...\" ou variações.\n\n## R11 — Tratamento de Erro de Tools (UNIVERSAL)\nSempre que qualquer tool retornar erro ou falhar, você DEVE:\n1. Acionar `service_handoff` com `motivo` apropriado (use `erro_agendamento` para falhas em `meeting_scheduling` ou `update_contact`) e `resumo` descrevendo o contexto do erro e o que o lead estava tentando fazer.\n2. Somente APÓS retorno positivo do `service_handoff`, enviar a mensagem padrão de transferência ao lead.\n\n⛔ PROIBIDO enviar mensagem de \"problema técnico\" (ou similar) ao lead sem antes acionar `service_handoff`.\n⛔ PROIBIDO retentar a mesma tool no mesmo turno após ela falhar.\n⛔ PROIBIDO continuar executando outras tools de negócio após uma falha — apenas `service_handoff`.\n⛔ PROIBIDO ignorar a falha e continuar como se tivesse sido sucesso.\n\n## R12 — Vedação de Handoff Fantasma (PRIORIDADE MÁXIMA)\n\nSe você pretende enviar uma mensagem com conteúdo de transferência/handoff, a tool `service_handoff` DEVE ter sido chamada com sucesso ANTES no mesmo turno.\n\n**Frases/conteúdos que EXIGEM chamada prévia obrigatória da tool `service_handoff`:**\n- \"vou encaminhar seu pedido / sua conversa / seu atendimento\"\n- \"vou acionar o time / um consultor / a pessoa certa\"\n- \"vou te transferir\" / \"vou transferir seu atendimento\"\n- \"em breve entrarão em contato\"\n- \"um consultor vai entrar em contato\"\n- \"vou direcionar pra um especialista humano\"\n- Qualquer variação prometendo que alguém humano vai contatar o lead\n\n⛔ PROIBIDO enviar qualquer mensagem contendo as frases acima sem ter acionado e recebido retorno positivo da tool `service_handoff`.\n⛔ PROIBIDO \"simular\" handoff só com texto — se não acionou a tool, o sistema humano NÃO foi notificado e o lead vai ficar sem resposta.\n⛔ PROIBIDO inventar frases alternativas que pareçam handoff pra burlar essa regra — a regra vale para o INTENT da mensagem, não só as palavras literais.\n\nSe a tool falhar, aplique R11. Se estiver em dúvida se é hora de handoff, escolha outro caminho (reforço de benefícios, oferta de teste, pergunta de qualificação) em vez de prometer contato humano sem agir.\n\n---\n\n# PROTOCOLOS ESPECIAIS\n\n## 🚫 Protocolo KB-404 (Informação não encontrada na KB)\n\n**Quando acionar:** Pergunta do lead não tem resposta literal na KB.\n\n**Script padrão (datas ainda em aberto):**\n> \"Essa é uma ótima pergunta, e quero te dar uma resposta precisa — não vou arriscar te passar algo incorreto aqui. Esse detalhe é exatamente o que nosso especialista aborda na Sessão Técnica, onde você vê a plataforma ao vivo e tira todas as dúvidas em tempo real. Das datas disponíveis — {{ $json.next_wednesdays_br }} — qual funciona melhor para você?\"\n\n**Script variação (datas já rejeitadas):**\n> \"Essa é uma ótima pergunta, e quero te dar uma resposta precisa. Esse detalhe específico nosso especialista responde com exatidão na Sessão Técnica. Enquanto isso, que tal começar com o teste gratuito de 10 dias e explorar a plataforma você mesmo?\"\n\n**Contador KB-404:**\n- Cada pergunta sem resposta completa incrementa o contador.\n- **3 perguntas consecutivas sem resposta** → acione `service_handoff`.\n- O contador zera se o lead fizer uma pergunta respondível pela KB.\n\n---\n\n## ⚡ Protocolo Compra Imediata (PRIORIDADE MÁXIMA)\n\n**Quando acionar:** Lead expressa intenção de comprar/assinar/contratar diretamente.\n\n**Ação:** Ofereça a Sessão Técnica UMA ÚNICA VEZ com no máximo 2 benefícios.\n\n**Se o lead recusar ou insistir em comprar:**\n> 🚨 SEQUÊNCIA OBRIGATÓRIA:\n> 1. Acione `service_handoff` com `motivo`: `compra_imediata` e `resumo` do que foi discutido.\n> 2. Somente após retorno da tool, envie EXCLUSIVAMENTE:\n\n*\"Entendo perfeitamente sua urgência, [Nome]! A Sessão Técnica é uma excelente oportunidade para garantir que você aproveite 100% dos recursos do [Plano Recomendado] desde o primeiro dia, mas como você já tem uma decisão tomada e precisa de agilidade, vou te encaminhar agora mesmo para um consultor comercial seguir com o seu processo de contratação. Foi um prazer te atender e em breve ele entrará em contato. 😊\"*\n\n⛔ PROIBIDO enviar a mensagem sem antes ter acionado e recebido retorno da tool `service_handoff`.\n⛔ PROIBIDO enviar `[Nome]` literal — substitua sempre pelo nome real.\n⛔ PROIBIDO oferecer teste gratuito, aplicar Fase 2 ou repetir benefícios após a primeira recusa.\n⛔ PROIBIDO enviar mais de uma mensagem — esta encerra a conversa.\n\n---\n\n## 🔄 Protocolo Continuidade / Contato Prévio\n\n**Quando acionar:** Lead menciona ter entrado em contato por outro canal sem resposta, faz referência a conversa/pedido anterior em andamento, pergunta sobre setor específico (B2G/órgãos públicos/consultorias grandes) não coberto detalhadamente na KB, **ou pede explicitamente contato por outro canal (telefone, email, videochamada 1:1)**.\n\n### Cenário A — Contato prévio não respondido\n\n**Sinais típicos:**\n- *\"enviei email e não recebi resposta\"*\n- *\"mandei mensagem e ninguém retornou\"*\n- *\"estou aguardando retorno sobre X\"*\n- *\"tenho um orçamento em aberto\"*\n- Menciona canais externos (email, telefone, site, formulário) em que já tentou contato\n- Pergunta sobre **órgãos públicos**, **licitações**, **SESMT de grande porte**, ou integrações específicas não cobertas na KB\n\n**🚨 SEQUÊNCIA OBRIGATÓRIA:**\n1. Acione `service_handoff` com `motivo`: `continuidade_atendimento` e `resumo` descrevendo: nome do lead, canal anterior mencionado (email/telefone/site), e assunto se souber.\n2. Somente após retorno positivo da tool, envie EXCLUSIVAMENTE:\n\n> *\"[Nome], desculpe pela demora no retorno. Vou acionar agora mesmo a pessoa certa do nosso time para dar continuidade ao que você já havia enviado. Em breve entrarão em contato com você diretamente. 😊\"*\n\n### Cenário B — Lead pede canal alternativo (telefone, email, videochamada 1:1)\n\n**Sinais típicos (pedido EXPLÍCITO de canal alternativo, na PRIMEIRA menção):**\n- *\"quero falar por telefone\"* / *\"gostaria de falar por telefone\"*\n- *\"pode me ligar?\"* / *\"podemos conversar por telefone?\"*\n- *\"prefiro ligação\"*\n- *\"vocês têm um telefone de contato?\"*\n- *\"quero falar com alguém por videochamada / Zoom / Meet (fora da Sessão Técnica)\"*\n- *\"quero conversar 1:1 agora\"* (pedido imediato, não sobre agendamento de demo)\n- *\"me passa o contato de um consultor\"*\n\n⛔ PROIBIDO nesses casos oferecer a Sessão Técnica como alternativa — o lead já escolheu o canal preferido dele. Forçar Sessão Técnica vira fricção.\n\n**🚨 SEQUÊNCIA OBRIGATÓRIA:**\n1. Acione `service_handoff` com `motivo`: `continuidade_atendimento` e `resumo` descrevendo: nome do lead, canal solicitado (telefone/email/videocall) e, se houver, o tópico que ele quer discutir.\n2. Somente após retorno positivo da tool, envie EXCLUSIVAMENTE:\n\n> *\"[Nome], claro! Vou acionar agora mesmo um consultor do nosso time para entrar em contato com você no canal que você preferir. Em breve você receberá o retorno. 😊\"*\n\n### Por que fazer handoff nos 2 cenários\n\n- Bella não tem acesso ao histórico fora do WhatsApp (emails, telefone, formulários anteriores)\n- Bella não consegue realizar ligação telefônica nem marcar call externa\n- Lead tem contexto ou pedido específico que precisa ser tratado humanamente\n- Tentar responder \"em paralelo\" sem saber do contato anterior gera fricção\n- Setores específicos (B2G) demandam tratamento comercial especializado\n\n⛔ PROIBIDO tentar responder a dúvida em paralelo sem antes acionar handoff.\n⛔ PROIBIDO ignorar referências a contatos anteriores ou pedidos em aberto.\n⛔ PROIBIDO insistir na Sessão Técnica quando o lead pediu canal alternativo específico.\n⛔ PROIBIDO enviar mensagem de handoff/encaminhamento sem antes acionar a tool `service_handoff` (ver **R12**).\n\n---\n\n## 🛠️ Protocolo Suporte\n\n### Classificação\n\n| Sinal | Tratamento |\n|---|---|\n| Não consegue logar, esqueceu senha, erro no sistema, cobrança indevida, cancelamento | **Suporte** |\n| Perguntas sobre preço, planos, funcionalidades, trials, \"como funciona\" | **Vendas** |\n| Ambíguo (sem menção a problema) | **Tratar como Vendas** |\n\n### Fluxo de Suporte\n\n**Passo 1 — Valide antes de redirecionar:**\n> *\"[Nome], pelo que você descreveu, parece que você já é cliente da Indexmed e precisa de atendimento de suporte. É isso mesmo?*\n> *Se sim, nossos canais são:*\n> *📧 suporte@indexmed.com.br*\n> *📱 WhatsApp: (11) 2311-4186*\n> *Agora, se você ainda não é cliente e quer conhecer nossa plataforma, estou aqui para te ajudar! 😊\"*\n\n**Passo 2a — Lead confirma suporte:**\n> *\"Perfeito! O caminho mais rápido é acionar diretamente nosso time:*\n> *📧 suporte@indexmed.com.br*\n> *📱 (11) 2311-4186*\n> *Eles vão te atender com toda a atenção que você merece. Até mais, [Nome]! 😊\"*\n\n⛔ PROIBIDO continuar tentando agendar após confirmação de suporte.\n⛔ PROIBIDO acionar `service_handoff` neste fluxo.\n\n**Passo 2b — Lead insiste em ser atendido neste canal:**\n> *\"Entendo sua frustração, [Nome]! Porém, este canal é exclusivo para novos clientes. Nosso time de suporte resolve sua situação com muito mais agilidade:*\n> *📧 suporte@indexmed.com.br | 📱 (11) 2311-4186*\n> *Conte com eles! 😊\"*\n\n⛔ PROIBIDO responder qualquer mensagem após o Passo 2b.\n\n**Passo 2c — Lead nega que precisa de suporte:**\nTrate como prospect e retome o fluxo normal.\n\n---\n\n# FLUXO PRINCIPAL\n\n## Fase 1 — Abertura\n\n> *\"Olá, [Nome]! Aqui é a Bella da Indexmed. [FRASE_CONTEXTO] Com base nesse volume, acredito que o nosso **[Plano Recomendado]** seja a solução ideal para automatizar sua gestão de SST. Para você ver como isso funciona na prática, nossas próximas sessões técnicas são: {{ $json.next_wednesdays_br }}. Qual funciona melhor para você?\"*\n\n**FRASE_CONTEXTO — escolha conforme os dados disponíveis:**\n\n| Dados disponíveis | Frase |\n|---|---|\n| Cargo ≠ \"Outro\" + Empresa + Vidas | *\"Vi que você é [Cargo] na [Empresa] e gerencia [Vidas].\"* |\n| Cargo = \"Outro\" + Empresa + Vidas | *\"Vi que você trabalha na [Empresa] e gerencia [Vidas].\"* |\n| Sem cargo + Empresa + Vidas | *\"Vi que você trabalha na [Empresa] e gerencia [Vidas].\"* |\n| Sem vidas | Adapte e pergunte as vidas antes de recomendar o plano. |\n\n---\n\n## Fase 2 — Objeções / Dúvidas / Rejeição de Datas\n\n1. Responda com a KB (aplique R7 para funcionalidades).\n2. Se resistir: reforce benefícios da sessão (R6).\n3. Se ainda resistir: ofereça teste gratuito de 10 dias.\n\n⛔ EXCEÇÃO: Se o lead veio via intenção de compra imediata → aplique exclusivamente o Protocolo Compra Imediata.\n\n---\n\n## Fase 2.5 — Confirmação de Agendamento\n\n### Passo 0 — Valide a data escolhida\nExtraia apenas o dia (DD) de cada data em `{{ $json.next_wednesdays_br }}` e compare com o número informado pelo lead.\nSe inválida:\n> *\"Que pena, [Nome]! Essa data não está disponível. As datas abertas são: {{ $json.next_wednesdays_br }}. Qual delas funciona melhor para você?\"*\n\n⛔ PROIBIDO avançar com data inválida.\n\n### Passo 1 — Confirme os dados\nEnvie como **UMA ÚNICA MENSAGEM** usando `\n` para quebrar as linhas:\n> *\"Ótimo, [Nome]! Antes de confirmar sua vaga, deixa eu verificar seus dados:\n📋 Nome completo: [nome completo do lead]\n📧 E-mail: [email do lead]\n📱 Telefone: [telefone do lead]\n👥 Vidas gerenciadas: [vidas do lead]\n\nEstá tudo correto ou precisa atualizar alguma informação?\"*\n\n⛔ PROIBIDO enviar cada linha como mensagem separada.\n\n### Passo 2 — Aguarde confirmação explícita\n⛔ PROIBIDO executar qualquer tool antes da confirmação.\n\n### Passo 3a — Dados corretos\n1. Acione `meeting_scheduling`.\n2. 🚨 SE `meeting_scheduling` RETORNAR ERRO (aplicação da Regra R11):\n   a. Acione `service_handoff` com `motivo`: `erro_agendamento` e `resumo` com nome do lead e data escolhida.\n   b. Somente após retorno, envie EXCLUSIVAMENTE:\n> *\"[Nome], parece que houve um problema técnico para agendar sua sessão no momento. Por favor, aguarde que estou transferindo o seu atendimento. Em breve um especialista da Indexmed entrará em contato. Obrigado pela compreensão! 😊\"*\n3. Se sucesso → envie:\n> *\"Sessão agendada para [data] às 10h (horário de Brasília). Você receberá o link de acesso por e-mail. Até lá, [Nome]! 😊\"*\n\n### Passo 3b — Lead corrige dados\n\n> 🚨 SEQUÊNCIA OBRIGATÓRIA — 4 passos, nesta ordem:\n\n**PASSO 1 — Exiba o bloco corrigido como UMA ÚNICA MENSAGEM:**\n> *\"Atualizei seus dados! Vamos confirmar:\n📋 Nome completo: [nome corrigido]\n📧 E-mail: [email]\n📱 Telefone: [telefone]\n👥 Vidas gerenciadas: [vidas corrigidas]\n\nEstá tudo certo agora?\"*\n\n⛔ PROIBIDO acionar qualquer tool antes de exibir este bloco.\n\n**PASSO 2 — PARE e aguarde confirmação explícita do lead.**\n\n**PASSO 3 — Somente após confirmação, acione `update_contact` com os dados corrigidos.**\n🚨 SE `update_contact` RETORNAR ERRO: aplique a Regra R11 (acione `service_handoff` com `motivo`: `erro_agendamento` e `resumo` descrevendo que a atualização cadastral falhou) e PARE. NÃO chame `meeting_scheduling` após falha.\n\n**PASSO 4 — Somente após sucesso de `update_contact`, acione `meeting_scheduling`.**\n🚨 SE `meeting_scheduling` RETORNAR ERRO: aplique a Regra R11 (acione `service_handoff`, depois envie a mensagem de transferência).\n\n⛔ PROIBIDO acionar `meeting_scheduling` antes de `update_contact`.\n⛔ PROIBIDO acionar `meeting_scheduling` se `update_contact` falhou.\n⛔ PROIBIDO enviar cada linha como mensagem separada.\n\n---\n\n## Fase 3 — Handoff\n\n**Quando acionar `service_handoff`:**\n- Lead insiste em atendimento 1:1 pela **segunda vez** após oferta de sessão + teste.\n- **3 perguntas consecutivas** sem resposta na KB.\n- Incompatibilidade total de agenda para as próximas 2 semanas.\n- Intenção de compra imediata + recusa da Sessão Técnica.\n- **Lead menciona contato prévio por outro canal (email/telefone/site) sem resposta** → ver Protocolo Continuidade / Contato Prévio.\n\n**🚨 SEQUÊNCIA OBRIGATÓRIA:**\n1. Acione `service_handoff` com `motivo` e `resumo` do atendimento.\n2. Somente após retorno, envie EXCLUSIVAMENTE:\n\n*\"Entendo perfeitamente sua urgência, [Nome]! A Sessão Técnica é uma excelente oportunidade para garantir que você aproveite 100% dos recursos do [Plano Recomendado] desde o primeiro dia, mas como você já tem uma decisão tomada e precisa de agilidade, vou te encaminhar agora mesmo para um consultor comercial seguir com o seu processo de contratação. Foi um prazer te atender e em breve ele entrará em contato. 😊\"*\n\n⛔ PROIBIDO enviar a mensagem sem antes ter acionado e recebido retorno da tool.\n⛔ PROIBIDO enviar mais de uma mensagem — esta encerra a conversa.\n"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 3.1,
      "position": [
        42672,
        13584
      ],
      "id": "c299ec7e-1a87-461a-bcd5-c06faee9b2ef",
      "name": "SDR AI Agent1"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=http://sdr-indexmed:8000/chat",
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"message\": \"{{ $('tiposCampanha').item.json.messageUser }}\",\n  \"session_id\": \"cw-{{ $('entradaChatwoot').first().json.body.conversation.id }}\",\n  \"lead_data\": {\n    \"lead_id\": \"{{ $('entradaChatwoot').first().json.body.sender.id }}\",\n    \"primeiro_nome\": \"{{ (() => { const nome = ($('entradaChatwoot').first().json.body.sender.name || '').trim(); const primeiroNome = nome.split(' ').filter(Boolean)[0] || 'Cliente'; return primeiroNome.charAt(0).toUpperCase() + primeiroNome.slice(1).toLowerCase(); })() }}\",\n    \"nome_completo\": \"{{ $('entradaChatwoot').first().json.body.sender.name }}\",\n    \"empresa\": \"{{ $('entradaChatwoot').first().json.body.sender.custom_attributes.empresa }}\",\n    \"cargo\": \"{{ $('entradaChatwoot').first().json.body.sender.custom_attributes.cargo }}\",\n    \"email\": \"{{ $('entradaChatwoot').first().json.body.sender.email }}\",\n    \"telefone\": \"{{ $('entradaChatwoot').first().json.body.sender.phone_number }}\",\n    \"vidas_gerenciadas\": \"{{ $('entradaChatwoot').first().json.body.sender.custom_attributes.vidas }}\",\n    \"origem\": \"form_site\"\n  },\n  \"chatwoot\": {\n    \"account_id\": \"{{ $('entradaChatwoot').first().json.body.account.id }}\",\n    \"conversation_id\": \"{{ $('entradaChatwoot').first().json.body.conversation.id }}\",\n    \"inbox_id\": \"{{ $('entradaChatwoot').first().json.body.inbox.id }}\",\n    \"contact_id\": \"{{ $('entradaChatwoot').first().json.body.sender.id }}\"\n  }\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        42816,
        14400
      ],
      "id": "bd4b9390-5e56-4b71-9b7b-3a013848c95f",
      "name": "AI Agent"
    }
  ],
  "pinData": {
    "entradaChatwoot": [
      {
        "json": {
          "headers": {
            "host": "webhooks-indexmed.neofluxx.com",
            "user-agent": "rest-client/2.1.0 (linux-musl x86_64) ruby/3.4.4p34",
            "content-length": "4282",
            "accept": "application/json",
            "accept-encoding": "gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
            "content-type": "application/json",
            "x-forwarded-for": "5.161.95.198",
            "x-forwarded-host": "webhooks-indexmed.neofluxx.com",
            "x-forwarded-port": "443",
            "x-forwarded-proto": "https",
            "x-forwarded-server": "traefik_traefik.1",
            "x-real-ip": "5.161.95.198"
          },
          "params": {},
          "query": {},
          "body": {
            "account": {
              "id": 4,
              "name": "Indexmed"
            },
            "additional_attributes": {},
            "content_attributes": {},
            "content_type": "text",
            "content": "Dia 06/05",
            "conversation": {
              "additional_attributes": {},
              "can_reply": true,
              "channel": "Channel::Whatsapp",
              "contact_inbox": {
                "id": 45265,
                "contact_id": 44580,
                "inbox_id": 85,
                "source_id": "5562993072074",
                "created_at": "2026-05-05T01:29:18.443Z",
                "updated_at": "2026-05-05T01:29:18.443Z",
                "hmac_verified": false,
                "pubsub_token": "85VVEHfXiLWrMe8Y6ie426U5"
              },
              "id": 3175,
              "inbox_id": 85,
              "messages": [
                {
                  "id": 514336,
                  "content": "Dia 06/05",
                  "account_id": 4,
                  "inbox_id": 85,
                  "conversation_id": 3175,
                  "message_type": 0,
                  "created_at": 1777946029,
                  "updated_at": "2026-05-05T01:53:49.034Z",
                  "private": false,
                  "status": "sent",
                  "source_id": "wamid.HBgMNTU2MjkzMDcyMDc0FQIAEhgUM0FENTZFMEEzNzczREFCODg1REMA",
                  "content_type": "text",
                  "content_attributes": {},
                  "sender_type": "Contact",
                  "sender_id": 44580,
                  "external_source_ids": {},
                  "additional_attributes": {},
                  "processed_message_content": "Dia 06/05",
                  "sentiment": {},
                  "conversation": {
                    "assignee_id": null,
                    "unread_count": 1,
                    "last_activity_at": 1777946029,
                    "contact_inbox": {
                      "source_id": "5562993072074"
                    }
                  },
                  "sender": {
                    "additional_attributes": {
                      "city": "não informado",
                      "country": "Brazil",
                      "description": "",
                      "company_name": "Segurança do Trabalho",
                      "country_code": "BR",
                      "avatar_url_hash": "0994e93b0bb5283ab78b9897af3af2d6d0a5893156eb7603cd18d1f2c3c7042b",
                      "last_avatar_sync_at": "2026-02-26T13:43:58Z"
                    },
                    "custom_attributes": {
                      "cnpj": "null",
                      "cargo": "Engenheiro(a)",
                      "vidas": "De 501 a 1000 vidas",
                      "estado": "não informado",
                      "empresa": "Segurança do Trabalho",
                      "form_name": "formulario_site",
                      "form_source": "Landing page da área informações de planos",
                      "nome_empresa": "laine",
                      "como_conheceu": "unknown",
                      "area_de_atuacao": "Segurança do Trabalho",
                      "empresa_area_atuacao": "n/a"
                    },
                    "email": "ambientaleng.ar@gmail.com",
                    "id": 44580,
                    "identifier": "62993072074",
                    "name": "Laine",
                    "phone_number": "+5562993072074",
                    "thumbnail": "",
                    "blocked": false,
                    "type": "contact"
                  }
                }
              ],
              "labels": [],
              "meta": {
                "sender": {
                  "additional_attributes": {
                    "city": "não informado",
                    "country": "Brazil",
                    "description": "",
                    "company_name": "Segurança do Trabalho",
                    "country_code": "BR",
                    "avatar_url_hash": "0994e93b0bb5283ab78b9897af3af2d6d0a5893156eb7603cd18d1f2c3c7042b",
                    "last_avatar_sync_at": "2026-02-26T13:43:58Z"
                  },
                  "custom_attributes": {
                    "cnpj": "null",
                    "cargo": "Engenheiro(a)",
                    "vidas": "De 501 a 1000 vidas",
                    "estado": "não informado",
                    "empresa": "Segurança do Trabalho",
                    "form_name": "formulario_site",
                    "form_source": "Landing page da área informações de planos",
                    "nome_empresa": "laine",
                    "como_conheceu": "unknown",
                    "area_de_atuacao": "Segurança do Trabalho",
                    "empresa_area_atuacao": "n/a"
                  },
                  "email": "ambientaleng.ar@gmail.com",
                  "id": 44580,
                  "identifier": "62993072074",
                  "name": "Laine",
                  "phone_number": "+5562993072074",
                  "thumbnail": "",
                  "blocked": false,
                  "type": "contact"
                },
                "assignee": null,
                "assignee_type": null,
                "team": null,
                "hmac_verified": false
              },
              "status": "open",
              "custom_attributes": {
                "priority_conversation_number": 3
              },
              "snoozed_until": null,
              "unread_count": 1,
              "first_reply_created_at": "2026-05-05T01:29:18.482Z",
              "priority": null,
              "waiting_since": 1777946029,
              "agent_last_seen_at": 0,
              "contact_last_seen_at": 0,
              "last_activity_at": 1777946029,
              "timestamp": 1777946029,
              "created_at": 1777944558,
              "updated_at": 1777946029.068649
            },
            "created_at": "2026-05-05T01:53:49.034Z",
            "id": 514336,
            "inbox": {
              "id": 85,
              "name": "Agente Comercial"
            },
            "message_type": "incoming",
            "private": false,
            "sender": {
              "account": {
                "id": 4,
                "name": "Indexmed"
              },
              "additional_attributes": {
                "city": "não informado",
                "country": "Brazil",
                "description": "",
                "company_name": "Segurança do Trabalho",
                "country_code": "BR",
                "avatar_url_hash": "0994e93b0bb5283ab78b9897af3af2d6d0a5893156eb7603cd18d1f2c3c7042b",
                "last_avatar_sync_at": "2026-02-26T13:43:58Z"
              },
              "avatar": "",
              "custom_attributes": {
                "cnpj": "null",
                "cargo": "Engenheiro(a)",
                "vidas": "De 501 a 1000 vidas",
                "estado": "não informado",
                "empresa": "Segurança do Trabalho",
                "form_name": "formulario_site",
                "form_source": "Landing page da área informações de planos",
                "nome_empresa": "laine",
                "como_conheceu": "unknown",
                "area_de_atuacao": "Segurança do Trabalho",
                "empresa_area_atuacao": "n/a"
              },
              "email": "ambientaleng.ar@gmail.com",
              "id": 44580,
              "identifier": "62993072074",
              "name": "Laine",
              "phone_number": "+5562993072074",
              "thumbnail": "",
              "blocked": false
            },
            "source_id": "wamid.HBgMNTU2MjkzMDcyMDc0FQIAEhgUM0FENTZFMEEzNzczREFCODg1REMA",
            "event": "message_created"
          },
          "webhookUrl": "https://webhooks-indexmed.neofluxx.com/webhook/sdr-ai-agent",
          "executionMode": "production"
        },
        "pairedItem": {
          "item": 0
        }
      }
    ]
  },
  "connections": {
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "SDR AI Agent",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Agente de Finalização de desqualificados",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Postgres Chat Memory": {
      "ai_memory": [
        [
          {
            "node": "SDR AI Agent",
            "type": "ai_memory",
            "index": 0
          },
          {
            "node": "Agente de Finalização de desqualificados",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Create Meetings Date": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "SDR AI Agent": {
      "main": [
        []
      ]
    },
    "meeting_scheduling": {
      "ai_tool": [
        [
          {
            "node": "SDR AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "service_handoff": {
      "ai_tool": [
        [
          {
            "node": "SDR AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "update_contact": {
      "ai_tool": [
        [
          {
            "node": "SDR AI Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "FiltraSomenteCliente": {
      "main": [
        [
          {
            "node": "filtraNumeros",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PayloadPergunta": {
      "main": [
        [
          {
            "node": "Call TrataGapHandoffHumano",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcrição": {
      "main": [
        [
          {
            "node": "mensagemConsolidada",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "EnviaChatwoot": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Agente de Finalização de desqualificados": {
      "main": [
        []
      ]
    },
    "pegaMensagem": {
      "main": [
        [
          {
            "node": "mensagemConsolidada",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Date & Time": {
      "main": [
        [
          {
            "node": "setCurrentDate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "messageInsert": {
      "main": [
        [
          {
            "node": "messageAgregated",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "setCurrentDate": {
      "main": [
        [
          {
            "node": "getMessage",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "getFutureDate": {
      "main": [
        [
          {
            "node": "confereFutureTime",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "getMessage": {
      "main": [
        [
          {
            "node": "messageInsert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "confereFutureTime": {
      "main": [
        [
          {
            "node": "mensagensAgregadas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "messageAgregated": {
      "main": [
        [
          {
            "node": "tempoEspera",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "tempoEspera": {
      "main": [
        [
          {
            "node": "getFutureDate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "entradaChatwoot": {
      "main": [
        [
          {
            "node": "FiltraInbox",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "resetMessageAgregated",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "intervaloPartes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "particionaMensagem": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "salvaInformaçõesAudio": {
      "main": [
        [
          {
            "node": "baixaAudio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "baixaAudio": {
      "main": [
        [
          {
            "node": "Transcribe a recording1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "mensagensAgregadas": {
      "main": [
        [
          {
            "node": "tiposCampanha",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "intervaloPartes": {
      "main": [
        [
          {
            "node": "EnviaChatwoot",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "separaTexto": {
      "main": [
        [
          {
            "node": "pegaMensagem",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "tipoMensagemChatwoot": {
      "main": [
        [
          {
            "node": "separaTexto",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "separaTexto",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "separaTexto",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "salvaInformaçõesAudio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "tiposCampanha": {
      "main": [
        [],
        [
          {
            "node": "Create Meetings Date",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Create Meetings Date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "FiltraInbox": {
      "main": [
        [
          {
            "node": "FiltraSomenteCliente",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "filtraNumeros": {
      "main": [
        [
          {
            "node": "FiltraAgentTag",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "mensagemConsolidada": {
      "main": [
        [
          {
            "node": "Date & Time",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "w-cfg": {
      "main": [
        [
          {
            "node": "tipoMensagemChatwoot",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "FiltraAgentTag": {
      "main": [
        [
          {
            "node": "PayloadPergunta",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "VerificaHistorico": {
      "main": [
        [
          {
            "node": "w-cfg",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get CW Contact Informations": {
      "main": [
        [
          {
            "node": "VerificaHistorico",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Call TrataGapHandoffHumano": {
      "main": [
        [
          {
            "node": "Get CW Contact Informations",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe a recording1": {
      "main": [
        [
          {
            "node": "Transcrição",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "particionaMensagem",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "availableInMCP": true,
    "timeSavedMode": "fixed",
    "errorWorkflow": "K2LaNGa5mWokz7en",
    "callerPolicy": "workflowsFromSameOwner"
  },
  "versionId": "e88c8b00-c9b0-43bc-8c0c-90fd31d6cce6",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "4c77d89ec915bc078747315cdb5d4cdb431200dbbb20a5e7e7e4671e8131788e"
  },
  "id": "O6Yu3ntvgMrg52mA",
  "tags": [
    {
      "updatedAt": "2026-03-10T14:18:09.880Z",
      "createdAt": "2026-03-10T14:18:09.880Z",
      "id": "sTn7EF97z7FNk8d2",
      "name": "SDR AI Agent"
    }
  ]
}