
Como Usar o whatsmeow-node com n8n
O n8n é uma plataforma de automação de workflows self-hosted — como o Zapier, mas open source. Seu nó WhatsApp nativo requer a Cloud API oficial (verificação Meta Business, cobrança por mensagem). Com o whatsmeow-node, você pode conectar o n8n ao WhatsApp de graça usando uma ponte REST simples.
Como Funciona
n8n Workflow
↕ HTTP requests / webhooks
whatsmeow-node REST API (Express)
↕
WhatsApp
- Recebendo: whatsmeow-node recebe uma mensagem do WhatsApp e faz POST para um webhook do n8n
- Enviando: um workflow do n8n faz uma requisição HTTP para a REST API do whatsmeow-node, que envia a mensagem
Pré-requisitos
- Uma sessão pareada do whatsmeow-node (Como Parear)
- n8n rodando (self-hosted ou cloud) —
npx n8npara começar rápido - Express:
npm install express
Passo 1: Criar a REST API do whatsmeow-node
Este servidor faz duas coisas: envia mensagens via REST e encaminha mensagens recebidas para o n8n.
import { createClient } from "@whatsmeow-node/whatsmeow-node";
import express from "express";
const client = createClient({ store: "session.db" });
const app = express();
app.use(express.json());
// n8n webhook URL — you'll set this up in Step 3
const N8N_WEBHOOK_URL = process.env.N8N_WEBHOOK_URL ?? "http://localhost:5678/webhook/whatsapp";
// --- Sending endpoint (n8n calls this) ---
app.post("/api/send", async (req, res) => {
const { phone, message, groupJid } = req.body;
const jid = groupJid ?? `${phone}@s.whatsapp.net`;
try {
const resp = await client.sendMessage(jid, { conversation: message });
res.json({ sent: true, id: resp.id });
} catch (err) {
res.status(500).json({ error: "Failed to send" });
}
});
// --- Forward incoming messages to n8n ---
client.on("message", async ({ info, message }) => {
if (info.isFromMe) return;
const text =
(message.conversation as string) ??
(message.extendedTextMessage as { text?: string } | undefined)?.text;
// POST to n8n webhook
try {
await fetch(N8N_WEBHOOK_URL, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
from: info.sender,
chat: info.chat,
pushName: info.pushName,
messageId: info.id,
text: text ?? null,
isGroup: info.isGroup,
timestamp: info.timestamp,
hasMedia: !!(
message.imageMessage ??
message.videoMessage ??
message.audioMessage ??
message.documentMessage
),
}),
});
} catch (err) {
console.error("Failed to forward to n8n:", err);
}
});
async function main() {
const { jid } = await client.init();
if (!jid) {
console.error("Not paired!");
process.exit(1);
}
await client.connect();
app.listen(3000, () => console.log("WhatsApp API on :3000"));
}
main().catch(console.error);
Passo 2: Configurar o Webhook Trigger no n8n
No n8n, crie um novo workflow:
- Adicione um nó Webhook como trigger
- Defina o método como
POST - Defina o path como
whatsapp(gerando a URLhttp://localhost:5678/webhook/whatsapp) - Configure a URL do webhook como
N8N_WEBHOOK_URLno ambiente da sua REST API
Agora cada mensagem recebida pelo WhatsApp aciona esse workflow do n8n.
Passo 3: Enviar Mensagens a partir do n8n
Adicione um nó HTTP Request ao seu workflow do n8n:
- Method: POST
- URL:
http://localhost:3000/api/send - Body (JSON):
{
"phone": "{{ $json.from.replace('@s.whatsapp.net', '') }}",
"message": "Thanks for your message! We'll get back to you soon."
}
Exemplo: Workflow de Auto-Resposta
Um workflow completo do n8n que responde automaticamente a mensagens:
[Webhook Trigger] → [IF: text contains "price"] → [HTTP Request: send reply]
→ [IF: text contains "help"] → [HTTP Request: send help menu]
→ [Default] → [HTTP Request: send acknowledgment]
Exemplo: Integração com CRM
Encaminhe mensagens do WhatsApp para um CRM e responda com o número do ticket:
[Webhook Trigger] → [HTTP Request: create CRM ticket]
→ [Set: extract ticket ID]
→ [HTTP Request: send "Your ticket #{{ ticketId }} has been created"]
Exemplo: Auto-Resposta com IA
Combine com OpenAI no n8n:
[Webhook Trigger] → [OpenAI Chat: generate reply]
→ [HTTP Request: send AI reply via whatsmeow-node]
Adicionando Mais Endpoints
Expanda a REST API para workflows do n8n que precisam de mais funcionalidades:
// Send media
app.post("/api/send-media", async (req, res) => {
const { phone, filePath, mediaType, caption } = req.body;
const jid = `${phone}@s.whatsapp.net`;
const media = await client.uploadMedia(filePath, mediaType);
await client.sendRawMessage(jid, {
[`${mediaType}Message`]: {
URL: media.URL,
directPath: media.directPath,
mediaKey: media.mediaKey,
fileEncSHA256: media.fileEncSHA256,
fileSHA256: media.fileSHA256,
fileLength: String(media.fileLength),
mimetype: `${mediaType}/*`,
...(caption && { caption }),
},
});
res.json({ sent: true });
});
// Send to group
app.post("/api/send-group", async (req, res) => {
const { groupJid, message } = req.body;
const resp = await client.sendMessage(groupJid, { conversation: message });
res.json({ sent: true, id: resp.id });
});
// Mark as read
app.post("/api/read", async (req, res) => {
const { messageId, chat, sender } = req.body;
await client.markRead([messageId], chat, sender);
res.json({ ok: true });
});
Erros Comuns
A REST API do whatsmeow-node e o n8n precisam estar rodando ao mesmo tempo. Use PM2 ou Docker Compose para gerenciá-los juntos.
A URL do webhook do n8n precisa ser acessível a partir do servidor do whatsmeow-node. No Docker, use o nome do container ou alias de rede, não localhost.
Workflows do n8n podem executar muito rápido. Se o seu workflow envia múltiplas mensagens, adicione um nó Wait (1-3 segundos) entre os envios para evitar rate limiting do WhatsApp.







