{
  "id": "VD3s5aMcu8PJi0rN",
  "name": "Clínica Essenza: Central de Atendimento e Ingestão de Agendamentos",
  "active": true,
  "isArchived": false,
  "versionId": "999957ac-339a-44a3-802a-0ed9cc07198f",
  "activeVersionId": null,
  "triggerCount": 2,
  "nodeCount": 17,
  "createdAt": "2026-11-09T11:50:20.787Z",
  "updatedAt": "2026-11-11T13:56:18.709Z",
  "settings": {
    "executionOrder": "v1",
    "binaryMode": "separate",
    "availableInMCP": true
  },
  "tags": [],
  "parentFolderId": null,
  "scopes": [
    "execution:delete",
    "execution:list",
    "execution:read",
    "execution:reveal",
    "workflow:create",
    "workflow:delete",
    "workflow:disableRedaction",
    "workflow:enableRedaction",
    "workflow:execute",
    "workflow:execute-chat",
    "workflow:export",
    "workflow:import",
    "workflow:list",
    "workflow:move",
    "workflow:publish",
    "workflow:read",
    "workflow:share",
    "workflow:unpublish",
    "workflow:unshare",
    "workflow:update"
  ],
  "canExecute": true,
  "connections": {
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent: Concierge Essenza",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent: Concierge Essenza": {
      "main": [
        [
          {
            "node": "Enviar Resposta WhatsApp (Evolution API)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Consultar Vagas da Agenda": {
      "ai_tool": [
        [
          {
            "node": "AI Agent: Concierge Essenza",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Registrar Agendamento na Planilha": {
      "ai_tool": [
        [
          {
            "node": "AI Agent: Concierge Essenza",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Postgres Chat Memory": {
      "ai_memory": [
        [
          {
            "node": "AI Agent: Concierge Essenza",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Webhook WhatsApp (Evolution API)": {
      "main": [
        [
          {
            "node": "Responder 200 à Evolution API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Responder 200 à Evolution API": {
      "main": [
        [
          {
            "node": "Filtrar e Normalizar WhatsApp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filtrar e Normalizar WhatsApp": {
      "main": [
        [
          {
            "node": "Validação de Origem e Dados",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook Formulário do Site": {
      "main": [
        [
          {
            "node": "Normalizar Dados do Site",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalizar Dados do Site": {
      "main": [
        [
          {
            "node": "Validação de Origem e Dados",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validação de Origem e Dados": {
      "main": [
        [
          {
            "node": "Origem é WhatsApp?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Responder Erro ao Site",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Origem é WhatsApp?": {
      "main": [
        [
          {
            "node": "AI Agent: Concierge Essenza",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Salvar Agendamento na Planilha",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Salvar Agendamento na Planilha": {
      "main": [
        [
          {
            "node": "Notificar WhatsApp Interno (Evolution API)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notificar WhatsApp Interno (Evolution API)": {
      "main": [
        [
          {
            "node": "Responder Sucesso ao Site",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "essenza-whatsapp",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "ca8c07aa-94cd-4b7f-817f-13e452132997",
      "name": "Webhook WhatsApp (Evolution API)",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        -544,
        144
      ],
      "webhookId": "webhook-essenza-whatsapp-inbound"
    },
    {
      "parameters": {
        "jsCode": "const body = $input.first()?.json?.body ?? {};\nif (body.event !== 'messages.upsert') {\n  return [];\n}\nconst data = body.data ?? {};\nconst key = data.key ?? {};\nif (key.fromMe === true) {\n  return [];\n}\nconst remoteJid = key.remoteJid ?? '';\nif (!remoteJid || remoteJid.endsWith('@g.us') || remoteJid.includes('status@broadcast')) {\n  return [];\n}\nconst message = data.message ?? {};\nconst text = message.conversation || message.extendedTextMessage?.text || message.imageMessage?.caption || '';\nif (!text || text.trim() === '') {\n  return [];\n}\nconst digits = remoteJid.replace('@s.whatsapp.net', '').replace(/\\D/g, '');\nlet normalizedPhone = digits;\nif (digits.length === 10 || digits.length === 11) {\n  normalizedPhone = '55' + digits;\n} else if (digits.length === 8 || digits.length === 9) {\n  normalizedPhone = '5511' + digits;\n}\nconst canonicalRemoteJid = normalizedPhone ? (normalizedPhone + '@s.whatsapp.net') : remoteJid;\nconst pushName = data.pushName ? data.pushName.trim() : '';\n\nreturn [{\n  json: {\n    origem: 'whatsapp',\n    evento_id: key.id || ('wa_' + Date.now()),\n    recebido_em: $now.setZone('America/Sao_Paulo').toFormat('dd/MM/yyyy HH:mm:ss'),\n    contato_id: canonicalRemoteJid,\n    remoteJid: canonicalRemoteJid,\n    telefone: normalizedPhone,\n    whatsapp: normalizedPhone,\n    nome: pushName || 'Paciente',\n    email: '',\n    queixa: 'Consulta Geral / Atendimento Clínico',\n    periodo: 'Indiferente',\n    simulador: 'Nenhum',\n    mensagem: text.trim(),\n    instance: body.instance || 'vivo',\n    is_valid: true\n  }\n}];"
      },
      "id": "8c48e3b5-a095-4bea-8e33-dd251b341de3",
      "name": "Filtrar e Normalizar WhatsApp",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -96,
        144
      ]
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "={{ \"Contexto do paciente:\\n- Nome: \" + $json.nome + \"\\n- Telefone WhatsApp: \" + $json.whatsapp + \"\\n- Canal de Origem: \" + $json.origem + \"\\n- Data atual: \" + $json.recebido_em + \"\\n- Queixa informada: \" + ($json.queixa || \"Não informada\") + \"\\n- Período preferencial: \" + ($json.periodo || \"Não informado\") + \"\\n- Dados do simulador do site: \" + ($json.simulador || \"Nenhum\") + \"\\n\\nMensagem do paciente:\\n\" + $json.mensagem }}",
        "options": {
          "systemMessage": "Você é o Concierge Médico Digital da Clínica Essenza — clínica médica boutique de referência em Dermatologia, Cosmiatria Avançada e Poupança Celular de Colágeno, localizada nos Jardins, em São Paulo/SP.\n\nSEU PAPEL\nVocê é o primeiro ponto de contato acolhedor, sofisticado e resolutivo com pacientes e interessados.\nSua missão é identificar com precisão a necessidade do paciente e conduzir o atendimento de forma humanizada, ética, clara e alinhada às boas práticas médicas.\n\nFORMATO DAS MENSAGENS — REGRAS OBRIGATÓRIAS\n- Escreva exclusivamente em texto simples adequado ao WhatsApp.\n- NÃO use Markdown convencional.\n- NÃO use títulos com \"#\", \"##\" ou \"###\".\n- NÃO use tabelas, blocos de código, links em formato Markdown, sublinhado ou formatação avançada.\n- NÃO use asteriscos duplos (**texto**), pois aparecem como caracteres literais no WhatsApp.\n- Para destacar uma palavra ou informação importante, use apenas um asterisco antes e depois do texto: *exemplo*.\n- Para itálico, use apenas um underline antes e depois do texto: _exemplo_.\n- Para listas, use hífen seguido de espaço no início da linha: \"- Item\".\n- Para perguntas ou opções, use uma lista curta, com no máximo 2 ou 3 itens.\n- Mantenha as mensagens curtas, elegantes e fáceis de ler no celular.\n- Divida respostas longas em mensagens naturais, quando necessário, sem excesso de emojis ou formatação.\n- Use no máximo 1 ou 2 emojis por mensagem, apenas quando agregarem leveza e elegância.\n- Nunca envie uma única mensagem muito longa com vários assuntos.\n\nIDENTIFICAÇÃO DE NECESSIDADES E CONDUTAS\n\n1. AGENDAMENTO DE CONSULTA NOVA E LEADS DO SITE\n- A primeira consulta médica diagnóstica tem duração de 60 minutos.\n- Ela inclui escuta clínica atenta, análise fotográfica e planejamento preventivo individualizado para saúde e longevidade cutânea.\n- Utilize a ferramenta \"Consultar Vagas da Agenda\" para verificar horários livres na planilha.\n- Apresente de forma elegante 2 ou 3 horários disponíveis compatíveis com o período desejado (manhã, tarde ou fim de tarde), indicando a equipe médica disponível:\n  - Dra. Camila Vasconcelos — CRM-SP 174.820\n  - Dr. Leonardo Meirelles — CRM-SP 189.442\n- Se o contato for originado do formulário do site (Canal de Origem: website): utilize OBRIGATORIAMENTE a ferramenta \"Registrar Agendamento na Planilha\" com status \"Solicitado via IA\" para registrar imediatamente a solicitação na planilha oficial e envie a mensagem de primeiro contato pelo WhatsApp apresentando os horários.\n- Assim que o paciente definir ou demonstrar interesse firme em um horário, utilize a ferramenta \"Registrar Agendamento na Planilha\" com o status \"Confirmado\".\n- Não confirme um horário como definitivo sem registrar o agendamento na planilha.\n\n2. REMARCAÇÃO DE CONSULTA\n- Acolha o pedido com serenidade e presteza.\n- Confirme com o paciente o horário atual da consulta, se ele souber informar.\n- Utilize \"Consultar Vagas da Agenda\" para identificar novas opções de data e horário.\n- Após o paciente escolher o novo horário, utilize \"Registrar Agendamento na Planilha\" com o status \"Remarcação\".\n- Confirme claramente a nova data e hora antes de encerrar o atendimento.\n\n3. CANCELAMENTO DE CONSULTA\n- Receba a solicitação com empatia, cordialidade e sem insistência indevida.\n- Pergunte se o paciente deseja apenas adiar para uma data futura ou se prefere que a equipe entre em contato posteriormente.\n- Registre o cancelamento na planilha com o status \"Cancelamento\" por meio da ferramenta \"Registrar Agendamento na Planilha\".\n- Se o paciente demonstrar interesse em reagendar, ofereça novas opções conforme o fluxo de remarcação.\n\n4. DÚVIDAS CLÍNICAS E TRATAMENTOS\n- Explique os tratamentos com base científica, linguagem acessível, elegância e responsabilidade.\n- Aborde, quando pertinente:\n  - Protocolo Radiance 360°: bioestimulação celular associada a laser Thulium.\n  - Poupança de Colágeno e bioestimuladores biocompatíveis, incluindo ácido poli-L-lático e hidroxiapatita de cálcio.\n  - Gerenciamento de melasma e rosácea, com foco na recuperação da barreira cutânea.\n  - Tecnologias não invasivas de ancoragem muscular e estímulo dérmico.\n- Não faça diagnóstico definitivo pelo WhatsApp.\n- Não prometa resultados garantidos, prazos fixos de resultado ou transformações absolutas.\n- Explique que a avaliação clínica presencial é indispensável para indicar o tratamento adequado.\n- Rigor ético: siga os princípios da Resolução CFM nº 2.336/2023.\n- Evite sensacionalismo, promessas exageradas, comparações irreais ou linguagem publicitária agressiva.\n\n5. VALORES, PAGAMENTO E CONVÊNIOS\n- Informe que a clínica atende exclusivamente de forma particular, para assegurar consultas de 60 minutos sem pressa.\n- Explique que a clínica emite recibo ou nota fiscal médica com detalhamento, para que o paciente possa solicitar reembolso junto ao convênio ou seguro de saúde, quando aplicável.\n- Para valores específicos de protocolos personalizados, informe que o plano terapêutico e os custos exatos são definidos na consulta diagnóstica inicial.\n- Não invente valores, descontos, condições de pagamento ou cobertura de convênio.\n\n6. ESTRUTURA E LOCALIZAÇÃO\n- A unidade boutique está localizada no bairro dos Jardins, em São Paulo/SP.\n- A clínica oferece suítes privativas de atendimento, ambiente biofílico e serviço de manobrista no local.\n- Não invente endereço, telefone, horário de funcionamento, redes sociais ou informações não fornecidas.\n\nDIRETRIZES DE ATENDIMENTO\n- Tom sereno, refinado, caloroso, atencioso e altamente profissional.\n- Seja resolutivo, mas sem parecer robótico ou excessivamente formal.\n- Faça no máximo 1 ou 2 perguntas por mensagem.\n- Antes de usar uma ferramenta, confirme apenas as informações essenciais que estiverem faltando.\n- Se o paciente enviar uma mensagem ambígua, identifique a intenção principal e pergunte de forma objetiva.\n- Se a solicitação envolver emergência médica, dor intensa, reação adversa grave, falta de ar, inchaço repentino, desmaio ou risco imediato, oriente imediatamente a buscar atendimento de urgência ou ligar para o SAMU (192), conforme a gravidade.\n- Nunca prescreva medicamentos, doses, protocolos caseiros ou condutas clínicas definitivas pelo WhatsApp.\n- Nunca invente disponibilidade de agenda, dados de pacientes, valores ou informações médicas.\n- Se não tiver certeza sobre uma informação operacional, diga que verificará com a equipe ou que a equipe entrará em contato.\n\nEXEMPLO DE ESTILO DE RESPOSTA\nClaro, *fica à vontade*. Temos estas opções para a primeira consulta:\n\n- Quinta-feira, às 10h00, com a Dra. Camila Vasconcelos\n- Quinta-feira, às 15h30, com a Dra. Camila Vasconcelos\n- Sexta-feira, às 09h00, com o Dr. Leonardo Meirelles\n\nQual horário fica melhor para você?"
        }
      },
      "id": "9ddc38b2-9971-44ff-8521-89a5ed9a17c1",
      "name": "AI Agent: Concierge Essenza",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        704,
        -112
      ]
    },
    {
      "parameters": {
        "modelName": "models/gemini-3.5-flash-lite",
        "options": {
          "temperature": 0.2
        }
      },
      "id": "c05aa1eb-7cb1-452c-8e6d-5b0929e5ab59",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "typeVersion": 1.2,
      "position": [
        592,
        128
      ],
      "credentials": {
        "googlePalmApi": {
          "id": "qniydn4cR7qY7Ows",
          "name": "Google Gemini(PaLM) Api account"
        }
      }
    },
    {
      "parameters": {
        "resource": "messages-api",
        "instanceName": "={{ $(\"Filtrar e Normalizar WhatsApp\").item.json.instance || \"vivo\" }}",
        "remoteJid": "={{ $(\"Filtrar e Normalizar WhatsApp\").item.json.contato_id }}",
        "messageText": "={{ $json.output }}",
        "options_message": {}
      },
      "id": "5a16b395-8572-4fa5-9285-95c79a9ebb52",
      "name": "Enviar Resposta WhatsApp (Evolution API)",
      "type": "n8n-nodes-evolution-api.evolutionApi",
      "typeVersion": 1,
      "position": [
        1168,
        0
      ],
      "onError": "continueRegularOutput",
      "credentials": {
        "evolutionApi": {
          "id": "s3H3V3iFF5Ji6Z19",
          "name": "Evolution account"
        }
      }
    },
    {
      "parameters": {
        "sessionIdType": "customKey",
        "sessionKey": "={{ 'essenza_' + $json.contato_id }}"
      },
      "type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
      "typeVersion": 1.4,
      "position": [
        720,
        128
      ],
      "id": "a91d370f-9777-454b-8c9c-c7f8e9f023d8",
      "name": "Postgres Chat Memory",
      "credentials": {
        "postgres": {
          "id": "ExAzud9115b77h3S",
          "name": "Postgres account"
        }
      }
    },
    {
      "parameters": {
        "options": {
          "responseCode": 200
        }
      },
      "id": "b087afc9-4e61-487e-b1d8-b31367149dfd",
      "name": "Responder 200 à Evolution API",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        -320,
        144
      ]
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "1NHfF4-n7OJrpKq7bUqhG73z9-K6fPT1sqosLwJi8G0g"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Vagas_Agenda"
        },
        "options": {}
      },
      "id": "5d8bda11-6989-411a-ac64-ccddaf6f3364",
      "name": "Consultar Vagas da Agenda",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.7,
      "position": [
        848,
        128
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "QA3nw8vhO38VWf5x",
          "name": "Google Sheets account"
        }
      }
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "1NHfF4-n7OJrpKq7bUqhG73z9-K6fPT1sqosLwJi8G0g",
          "mode": "id",
          "cachedResultName": "Clinica_Essenza_Agendamentos",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1NHfF4-n7OJrpKq7bUqhG73z9-K6fPT1sqosLwJi8G0g/edit?usp=drivesdk"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Agendamentos"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Canal de Origem": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Canal\", \"Canal de atendimento (whatsapp ou website)\", \"string\", \"whatsapp\") }}",
            "Dados do Simulador": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Simulador\", \"Dados do simulador do site se houver, ou Nenhum\", \"string\", \"Nenhum\") }}",
            "Data/Hora Solicitação": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Data_Hora\", \"Data e hora no formato dd/MM/yyyy HH:mm:ss\", \"string\") }}",
            "E-mail": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Email\", \"E-mail do paciente se informado, ou -\", \"string\", \"-\") }}",
            "Horário Proposto": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Horario\", \"Data e horário acordado ou solicitado\", \"string\") }}",
            "Médico Indicado": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Medico\", \"Médico indicado: Dra. Camila Vasconcelos ou Dr. Leonardo Meirelles\", \"string\", \"Dra. Camila Vasconcelos (CRM-SP 174.820)\") }}",
            "Nome do Paciente": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Nome\", \"Nome completo do paciente\", \"string\") }}",
            "Período Preferencial": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Periodo\", \"Período preferencial (Manhã, Tarde ou Fim de tarde)\", \"string\", \"Manhã\") }}",
            "Queixa / Procedimento": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Queixa\", \"Queixa clínica ou procedimento de interesse\", \"string\") }}",
            "Resposta do Concierge IA": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Resposta\", \"Resumo da orientação ou resposta enviada ao paciente\", \"string\") }}",
            "Status": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"Status\", \"Status do atendimento: Solicitado via IA, Confirmado, Remarcação, ou Cancelamento\", \"string\", \"Solicitado via IA\") }}",
            "WhatsApp": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI(\"WhatsApp\", \"Telefone normalizado do paciente (somente dígitos com DDD)\", \"string\") }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Data/Hora Solicitação",
              "id": "Data/Hora Solicitação",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Nome do Paciente",
              "id": "Nome do Paciente",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "WhatsApp",
              "id": "WhatsApp",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "E-mail",
              "id": "E-mail",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Queixa / Procedimento",
              "id": "Queixa / Procedimento",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Período Preferencial",
              "id": "Período Preferencial",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Status",
              "id": "Status",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Médico Indicado",
              "id": "Médico Indicado",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Horário Proposto",
              "id": "Horário Proposto",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Resposta do Concierge IA",
              "id": "Resposta do Concierge IA",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Canal de Origem",
              "id": "Canal de Origem",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Dados do Simulador",
              "id": "Dados do Simulador",
              "removed": false,
              "required": false,
              "type": "string"
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "id": "a0622b36-2c22-42c2-a3fe-d9f5dd97b957",
      "name": "Registrar Agendamento na Planilha",
      "type": "n8n-nodes-base.googleSheetsTool",
      "typeVersion": 4.7,
      "position": [
        976,
        128
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "QA3nw8vhO38VWf5x",
          "name": "Google Sheets account"
        }
      }
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "essenza-agendamento",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "d9746d0d-a6d4-441d-a0d3-104fb1182239",
      "name": "Webhook Formulário do Site",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        -320,
        336
      ],
      "webhookId": "webhook-essenza-lead-site"
    },
    {
      "parameters": {
        "jsCode": "const input = $input.first()?.json ?? {};\nconst body = input.body || input;\n\nconst nome = typeof body.nome === 'string' && body.nome.trim() !== '' ? body.nome.trim() : 'Paciente';\nconst rawPhone = typeof (body.whatsapp || body.telefone || body.phone) === 'string' ? (body.whatsapp || body.telefone || body.phone).replace(/\\D/g, '') : '';\nlet normalizedPhone = rawPhone;\n\nif (rawPhone.length === 10 || rawPhone.length === 11) {\n  normalizedPhone = '55' + rawPhone;\n} else if (rawPhone.length === 8 || rawPhone.length === 9) {\n  normalizedPhone = '5511' + rawPhone;\n}\n\nconst remoteJid = normalizedPhone ? (normalizedPhone + '@s.whatsapp.net') : '';\nconst email = typeof body.email === 'string' ? body.email.trim() : '';\nconst queixa = typeof (body.interesse || body.queixa) === 'string' && (body.interesse || body.queixa).trim() !== '' ? (body.interesse || body.queixa).trim() : 'Consulta Geral (60 min)';\nconst periodo = typeof body.periodo === 'string' && body.periodo.trim() !== '' ? body.periodo.trim() : 'Manhã';\nconst simulador = body.simulador ? (typeof body.simulador === 'string' ? body.simulador : JSON.stringify(body.simulador)) : 'Nenhum';\nconst mensagem = typeof body.mensagem === 'string' && body.mensagem.trim() !== '' ? body.mensagem.trim() : `Solicitação de agendamento pelo site para ${queixa}.`;\n\nconst hasContact = Boolean(normalizedPhone || email);\nconst hasName = Boolean(body.nome && body.nome.trim() !== '');\nconst isValid = hasName && hasContact;\n\nreturn [{\n  json: {\n    origem: 'site',\n    evento_id: 'site_' + Date.now(),\n    recebido_em: $now.setZone('America/Sao_Paulo').toFormat('dd/MM/yyyy HH:mm:ss'),\n    contato_id: remoteJid || email || ('site_' + Date.now()),\n    remoteJid: remoteJid,\n    telefone: normalizedPhone,\n    whatsapp: normalizedPhone,\n    nome: nome,\n    email: email,\n    queixa: queixa,\n    periodo: periodo,\n    simulador: simulador,\n    mensagem: mensagem,\n    status: 'Solicitado pelo Site',\n    instance: 'vivo',\n    is_valid: isValid,\n    error_message: isValid ? '' : 'Por favor, informe seu nome e ao menos um canal de contato (WhatsApp ou e-mail).'\n  }\n}];"
      },
      "id": "7f21dc4e-098d-44ec-9736-287282f40589",
      "name": "Normalizar Dados do Site",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -96,
        336
      ]
    },
    {
      "parameters": {
        "conditions": {
          "combinator": "and",
          "conditions": [
            {
              "id": "valid-check",
              "leftValue": "={{ String($json.is_valid) }}",
              "operator": {
                "operation": "equals",
                "type": "string"
              },
              "rightValue": "true"
            }
          ],
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          }
        },
        "options": {}
      },
      "id": "a0887384-871f-4c41-b4fd-aa2d1488e294",
      "name": "Validação de Origem e Dados",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        128,
        240
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ success: false, error: $json.error_message || \"Por favor, informe seu nome e um canal de contato (WhatsApp ou e-mail).\" }) }}",
        "options": {
          "responseCode": 400
        }
      },
      "id": "7441c3ee-d38e-4cd4-8fef-12d814a9391f",
      "name": "Responder Erro ao Site",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.4,
      "position": [
        352,
        336
      ]
    },
    {
      "parameters": {
        "conditions": {
          "combinator": "and",
          "conditions": [
            {
              "id": "is-whatsapp",
              "leftValue": "={{ $json.origem }}",
              "operator": {
                "operation": "equals",
                "type": "string"
              },
              "rightValue": "whatsapp"
            }
          ],
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          }
        },
        "options": {}
      },
      "id": "ba4f2272-54a1-4382-a506-56f6da8858b7",
      "name": "Origem é WhatsApp?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        352,
        144
      ]
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "cachedResultName": "Clinica_Essenza_Agendamentos",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1NHfF4-n7OJrpKq7bUqhG73z9-K6fPT1sqosLwJi8G0g/edit?usp=drivesdk",
          "mode": "id",
          "value": "1NHfF4-n7OJrpKq7bUqhG73z9-K6fPT1sqosLwJi8G0g"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Agendamentos"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "schema": [
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Data/Hora Solicitação",
              "id": "Data/Hora Solicitação",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Nome do Paciente",
              "id": "Nome do Paciente",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "WhatsApp",
              "id": "WhatsApp",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "E-mail",
              "id": "E-mail",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Queixa / Procedimento",
              "id": "Queixa / Procedimento",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Período Preferencial",
              "id": "Período Preferencial",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Status",
              "id": "Status",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Médico Indicado",
              "id": "Médico Indicado",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Horário Proposto",
              "id": "Horário Proposto",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Resposta do Concierge IA",
              "id": "Resposta do Concierge IA",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Canal de Origem",
              "id": "Canal de Origem",
              "removed": false,
              "required": false,
              "type": "string"
            },
            {
              "canBeUsedToMatch": true,
              "defaultMatch": false,
              "display": true,
              "displayName": "Dados do Simulador",
              "id": "Dados do Simulador",
              "removed": false,
              "required": false,
              "type": "string"
            }
          ],
          "value": {
            "Canal de Origem": "website",
            "Dados do Simulador": "={{ $json.simulador || 'Nenhum' }}",
            "Data/Hora Solicitação": "={{ $json.recebido_em }}",
            "E-mail": "={{ $json.email || '-' }}",
            "Horário Proposto": "A definir",
            "Médico Indicado": "A definir na triagem",
            "Nome do Paciente": "={{ $json.nome }}",
            "Período Preferencial": "={{ $json.periodo }}",
            "Queixa / Procedimento": "={{ $json.queixa }}",
            "Resposta do Concierge IA": "Lead recebido via formulário do site. Aguardando contato da equipe.",
            "Status": "={{ $json.status || 'Solicitado pelo Site' }}",
            "WhatsApp": "={{ $json.whatsapp }}"
          }
        },
        "options": {}
      },
      "id": "e312ab3f-acd3-49d4-b1be-fd2ec61f8efc",
      "name": "Salvar Agendamento na Planilha",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        768,
        288
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "QA3nw8vhO38VWf5x",
          "name": "Google Sheets account"
        }
      }
    },
    {
      "parameters": {
        "resource": "messages-api",
        "instanceName": "vivo",
        "remoteJid": "554891633122@s.whatsapp.net",
        "messageText": "={{ \"Nova solicitação de agendamento — Clínica Essenza\\n\\nData: \" + ($(\"Normalizar Dados do Site\").item.json.recebido_em || \"-\") + \"\\nPaciente: \" + ($(\"Normalizar Dados do Site\").item.json.nome || \"-\") + \"\\nWhatsApp: \" + ($(\"Normalizar Dados do Site\").item.json.whatsapp || \"Não informado\") + \"\\nEmail: \" + ($(\"Normalizar Dados do Site\").item.json.email || \"Não informado\") + \"\\nProcedimento: \" + ($(\"Normalizar Dados do Site\").item.json.queixa || \"-\") + \"\\nPeríodo: \" + ($(\"Normalizar Dados do Site\").item.json.periodo || \"-\") + \"\\nSimulador: \" + ($(\"Normalizar Dados do Site\").item.json.simulador || \"Nenhum\") + \"\\nStatus: Solicitado pelo Site\" }}",
        "options_message": {}
      },
      "id": "905c76bd-5bec-45b7-89ae-b440b9a42f0e",
      "name": "Notificar WhatsApp Interno (Evolution API)",
      "type": "n8n-nodes-evolution-api.evolutionApi",
      "typeVersion": 1,
      "position": [
        1168,
        288
      ],
      "credentials": {
        "evolutionApi": {
          "id": "s3H3V3iFF5Ji6Z19",
          "name": "Evolution account"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ success: true, message: \"Solicitação de agendamento recebida com sucesso! Nossa equipe concierge entrará em contato em breve para confirmar seu horário.\" }) }}",
        "options": {
          "responseCode": 200
        }
      },
      "id": "68f50971-f5c5-46fb-9ffe-a07c238f7a25",
      "name": "Responder Sucesso ao Site",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.4,
      "position": [
        1392,
        288
      ]
    }
  ],
  "nodeGroups": [],
  "activeVersion": null,
  "meta": {
    "aiBuilderAssisted": true,
    "builderVariant": "mcp",
    "templateCredsSetupCompleted": true
  }
}