Integrations
Connect WhatsApp to n8n
Connect WhatsApp to n8n with the built in HTTP Request and Webhook nodes. No custom node to install, no Meta business verification, and your first number is free.
n8n can already talk to wasender.dev. Sending a WhatsApp message is an HTTP Request node, and receiving one is a Webhook node, so there is no community node to install and nothing to wait on a marketplace to approve.
This guide builds a complete two way flow: a customer messages your WhatsApp number, n8n picks it up, and your workflow replies. It takes about ten minutes.
What you need
- An n8n instance, either cloud or self hosted
- A WhatsApp number you can scan a QR code with, ideally a dedicated one rather than your personal line
- A wasender.dev account. The first connected number is free permanently, so this costs nothing to follow along with
Step 1: connect your WhatsApp number
Create a channel in the dashboard and you get a channel token that looks like wsk_sg_xxxxxxxxxxxx. It is scoped to exactly one WhatsApp number, and it is a password: anyone holding it can send as you.
Fetch the QR code and scan it from WhatsApp under Settings, Linked devices, Link a device:
curl https://api.wasender.dev/users/login/image \
-H "Authorization: Bearer $WASENDER_TOKEN" \
--output qr.pngQR codes rotate every 20 seconds or so, so request a new one if it expires. Once scanned, the credentials persist and reconnects never ask again. Confirm the number is live:
curl https://api.wasender.dev/health \
-H "Authorization: Bearer $WASENDER_TOKEN"Step 2: send a message from n8n
Add an HTTP Request node and configure it:
- Method:
POST - URL:
https://api.wasender.dev/messages/text - Authentication: Generic Credential Type, then Header Auth
- Header name:
Authorization - Header value:
Bearer wsk_sg_your_token_here - Send Body: on, using JSON
The body is two fields:
{
"to": "61371989950",
"body": "Your order has shipped."
}Recipients are phone numbers in international format without a leading +. You can also pass a full chat id such as 61371989950@s.whatsapp.net, or a group id ending in @g.us.
Execute the node and the message arrives. A 2xx means WhatsApp accepted it, which is not the same as delivered, so confirm real delivery with webhooks or GET /statuses/{MessageID} if it matters to your flow.
Step 3: receive messages into n8n
Add a Webhook node, set the method to POST, and copy its production URL. Register that URL against your channel with PATCH /settings:
curl -X PATCH https://api.wasender.dev/settings \
-H "Authorization: Bearer $WASENDER_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"webhooks": [
{
"url": "https://your-n8n-host/webhook/whatsapp",
"events": [{ "type": "messages", "method": "post" }],
"mode": "body"
}
]
}'You can also set this from the dashboard if you would rather not call the API.
The event types you can subscribe to are messages, statuses, chats, contacts, groups, calls and users. Subscribing to messages is enough for a reply flow. Add statuses if you want delivery and read receipts as well.
Deliveries are signed and retried with backoff, so a workflow that is briefly down does not silently lose messages.
Now trigger it: send a WhatsApp message to your connected number and watch it arrive in n8n. Rather than guessing at field names, run this once and read the payload n8n captures. That is the shape your workflow should branch on, and reading it from a real delivery beats copying it out of any guide, including this one.
Add an IF node after the webhook so you act only on genuinely new inbound messages and ignore your own outgoing echoes and receipt events.
Step 4: close the loop
Wire the IF node's true branch into another HTTP Request node pointed back at /messages/text, using the incoming sender as the recipient. The finished workflow is four nodes:
Webhook -> IF (inbound message?) -> your logic -> HTTP Request (reply)"Your logic" is wherever the value is. An AI node answering support questions, a lookup against your order database, a calendar check for appointment scheduling, or a routing rule that pages a human when the customer sounds unhappy.
Sending more than text
The same HTTP Request node covers every message type by changing the URL:
/messages/image,/messages/video,/messages/document,/messages/audioand/messages/voicefor media/messages/locationfor a map pin,/messages/contactfor a contact card/messages/pollfor a poll you can read votes back from/messages/link_previewfor a link that renders with a proper preview
Group administration, contacts, chat management and typing indicators are all available the same way. The full list is in the API reference.
Costs
There are no per message fees. Your first connected number is free permanently with unlimited messages, and each additional number is a flat $4 a month. A workflow sending ten messages a month and one sending ten million cost the same.
Common problems
The QR code expired before I scanned it. They rotate roughly every 20 seconds. Request a new one and scan promptly.
I get a 401. The token is wrong, revoked, or belongs to a different region. Check you copied the whole wsk_ string.
I get a 503. The session is reconnecting or waking. Retry with backoff rather than immediately.
Messages send but never arrive. A 2xx means accepted, not delivered. Check GET /statuses/{MessageID} or subscribe to the statuses webhook events. Also confirm the recipient number has no leading +.
Rate limited with a 429. The limits protect your number from WhatsApp's anti abuse systems rather than upsell you. Respect Retry-After and slow the workflow down.
A note on which number to use
This service drives WhatsApp through an unofficial client, the same mechanism WhatsApp Web uses. Meta does not sanction it, so use a number you can afford to lose rather than your main business line, and do not send first contact messages to people who never opted in. For regulated workloads, use Meta's official Cloud API instead.