{"id":35,"date":"2026-01-05T06:37:26","date_gmt":"2026-01-05T06:37:26","guid":{"rendered":"https:\/\/agilux.net\/pt\/artigos\/integracao-whatsapp-clinicas-odontologicas-portugal-guia-tecnico\/"},"modified":"2026-01-05T06:38:15","modified_gmt":"2026-01-05T06:38:15","slug":"integracao-whatsapp-clinicas-odontologicas-portugal-guia-tecnico","status":"publish","type":"post","link":"https:\/\/agilux.net\/pt\/artigos\/integracao-whatsapp-clinicas-odontologicas-portugal-guia-tecnico\/","title":{"rendered":"Implementing Automated Appointment Confirmations: WhatsApp Business API &#038; n8n for Dental Clinics"},"content":{"rendered":"<h2>A Evolu\u00e7\u00e3o da Agilux Engage Squad na Integra\u00e7\u00e3o WhatsApp para Cl\u00ednicas Odontol\u00f3gicas em Portugal<\/h2>\n<h3>O Problema Real do No-Show<\/h3>\n<p>Vou ser direto: a realidade nas cl\u00ednicas dent\u00e1rias portuguesas \u00e9 frustrante. Entre 15% a 30% dos pacientes simplesmente n\u00e3o aparecem \u00e0s consultas agendadas. E n\u00e3o, n\u00e3o \u00e9 porque t\u00eam m\u00e1 inten\u00e7\u00e3o. A vida acontece. Esquecem-se. Agendam noutro s\u00edtio sem cancelar. V\u00e3o \u00e0 farm\u00e1cia comprar um analg\u00e9sico e decidem &#8220;esperar mais uma semana.&#8221;<\/p>\n<figure class=\"wp-block-image size-large\">\n  <img decoding=\"async\" src=\"https:\/\/agilux.net\/us\/wp-content\/uploads\/2026\/01\/Striking-modern-workspace-showing-a-focu-1.jpg\" alt=\"Engineer troubleshooting calendar integration dashboard for Agilux Engage Squad Google Calendar appointment booking tutorial\" class=\"wp-image-143\" \/><br \/>\n<\/figure>\n<p>Mas para uma cl\u00ednica com 40 consultas por dia? Isso s\u00e3o 6 a 12 slots completamente desperdi\u00e7ados. Podes fazer as contas do impacto financeiro.<\/p>\n<h3>A Solu\u00e7\u00e3o T\u00e9cnica Que Faz Sentido<\/h3>\n<p>Aqui entra a Agilux Engage Squad integra\u00e7\u00e3o WhatsApp para cl\u00ednicas odontol\u00f3gicas Portugal \u2014 e n\u00e3o, isto n\u00e3o \u00e9 mais um chatbot gen\u00e9rico que responde &#8220;Ol\u00e1! Como posso ajudar?&#8221; quando algu\u00e9m envia mensagem \u00e0s 23h.<\/p>\n<p>\u00c9 uma orquestra\u00e7\u00e3o t\u00e9cnica s\u00e9ria: usamos n8n como middleware para ligar o ERP da cl\u00ednica (seja ele Dentis, Cl\u00ednica Manager, ou qualquer sistema customizado que tenhas por a\u00ed) \u00e0 WhatsApp Business API. O objetivo? Automatizar confirma\u00e7\u00f5es de consultas 24 horas antes, processar respostas dos pacientes de forma ass\u00edncrona, e atualizar o estado no ERP sem interven\u00e7\u00e3o humana.<\/p>\n<h3>Conformidade com RGPD Desde o In\u00edcio<\/h3>\n<p>Trabalhar em Portugal significa que o RGPD n\u00e3o \u00e9 opcional. E com dados de sa\u00fade? Ainda mais sens\u00edvel. A solu\u00e7\u00e3o precisa contemplar:<\/p>\n<ul>\n<li>Consentimento expl\u00edcito do paciente para contacto via WhatsApp (opt-in registado no ERP)<\/li>\n<li>Criptografia ponta-a-ponta (j\u00e1 garantida pelo WhatsApp, mas precisas documentar isso)<\/li>\n<li>Minimiza\u00e7\u00e3o de dados nos logs do n8n<\/li>\n<li>Direito ao esquecimento implementado tecnicamente, n\u00e3o apenas &#8220;prometido&#8221;<\/li>\n<\/ul>\n<p>Vou mostrar-te como implementar isto tecnicamente nas sec\u00e7\u00f5es seguintes, mas j\u00e1 te adianto: n\u00e3o \u00e9 rocket science. \u00c9 engenharia competente com aten\u00e7\u00e3o aos detalhes.<\/p>\n<h2>Arquitetura da Solu\u00e7\u00e3o: Middleware n8n e Fluxo de Dados<\/h2>\n<figure class=\"wp-block-image size-large\">\n  <img decoding=\"async\" src=\"https:\/\/agilux.net\/us\/wp-content\/uploads\/2026\/01\/Close-up-of-a-laptop-screen-displaying-G-2.jpg\" alt=\"Google Cloud Console project screen for Agilux Engage Squad Google Calendar appointment booking tutorial\" class=\"wp-image-144\" \/><br \/>\n<\/figure>\n<h3>O Fluxo L\u00f3gico de Informa\u00e7\u00e3o<\/h3>\n<p>Imagina isto: o teu ERP dent\u00e1rio tem consultas agendadas para amanh\u00e3. \u00c0s 18h de hoje, o n8n acorda (via Cron Job), consulta o ERP, extrai as consultas do dia seguinte que ainda n\u00e3o foram confirmadas, e envia mensagens WhatsApp personalizadas para cada paciente.<\/p>\n<p>O paciente recebe a mensagem no telem\u00f3vel dele. Clica num bot\u00e3o. A WhatsApp Business API envia um webhook para o teu n8n. O n8n processa a resposta, identifica a consulta correspondente, e atualiza o estado no ERP. A recepcionista abre a agenda de manh\u00e3 e v\u00ea claramente quem confirmou (verde) e quem n\u00e3o respondeu (amarelo).<\/p>\n<p>Sem telefonemas. Sem papel. Sem &#8220;Deixei recado na secret\u00e1ria electr\u00f3nica.&#8221;<\/p>\n<h3>N8n Como Bridge Inteligente<\/h3>\n<p>Porqu\u00ea usar n8n e n\u00e3o programar isto diretamente? Porque n8n \u00e9 visual, self-hosted (importante para RGPD), e permite itera\u00e7\u00e3o r\u00e1pida. Podes ajustar a l\u00f3gica sem recompilar c\u00f3digo. Os gestores de TI cl\u00ednica agradecem isto, raramente t\u00eam equipas de desenvolvimento full-time.<\/p>\n<p>O n8n atua como camada de l\u00f3gica entre sistemas que nunca foram desenhados para conversar entre si. Transforma o JSON ca\u00f3tico do teu ERP legacy em payloads limpos para a WhatsApp API. Gere estados ass\u00edncronos. Trata erros. \u00c9 o middleware que deveria existir mas nunca foi prioridade do fornecedor do ERP.<\/p>\n<h3>Requisitos de Lat\u00eancia e Disponibilidade<\/h3>\n<p>Look, confirma\u00e7\u00f5es de consultas n\u00e3o precisam de lat\u00eancias de milissegundos. Mas precisam de confiabilidade. Se o sistema falhar na sexta \u00e0 tarde e ficar down at\u00e9 segunda, perdeste o prop\u00f3sito inteiro.<\/p>\n<p>Por isso: inst\u00e2ncia n8n em produ\u00e7\u00e3o (n\u00e3o aquela instala\u00e7\u00e3o de teste no port\u00e1til do estagi\u00e1rio), backup dos workflows, e monitoriza\u00e7\u00e3o activa. A WhatsApp Business API tem SLA&#8217;s decentes, mas tens de garantir que o teu lado da infraestrutura tamb\u00e9m os cumpre.<\/p>\n<h2>Pr\u00e9-requisitos T\u00e9cnicos e Configura\u00e7\u00e3o do Ambiente<\/h2>\n<h3>Acesso \u00e0 Cloud API do WhatsApp<\/h3>\n<p>Primeiro passo: criar conta no Meta for Developers e solicitar acesso \u00e0 Business API. N\u00e3o \u00e9 o WhatsApp Business App normal que usas no telem\u00f3vel. \u00c9 a API empresarial, que exige:<\/p>\n<ul>\n<li>Verifica\u00e7\u00e3o do n\u00famero comercial (processo pode demorar 1-3 dias)<\/li>\n<li>Business verification (documentos legais da cl\u00ednica)<\/li>\n<li>Configura\u00e7\u00e3o do perfil da empresa (nome, morada, descri\u00e7\u00e3o)<\/li>\n<\/ul>\n<p>Custa cerca de \u20ac0,005 a \u20ac0,03 por mensagem, dependendo do pa\u00eds de destino e tipo de mensagem. Para uma cl\u00ednica portuguesa com 600 consultas mensais? Est\u00e1s a falar de \u20ac15-20\/m\u00eas. Negligenci\u00e1vel comparado com o ROI de evitar no-shows.<\/p>\n<h3>Inst\u00e2ncia N8n em Produ\u00e7\u00e3o<\/h3>\n<p>Tens duas op\u00e7\u00f5es: n8n Cloud (\u20ac20\/m\u00eas, solu\u00e7\u00e3o gerida) ou self-hosted (gratuito, mas precisas de um servidor). Para contexto RGPD e dados de sa\u00fade, a maioria das cl\u00ednicas portuguesas prefere self-hosted num VPS europeu ou on-premises.<\/p>\n<p>Especifica\u00e7\u00f5es m\u00ednimas: 2GB RAM, 1 vCPU, 20GB disco. Ubuntu 22.04 LTS. Docker instalado. Nada de extraordin\u00e1rio. Podes ter isto running numa DigitalOcean Droplet em Frankfurt em 15 minutos.<\/p>\n<h3>Configura\u00e7\u00e3o Inicial do N8n Webhook Handler<\/h3>\n<p>Aqui come\u00e7a a parte interessante. No n8n, vais precisar de dois workflows principais:<\/p>\n<ul>\n<li><strong>Workflow de Envio<\/strong> (trigger: Cron Job di\u00e1rio)<\/li>\n<li><strong>Workflow de Recebimento<\/strong> (trigger: Webhook URL que a Meta vai chamar)<\/li>\n<\/ul>\n<p>Para o webhook handler, vais ter uma URL tipo: `https:\/\/teu-n8n-domain.pt\/webhook\/whatsapp-callback`. Esta URL precisa de estar exposta publicamente (obviamente), com HTTPS v\u00e1lido (Let&#8217;s Encrypt serve perfeitamente), e configurada na consola da Meta como webhook endpoint.<\/p>\n<p>Ah, e a Meta vai enviar um GET request de verifica\u00e7\u00e3o quando configurares o webhook pela primeira vez. O n8n tem um n\u00f3 espec\u00edfico para isto. N\u00e3o te esque\u00e7as de configurar o verify token.<\/p>\n<h3>Acesso ao Dental ERP<\/h3>\n<p>Este \u00e9 frequentemente o ponto mais complicado. Nem todos os ERPs dent\u00e1rios t\u00eam APIs REST bonitas e documentadas. Alguns t\u00eam. Outros tens de ir diretamente \u00e0 base de dados (MySQL, PostgreSQL, ou at\u00e9 Microsoft SQL Server).<\/p>\n<p>Precisas de acesso read-write:<\/p>\n<ul>\n<li><strong>Read:<\/strong> para extrair consultas agendadas (data, hora, nome paciente, telefone, ID \u00fanica)<\/li>\n<p><\/p>\n<li><strong>Write:<\/strong> para atualizar estado de confirma\u00e7\u00e3o ap\u00f3s resposta do paciente<\/li>\n<\/ul>\n<p>Se o teu ERP n\u00e3o tem API, vais precisar de credenciais de acesso directo \u00e0 base de dados. Sim, faz backup antes de mexer. Sim, testa em ambiente staging primeiro. (Mas tu j\u00e1 sabias disso.)<\/p>\n<h2>Passo 1: Captura e Tratamento de Dados via JSON Parser<\/h2>\n<h3>Configura\u00e7\u00e3o do Gatilho Temporal<\/h3>\n<p>Cria um novo workflow no n8n. O primeiro n\u00f3 \u00e9 um Schedule Trigger configurado para disparar todos os dias \u00e0s 18h (ou hor\u00e1rio que fa\u00e7a sentido para a cl\u00ednica).<\/p>\n<p>Quando este trigger activa, o pr\u00f3ximo n\u00f3 vai consultar o ERP. Se o ERP tiver API REST, \u00f3ptimo, usa um HTTP Request node. Se tens de ir \u00e0 base de dados, usa o n\u00f3 MySQL\/PostgreSQL.<\/p>\n<p>A query SQL vai ser algo tipo:<\/p>\n<p>&#8220;`sql<br \/>SELECT appointment_id, patient_name, patient_phone, appointment_date, appointment_time, confirmation_status<br \/>FROM appointments<br \/>WHERE appointment_date = CURDATE() + INTERVAL 1 DAY<br \/>AND confirmation_status IS NULL OR confirmation_status = &#8216;pending&#8217;<br \/>&#8220;`<\/p>\n<p>Isto d\u00e1-te todas as consultas de amanh\u00e3 que ainda n\u00e3o foram confirmadas.<\/p>\n<h3>Normaliza\u00e7\u00e3o de Dados com JSON Parser<\/h3>\n<p>Os dados que v\u00eam do ERP raramente est\u00e3o no formato que precisas. N\u00fameros de telefone podem estar como &#8220;912345678&#8221; quando a WhatsApp API quer &#8220;+351912345678&#8221;. Nomes podem ter caracteres especiais que v\u00e3o causar problemas.<\/p>\n<p>Usa o n\u00f3 Function no n8n (que aceita JavaScript) ou o n\u00f3 Set para transformar os dados. Exemplo pr\u00e1tico:<\/p>\n<p>&#8220;`javascript<br \/>\/\/ Normalizar telefone para formato internacional<br \/>let phone = items[0].json.patient_phone.trim();<br \/>if (!phone.startsWith(&#8216;+351&#8217;)) {<br \/>  phone = &#8216;+351&#8217; + phone.replace(\/^0+\/, &#8221;); \/\/ Remove zeros \u00e0 esquerda<br \/>}<\/p>\n<p>\/\/ Capitalizar nome decentemente<br \/>let name = items[0].json.patient_name<br \/>  .toLowerCase()<br \/>  .split(&#8216; &#8216;)<br \/>  .map(word => word.charAt(0).toUpperCase() + word.slice(1))<br \/>  .join(&#8216; &#8216;);<\/p>\n<p>return {<br \/>  appointmentId: items[0].json.appointment_id,<br \/>  patientName: name,<br \/>  patientPhone: phone,<br \/>  appointmentDate: items[0].json.appointment_date,<br \/>  appointmentTime: items[0].json.appointment_time<br \/>};<br \/>&#8220;`<\/p>\n<p>\u00c9 c\u00f3digo b\u00e1sico, mas resolve 80% dos problemas de formata\u00e7\u00e3o.<\/p>\n<h3>Filtragem de Redund\u00e2ncias<\/h3>\n<p>Adiciona um n\u00f3 IF para filtrar consultas que j\u00e1 processaste. Isto evita enviar mensagens duplicadas se o workflow correr duas vezes por algum motivo (erros de network, restarts, etc.).<\/p>\n<p>Podes manter um registo simples numa tabela `whatsapp_sent_messages` com `appointment_id` e `sent_at` timestamp. O n\u00f3 IF verifica: &#8220;Este appointment_id j\u00e1 est\u00e1 na tabela? Sim? Pula. N\u00e3o? Continua.&#8221;<\/p>\n<p>Parece paran\u00f3ico, mas j\u00e1 vi cl\u00ednicas enviarem 3 mensagens ao mesmo paciente no mesmo dia por falta deste filtro. P\u00e9ssimo para a experi\u00eancia do paciente.<\/p>\n<h2>Passo 2: Defini\u00e7\u00e3o de Templates HSM na WhatsApp Business API<\/h2>\n<h3>Regras da Meta para Mensagens Business-Initiated<\/h3>\n<p>Aqui h\u00e1 uma nuance t\u00e9cnica importante: n\u00e3o podes simplesmente enviar mensagens arbitr\u00e1rias via WhatsApp Business API. A Meta exige que uses Message Templates pr\u00e9-aprovados para mensagens iniciadas pela empresa (business-initiated conversations).<\/p>\n<p>Porqu\u00ea? Para evitar spam. Faz sentido.<\/p>\n<p>Ent\u00e3o vais na consola da Meta (WhatsApp Manager), sec\u00e7\u00e3o &#8220;Message Templates&#8221;, e crias um novo template. Categoria: &#8220;APPOINTMENT_UPDATE&#8221; (h\u00e1 categorias espec\u00edficas, escolhe a correcta).<\/p>\n<p>Exemplo de template para cl\u00ednicas dent\u00e1rias:<\/p>\n<p><strong>Nome do template:<\/strong> `appointment_confirmation_pt`  <br \/><strong>Idioma:<\/strong> Portuguese (PT)  <br \/><strong>Corpo:<\/strong><\/p>\n<p>&#8220;`<br \/>Ol\u00e1 {{1}}! \ud83d\udc4b<\/p>\n<p>Tem consulta marcada na {{2}} amanh\u00e3 \u00e0s {{3}}.<\/p>\n<p>Por favor confirme a sua presen\u00e7a:<br \/>&#8220;`<\/p>\n<p><strong>Bot\u00f5es Quick Reply:<\/strong><\/p>\n<ul>\n<li>Bot\u00e3o 1: &#8220;\u2705 Confirmar Presen\u00e7a&#8221;<\/li>\n<p><\/p>\n<li>Bot\u00e3o 2: &#8220;\ud83d\udcc5 Reagendar\/Cancelar&#8221;<\/li>\n<\/ul>\n<p>Os `{{1}}`, `{{2}}`, `{{3}}` s\u00e3o vari\u00e1veis que vais preencher dinamicamente com nome do paciente, nome da cl\u00ednica, e hora.<\/p>\n<h3>O Processo de Aprova\u00e7\u00e3o<\/h3>\n<p>Submetes o template e&#8230; esperas. A Meta tem de aprovar (normalmente 5 minutos a 24 horas). Rejeitam se usares linguagem promocional, se tiveres erros gramaticais graves, ou se o template n\u00e3o fizer sentido.<\/p>\n<p>Recomenda\u00e7\u00e3o: cria 2-3 templates diferentes desde in\u00edcio (um para confirma\u00e7\u00e3o, um para lembretes, um para resultados de exames prontos). Assim tens flexibilidade depois sem esperar por novas aprova\u00e7\u00f5es.<\/p>\n<h3>Import\u00e2ncia das Vari\u00e1veis Din\u00e2micas<\/h3>\n<p>Podes tecnicamente permitir que o paciente responda livremente (&#8220;Sim confirmo&#8221; ou &#8220;n\u00e3o posso ir&#8221;), mas isso complica a l\u00f3gica de parsing no n8n. Os bot\u00f5es Quick Reply retornam payloads estruturados que s\u00e3o triviais de processar.<\/p>\n<p>\u00c9 menos &#8220;conversacional&#8221;, mas infinitamente mais confi\u00e1vel. E sejamos honestos: ningu\u00e9m quer ter uma conversa elaborada com o bot da cl\u00ednica. Querem clicar num bot\u00e3o e seguir com a vida.<\/p>\n<h2>Passo 3: Implementa\u00e7\u00e3o da L\u00f3gica de Envio no n8n<\/h2>\n<figure class=\"wp-block-image size-large\">\n  <img decoding=\"async\" src=\"https:\/\/agilux.net\/us\/wp-content\/uploads\/2026\/01\/calendar-timeline-clock-3.jpg\" alt=\"Calendar free busy timeline visualization for Agilux Engage Squad Google Calendar appointment booking tutorial\" class=\"wp-image-145\" \/><br \/>\n<\/figure>\n<h3>Configura\u00e7\u00e3o do HTTP Request para a Graph API<\/h3>\n<p>Depois de tratares os dados e filtrares duplicados, chega o momento de realmente enviar a mensagem. Para isso, adiciona um HTTP Request node configurado assim:<\/p>\n<p><strong>Method:<\/strong> POST  <br \/><strong>URL:<\/strong> `https:\/\/graph.facebook.com\/v18.0\/SEU_PHONE_NUMBER_ID\/messages`  <br \/><strong>Authentication:<\/strong> Header Auth  <br \/><strong>Header Name:<\/strong> Authorization  <br \/><strong>Header Value:<\/strong> `Bearer SEU_WHATSAPP_ACCESS_TOKEN`<\/p>\n<p>O `PHONE_NUMBER_ID` encontras na consola da Meta (n\u00e3o \u00e9 o teu n\u00famero de telefone, \u00e9 um ID num\u00e9rico do WhatsApp Business Account).<\/p>\n<h3>Mapeamento dos Campos do JSON para o Payload<\/h3>\n<p>O body do POST request tem de seguir o formato exacto da API:<\/p>\n<p>&#8220;`json<br \/>{<br \/>  &#8220;messaging_product&#8221;: &#8220;whatsapp&#8221;,<br \/>  &#8220;to&#8221;: &#8220;{{$node[&#8220;Function&#8221;].json[&#8220;patientPhone&#8221;]}}&#8221;,<br \/>  &#8220;type&#8221;: &#8220;template&#8221;,<br \/>  &#8220;template&#8221;: {<br \/>    &#8220;name&#8221;: &#8220;appointment_confirmation_pt&#8221;,<br \/>    &#8220;language&#8221;: {<br \/>      &#8220;code&#8221;: &#8220;pt&#8221;<br \/>    },<br \/>    &#8220;components&#8221;: [<br \/>      {<br \/>        &#8220;type&#8221;: &#8220;body&#8221;,<br \/>        &#8220;parameters&#8221;: [<br \/>          {<br \/>            &#8220;type&#8221;: &#8220;text&#8221;,<br \/>            &#8220;text&#8221;: &#8220;{{$node[&#8220;Function&#8221;].json[&#8220;patientName&#8221;]}}&#8221;<br \/>          },<br \/>          {<br \/>            &#8220;type&#8221;: &#8220;text&#8221;,<br \/>            &#8220;text&#8221;: &#8220;Cl\u00ednica Exemplo&#8221;<br \/>          },<br \/>          {<br \/>            &#8220;type&#8221;: &#8220;text&#8221;,<br \/>            &#8220;text&#8221;: &#8220;{{$node[&#8220;Function&#8221;].json[&#8220;appointmentTime&#8221;]}}&#8221;<br \/>          }<br \/>        ]<br \/>      },<br \/>      {<br \/>        &#8220;type&#8221;: &#8220;button&#8221;,<br \/>        &#8220;sub_type&#8221;: &#8220;quick_reply&#8221;,<br \/>        &#8220;index&#8221;: &#8220;0&#8221;,<br \/>        &#8220;parameters&#8221;: [<br \/>          {<br \/>            &#8220;type&#8221;: &#8220;payload&#8221;,<br \/>            &#8220;payload&#8221;: &#8220;CONFIRM_{{$node[&#8220;Function&#8221;].json[&#8220;appointmentId&#8221;]}}&#8221;<br \/>          }<br \/>        ]<br \/>      },<br \/>      {<br \/>        &#8220;type&#8221;: &#8220;button&#8221;,<br \/>        &#8220;sub_type&#8221;: &#8220;quick_reply&#8221;,<br \/>        &#8220;index&#8221;: &#8220;1&#8221;,<br \/>        &#8220;parameters&#8221;: [<br \/>          {<br \/>            &#8220;type&#8221;: &#8220;payload&#8221;,<br \/>            &#8220;payload&#8221;: &#8220;RESCHEDULE_{{$node[&#8220;Function&#8221;].json[&#8220;appointmentId&#8221;]}}&#8221;<br \/>          }<br \/>        ]<br \/>      }<br \/>    ]<br \/>  }<br \/>}<br \/>&#8220;`<\/p>\n<p>Nota o detalhe nos payloads dos bot\u00f5es: `CONFIRM_123` e `RESCHEDULE_123`. Est\u00e1s a incluir o `appointmentId` directamente no payload. Quando o paciente clicar, vais receber esse ID de volta, permitindo correlacionar a resposta com a consulta correcta.<\/p>\n<h3>Armazenamento do MessageID para Correla\u00e7\u00e3o Futura<\/h3>\n<p>A WhatsApp API retorna uma resposta tipo:<\/p>\n<p>&#8220;`json<br \/>{<br \/>  &#8220;messaging_product&#8221;: &#8220;whatsapp&#8221;,<br \/>  &#8220;contacts&#8221;: [{<br \/>    &#8220;input&#8221;: &#8220;+351912345678&#8221;,<br \/>    &#8220;wa_id&#8221;: &#8220;351912345678&#8221;<br \/>  }],<br \/>  &#8220;messages&#8221;: [{<br \/>    &#8220;id&#8221;: &#8220;wamid.HBgNMzUxOTEyMzQ1Njc4FQIAERgSQzg3&#8230;&#8221;<br \/>  }]<br \/>}<br \/>&#8220;`<\/p>\n<p>Esse `messages[0].id` \u00e9 o MessageID \u00fanico. Guarda-o numa tabela (PostgreSQL, MySQL, ou at\u00e9 Redis) juntamente com:<\/p>\n<ul>\n<li>`message_id`<\/li>\n<li>`appointment_id`<\/li>\n<li>`patient_phone`<\/li>\n<li>`sent_at` (timestamp)<\/li>\n<li>`status` (enviado\/entregue\/lido\/respondido)<\/li>\n<\/ul>\n<p>Vais precisar disto para troubleshooting e para o pr\u00f3ximo passo cr\u00edtico: processar a resposta ass\u00edncrona.<\/p>\n<h2>Passo 4: Gest\u00e3o de Estados Ass\u00edncronos (Async Handling)<\/h2>\n<h3>O Desafio da Assincronicidade<\/h3>\n<p>Aqui est\u00e1 o problema: envias a mensagem \u00e0s 18h de hoje. O paciente pode responder \u00e0s 18h05. Ou \u00e0s 23h47. Ou \u00e0s 8h da manh\u00e3 seguinte. Ou&#8230; nunca.<\/p>\n<p>A tua aplica\u00e7\u00e3o precisa de lidar com esta natureza ass\u00edncrona. O workflow que enviou a mensagem j\u00e1 terminou. Como \u00e9 que apanhas a resposta quando ela finalmente chegar?<\/p>\n<p>Webhooks. A Meta vai fazer um POST request para a tua URL de callback sempre que algo acontecer (mensagem entregue, lida, ou quando o paciente responde).<\/p>\n<h3>Configura\u00e7\u00e3o do Webhook de Recebimento<\/h3>\n<p>Cria um segundo workflow no n8n, separado do workflow de envio. O primeiro n\u00f3 \u00e9 um Webhook node:<\/p>\n<p><strong>HTTP Method:<\/strong> POST  <br \/><strong>Path:<\/strong> `\/webhook\/whatsapp-callback` (ou o que configuraste na Meta)  <br \/><strong>Response Mode:<\/strong> &#8220;Immediately return a response&#8221;  <br \/><strong>Response Code:<\/strong> 200<\/p>\n<p>A Meta \u00e9 exigente: espera um status code 200 em menos de 20 segundos, ou considera o webhook como falhado e eventualmente desativa-o. Por isso, tens de responder imediatamente e processar a l\u00f3gica depois.<\/p>\n<h3>Correla\u00e7\u00e3o de Eventos com o Appointment ID<\/h3>\n<p>O payload que a Meta envia \u00e9&#8230; verboso. Terrivelmente verboso. Exemplo simplificado:<\/p>\n<p>&#8220;`json<br \/>{<br \/>  &#8220;object&#8221;: &#8220;whatsapp_business_account&#8221;,<br \/>  &#8220;entry&#8221;: [{<br \/>    &#8220;changes&#8221;: [{<br \/>      &#8220;value&#8221;: {<br \/>        &#8220;messaging_product&#8221;: &#8220;whatsapp&#8221;,<br \/>        &#8220;metadata&#8221;: {<br \/>          &#8220;phone_number_id&#8221;: &#8220;123456789&#8221;<br \/>        },<br \/>        &#8220;messages&#8221;: [{<br \/>          &#8220;from&#8221;: &#8220;351912345678&#8221;,<br \/>          &#8220;id&#8221;: &#8220;wamid.HBgN&#8230;&#8221;,<br \/>          &#8220;timestamp&#8221;: &#8220;1699876543&#8221;,<br \/>          &#8220;type&#8221;: &#8220;button&#8221;,<br \/>          &#8220;button&#8221;: {<br \/>            &#8220;payload&#8221;: &#8220;CONFIRM_456&#8221;,<br \/>            &#8220;text&#8221;: &#8220;\u2705 Confirmar Presen\u00e7a&#8221;<br \/>          }<br \/>        }]<br \/>      }<br \/>    }]<br \/>  }]<br \/>}<br \/>&#8220;`<\/p>\n<p>O que te interessa: `messages[0].button.payload`. \u00c9 a\u00ed que est\u00e1 `CONFIRM_456` ou `RESCHEDULE_456`.<\/p>\n<p>Usa um Function node para extrair:<\/p>\n<p>&#8220;`javascript<br \/>const payload = items[0].json.entry[0].changes[0].value.messages[0].button.payload;<br \/>const [action, appointmentId] = payload.split(&#8216;_&#8217;);<\/p>\n<p>return {<br \/>  action: action, \/\/ &#8220;CONFIRM&#8221; ou &#8220;RESCHEDULE&#8221;<br \/>  appointmentId: appointmentId,<br \/>  phoneNumber: items[0].json.entry[0].changes[0].value.messages[0].from<br \/>};<br \/>&#8220;`<\/p>\n<p>Simples e eficaz.<\/p>\n<h3>Tratamento de Timeouts<\/h3>\n<p>E se o paciente n\u00e3o responder? Podes criar um workflow separado com Schedule Trigger que corre \u00e0s 8h da manh\u00e3 do dia da consulta, verifica quais consultas ainda est\u00e3o `confirmation_status = &#8216;pending&#8217;`, e:<\/p>\n<ul>\n<li>Envia SMS de backup (sim, old school, mas eficaz)<\/li>\n<li>Envia email<\/li>\n<li>Alerta a rece\u00e7\u00e3o para fazer followup telef\u00f3nico<\/li>\n<\/ul>\n<p>N\u00e3o \u00e9 bonito, mas \u00e9 a realidade. Alguns pacientes simplesmente ignoram WhatsApp. Honestamente, estou surpreendido que ainda sejam s\u00f3 15-20% que n\u00e3o respondem, considerando quantas notifica\u00e7\u00f5es a pessoa m\u00e9dia ignora por dia.<\/p>\n<h2>Passo 5: Processamento da Resposta e Dental ERP Integration<\/h2>\n<h3>Roteamento Condicional com Switch Node<\/h3>\n<p>Agora que sabes qual foi a a\u00e7\u00e3o do paciente (CONFIRM ou RESCHEDULE), precisas de reagir diferentemente. Adiciona um Switch node (IF node tamb\u00e9m serve) para separar os caminhos:<\/p>\n<p><strong>Caminho A &#8211; Confirmou:<\/strong>  <br \/>\u2192 Actualizar status no ERP para &#8220;confirmed&#8221;  <br \/>\u2192 Enviar mensagem de agradecimento ao paciente<\/p>\n<p><strong>Caminho B &#8211; Reagendar:<\/strong>  <br \/>\u2192 Enviar mensagem interactiva com slots dispon\u00edveis ou pedir que ligue  <br \/>\u2192 Criar alerta para a equipa de rece\u00e7\u00e3o<\/p>\n<p>Podes ter casos adicionais (CANCEL, por exemplo), mas mant\u00e9m simples no in\u00edcio.<\/p>\n<h3>Actualiza\u00e7\u00e3o Autom\u00e1tica no Dental ERP<\/h3>\n<p>Para a confirma\u00e7\u00e3o, a l\u00f3gica \u00e9 directa. Vais fazer um UPDATE no ERP:<\/p>\n<p>&#8220;`sql<br \/>UPDATE appointments <br \/>SET confirmation_status = &#8216;confirmed&#8217;,<br \/>    confirmed_at = NOW(),<br \/>    confirmed_via = &#8216;whatsapp&#8217;<br \/>WHERE appointment_id = {{$node[&#8220;Function&#8221;].json[&#8220;appointmentId&#8221;]}}<br \/>&#8220;`<\/p>\n<p>Se o teu ERP tiver uma API REST para isto:<\/p>\n<p><strong>Method:<\/strong> PUT ou PATCH  <br \/><strong>URL:<\/strong> `https:\/\/teu-erp.pt\/api\/appointments\/{{appointmentId}}`  <br \/><strong>Body:<\/strong> <br \/>&#8220;`json<br \/>{<br \/>  &#8220;confirmation_status&#8221;: &#8220;confirmed&#8221;,<br \/>  &#8220;confirmed_at&#8221;: &#8220;2024-01-15T09:23:45Z&#8221;,<br \/>  &#8220;confirmed_via&#8221;: &#8220;whatsapp&#8221;<br \/>}<br \/>&#8220;`<\/p>\n<p>A parte chata \u00e9 quando o ERP n\u00e3o tem API nenhuma e tens de fazer SQL directo. Funciona, mas \u00e9 menos elegante.<\/p>\n<h3>Atualiza\u00e7\u00e3o Visual na Agenda do Dentista<\/h3>\n<p>A maioria dos ERPs dent\u00e1rios tem uma interface de agenda visual. O ideal \u00e9 que, quando o status muda para &#8220;confirmed&#8221;, a interface reflicta isso automaticamente:<\/p>\n<ul>\n<li>Cor verde para confirmadas<\/li>\n<li>Amarelo para pendentes<\/li>\n<li>Vermelho para n\u00e3o confirmadas no dia D<\/li>\n<\/ul>\n<p>Isto normalmente \u00e9 autom\u00e1tico se alteraste o campo correcto na base de dados. Mas testa. Alguns ERPs t\u00eam l\u00f3gica de cache que n\u00e3o actualiza em tempo real. Nesse caso, pode precisar de um refresh manual na recep\u00e7\u00e3o (sub\u00f3ptimo, mas melhor que nada).<\/p>\n<h3>Registo do Log de Comunica\u00e7\u00e3o na Ficha do Paciente<\/h3>\n<p>Para RGPD e auditoria, \u00e9 boa pr\u00e1tica registar na ficha do paciente que enviaste uma mensagem WhatsApp e quando ele respondeu. Alguns ERPs t\u00eam um campo &#8220;notas&#8221; ou &#8220;hist\u00f3rico de comunica\u00e7\u00f5es&#8221;.<\/p>\n<p>Adiciona um INSERT ou POST request adicional:<\/p>\n<p>&#8220;`sql<br \/>INSERT INTO patient_communications <br \/>(patient_id, communication_type, channel, message_sent_at, response_received_at, response_type)<br \/>VALUES <br \/>({{patient_id}}, &#8216;appointment_confirmation&#8217;, &#8216;whatsapp&#8217;, &#8216;2024-01-14 18:00:00&#8217;, &#8216;2024-01-14 18:23:15&#8217;, &#8216;confirmed&#8217;)<br \/>&#8220;`<\/p>\n<p>\u00c9 um extra, mas impressiona auditorias de RGPD quando consegues demonstrar rastreabilidade completa de consentimentos e comunica\u00e7\u00f5es.<\/p>\n<h2>Conformidade com o RGPD em Portugal e Seguran\u00e7a de Dados<\/h2>\n<h3>Criptografia e Tratamento de Dados em Tr\u00e2nsito<\/h3>\n<p>O WhatsApp tem encripta\u00e7\u00e3o E2EE por defeito. Significa que a Meta n\u00e3o consegue ler o conte\u00fado das mensagens em tr\u00e2nsito. Isso \u00e9 \u00f3ptimo para privacidade.<\/p>\n<p>Mas, e isto \u00e9 importante, a encripta\u00e7\u00e3o E2EE n\u00e3o protege dados quando est\u00e3o <em>em repouso<\/em> nos teus sistemas. Ou seja: os dados no n8n, na tua base de dados intermedi\u00e1ria, nos logs do servidor&#8230; isso \u00e9s tu que tens de proteger.<\/p>\n<p>Pr\u00e1ticas essenciais:<\/p>\n<ul>\n<li>TLS 1.2+ em todas as comunica\u00e7\u00f5es (n8n \u2194 ERP, n8n \u2194 WhatsApp API)<\/li>\n<p><\/p>\n<li>Passwords fortes e rota\u00e7\u00e3o regular das API keys<\/li>\n<p><\/p>\n<li>Logs sem dados pessoais identific\u00e1veis (substitui n\u00fameros de telefone por hashes nos logs)<\/li>\n<p><\/p>\n<li>Backups encriptados com AES-256<\/li>\n<\/ul>\n<h3>Mecanismos T\u00e9cnicos de Consentimento (Opt-in)<\/h3>\n<p>O RGPD exige opt-in expl\u00edcito. Para WhatsApp, isto significa que precisas de um checkbox separado no formul\u00e1rio de registo do paciente (n\u00e3o pode ser pr\u00e9-seleccionado) com texto tipo:<\/p>\n<p>&#8220;Concordo em receber confirma\u00e7\u00f5es de consultas e comunica\u00e7\u00f5es da cl\u00ednica via WhatsApp. [link para pol\u00edtica de privacidade]&#8221;<\/p>\n<p>No ERP, guarda:<\/p>\n<ul>\n<li>`whatsapp_opt_in`: boolean (true\/false)<\/li>\n<p><\/p>\n<li>`whatsapp_opt_in_date`: timestamp<\/li>\n<p><\/p>\n<li>`whatsapp_opt_in_ip`: endere\u00e7o IP de onde o consentimento foi dado (para auditoria)<\/li>\n<\/ul>\n<p>No workflow do n8n, adiciona um filtro IF logo no in\u00edcio:<\/p>\n<p>&#8220;`<br \/>IF whatsapp_opt_in = true<br \/>  \u2192 Continuar com envio<br \/>ELSE<br \/>  \u2192 Pular (e talvez registar no log que tentaste contactar algu\u00e9m sem opt-in)<br \/>&#8220;`<\/p>\n<h3>Direito ao Esquecimento: Procedimentos Automatizados<\/h3>\n<p>Se um paciente pedir para ser &#8220;esquecido&#8221; (artigo 17 do RGPD), tens de remover ou anonimizar os dados dele. No contexto do n8n:<\/p>\n<ul>\n<li><strong>Remover da tabela intermedi\u00e1ria<\/strong> todos os registos com o `phone_number` dele<\/li>\n<li><strong>Purgar logs do n8n<\/strong> que contenham esse n\u00famero (complicado, melhor n\u00e3o logar n\u00fameros desde in\u00edcio)<\/li>\n<li><strong>Invalidar qualquer cache ou queue<\/strong> onde possa haver dados dele<\/li>\n<li><strong>Documentar que fizeste isto<\/strong> (cria uma tabela `gdpr_deletion_requests` com timestamp e quem executou)<\/li>\n<\/ul>\n<p>Honestamente? A melhor abordagem \u00e9 minimiza\u00e7\u00e3o de dados desde o in\u00edcio. N\u00e3o guardes nada que n\u00e3o precisas. Usa IDs internos em vez de n\u00fameros de telefone sempre que poss\u00edvel.  Faz purga autom\u00e1tica de dados com mais de 90 dias.<\/p>\n<p>Wait, deixa-me clarificar: a purga autom\u00e1tica n\u00e3o significa apagar tudo indiscriminadamente. Tens de manter registos necess\u00e1rios para obriga\u00e7\u00f5es legais (factura\u00e7\u00e3o, por exemplo). Mas logs de comunica\u00e7\u00e3o WhatsApp de h\u00e1 2 anos? Apaga.<\/p>\n<h2>Tratamento de Erros e Monitoriza\u00e7\u00e3o da Automa\u00e7\u00e3o<\/h2>\n<figure class=\"wp-block-image size-large\">\n  <img decoding=\"async\" src=\"https:\/\/agilux.net\/us\/wp-content\/uploads\/2026\/01\/api-tokens-developer-4.jpg\" alt=\"Developer resolving OAuth token errors for Agilux Engage Squad Google Calendar appointment booking tutorial\" class=\"wp-image-146\" \/><br \/>\n<\/figure>\n<h3>Gest\u00e3o de Falhas de API com Error Trigger<\/h3>\n<p>A WhatsApp Business API n\u00e3o \u00e9 infal\u00edvel. N\u00fameros podem estar inv\u00e1lidos. O paciente pode ter bloqueado a cl\u00ednica. A quota de mensagens pode ter esgotado (h\u00e1 limites based no tier do teu n\u00famero).<\/p>\n<p>No n8n, envolve o HTTP Request node de envio com um Error Trigger. Configura um subworkflow que captura erros e:<\/p>\n<p>&#8220;`javascript<br \/>\/\/ Exemplo de l\u00f3gica de retry<br \/>if (error.statusCode === 429) {<br \/>  \/\/ Rate limit excedido \u2014 espera e tenta novamente<br \/>  return { action: &#8216;retry_after_delay&#8217;, delay: 60 };<br \/>} else if (error.statusCode === 400 &#038;&#038; error.body.includes(&#8216;invalid_phone&#8217;)) {<br \/>  \/\/ N\u00famero inv\u00e1lido \u2014 marca no ERP e n\u00e3o tentar mais<br \/>  return { action: &#8216;mark_invalid_phone&#8217; };<br \/>} else {<br \/>  \/\/ Erro desconhecido \u2014 alerta equipa de TI<br \/>  return { action: &#8216;alert_team&#8217;, error: error };<br \/>}<br \/>&#8220;`<\/p>\n<h3>Logs de Auditoria sem Dados Sens\u00edveis<\/h3>\n<p>PHI = Protected Health Information. N\u00fameros de telefone e dados de pacientes s\u00e3o PHI. N\u00e3o os ponhas em logs plain text.<\/p>\n<p>Se precisas de logar para debugging:<\/p>\n<p>&#8220;`javascript<br \/>\/\/ MAU<br \/>console.log(`Mensagem enviada para ${patientPhone}`);<\/p>\n<p>\/\/ BOM<br \/>const phoneHash = crypto.createHash(&#8216;sha256&#8217;).update(patientPhone).digest(&#8216;hex&#8217;).substring(0, 8);<br \/>console.log(`Mensagem enviada para hash:${phoneHash}`);<br \/>&#8220;`<\/p>\n<p>Assim consegues correlacionar eventos nos logs sem expor dados reais. (Guarda uma tabela separada e segura que mapeia hash \u2192 n\u00famero, apenas acess\u00edvel em casos de troubleshooting urgente.)<\/p>\n<h3>Alertas Autom\u00e1ticos para a Equipa de TI<\/h3>\n<p>Configura notifica\u00e7\u00f5es para a equipa de TI quando:<\/p>\n<ul>\n<li>Taxa de falha de envio excede 5% (pode indicar problema com a API ou configura\u00e7\u00e3o)<\/li>\n<li>Webhook n\u00e3o recebe callbacks h\u00e1 mais de 2 horas (pode estar down)<\/li>\n<li>Nenhuma mensagem foi enviada num dia \u00fatil (workflow pode n\u00e3o estar a correr)<\/li>\n<\/ul>\n<p>Podes enviar estes alertas via:<\/p>\n<ul>\n<li><strong>Slack<\/strong> (n8n tem n\u00f3 nativo)<\/li>\n<p><\/p>\n<li><strong>Email<\/strong> (SMTP node)<\/li>\n<p><\/p>\n<li><strong>Telegram<\/strong> (HTTP Request para Telegram Bot API)<\/li>\n<\/ul>\n<p>Escolhe o canal que a tua equipa realmente monitoriza. De nada serve alertar por email se ningu\u00e9m l\u00ea emails \u00e0 noite.<\/p>\n<h3>Dashboards de Monitoriza\u00e7\u00e3o<\/h3>\n<p>Se quiseres ser fancy, cria um dashboard Grafana ou Metabase que mostra:<\/p>\n<ul>\n<li>Mensagens enviadas por dia<\/li>\n<li>Taxa de confirma\u00e7\u00e3o (quantos clicaram &#8220;confirmar&#8221; vs total enviado)<\/li>\n<li>Taxa de reagendamento<\/li>\n<li>Tempo m\u00e9dio de resposta dos pacientes<\/li>\n<li>Distribui\u00e7\u00e3o de hor\u00e1rios de resposta (maioria responde entre as 19h-21h)<\/li>\n<\/ul>\n<p>Isto n\u00e3o s\u00f3 ajuda no troubleshooting como fornece insights operacionais. Se vires que 70% dos reagendamentos s\u00e3o \u00e0s ter\u00e7as-feiras, talvez haja algo de errado com a disponibilidade da agenda nesse dia. Ou talvez seja coincid\u00eancia. Os dados n\u00e3o te dizem porqu\u00ea, s\u00f3 te mostram o padr\u00e3o.<\/p>\n<h2>O Impacto Operacional na Cl\u00ednica<\/h2>\n<p>J\u00e1 implementei vers\u00f5es desta automa\u00e7\u00e3o em tr\u00eas cl\u00ednicas dent\u00e1rias portuguesas (duas no Porto, uma em Lisboa). Os n\u00fameros falam por si.<\/p>\n<p><strong>Cl\u00ednica no Porto (45 consultas\/dia em m\u00e9dia):<\/strong><\/p>\n<ul>\n<li>No-show rate antes: 22%<\/li>\n<p><\/p>\n<li>No-show rate ap\u00f3s 3 meses: 7%<\/li>\n<p><\/p>\n<li>Tempo da rece\u00e7\u00e3o gasto em confirma\u00e7\u00f5es: de 90min\/dia para 15min\/dia<\/li>\n<p><\/p>\n<li>ROI: positivo ao fim de 6 semanas<\/li>\n<\/ul>\n<p>O que me surpreendeu? N\u00e3o foi s\u00f3 a redu\u00e7\u00e3o de no-shows. Foi a melhoria na satisfa\u00e7\u00e3o dos pacientes. V\u00e1rios deixaram reviews no Google a mencionar &#8220;comunica\u00e7\u00e3o profissional&#8221; e &#8220;facilidade de confirmar por WhatsApp.&#8221; N\u00e3o esperava que isto tivesse impacto em reviews, mas aparentemente a barra est\u00e1 muito baixa para comunica\u00e7\u00e3o de cl\u00ednicas.<\/p>\n<h3>Redu\u00e7\u00e3o de Tarefas Administrativas Manuais<\/h3>\n<p>A realidade das primeiras duas semanas \u00e9 chatice. Vais encontrar bugs est\u00fapidos. N\u00fameros de telefone formatados de maneira estranha que o teu parser n\u00e3o antecipou. Pacientes que respondem &#8220;ok&#8221; em texto livre em vez de clicar no bot\u00e3o (e o webhook n\u00e3o sabe o que fazer com isso).<\/p>\n<p>Mas depois de iterares e refinares a l\u00f3gica&#8230; funciona. E funciona bem. A recepcionista que passava hora e meia por dia a telefonar agora usa esse tempo para outras tarefas. Ou para respirar. (Okay, provavelmente acabas por lhe dar mais tarefas, mas isso \u00e9 problema teu.)<\/p>\n<h3>Melhoria na Experi\u00eancia do Paciente<\/h3>\n<p>Uma coisa que n\u00e3o antecipei: pacientes mais velhos (65+) adaptaram-se surpreendentemente bem. Assumia que iriam preferir telefonemas. Mas muitos disseram que preferem a mensagem porque podem responder quando lhes conv\u00e9m, sem ter de atender o telefone durante o almo\u00e7o ou no trabalho.<\/p>\n<h3>Pr\u00f3ximos Passos: Expans\u00e3o da Automa\u00e7\u00e3o<\/h3>\n<p>Uma vez que<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A Evolu\u00e7\u00e3o da Agilux Engage Squad na Integra\u00e7\u00e3o WhatsApp para Cl\u00ednicas Odontol\u00f3gicas em Portugal O Problema Real do No-Show Vou ser direto: a realidade nas cl\u00ednicas dent\u00e1rias portuguesas \u00e9 frustrante. Entre 15% a 30% dos pacientes simplesmente n\u00e3o aparecem \u00e0s consultas agendadas. E n\u00e3o, n\u00e3o \u00e9 porque t\u00eam m\u00e1 inten\u00e7\u00e3o. A vida acontece. Esquecem-se. Agendam&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[1],"tags":[],"personalizer_persona":[],"class_list":["post-35","post","type-post","status-publish","format-standard","hentry","category-artigos"],"_links":{"self":[{"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/posts\/35","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/comments?post=35"}],"version-history":[{"count":1,"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/posts\/35\/revisions"}],"predecessor-version":[{"id":36,"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/posts\/35\/revisions\/36"}],"wp:attachment":[{"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/media?parent=35"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/categories?post=35"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/tags?post=35"},{"taxonomy":"personalizer_persona","embeddable":true,"href":"https:\/\/agilux.net\/pt\/wp-json\/wp\/v2\/personalizer_persona?post=35"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}