WhatsApp Echo Bot Starter Workflow
Set up a simple WhatsApp echo bot with this starter workflow. Learn how to configure and verify Meta webhooks in n8n to automatically respond to incoming user messages.
Overview
Automates responding to WhatsApp messages by creating a simple echo bot. This workflow handles Meta's webhook verification and echoes back any text message received from a user.
🤖 What does this workflow do?
This workflow provides a basic template for building a WhatsApp bot. It demonstrates the two key steps for integrating with the WhatsApp Business API:
- Webhook Verification: It handles the initial one-time verification challenge from Meta to confirm your webhook URL is valid.
- Message Handling: It listens for incoming messages from users and automatically replies with an "echo" of their message.
✨ How it works
The workflow is split into two main paths that share the same webhook URL but respond to different HTTP methods (GET for verification, POST for messages).
-
Verification Flow (
GETrequest):- The Verify Webhook node captures the initial
GETrequest sent by Meta when you set up the Callback URL. - The Respond to Webhook node immediately sends back the
hub.challengevalue it receives in the request. This is required by Meta to confirm you own the endpoint.
- The Verify Webhook node captures the initial
-
Main Message Flow (
POSTrequest):- The Respond Webhook node listens for
POSTrequests, which are sent by Meta whenever there's an event (like a new message). - The Is message? IF node checks if the incoming data actually contains a text message from a user.
- If it's a valid message, the Echo the message back WhatsApp node sends a reply to the original user. The reply consists of the text "Echo back:" followed by the user's original message.
- The Respond Webhook node listens for
🚀 Use Cases
- Foundation for Complex Bots: Use this as a starting point to build more advanced bots for customer support, lead generation, or notifications.
- API Connection Test: A simple way to verify that your n8n instance can successfully connect to and interact with the WhatsApp Business API.
- Learning Tool: An excellent example for understanding how to work with webhooks and the n8n WhatsApp node.
Instructions
Basic steps
- Download workflow JSON
- Import into n8n
- Configure node parameters as needed
- Test and enable the workflow
💡 Tips
After importing, verify all connectors and credentials match your environment.
Preview
Workflow Visualization
Nodes
Verify
webhook
Respond to Webhook
respondToWebhook
Echo the message back
Is message?
if
Sticky Note
stickyNote
Sticky Note1
stickyNote
Sticky Note2
stickyNote
Respond
webhook
Statistics
View full JSON structure
{
"nodes": [
{
"id": "9b385dfe-fa67-4c2c-83df-e3e02c0ff796",
"name": "Verify",
"type": "n8n-nodes-base.webhook",
"position": [
700,
180
],
"webhookId": "793f285b-9da7-4a5e-97ce-f0976c113db5",
"parameters": {
"path": "1fea1f5f-81c0-48ad-ae13-41e0f8e474ed",
"options": {},
"responseMode": "responseNode"
},
"typeVersion": 1.1
},
{
"id": "676efc61-c875-4675-a843-20f98ef1a642",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
920,
180
],
"parameters": {
"options": {},
"respondWith": "text",
"responseBody": "={{ $json.query['hub.challenge'] }}"
},
"typeVersion": 1
},
{
"id": "8dd6d094-415c-40d7-ad2b-4ed9f2d23232",
"name": "Echo the message back",
"type": "n8n-nodes-base.whatsApp",
"position": [
1140,
540
],
"parameters": {
"textBody": "=Echo back: {{ $json.body.entry[0].changes[0].value.messages[0].text.body }}",
"operation": "send",
"phoneNumberId": "244242975437240",
"additionalFields": {},
"recipientPhoneNumber": "={{ $json.body.entry[0].changes[0].value.messages[0].from }}"
},
"credentials": {
"whatsAppApi": {
"id": "dy22WXWn0Xz4WRby",
"name": "WhatsApp account"
}
},
"typeVersion": 1
},
{
"id": "cd9e2cfd-9589-4390-95fd-f0bc3960d60c",
"name": "Is message?",
"type": "n8n-nodes-base.if",
"position": [
920,
540
],
"parameters": {
"options": {
"looseTypeValidation": true
},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "8a765e57-8e39-4547-a99a-0458df2b75f4",
"operator": {
"type": "object",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.body.entry[0].changes[0].value.messages[0] }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "20939289-3c4f-467a-b0e9-bf7e6d42cc18",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
660,
46
],
"parameters": {
"width": 618,
"height": 272,
"content": "## Verify Webhook\n* Go to your [Meta for Developers App page](https://developers.facebook.com/apps/), navigate to the App settings\n* Add a **production webhook URL** as a new Callback URL\n* *Verify* webhook receives a GET Request and sends back a verification code\n"
},
"typeVersion": 1
},
{
"id": "36ffeb5b-165a-4723-8250-a4feb9123140",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
660,
360
],
"parameters": {
"width": 619,
"height": 343,
"content": "## Main flow\n* *Respond* webhook receives various POST Requests from Meta regarding WhatsApp messages (user messages + status notifications)\n* Check if the incoming JSON contains user message\n* Echo back the text message to the user. This is a custom message, not a WhatsApp Business template message"
},
"typeVersion": 1
},
{
"id": "aa234bca-c8db-43c6-9aeb-02aef6a084e5",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
240,
260
],
"parameters": {
"color": 3,
"width": 405,
"height": 177,
"content": "## Important!\n### Configure the webhook nodes this way:\n* Make sure that both *Verify* and *Respond* have the same URL\n* *Verify* should have GET HTTP Method\n* *Respond* should have POST HTTP Method"
},
"typeVersion": 1
},
{
"id": "2370b81a-0721-42fd-8893-e3ee02e20278",
"name": "Respond",
"type": "n8n-nodes-base.webhook",
"position": [
700,
540
],
"webhookId": "c4cbc1c4-e1f5-4ea5-bd9a-c5f697493985",
"parameters": {
"path": "1fea1f5f-81c0-48ad-ae13-41e0f8e474ed",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 1.1
}
],
"connections": {
"Verify": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Respond": {
"main": [
[
{
"node": "Is message?",
"type": "main",
"index": 0
}
]
]
},
"Is message?": {
"main": [
[
{
"node": "Echo the message back",
"type": "main",
"index": 0
}
]
]
}
}
}Actions
Technical Specs
Compatibility
License
This workflow template follows MIT license, you can freely use, modify and distribute.
Please comply with relevant third-party service terms when using.