WHATSAPP SEND TEMPLATE - Enviar Template Pré-aprovado
O que é este Node?
O WHATSAPP SEND TEMPLATE é o node responsável por enviar mensagens baseadas em templates pré-aprovados pelo Meta para iniciar conversas ou enviar notificações estruturadas.
Por que este Node existe?
WhatsApp Business exige templates aprovados para iniciar conversas. O SEND TEMPLATE existe para:
- Iniciar conversas: WhatsApp só permite iniciar conversa com template aprovado
- Marketing aprovado: Enviar campanhas promocionais dentro das regras do Meta
- Notificações estruturadas: Enviar alertas padronizados (confirmações, lembretes, etc.)
- Compliance: Garantir que mensagens seguem políticas do WhatsApp Business
- Personalização em escala: Templates suportam variáveis dinâmicas
Como funciona internamente?
Quando o SEND TEMPLATE é executado, o sistema:
- Valida credenciais: Verifica accessToken e phoneNumberId
- Valida template: Confirma que templateName e templateLanguage existem
- Valida destinatário: Garante que recipientPhone está presente
- Formata parâmetros: Processa templateParameters (texto, moeda, data)
- Monta payload: Estrutura JSON conforme especificação da API
- Envia requisição: POST para WhatsApp Graph API
- Retorna resultado: Confirma envio com ID da mensagem
Código interno (whatsapp-meta-executor.service.ts:546-593):
private async sendTemplate(data: WhatsAppMetaNodeData): Promise<any> {
const template: any = {
name: data.templateName,
language: {
code: data.templateLanguage
}
};
if (data.templateParameters && data.templateParameters.length > 0) {
template.components = [
{
type: 'body',
parameters: data.templateParameters.map(param => {
switch (param.type) {
case 'text':
return { type: 'text', text: param.text };
case 'currency':
return { type: 'currency', currency: param.currency };
case 'date_time':
return { type: 'date_time', date_time: param.date_time };
default:
return { type: 'text', text: param.text };
}
})
}
];
}
const payload = {
messaging_product: 'whatsapp',
to: data.recipientPhone,
type: 'template',
template
};
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 TEMPLATE sempre que precisar iniciar conversa ou enviar notificação estruturada:
Casos de uso:
- Iniciar atendimento: Enviar primeira mensagem para cliente (obrigatório usar template)
- Confirmação de pedido: Template com variáveis do pedido
- Notificação de entrega: Atualizações de status de envio
- Código de verificação: OTP/2FA para autenticação
- Lembrete de pagamento: Notificar sobre vencimentos
- Promoções: Campanhas de marketing aprovadas pelo Meta
Quando NÃO usar SEND TEMPLATE:
- Conversa já iniciada: Use SEND_MESSAGE para respostas
- Mensagem sem template: Templates precisam ser criados e aprovados primeiro
- Conteúdo dinâmico livre: Templates têm estrutura fixa, use SEND_MESSAGE para flexibilidade
Parâmetros Detalhados
templateName (string, obrigatório)
O que é: Nome único do template criado no Meta Business Manager.
Como criar templates: 1. Acesse Meta Business Manager 2. Vá em WhatsApp Manager > Message Templates 3. Crie novo template (aguarde aprovação - pode levar 24h) 4. Use o nome exato do template aprovado
Flow completo para testar:
{
"name": "Teste WhatsApp Send Template - TemplateName",
"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 Template",
"parameters": {
"operation": "send_template",
"accessToken": "SEU_TOKEN",
"phoneNumberId": "SEU_PHONE_ID",
"recipientPhone": "5511999999999",
"templateName": "hello_world",
"templateLanguage": "pt_BR"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "✅ Template enviado!"
}
}
},
{
"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: Use "hello_world" (template padrão do WhatsApp) ou nome do seu template aprovado.
templateLanguage (string, obrigatório)
O que é: Código do idioma do template (ISO 639-1 + país).
Códigos comuns: - pt_BR - Português do Brasil - en_US - Inglês (EUA) - es_ES - Espanhol (Espanha) - es_MX - Espanhol (México)
Flow completo para testar:
{
"name": "Teste WhatsApp Send Template - Language",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "switch_1",
"type": "switch",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Escolher Idioma",
"parameters": {
"variable": "idioma_escolhido",
"cases": [
{ "value": "portugues", "targetNodeId": "whatsapp_pt" },
{ "value": "ingles", "targetNodeId": "whatsapp_en" },
{ "value": "espanhol", "targetNodeId": "whatsapp_es" }
]
}
}
},
{
"id": "whatsapp_pt",
"type": "whatsapp_meta",
"position": { "x": 500, "y": 50 },
"data": {
"label": "Template PT-BR",
"parameters": {
"operation": "send_template",
"accessToken": "SEU_TOKEN",
"phoneNumberId": "SEU_PHONE_ID",
"recipientPhone": "5511999999999",
"templateName": "boas_vindas",
"templateLanguage": "pt_BR"
}
}
},
{
"id": "whatsapp_en",
"type": "whatsapp_meta",
"position": { "x": 500, "y": 150 },
"data": {
"label": "Template EN-US",
"parameters": {
"operation": "send_template",
"accessToken": "SEU_TOKEN",
"phoneNumberId": "SEU_PHONE_ID",
"recipientPhone": "5511999999999",
"templateName": "welcome",
"templateLanguage": "en_US"
}
}
},
{
"id": "whatsapp_es",
"type": "whatsapp_meta",
"position": { "x": 500, "y": 250 },
"data": {
"label": "Template ES-ES",
"parameters": {
"operation": "send_template",
"accessToken": "SEU_TOKEN",
"phoneNumberId": "SEU_PHONE_ID",
"recipientPhone": "5511999999999",
"templateName": "bienvenida",
"templateLanguage": "es_ES"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 150 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "switch_1" },
{ "source": "whatsapp_pt", "target": "end_1" },
{ "source": "whatsapp_en", "target": "end_1" },
{ "source": "whatsapp_es", "target": "end_1" }
]
}
Teste: Configure variável idioma_escolhido e envie template no idioma correto!
templateParameters (array, opcional)
O que é: Array de parâmetros para preencher variáveis do template ({{1}}, {{2}}, etc.).
Tipos suportados: - text: Texto simples - currency: Valores monetários - date_time: Datas e horários
Flow completo para testar:
{
"name": "Teste WhatsApp Send Template - Parameters",
"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 Cliente",
"parameters": {
"message": "Digite o nome do cliente:",
"variable": "cliente_nome"
}
}
},
{
"id": "input_2",
"type": "input",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Número Pedido",
"parameters": {
"message": "Digite o número do pedido:",
"variable": "pedido_numero"
}
}
},
{
"id": "number_1",
"type": "number",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Valor Pedido",
"parameters": {
"message": "Digite o valor do pedido:",
"variable": "pedido_valor",
"decimals": 2
}
}
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Enviar Confirmação",
"parameters": {
"operation": "send_template",
"accessToken": "SEU_TOKEN",
"phoneNumberId": "SEU_PHONE_ID",
"recipientPhone": "5511999999999",
"templateName": "confirmacao_pedido",
"templateLanguage": "pt_BR",
"templateParameters": [
{ "type": "text", "text": "{{cliente_nome}}" },
{ "type": "text", "text": "{{pedido_numero}}" },
{ "type": "text", "text": "{{pedido_valor}}" }
]
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Sucesso",
"parameters": {
"message": "✅ Confirmação enviada para {{cliente_nome}}!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1300, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "input_2" },
{ "source": "input_2", "target": "number_1" },
{ "source": "number_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Template precisa ter placeholders {{1}}, {{2}}, {{3}} que serão substituídos pelos parâmetros!
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "send_template" |
| 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) |
| templateName | string | Sim | Nome do template aprovado pelo Meta |
| templateLanguage | string | Sim | Código do idioma (ex: pt_BR, en_US) |
| templateParameters | array | Não | Parâmetros para substituir variáveis do template |
Exemplo 1: Confirmação de Pedido com Template
Objetivo: Enviar confirmação estruturada usando template aprovado
Template necessário no Meta:
Nome: confirmacao_pedido
Categoria: TRANSACTIONAL
Idioma: pt_BR
Conteúdo:
Olá {{1}}! 👋
✅ Seu pedido #{{2}} foi confirmado com sucesso!
💰 Valor: R$ {{3}}
📦 Status: Em preparação
Obrigado pela preferência!
JSON para Importar
{
"name": "WhatsApp Template - Confirmação 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": "Nome",
"parameters": {
"message": "Nome do cliente:",
"variable": "nome"
}
}
},
{
"id": "input_2",
"type": "input",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Pedido",
"parameters": {
"message": "Número do pedido:",
"variable": "pedido"
}
}
},
{
"id": "number_1",
"type": "number",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Valor",
"parameters": {
"message": "Valor total:",
"variable": "valor",
"decimals": 2
}
}
},
{
"id": "input_3",
"type": "input",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Telefone",
"parameters": {
"message": "Telefone do cliente (ex: 5511999999999):",
"variable": "telefone"
}
}
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Enviar Template",
"parameters": {
"operation": "send_template",
"accessToken": "SEU_TOKEN",
"phoneNumberId": "SEU_PHONE_ID",
"recipientPhone": "{{telefone}}",
"templateName": "confirmacao_pedido",
"templateLanguage": "pt_BR",
"templateParameters": [
{ "type": "text", "text": "{{nome}}" },
{ "type": "text", "text": "{{pedido}}" },
{ "type": "text", "text": "{{valor}}" }
]
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 1300, "y": 100 },
"data": {
"label": "Confirmação",
"parameters": {
"message": "✅ Template enviado para {{nome}} ({{telefone}})"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1500, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "input_2" },
{ "source": "input_2", "target": "number_1" },
{ "source": "number_1", "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 cliente:
Usuário: Maria Silva
Sistema: Número do pedido:
Usuário: 12345
Sistema: Valor total:
Usuário: 299.90
Sistema: Telefone do cliente (ex: 5511999999999):
Usuário: 5511988887777
[WhatsApp Template enviado]
Sistema: ✅ Template enviado para Maria Silva (5511988887777)
Exemplo 2: Código de Verificação (OTP)
Objetivo: Enviar código de autenticação 2FA
Template necessário no Meta:
Nome: codigo_verificacao
Categoria: AUTHENTICATION
Idioma: pt_BR
Conteúdo:
🔐 SEU CÓDIGO DE VERIFICAÇÃO
*{{1}}*
⚠️ Não compartilhe este código.
Válido por 5 minutos.
JSON para Importar
{
"name": "WhatsApp Template - Código OTP",
"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": "Telefone",
"parameters": {
"message": "Digite seu telefone (ex: 5511999999999):",
"variable": "telefone"
}
}
},
{
"id": "random_1",
"type": "random",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Gerar Código",
"parameters": {
"min": 100000,
"max": 999999,
"variable": "codigo_otp"
}
}
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Enviar OTP",
"parameters": {
"operation": "send_template",
"accessToken": "SEU_TOKEN",
"phoneNumberId": "SEU_PHONE_ID",
"recipientPhone": "{{telefone}}",
"templateName": "codigo_verificacao",
"templateLanguage": "pt_BR",
"templateParameters": [
{ "type": "text", "text": "{{codigo_otp}}" }
]
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Sucesso",
"parameters": {
"message": "✅ Código {{codigo_otp}} enviado para {{telefone}}"
}
}
},
{
"id": "number_1",
"type": "number",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Validar Código",
"parameters": {
"message": "Digite o código recebido:",
"variable": "codigo_digitado"
}
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 1300, "y": 100 },
"data": {
"label": "Verificar",
"parameters": {
"condition": "{{codigo_digitado}} == {{codigo_otp}}",
"trueNodeId": "message_ok",
"falseNodeId": "message_erro"
}
}
},
{
"id": "message_ok",
"type": "message",
"position": { "x": 1500, "y": 50 },
"data": {
"label": "Código Correto",
"parameters": {
"message": "✅ Código verificado! Acesso liberado."
}
}
},
{
"id": "message_erro",
"type": "message",
"position": { "x": 1500, "y": 150 },
"data": {
"label": "Código Incorreto",
"parameters": {
"message": "❌ Código inválido. Tente novamente."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "random_1" },
{ "source": "random_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "message_1" },
{ "source": "message_1", "target": "number_1" },
{ "source": "number_1", "target": "condition_1" },
{ "source": "message_ok", "target": "end_1" },
{ "source": "message_erro", "target": "end_1" }
]
}
Saída esperada:
Sistema: Digite seu telefone (ex: 5511999999999):
Usuário: 5511988887777
[Código gerado: 456789]
[WhatsApp Template enviado]
Sistema: ✅ Código 456789 enviado para 5511988887777
Sistema: Digite o código recebido:
Usuário: 456789
Sistema: ✅ Código verificado! Acesso liberado.
Resposta do Node
{
"success": true,
"data": {
"messaging_product": "whatsapp",
"contacts": [
{
"input": "5511999999999",
"wa_id": "5511999999999"
}
],
"messages": [
{
"id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNBMDhBRjg3QTQyRjI2RTFCNDFBAA=="
}
]
},
"executionTime": 1456,
"logs": ["WhatsApp Meta send_template operation completed successfully"]
}
Categorias de Templates
UTILITY (Transacional)
- Confirmações de pedidos
- Atualizações de conta
- Alertas de segurança
- Notificações de entrega
AUTHENTICATION (Autenticação)
- Códigos OTP
- Verificação em duas etapas
- Redefinição de senha
MARKETING (Marketing)
- Promoções
- Ofertas especiais
- Campanhas
- Requer opt-in do usuário
Boas Práticas
✅ SIM:
- Sempre crie e aprove templates no Meta Business Manager antes de usar
- Use categoria correta: UTILITY para transacional, AUTHENTICATION para OTP
- Teste templates em números de teste antes de produção
- Use variáveis {{1}}, {{2}}, etc. para personalização
- Mantenha templates simples e objetivos (aprovação mais rápida)
- Respeite limites: templates podem ter até 1024 caracteres
- Use templateLanguage correto (pt_BR para Brasil)
❌ NÃO:
- Não use templates não aprovados (erro 404)
- Não misture idiomas (template pt_BR com language en_US)
- Não envie marketing sem opt-in do usuário
- Não abuse de templates promocionais (pode resultar em bloqueio)
- Não use parâmetros que não existem no template
- Não espere aprovação instantânea (pode levar 24h ou mais)
Dicas
💡 Aprovação rápida: Templates simples sem links externos são aprovados mais rápido 💡 Variáveis: Use {{1}}, {{2}}, {{3}} em ordem sequencial 💡 Categorias: UTILITY e AUTHENTICATION têm menos restrições que MARKETING 💡 Teste: Meta fornece template "hello_world" pré-aprovado para testes 💡 Idiomas: Crie versões do template para cada idioma que precisar 💡 Rejeições: Se template for rejeitado, revise política do WhatsApp Business 💡 Rate limiting: Templates contam no limite de 80 msg/segundo 💡 Custo: Templates iniciam conversas - verifique custos na sua região
Próximo Node
→ SEND_MESSAGE - Responder dentro de conversa ativa → SEND_INTERACTIVE - Adicionar botões ao template → CREATE_TEMPLATE - Criar templates via API