Build WhatsApp Chatbots Without Code
Design conversation flows visually with drag-and-drop. Handle support, sales, bookings, and FAQs 24/7. Seamless handoff to human agents when needed. Chatbot flows are on the Business plan and the 14-day free trial.
✦ 14-day free trial · Your own WhatsApp Business number · Meta bills messages directly
Visual Drag-and-Drop Flow Builder
No coding required. Start a flow on a customer's first message, on any inbound message, on a keyword, or manually. Then chain steps: send a message or template, wait for a reply or a delay, branch on button or list replies and conditions, set fields, add or remove tags, change the pipeline stage, assign an agent, and end. Begin from one of 4 industry starter flows.
- Visual drag-and-drop interface
- Conditional logic & branching
- Agent handoff with full context
Seamless Bot-to-Human Agent Handoff
1. Bot Resolution Try
The chatbot addresses FAQs, collects primary details, and processes queries using visual logic rules.
2. Transfer Request
When a customer taps 'Speak to an agent' (a button or list branch), an 'assign agent' step hands the chat to your team.
3. Direct Takeover
The agent sees the whole conversation, contact tags and fields in the shared team inbox, and replies from there.
Chatbot Automation vs. Interactive Menu vs. Live Support
Understand the response efficiency, setup complexity, and cost differences.
| Capability | Automated Chatbot | Interactive Button Menu | Pure Live Support |
|---|---|---|---|
| Response Latency | Seconds (automatic) | Seconds (fixed options) | Minutes to hours (Queue dependent) |
| Complexity Level | Medium (branches, conditions, fields) | Low (Fixed static routes) | High (Human capacity dependent) |
| Operating Hours | 24/7/365 (Unattended) | 24/7/365 (Unattended) | Business hours only |
| Operational Costs | Low (no agent time per chat) | Low (no agent time per chat) | Highest (agent time on every chat) |
Receive customer replies as signed webhooks
{
"id": "evt_01JC9W2K7Q",
"type": "message.received",
"createdAt": "2026-10-07T10:42:00.000Z",
"workspaceId": "ws_9f2c",
"data": {
"message": {
"id": "msg_7d1e",
"conversationId": "conv_3a90",
"contactId": "ct_88b1",
"from": "+919812345678",
"type": "interactive",
"text": "Track my order",
"reply": {
"kind": "button",
"id": "track_order",
"title": "Track my order"
},
"context": {
"messageId": "msg_6c02",
"clientReference": "order-1042"
},
"form": null,
"referral": null,
"timestamp": "2026-10-07T10:41:58.000Z"
},
"contact": {
"id": "ct_88b1",
"phone": "+919812345678",
"name": "Asha"
}
}
} import express from 'express';
import { createHmac, timingSafeEqual } from 'node:crypto';
const app = express();
const SECRET = process.env.SM_WEBHOOK_SECRET; // the whole whsec_… string
function verify(rawBody, headers) {
const ts = headers['x-sm-timestamp'];
const sigs = headers['x-sm-signature'];
if (!/^\d+$/.test(ts ?? '') || typeof sigs !== 'string') return false;
if (Math.abs(Date.now() / 1000 - Number(ts)) > 300) return false;
const expected = createHmac('sha256', SECRET).update(`${ts}.`).update(rawBody).digest();
return sigs.split(',').some((part) => {
const m = /^v1=([0-9a-f]{64})$/.exec(part.trim());
return m !== null && timingSafeEqual(Buffer.from(m[1], 'hex'), expected);
});
}
app.post('/webhooks/startmessaging', express.raw({ type: 'application/json' }), (req, res) => {
if (!verify(req.body, req.headers)) return res.sendStatus(401);
res.sendStatus(200); // answer within 5 seconds, then do the work
const event = JSON.parse(req.body);
if (event.type === 'message.received' && event.data.message.reply?.id === 'track_order') {
// look up the order and reply via POST /api/v1/messages
}
}); import hmac, hashlib, json, os, time
from flask import Flask, request
app = Flask(__name__)
SECRET = os.environ['SM_WEBHOOK_SECRET'].encode() # the whole whsec_… string
def verify(raw_body, ts, sigs):
if not ts or not ts.isdigit() or not sigs:
return False
if abs(time.time() - int(ts)) > 300:
return False
expected = hmac.new(SECRET, f'{ts}.'.encode() + raw_body, hashlib.sha256).hexdigest()
return any(
hmac.compare_digest(part.strip()[3:], expected)
for part in sigs.split(',') if part.strip().startswith('v1=')
)
@app.post('/webhooks/startmessaging')
def startmessaging_webhook():
raw = request.get_data()
if not verify(raw, request.headers.get('X-SM-Timestamp'), request.headers.get('X-SM-Signature')):
return '', 401
event = json.loads(raw)
if event['type'] == 'message.received':
reply = event['data']['message'].get('reply') or {}
print('Customer tapped:', reply.get('id'))
return '', 200 Chatbot — FAQ
Can the chatbot hand off to a human agent?
Yes. Add an 'assign agent' step wherever a person should take over — for example after a 'Speak to an agent' button. The chat moves to your team in the shared inbox with the full conversation, contact tags and fields, so the agent can help without asking the customer to repeat anything.
Do I need coding skills to build a WhatsApp chatbot?
No. The visual flow builder is fully no-code — drag steps onto the canvas, connect them, and configure messages and conditions. For custom logic, every inbound message is also sent to your system as a signed webhook, and you can reply through the REST API.
What types of messages can the chatbot handle automatically?
The chatbot can send text, media and approved templates, reply buttons (up to 3) and list messages (up to 10 rows). It can branch on the customer's choice or on conditions, and wait for a free-text reply before moving on.
Can I connect the chatbot to my CRM or external database?
Flows update StartMessaging's built-in CRM directly — set contact fields, add or remove tags, and move contacts between pipeline stages. To sync with an external CRM or database, use webhooks (new messages, contact changes) and the REST API, or connect Zapier, Make or Pabbly.
How do I test the chatbot before going live?
Add your own phone number as a contact and give the flow a keyword trigger only your team knows (for example 'testbot'). Message that keyword to your WhatsApp Business number to walk through the flow, then switch to the real trigger when you're happy.
Which plan includes chatbot flows?
The Business plan, and the 14-day free trial. Building, saving and turning on flows needs Business. On any plan you can still open, pause or delete flows made earlier, for example during the trial, and they run again when the workspace is on Business. Keyword auto-replies, which answer a keyword with text or a template without a flow, are on Team and Business.
Build Your First WhatsApp Chatbot
Chatbot flows are on the Business plan and the 14-day free trial. Keyword auto-replies are on Team and Business.