SEND_DOCUMENT - Enviar Documento
O que é este Node?
O SEND_DOCUMENT é o node responsável por enviar documentos (PDF, DOC, XLS, etc.) via WhatsApp Business API.
Por que este Node existe?
Documentos são essenciais em negócios. O SEND_DOCUMENT existe para:
- Compartilhar arquivos: Enviar contratos, propostas, relatórios
- Nome personalizado: Definir nome de arquivo exibido
- Legenda descritiva: Adicionar contexto ao documento
- Formatos profissionais: Suportar PDF, Office, etc.
- Tamanho grande: Até 100MB por arquivo
Como funciona internamente?
Quando o SEND_DOCUMENT é executado, o sistema:
- Valida fonte: Verifica documentUrl ou documentId
- Extrai nome: Usa documentFilename ou nome original
- Constrói payload: Cria objeto tipo 'document'
- Adiciona caption: Inclui legenda se fornecida
- Envia para API: POST com tipo document
- Retorna message_id: Confirma envio
Código interno (whatsapp-meta-executor.service.ts:393-434):
private async sendMedia(data: WhatsAppMetaNodeData): Promise<any> {
const mediaType = this.getMediaType(data.operation!);
const mediaUrl = this.getMediaUrl(data);
const mediaId = this.getMediaId(data);
const caption = this.getMediaCaption(data);
const mediaObject: any = {};
if (mediaId) {
mediaObject.id = mediaId;
} else {
mediaObject.link = mediaUrl;
}
if (caption) {
mediaObject.caption = caption;
}
if (data.operation === 'send_document' && data.documentFilename) {
mediaObject.filename = data.documentFilename;
}
const payload = {
messaging_product: 'whatsapp',
to: data.recipientPhone,
type: mediaType,
[mediaType]: mediaObject
};
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_DOCUMENT quando precisar enviar arquivos profissionais:
Casos de uso
- Contratos: Enviar termos de serviço, contratos assinados
- Propostas comerciais: PDF com orçamentos detalhados
- Comprovantes: Recibos, notas fiscais
- Relatórios: Planilhas Excel, apresentações PowerPoint
- Manuais: Guias de usuário, documentação técnica
Quando NÃO usar SEND_DOCUMENT
- Imagens: Use SEND_IMAGE para fotos
- Vídeos: Use SEND_VIDEO para conteúdo audiovisual
- Áudios: Use SEND_AUDIO para gravações
Parâmetros Detalhados
documentUrl (string, condicional)
O que é: URL pública HTTPS do documento. Obrigatório se documentId não fornecido.
Padrão: Nenhum
Flow completo para testar:
{
"name": "Teste SEND_DOCUMENT - Document URL",
"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 PDF",
"parameters": {
"operation": "send_document",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "5511999999999",
"documentUrl": "https://exemplo.com/contrato.pdf",
"documentFilename": "Contrato-Servico.pdf",
"documentCaption": "Segue o contrato para análise"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Documento 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: URL deve ser HTTPS e acessível publicamente.
documentId (string, condicional)
O que é: ID de documento já enviado ao WhatsApp. Obrigatório se documentUrl não fornecido.
Padrão: Nenhum
Flow completo para testar:
{
"name": "Teste SEND_DOCUMENT - Document ID",
"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": "Reenviar Documento",
"parameters": {
"operation": "send_document",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "5511888888888",
"documentId": "1234567890123456",
"documentCaption": "Reenviando o documento solicitado"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Documento reenviado via ID!"
}
}
},
{
"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 ID de documento enviado anteriormente para economizar bandwidth.
documentFilename (string, opcional)
O que é: Nome personalizado do arquivo que será exibido no WhatsApp.
Padrão: Nome original do arquivo
Flow completo para testar:
{
"name": "Teste SEND_DOCUMENT - Filename",
"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 com Nome Custom",
"parameters": {
"operation": "send_document",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "5511999999999",
"documentUrl": "https://storage.com/files/abc123.pdf",
"documentFilename": "Proposta-Comercial-Janeiro-2025.pdf",
"documentCaption": "Proposta válida até 31/01/2025"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Arquivo enviado com nome personalizado!"
}
}
},
{
"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: Nome exibido no WhatsApp será "Proposta-Comercial-Janeiro-2025.pdf".
documentCaption (string, opcional)
O que é: Texto descritivo que acompanha o documento (legenda).
Padrão: Nenhum
Flow completo para testar:
{
"name": "Teste SEND_DOCUMENT - Caption",
"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 com Legenda",
"parameters": {
"operation": "send_document",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "5511999999999",
"documentUrl": "https://docs.com/manual.pdf",
"documentFilename": "Manual-Usuario.pdf",
"documentCaption": "📖 Manual do Usuário\n\nVersão 2.0 - Janeiro 2025\n\nLeia com atenção para aproveitar todos os recursos!"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Manual enviado com instruções!"
}
}
},
{
"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: Caption aparece como texto junto ao documento.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "send_document" |
| accessToken | string | Sim | Token de acesso da WhatsApp Business API |
| phoneNumberId | string | Sim | ID do número WhatsApp Business |
| recipientPhone | string | Sim | Número do destinatário |
| documentUrl | string | Condicional | URL do documento (obrigatório se sem documentId) |
| documentId | string | Condicional | ID do documento (obrigatório se sem documentUrl) |
| documentFilename | string | Não | Nome personalizado do arquivo |
| documentCaption | string | Não | Legenda do documento |
Exemplo 1: Enviar Contrato Assinado
Objetivo: Enviar contrato após assinatura digital com instruções.
JSON para Importar
{
"name": "Envio de Contrato - SEND_DOCUMENT",
"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": "Dados do Contrato",
"parameters": {
"variableName": "contract",
"value": {
"customerName": "Maria Silva",
"customerPhone": "5511999999999",
"contractId": "CONT-2025-001",
"signedPdfUrl": "https://docs.empresa.com/contracts/signed-001.pdf",
"validUntil": "31/12/2025"
}
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Notificar",
"parameters": {
"message": "✅ Contrato assinado com sucesso!\n\nOlá {{contract.customerName}}, seu contrato está pronto.\n\nEnviando documento..."
}
}
},
{
"id": "delay_1",
"type": "delay",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Aguardar",
"parameters": {
"duration": 2,
"unit": "seconds"
}
}
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Enviar Contrato",
"parameters": {
"operation": "send_document",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "{{contract.customerPhone}}",
"documentUrl": "{{contract.signedPdfUrl}}",
"documentFilename": "Contrato-{{contract.contractId}}-Assinado.pdf",
"documentCaption": "📄 Contrato Assinado\n\nID: {{contract.contractId}}\nCliente: {{contract.customerName}}\nValidade: {{contract.validUntil}}\n\n✅ Este documento possui validade jurídica.\n\nGuarde-o para referência futura."
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Finalizar",
"parameters": {
"message": "🎉 Tudo certo! Obrigado pela confiança.\n\nSe tiver dúvidas, estamos à disposição."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1300, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "message_1" },
{ "source": "message_1", "target": "delay_1" },
{ "source": "delay_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: ✅ Contrato assinado com sucesso!
Olá Maria Silva, seu contrato está pronto.
Enviando documento...
[Aguarda 2s]
[PDF: Contrato-CONT-2025-001-Assinado.pdf]
📄 Contrato Assinado
ID: CONT-2025-001
Cliente: Maria Silva
Validade: 31/12/2025
✅ Este documento possui validade jurídica.
Guarde-o para referência futura.
Sistema: 🎉 Tudo certo! Obrigado pela confiança.
Se tiver dúvidas, estamos à disposição.
Exemplo 2: Enviar Relatório Mensal
Objetivo: Enviar relatório financeiro mensal em Excel.
JSON para Importar
{
"name": "Relatório Mensal - SEND_DOCUMENT",
"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": "Dados do Relatório",
"parameters": {
"variableName": "report",
"value": {
"clientName": "João Oliveira",
"clientPhone": "5511888888888",
"month": "Janeiro",
"year": "2025",
"reportUrl": "https://storage.empresa.com/reports/jan2025-client123.xlsx",
"totalRevenue": "R$ 125.450,00",
"totalExpenses": "R$ 78.320,00"
}
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Saudação",
"parameters": {
"message": "📊 Relatório Mensal Disponível\n\nOlá {{report.clientName}}!\n\nSeu relatório de {{report.month}}/{{report.year}} está pronto."
}
}
},
{
"id": "whatsapp_1",
"type": "whatsapp_meta",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Enviar Relatório",
"parameters": {
"operation": "send_document",
"accessToken": "EAAxxxxxxxx",
"phoneNumberId": "123456789",
"recipientPhone": "{{report.clientPhone}}",
"documentUrl": "{{report.reportUrl}}",
"documentFilename": "Relatorio-Financeiro-{{report.month}}-{{report.year}}.xlsx",
"documentCaption": "📊 Relatório Financeiro - {{report.month}}/{{report.year}}\n\n💰 Receitas: {{report.totalRevenue}}\n💸 Despesas: {{report.totalExpenses}}\n\nAbra no Excel para ver detalhes completos."
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Finalizar",
"parameters": {
"message": "📞 Dúvidas sobre o relatório?\n\nEstamos à disposição para explicar qualquer item."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "message_1" },
{ "source": "message_1", "target": "whatsapp_1" },
{ "source": "whatsapp_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: 📊 Relatório Mensal Disponível
Olá João Oliveira!
Seu relatório de Janeiro/2025 está pronto.
[Excel: Relatorio-Financeiro-Janeiro-2025.xlsx]
📊 Relatório Financeiro - Janeiro/2025
💰 Receitas: R$ 125.450,00
💸 Despesas: R$ 78.320,00
Abra no Excel para ver detalhes completos.
Sistema: 📞 Dúvidas sobre o relatório?
Estamos à disposição para explicar qualquer item.
Resposta do Node
{
"messaging_product": "whatsapp",
"contacts": [
{
"input": "5511999999999",
"wa_id": "5511999999999"
}
],
"messages": [
{
"id": "wamid.HBgNNTUxMTk5OTk5OTk5ORUCABIYFjNBMzYxNzQyQ0JGRjREMTU0QzFEAA=="
}
]
}
Formatos Suportados
- PDF: Formato universal, recomendado
- Microsoft Office: DOC, DOCX, XLS, XLSX, PPT, PPTX
- OpenOffice: ODT, ODS, ODP
- Outros: TXT, CSV, RTF
Tamanho máximo: 100MB
Boas Práticas
✅ SIM:
- Use PDF para documentos finais (melhor compatibilidade)
- Defina documentFilename descritivo e organizado
- Inclua versão e data no nome do arquivo
- Use caption para resumir conteúdo do documento
- Comprima arquivos grandes antes de enviar
❌ NÃO:
- Não envie documentos protegidos por senha (WhatsApp não suporta)
- Não use nomes de arquivo genéricos ("documento.pdf")
- Não ultrapasse 100MB
- Não envie formatos não suportados (.exe, .zip)
- Não exponha dados sensíveis no caption
Dicas
💡 Nomenclatura: Use padrão "Tipo-Identificador-Data.ext" (ex: Contrato-CONT001-2025-01.pdf)
💡 PDF/A: Use formato PDF/A para arquivamento de longo prazo
💡 Compressão: Comprima PDFs com imagens usando ferramentas online
💡 Segurança: Nunca envie documentos com dados bancários/senhas
💡 Versionamento: Inclua versão no filename para rastreabilidade
Próximo Node
→ SEND_IMAGE - Enviar imagens → SEND_MEDIA - Enviar mídia genérica → SEND_MESSAGE - Enviar texto simples