Pular para conteúdo

WHATSAPP SEND MESSAGE - Enviar Mensagem de Texto

O que é este Node?

O WHATSAPP SEND MESSAGE é o node responsável por enviar mensagens de texto pelo WhatsApp Business API para contatos individuais ou grupos.

Por que este Node existe?

Enviar mensagens de texto pelo WhatsApp via API requer autenticação e configuração específica. O SEND MESSAGE existe para:

  1. Automação de mensagens: Enviar mensagens programáticas sem intervenção manual
  2. Integração com sistemas: Conectar WhatsApp a flows automatizados
  3. Notificações: Alertar usuários sobre eventos importantes
  4. Atendimento automatizado: Responder automaticamente a clientes
  5. Marketing: Enviar campanhas de comunicação em massa

Como funciona internamente?

Quando o SEND MESSAGE é executado, o sistema:

  1. Valida credenciais: Verifica accessToken e phoneNumberId
  2. Valida destinatário: Confirma que recipientPhone está presente
  3. Valida conteúdo: Garante que messageText não está vazio
  4. Formata payload: Cria estrutura JSON da API do WhatsApp
  5. Envia requisição: POST para WhatsApp Graph API
  6. Retorna resultado: Confirma envio com ID da mensagem
  7. Se erro: Retorna detalhes do erro (401, 400, etc.)

Código interno (whatsapp-meta-executor.service.ts:368-391):

private async sendMessage(data: WhatsAppMetaNodeData): Promise<any> {
  const payload = {
    messaging_product: 'whatsapp',
    to: data.recipientPhone,
    type: 'text',
    text: {
      preview_url: data.previewUrl || false,
      body: data.messageText
    }
  };

  const response: AxiosResponse = await axios.post(
    `${this.WHATSAPP_API_BASE}/${data.phoneNumberId}/messages`,
    payload,
    {
      headers: {
        'Authorization': `Bearer ${data.accessToken}`,
        'Content-Type': 'application/json'
      }
    }
  );

  return response.data;
}

Quando você DEVE usar este Node?

Use SEND MESSAGE sempre que precisar enviar texto simples pelo WhatsApp:

Casos de uso:

  1. Confirmação de pedido: "Seu pedido #12345 foi confirmado!"
  2. Notificação: "Seu pagamento foi aprovado"
  3. Alerta: "Lembrete: consulta amanhã às 14h"
  4. Resposta automatizada: "Obrigado pelo contato! Em breve responderemos"
  5. Atualização de status: "Seu pedido saiu para entrega"
  6. Mensagens informativas: Avisos, comunicados, newsletters

Quando NÃO usar SEND MESSAGE:

Parâmetros Detalhados

accessToken (string, obrigatório)

O que é: Token de acesso da API do WhatsApp Business obtido no Meta for Developers.

Como obter: 1. Acesse developers.facebook.com 2. Crie um app do tipo Business 3. Adicione o produto WhatsApp 4. Gere um token permanente 5. Configure permissões whatsapp_business_messaging

Flow completo para testar:

{
  "name": "Teste WhatsApp Send Message - AccessToken",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "whatsapp_1",
      "type": "whatsapp_meta",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Enviar Mensagem",
        "parameters": {
          "operation": "send_message",
          "accessToken": "SEU_TOKEN_AQUI",
          "phoneNumberId": "SEU_PHONE_NUMBER_ID",
          "recipientPhone": "5511999999999",
          "messageText": "Olá! Esta é uma mensagem de teste."
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "✅ Mensagem enviada com sucesso!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "whatsapp_1" },
    { "source": "whatsapp_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Substitua SEU_TOKEN_AQUI pelo token real e execute. A mensagem será enviada!

phoneNumberId (string, obrigatório)

O que é: ID do número de telefone do WhatsApp Business cadastrado no Meta for Developers.

Como obter: 1. No painel do Meta for Developers 2. Vá em WhatsApp > API Setup 3. Copie o Phone number ID (não é o número de telefone, é um ID numérico)

Flow completo para testar:

{
  "name": "Teste WhatsApp Send Message - PhoneNumberId",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Configurar Credenciais",
        "parameters": {
          "variables": {
            "wa_token": "SEU_TOKEN",
            "wa_phone_id": "SEU_PHONE_NUMBER_ID"
          }
        }
      }
    },
    {
      "id": "whatsapp_1",
      "type": "whatsapp_meta",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Enviar Mensagem",
        "parameters": {
          "operation": "send_message",
          "accessToken": "{{wa_token}}",
          "phoneNumberId": "{{wa_phone_id}}",
          "recipientPhone": "5511999999999",
          "messageText": "Mensagem enviada usando variáveis!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "whatsapp_1" },
    { "source": "whatsapp_1", "target": "end_1" }
  ]
}

Teste: Configure as variáveis com suas credenciais reais.

recipientPhone (string, obrigatório)

O que é: Número de telefone do destinatário no formato internacional (sem + e sem espaços).

Formato: Código do país + DDD + número (exemplo: 5511999999999)

Flow completo para testar:

{
  "name": "Teste WhatsApp Send Message - RecipientPhone",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Pedir Telefone",
        "parameters": {
          "message": "Digite o telefone do destinatário (ex: 5511999999999):",
          "variable": "telefone"
        }
      }
    },
    {
      "id": "whatsapp_1",
      "type": "whatsapp_meta",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Enviar para Telefone",
        "parameters": {
          "operation": "send_message",
          "accessToken": "SEU_TOKEN",
          "phoneNumberId": "SEU_PHONE_ID",
          "recipientPhone": "{{telefone}}",
          "messageText": "Mensagem enviada para {{telefone}}"
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "✅ Enviado para: {{telefone}}"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "whatsapp_1" },
    { "source": "whatsapp_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Teste: Digite um telefone válido - mensagem será enviada para esse número!

messageText (string, obrigatório)

O que é: Texto da mensagem a ser enviada. Suporta emojis e quebras de linha (\n).

Limites: Até 4096 caracteres

Flow completo para testar:

{
  "name": "Teste WhatsApp Send Message - MessageText",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Pedir Nome",
        "parameters": {
          "message": "Qual seu nome?",
          "variable": "nome"
        }
      }
    },
    {
      "id": "whatsapp_1",
      "type": "whatsapp_meta",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Mensagem Personalizada",
        "parameters": {
          "operation": "send_message",
          "accessToken": "SEU_TOKEN",
          "phoneNumberId": "SEU_PHONE_ID",
          "recipientPhone": "5511999999999",
          "messageText": "Olá {{nome}}! 👋\n\nSeja bem-vindo(a) ao nosso sistema.\n\nEstamos aqui para ajudar!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "whatsapp_1" },
    { "source": "whatsapp_1", "target": "end_1" }
  ]
}

Teste: Digite um nome e veja a mensagem personalizada sendo enviada!

previewUrl (boolean, opcional)

O que é: Se true, gera preview automático de URLs contidas no texto.

Padrão: false

Flow completo para testar:

{
  "name": "Teste WhatsApp Send Message - PreviewUrl",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "whatsapp_1",
      "type": "whatsapp_meta",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Mensagem COM Preview",
        "parameters": {
          "operation": "send_message",
          "accessToken": "SEU_TOKEN",
          "phoneNumberId": "SEU_PHONE_ID",
          "recipientPhone": "5511999999999",
          "messageText": "Confira nosso site: https://www.exemplo.com.br",
          "previewUrl": true
        }
      }
    },
    {
      "id": "delay_1",
      "type": "delay",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Aguardar",
        "parameters": {
          "duration": 3,
          "unit": "seconds"
        }
      }
    },
    {
      "id": "whatsapp_2",
      "type": "whatsapp_meta",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Mensagem SEM Preview",
        "parameters": {
          "operation": "send_message",
          "accessToken": "SEU_TOKEN",
          "phoneNumberId": "SEU_PHONE_ID",
          "recipientPhone": "5511999999999",
          "messageText": "Link sem preview: https://www.exemplo.com.br",
          "previewUrl": false
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 900, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "whatsapp_1" },
    { "source": "whatsapp_1", "target": "delay_1" },
    { "source": "delay_1", "target": "whatsapp_2" },
    { "source": "whatsapp_2", "target": "end_1" }
  ]
}

Teste: Compare as duas mensagens - a primeira mostra preview do site, a segunda não!

Parâmetros

Campo Tipo Obrigatório Descrição
operation string Sim Deve ser "send_message"
accessToken string Sim Token da WhatsApp Business API
phoneNumberId string Sim ID do número de telefone WhatsApp
recipientPhone string Sim Telefone do destinatário (formato: 5511999999999)
messageText string Sim Texto da mensagem (até 4096 caracteres)
previewUrl boolean Não Gerar preview de URLs (padrão: false)

Exemplo 1: Confirmação de Pedido

Objetivo: Enviar confirmação automática após pedido

JSON para Importar

{
  "name": "WhatsApp - Confirmação de Pedido",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Número do Pedido",
        "parameters": {
          "message": "Digite o número do pedido:",
          "variable": "pedido_numero"
        }
      }
    },
    {
      "id": "number_1",
      "type": "number",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Valor do Pedido",
        "parameters": {
          "message": "Qual o valor total?",
          "variable": "pedido_valor",
          "decimals": 2
        }
      }
    },
    {
      "id": "whatsapp_1",
      "type": "whatsapp_meta",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Enviar Confirmação",
        "parameters": {
          "operation": "send_message",
          "accessToken": "SEU_TOKEN",
          "phoneNumberId": "SEU_PHONE_ID",
          "recipientPhone": "5511999999999",
          "messageText": "✅ PEDIDO CONFIRMADO\n\n📦 Número: #{{pedido_numero}}\n💰 Valor: R$ {{pedido_valor}}\n\n✨ Obrigado pela preferência!\nEm breve você receberá atualizações."
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Confirmar Envio",
        "parameters": {
          "message": "✅ Confirmação enviada via WhatsApp!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "number_1" },
    { "source": "number_1", "target": "whatsapp_1" },
    { "source": "whatsapp_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Digite o número do pedido:
Usuário: 12345
Sistema: Qual o valor total?
Usuário: 150.50
[WhatsApp enviado]
Sistema: ✅ Confirmação enviada via WhatsApp!

Exemplo 2: Lembrete de Consulta

Objetivo: Enviar lembrete automático de consulta médica

JSON para Importar

{
  "name": "WhatsApp - Lembrete de Consulta",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "input_1",
      "type": "input",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Nome do Paciente",
        "parameters": {
          "message": "Nome do paciente:",
          "variable": "paciente_nome"
        }
      }
    },
    {
      "id": "date_1",
      "type": "date",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Data da Consulta",
        "parameters": {
          "message": "Data da consulta (DD/MM/AAAA):",
          "variable": "consulta_data"
        }
      }
    },
    {
      "id": "input_2",
      "type": "input",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Horário",
        "parameters": {
          "message": "Horário (ex: 14:30):",
          "variable": "consulta_hora"
        }
      }
    },
    {
      "id": "input_3",
      "type": "input",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Telefone",
        "parameters": {
          "message": "Telefone (ex: 5511999999999):",
          "variable": "paciente_telefone"
        }
      }
    },
    {
      "id": "whatsapp_1",
      "type": "whatsapp_meta",
      "position": { "x": 1100, "y": 100 },
      "data": {
        "label": "Enviar Lembrete",
        "parameters": {
          "operation": "send_message",
          "accessToken": "SEU_TOKEN",
          "phoneNumberId": "SEU_PHONE_ID",
          "recipientPhone": "{{paciente_telefone}}",
          "messageText": "🏥 LEMBRETE DE CONSULTA\n\n👤 Paciente: {{paciente_nome}}\n📅 Data: {{consulta_data}}\n🕐 Horário: {{consulta_hora}}\n\n📍 Clínica Medical Center\nRua Exemplo, 123\n\n⚠️ Por favor, chegue 15 minutos antes."
        }
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 1300, "y": 100 },
      "data": {
        "label": "Sucesso",
        "parameters": {
          "message": "✅ Lembrete enviado para {{paciente_nome}}!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1500, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "input_1" },
    { "source": "input_1", "target": "date_1" },
    { "source": "date_1", "target": "input_2" },
    { "source": "input_2", "target": "input_3" },
    { "source": "input_3", "target": "whatsapp_1" },
    { "source": "whatsapp_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Nome do paciente:
Usuário: João Silva
Sistema: Data da consulta (DD/MM/AAAA):
Usuário: 15/01/2025
Sistema: Horário (ex: 14:30):
Usuário: 14:30
Sistema: Telefone (ex: 5511999999999):
Usuário: 5511988887777
[WhatsApp enviado]
Sistema: ✅ Lembrete enviado para João Silva!

Resposta do Node

{
  "success": true,
  "data": {
    "messaging_product": "whatsapp",
    "contacts": [
      {
        "input": "5511999999999",
        "wa_id": "5511999999999"
      }
    ],
    "messages": [
      {
        "id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNBMDhBRjg3QTQyRjI2RTFCNDFBAA=="
      }
    ]
  },
  "executionTime": 1245,
  "logs": ["WhatsApp Meta send_message operation completed successfully"]
}

Boas Práticas

SIM:

  • Sempre use tokens permanentes em produção (não tokens temporários)
  • Armazene credenciais em variáveis de ambiente, não no flow
  • Valide o formato do telefone antes de enviar (regex: ^\d{10,15}$)
  • Use previewUrl: true quando enviar links importantes
  • Personalize mensagens com variáveis (nome, pedido, etc.)
  • Respeite limites de taxa: não envie mais de 80 msg/segundo
  • Adicione emojis para tornar mensagens mais amigáveis
  • Use quebras de linha (\n) para organizar o texto

NÃO:

  • Não exponha tokens em código ou documentação
  • Não envie spam (pode resultar em bloqueio da conta)
  • Não ultrapasse 4096 caracteres por mensagem
  • Não use número de telefone incorreto (com +, espaços, etc.)
  • Não envie mensagens promocionais sem opt-in do usuário
  • Não abuse de mensagens automáticas (respeite o usuário)

Dicas

💡 Formatação: Use \n para quebras de linha e emojis para destacar informações 💡 Variáveis: Sempre personalize com {{nome}}, {{pedido}}, etc. 💡 Preview de URL: Ative previewUrl quando compartilhar links importantes 💡 Rate Limiting: WhatsApp Business permite até 80 msg/s - use DELAY se necessário 💡 Telefone internacional: Sempre use formato internacional sem + (exemplo: 5511999999999) 💡 Teste primeiro: Use números de teste antes de enviar para clientes reais 💡 Erros 401: Se receber erro 401, o token expirou ou está inválido 💡 Erros 400: Verifique formato do telefone e parâmetros obrigatórios

Próximo Node

SEND_TEMPLATE - Enviar templates pré-aprovados → SEND_MEDIA - Enviar imagens, vídeos, documentos → SEND_INTERACTIVE - Mensagens com botões e listas