WABridges
No code

Your n8n workflows,
now on WhatsApp.

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.

Four steps. One loop.

We keep the number online and hand you every event. You write the part in the middle.

1
Create an API key

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.

2
Add two credentials in n8n

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).

3
Import a workflow

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.

Point the bridge at n8n and go live

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.

Before you start. Four things.

Everything below works on n8n Cloud and self-hosted alike.

A WABridges account. Sign up, free for 7 days once you connect a number, card on file, nothing charged until then.
An API key. Dashboard → API key → create. It starts with sk_ and is shown once; keep it for step 2.
The sandbox webhook secret. The dashboard's sandbox card has a Webhook step with a Reveal button next to whsec_sbx_…. Real bridges show theirs on the bridge page.
n8n Cloud or self-hosted. Self-hosted only needs its webhook URL reachable from the internet: set N8N_WEBHOOK_URL to your public address, or run n8n behind Cloudflare Tunnel or ngrok. n8n's old --tunnel flag was discontinued.

Two credentials, once.

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.

WABridges API key Header Authorization, value Bearer sk_…. Used by every HTTP Request node that sends a message.
WABridges webhook secret Header 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.

Import a workflow. Paste and go.

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.

Send a WhatsApp messagewabridges-send.json
Hello world. A manual trigger, a Settings node with the recipient and text, and one HTTP Request. Run it and Alice replies in the sandbox.
NodesManual Trigger → Settings → HTTP Request
NeedsAPI key credential
https://wabridges.com/n8n/wabridges-send.json
Download
Reply to incoming messageswabridges-reply.json
The two-way skeleton. Every incoming message starts the workflow; it skips your own messages and non-message events, then answers. Swap the reply node for your logic.
NodesWebhook → Settings → IF → HTTP Request
NeedsAPI key + webhook secret credentials
https://wabridges.com/n8n/wabridges-reply.json
Download
AI assistant on your numberwabridges-ai-agent.json
Direct messages go to an AI Agent with conversation memory keyed by chat_id; its answer is sent back. Edit the system message, attach tools, add a human handoff.
NodesWebhook → Settings → IF → AI Agent (chat model + memory) → HTTP Request
NeedsAPI key + webhook secret + a chat model credential (OpenAI by default)
https://wabridges.com/n8n/wabridges-ai-agent.json
Download

First test, no phone needed.

The sandbox bridge answers you, so both halves of the loop are testable before a number is paired.

  1. Import Send a WhatsApp message. Open the Send WhatsApp message node and select the WABridges API key credential if it is not already. Click Test workflow. The output shows a message_id; the dashboard's sandbox card shows the message and, a few seconds later, Alice's reply.
  2. Import Reply to incoming messages. Select the webhook secret credential in WhatsApp message received and the API key in Send reply. Activate the workflow (toggle at the top right).
  3. Open the Webhook node and copy its Production URL, not the Test URL: that one only listens while you click Listen for test event. On the dashboard, paste it into the sandbox card's Webhook field and save.
  4. Run the send workflow again. Alice's reply now reaches n8n (see Executions), the reply workflow answers her, and she answers back. After a few rounds the sandbox says it is looping and goes quiet for a minute. That is deliberate, and a useful reminder to reply only to messages that need one in production.

Node settings, field by field.

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.

HTTP Request node · send a message
MethodPOST
URLhttps://wabridges.com/api/instances/customer_ref/proxy/send/text. Use sandbox, or the name you gave the bridge
AuthenticationGeneric Credential Type → Header Auth → WABridges API key
Send BodyOn · 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 tabRetry 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.

Or import it from cURL

The HTTP Request node has an Import cURL button. Paste this, then swap the key for your credential.

bash
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"}'
Webhook node, receiving messages
Webhook node · receive messages
HTTP MethodPOST
PathAnything, e.g. wabridges
AuthenticationHeader Auth → WABridges webhook secret
RespondImmediately. WABridges retries anything that is not a fast 2xx, so respond first and do the work after.
OutputEvent 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

Go live on a real number.

Four changes between the sandbox and a phone people can message.

  1. Dashboard → New bridge, give it a name, scan the QR with the phone, the same way you link WhatsApp Web.
  2. Add a Header Auth credential with that bridge's webhook secret (bridge page → Webhook Secret → Copy) and select it in the Webhook node.
  3. In the Settings node, change customer_ref from sandbox to the bridge's name.
  4. Paste the Webhook node's Production URL into the bridge page's Webhook URL field. Send yourself a message from another phone and watch the execution.

Optional: verify the signature.

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.

n8n Code node
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.

When it does not work.

Six things that account for almost every failed first run.

HTTP Request returns 401credential, header name or missing Bearer
HTTP Request returns 503 bridge_startingidle bridge waking, Retry On Fail covers it
Nothing arrives in n8nTest URL instead of Production, or not activated
Webhook deliveries show 403secret belongs to another bridge
The workflow answers itselfmissing the from_me check
Self-hosted, Production URL is localhostset N8N_WEBHOOK_URL and restart

On the bridge page, Webhook deliveries shows every attempt and the response code n8n gave, which usually names the problem outright.

The same three calls. Different jobs.

Every loop below is the one above with your own logic in the middle.

🤖 AI on your number
  • Webhook → AI Agent → reply
  • Per-chat memory keyed by chat_id
  • Attach tools: Sheets, CRM, your API
  • Hand tricky ones to a human
🖥️ Ops and alerts
  • Failed job → on-call WhatsApp group
  • Server monitor → instant message
  • Reply "ACK" to acknowledge
  • Daily digest workflow
📇 Customers and leads
  • New enquiry → CRM record
  • Instant acknowledgement reply
  • Order status lookups by reply
  • Appointment reminder flows
🧩 Internal tools
  • Query your database by message
  • Approve requests from your phone
  • File incoming media to storage
  • Bridge WhatsApp to Slack or email

Want it customised? Paste this into ChatGPT or Claude

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.

prompt
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.

One number, one price, no approval queue.

What you get on the WhatsApp side, whatever you build on yours.

Standard HTTP Request and Webhook nodes: works on n8n Cloud and self-hosted, no community package to vet
Three importable workflows: send, two-way reply, AI assistant with per-chat memory
Sandbox bridge with a contact who replies, test the whole loop before you pair a phone
Webhook node verifies every event with your webhook secret, zero code
No Meta Business approval, no message templates, no waiting
Flat $5/month, unlimited messages, however busy your workflows get
7-day free trial, no credit card