Table of Contents

Build a WhatsApp Bot - Best Practices for Developers

Pau Sanchez Updated by Pau Sanchez

This article offers a guide for developers that need a "quick" introduction to the most important concepts during the planning, developing and testing of a Whatsapp bot with Landbot for developers.

Other resources:
Build a WhatsApp Bot - Best Practices and User guide
For general best practices check this article
The Ultimate WhatsApp Guide
For information about Facebook Business Verification process and number request, check this article
Whatsapp & Landbot
Video course with exercises from Landbot Academy link

Testing Troubleshooting bots

Chat section - Variables

One of the best ways to know what is going on is from the Chat section, while you are testing the bots, you can check that conversation and specially the variables that are being set and with which value. Bear in mind that variables are not "reset" so it can be tricky with some conditions that might not behave as expected due to early tests

You can modify in that section the value of the variable and even delete them. That is very handy while testing

Resources:Variables - Chat section

Chat section - Close Chat

Sometimes while testing, we might need to restart from the beginning, a good way to do it, is by pressing "CLOSE", it will force the bot to start from the beginning in the next user input.

Resources:Close or Pause chat

Chat section - Delete Number

Also, while testing a bot, we might want to start from scratch with any variable set. By deleting the Chat, all the data for that number will be erased and and once you start again, it will generate a new customer id with no variables set. Be careful to don't use that system for users that have already opt-in, as that opt-in won't be possible to use, as it is generating a new user.

Resources:Additional Actions

Building Whatsapp bots - Special WA blocks

Formatting content text

WhatsApp doesn't allow HTML, but you can use the following formats to display formatted text:




In case you want to set up line breaks, you can do it using either with <br> tag or when pressing intro in the editor:


Other approach, in case you have a list separated by commas, from an external source (like an API), then using Formulas with Replace()

Resources:Text formatting

User inputs & variables

When working with User inputs, bear in mind that the logic is a bit different between this channel and web. That means that the input stored in the user input will be text used by the user, not the text displayed in the bot.

In the example below we can see that if we want to set a value, that we can later use, instead of numbers, we will need to use a Set Variable block after to set the desired value correctly

If you are using the buttons block, and the input from the user, is none of the possible options, it will go through the default exit. We do recommend to use the Keyword Options, that can use validation of the user input


Resources:Set Variable

Default Output Explained

First Input / Welcome

A simple way to get the first user input, will be by deleting the Welcome Message block, and using a set variable block to set such value.

If you use ${body} will capture text

If you use ${url} will capture where the media file (picture, attachment or audio) is hosted

We highly recommend to use this method, as it will allow to set up after conditional blocks/logics even before the user encounters any user input

Resources:How to capture and use the first user's interaction (input)


The Webhook block will be a really handy way to work with external APIs or Serverless functions.

Note that:

Does not accept SOAP (XML)

Does not accept HTTP (only HTTPS)

Has a 40 seconds timeout

In case of troubleshooting Webhook requests you can check them in the Webhook Logs (Integrations section)


Webhook Dashboard (Logs)

Dynamic Data (index)

If you are working with Arrays, Dynamic Data is very handy, however, like the buttons, the input stored is the one from the user. In case you want to extract the information please check this article: Get Index Array selection Whatsapp

Resources:Dynamic Data


Code block (and Javascript) cannot be used in Whatsapp bots, the best alternative is to use the Formula block

Resources:Get started with the Formulas block

Close Chat

For better control of user flow, and design, use the Close Chat. After going through CLOSE block, next input from the user will restart bot

Resources:Close Chat


Whatsapp offers text input all the time and at the same time offers little options to let the user select, so natural language has to be under control. The best way to do that would be with a NLP Tool, that is why we recommend to use Dialogflow

Resources:Dialogflow Block

Opt-in process

What is the opt-in

The opt-in process is the way we validate a number is a valid Whatsapp account, and at the same time in Landbot a user is generated. This is required if you want in the future to communicate using HSM Templates

Resources:What is the Opt-in process?


The widget is the way we create set up the end-point that later you can use to request the opt-ins.

It can be also used to directly embed such widget in a site.

Once a widget is create do not delete it, otherwise will lose all the opt-ins generated

Resources:What is a Snippet

URL endpoint

Once the widget is create with the specific settings (bot and message) the url will be displayed in the key "url"

phone=XXXX ie.164 format

othervalue=XXXX (variables)

Bear in mind that when you make a request, the response of the opt-in status will be always false. It takes few minutes to be validated

Resources:How to write the correct URL

Check user opt-in

To check the list of numbers that have done correctly the opt-in, you can check the side panel in your channel:

Resources:Channel's Opt-ins list

HSM Templates

What is an HSM Template

HSM Templates are messages, previously requested and approved by Whatsapp, that can be sent to opt-in users to contact them after 24 hours from last user interaction


HSM Templates for Whatsapp ๐Ÿ’ฌ

How to request a template

Send HSM Template - Campaigns

If you are interested to send a big amount of HSM Templates at once, using a GUI, the best method is using the Campaigns section.

There is no bulk method to send HSM Templates via API

Resources:WhatsApp Campaigns

Send HSM Template - Chat

An alternative way to send 1 to 1, is using the Chat section. Bear in mind that this method will force the assignation of such conversation to the agent who sent the Template.

Resources:Send Templates (for Whatsapp)

Send HSM Template - API (& assign)

The most common method used by developers to send Templates is via API. Please check this article

Channel vs Bot

In Landbot we distinguish between Bots and Channels, for a simple definition, Channel is the Whatsapp phone number, and bot is the flow that is linked to the Channel. More than one bot can be interacted by a customer in the same channel.

The Bot that is linked to the channel, will be the Source bot, and will be where you find all the metrics and analytics, and where it will restart the user, once it reaches the end of a flow or the conversation has been closed


Resources:Parent Bot/Linked Bot (WhatsApp)

Landbot API

In case you already have a Whatsapp Business API key, and want to use Landbot only to build the logic, please check our APIChat bot channel: APIChatbot

The initial state as Hybrid bots (cannot work with API until linked from the channel section)

Platform API Docs

Resources:Landbot API Docs


When working with the API Platform, you might need to use some ids for specific methods, here is a list of them and how to find them in Landbot:

customer_id : Customer id is the unique identifier that creates Landbot with the first user interaction (or opt-in). You can find it in the variable @id It cannot be created or modified externally.

bot_id: Is the identifier of the bot, it can be found in the url of the builder (as in the image above)

channel_id: Similar to the bot_id, it can be found in the url but of the channel (where you have all the setting of the Whatsapp number)

Node block: The node block is a unique and random identifier for each block in the builder, it can be copied by doing right click in the block & copying

Agent API Token: It can be found in the user account section. Bear in mind that the methods you can use depend on the permissions you have.


Handy to extract the users that had a chat with your bot. Bear in mind that there is a limit of 100 records. So in case you want to extract more information you must use pagination

curl --location --request GET '' \
--header 'Content-Type: application/json' \
--header 'Authorization: Token <YOUR TOKEN>'

Resources:List Customers

Filter by

Best method to filter listing


Example filtering by channel_id and opt_in true

curl --location --request GET '' \
--header 'Content-Type: application/json' \
--header 'Authorization: Token <YOUR TOKEN>'

Example filtering by phone

curl --location --request GETย 
'' \
--header 'Content-Type: application/json' \
--header 'Authorization: Token <YOUR TOKEN>'

Resources:List Customers


Information of a specific customer

Example to get data from a specific customer_id (in the example 87647367)

curl --location --request GET '' \
--header 'Content-Type: application/json' \
--header 'Authorization: Token <YOUR TOKEN>'

Resources:Get data

Assign bot (launch)

For redirecting user to step in bot (if less than 24 hours can launch:true)

curl --location --request PUT '' \
--header 'Content-Type: application/json' \
--header 'Authorization: Token <YOUR TOKEN>' \
--data-raw '{
"launch": false,
"node": "Nkky3ra7k"

Resources:Assign bot

Close Chat

Great method (in combination with CRON) to ensure user starts from the beginning

curl ex:

curl --location --request PUT '' \
--header 'Content-Type: application/json' \
--header 'Authorization: Token <YOUR TOKEN>'


Variables / Custom Fields

For adding information to customerย 

Can also add โ€œobjectโ€ type and get values with Formula

curl --location --request PUT '' \
--header 'Content-Type: application/json' \
--header 'Authorization: Token <YOUR TOKEN>' \
--data-raw '{
ย ย ย "type": "string",
ย ย ย "value": "no"




If you want to have deeper control over the users and bot behaviour, using MessageHooks will allow you to "subscribe" to events and messages in real time


MessageHooks - Landbot Webhooks

API Docs MessageHooks

How did we do?