Chatbot Builder

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
WhatsApp Visual Chatbot Flow Diagram
Agent Handoff

Seamless Bot-to-Human Agent Handoff

01

1. Bot Resolution Try

The chatbot addresses FAQs, collects primary details, and processes queries using visual logic rules.

02

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.

03

3. Direct Takeover

The agent sees the whole conversation, contact tags and fields in the shared team inbox, and replies from there.

Automation Comparison

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

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
FAQs

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.

WhatsApp API

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.