Import a ready-made workflow, add two credentials, and send your first WhatsApp message from n8n in ten minutes, no community package, no code. Test in a sandbox before you pair a phone. Flat $5/month, unlimited messages.
n8n can already talk to almost everything you run, and with WABridges, "almost everything" includes a real WhatsApp number. Your bridge is a plain web endpoint, which is exactly what n8n's HTTP Request node is for, and every incoming message is a webhook, which is exactly what n8n's Webhook node is for. Both are core nodes, so everything on this page works on n8n Cloud and on a self-hosted instance with community packages disabled.
Below: the three workflows you can import as-is, the two credentials they need, every node setting field by field for when you build your own, and how to test it all against the built-in sandbox before a phone is involved.
We keep the number online and hand you every event. You write the part in the middle.
Sign up, open the dashboard, and create an API key. The dashboard also gives you a sandbox bridge, a simulated WhatsApp number whose contact, Alice, replies to everything, so the first test needs no phone.
Both are the built-in Header Auth type. One holds your API key (for sending), the other holds the bridge's webhook secret (so the Webhook node only accepts events that really come from WABridges).
Paste one of the workflow URLs below into n8n's Import from URL, or copy the JSON onto the canvas. Pick the credentials in the two nodes that ask for them, and run it: the message lands in the sandbox and Alice replies.
Activate the workflow, paste the Webhook node's production URL into the bridge's webhook field, and change one value, customer_ref, from sandbox to the bridge you paired by scanning a QR code.
Everything below works on n8n Cloud and self-hosted alike.
sk_ and is shown once; keep it for step 2.whsec_sbx_…. Real bridges show theirs on the bridge page.N8N_WEBHOOK_URL to your public address, or run n8n behind Cloudflare Tunnel or ngrok. n8n's old --tunnel flag was discontinued.Both use n8n's built-in Header Auth type (Credentials → Add credential → search “Header Auth”). Name them exactly as below and the imported workflows pick them up automatically. Do not use the generic “Bearer Auth” option: it is a common source of silent 401s, and Header Auth does the same job.
Authorization, value Bearer sk_…. Used by every HTTP Request node that sends a message.
Authorization, value Bearer whsec_… (the bridge's webhook secret). Used by the Webhook trigger node.
Why the second one: WABridges sends Authorization: Bearer <webhook_secret> with every event, and the Webhook node checks it before the workflow runs. Nobody who guesses your webhook URL can start your workflow. Each bridge has its own secret, so you will add another credential when you go live with a real number.
In n8n: open a new workflow → the … menu at the top right → Import from URL… and paste the link, or copy the JSON and paste it straight onto the canvas (Ctrl/⌘+V). Each workflow carries its own setup notes as sticky notes.
https://wabridges.com/n8n/wabridges-send.json
https://wabridges.com/n8n/wabridges-reply.json
https://wabridges.com/n8n/wabridges-ai-agent.json
The sandbox bridge answers you, so both halves of the loop are testable before a number is paired.
message_id; the dashboard's sandbox card shows the message and, a few seconds later, Alice's reply.For when you build your own workflow or change the imported ones. Anything in {{ }} is an n8n expression; the imported workflows read customer_ref from a Settings node so it is changed in one place.
| Method | POST |
| URL | https://wabridges.com/api/instances/customer_ref/proxy/send/text. Use sandbox, or the name you gave the bridge |
| Authentication | Generic Credential Type → Header Auth → WABridges API key |
| Send Body | On · Body Content Type: JSON · Specify Body: Using JSON |
| JSON | {{ JSON.stringify({ chat: $json.body.chat_id, body: "Your text" }) }}. Building the object with JSON.stringify keeps quotes and line breaks in the text from breaking the JSON |
| Header (optional) | Idempotency-Key = {{ $execution.id }}-{{ $json.body.message_id }} so retries never send twice |
| Settings tab | Retry On Fail: on, 3 tries, 5000 ms. Covers a 503 bridge_starting when an idle bridge wakes up |
chat accepts a phone number with country code and no + (15550001234), or a full WhatsApp id (…@s.whatsapp.net for people, …@g.us for groups). Media, reactions, polls, locations and typing indicators are the same node with a different path. See the API reference.
The HTTP Request node has an Import cURL button. Paste this, then swap the key for your credential.
curl -X POST 'https://wabridges.com/api/instances/sandbox/proxy/send/text' \ -H 'Authorization: Bearer sk_YOUR_KEY' \ -H 'Content-Type: application/json' \ -d '{"chat": "15550001234", "body": "Hello from n8n"}'
| HTTP Method | POST |
| Path | Anything, e.g. wabridges |
| Authentication | Header Auth → WABridges webhook secret |
| Respond | Immediately. WABridges retries anything that is not a fast 2xx, so respond first and do the work after. |
| Output | Event fields arrive under $json.body: event, body, chat_id, phone, name, from_me, is_group, message_id, media_type, caption. Full list in the webhook docs. |
| Then an IF node | {{ $json.body.event }} equals message and {{ $json.body.from_me }} is false, otherwise your own outgoing messages and connection events start the workflow too |
Four changes between the sandbox and a phone people can message.
customer_ref from sandbox to the bridge's name.Header Auth already proves the event came from WABridges. If you also want tamper-proofing and replay protection, WABridges signs each delivery: X-Webhook-Signature: t=<unix>,v1=<hex>, HMAC-SHA256 over <t>.<raw body>. In the Webhook node turn on Options → Raw Body, then add a Code node right after it.
const crypto = require('crypto');
const secret = 'whsec_...'; // the bridge's webhook secret
const item = $input.first();
const raw = (await this.helpers.getBinaryDataBuffer(0, 'data')).toString('utf8');
const sig = Object.fromEntries((item.json.headers['x-webhook-signature'] || '').split(',').map(p => p.split('=')));
const expected = crypto.createHmac('sha256', secret).update(`${sig.t}.${raw}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(sig.t)) < 300;
const match = (sig.v1 || '').length === expected.length && crypto.timingSafeEqual(Buffer.from(sig.v1), Buffer.from(expected));
if (!fresh || !match) throw new Error('Invalid WABridges webhook signature');
return [{ json: { ...item.json, body: JSON.parse(raw) } }];
Downstream nodes keep reading $json.body.… as before. The Code node's crypto module is available on n8n Cloud.
Six things that account for almost every failed first run.
Bearerbridge_startingidle bridge waking, Retry On Fail covers itfrom_me checklocalhostset N8N_WEBHOOK_URL and restartOn the bridge page, Webhook deliveries shows every attempt and the response code n8n gave, which usually names the problem outright.
Every loop below is the one above with your own logic in the middle.
Copy this prompt → paste into any AI assistant → get a node-by-node walkthrough that starts from a working workflow instead of a blank canvas.
I use n8n and I want to connect WhatsApp to my workflows using WABridges (wabridges.com). I don't write code. What I want to build: [describe it plainly, e.g. "when a customer messages my WhatsApp number, answer common questions with AI, and forward anything it can't answer to my personal number"] My setup: - A WABridges account with an API key and the sandbox bridge (customer_ref "sandbox"): or a real paired bridge named [name] - n8n [cloud / self-hosted: update this] Start from the closest of these ready-made WABridges workflows (they are importable n8n JSON; read them first): - https://wabridges.com/n8n/wabridges-send.json (send one message) - https://wabridges.com/n8n/wabridges-reply.json (reply to incoming messages) - https://wabridges.com/n8n/wabridges-ai-agent.json (AI assistant with memory) and the API docs: https://wabridges.com/llms-full.txt Then walk me through, node by node: 1. Which workflow to import and how (Import from URL) 2. The two Header Auth credentials and where each one is selected 3. Exactly which nodes to add or change for my flow above, every field value written out so I can type it into the n8n form 4. How to test it against the sandbox, then switch to my real bridge Explain it like I'm setting up n8n for the first time, which nodes to add and what to paste where, no code.
What you get on the WhatsApp side, whatever you build on yours.
Other guides that build on the loop you just read.
Choosing a provider? See how WABridges compares to Twilio, 360dialog, and other WhatsApp API providers.