WhatsApp Business API для квалификации лидов с ключевыми вопросами
Этот кейс отправляет новому лиду одобренный шаблон WhatsApp с персонализированным приветствием: подставляются имя лида и продукт, а также быстрый ответ «Начать»
В этом сценарии новому лиду отправляется одобренный WhatsApp шаблон с персонализированным приветствием: в сообщение подставляется имя лида и контекст продукта или источника, а кнопка быстрого ответа «Начать» открывает короткий квалификационный сценарий. После нажатия этой кнопки в течение 24-часового окна сессии система задаёт последующие вопросы по одному и записывает каждый ответ через вебхук.
Пример шаблона
Здравствуйте, {{1}}! Чтобы быстрее найти подходящее решение для {{2}}, ответьте на несколько коротких вопросов. Нажмите «Начать» — это займёт пару минут.
Начать
{{1}}
лид или имя получателя
{{2}}
контекст интереса к продукту или источника лида (откуда пришёл запрос, какая область интересует)
“Начать”
кнопка — исправлено в шаблоне Meta
Когда использовать это
Этот сценарий используйте, когда появляется новый лид из формы, рекламы или CRM только с базовыми контактными данными. Отделу продаж нужен структурированный профиль — бюджет, сроки, размер компании, сфера применения — до первого звонка, но сеанс WhatsApp ещё не открыт. Это подходит для команд разработчиков, небольших продуктовых групп и агентств, интегрирующих WhatsApp в воронку квалификации, где один вопрос по шаблону не может охватить весь профиль.
Поддерживается первый контакт без открытого чата
Утверждённый шаблон с двумя переменными в теле — имя и продукт или источник контекста — и кнопка быстрого ответа «Start» используется для начала разговора, если 24-часовая сессия ещё не началась.
Полный профиль квалификации в одном чате
После того как лид нажмёт «Start», последующие вопросы отправляются по одному в окне сессии, и каждый ответ поступает через вебхук, чтобы бюджет, сроки, размер компании и вариант использования оказались в одном структурированном профиле, а не в одном поле шаблона.
Уменьшение отказов от формы
Лид отвечает на короткие вопросы в WhatsApp после персонализированного приветствия, вместо того чтобы заполнять длинную веб-форму, которую могут так и не завершить.
Быстрая передача в отдел продаж или в CRM
После сохранения всех ключевых полей в квалификационном профиле интегратор передаёт готовую запись в CRM или отдел продаж для маршрутизации — торговый представитель не вводит вручную ответы из разных каналов.
Остаётся в окне сеанса
Последующие вопросы отправляются сразу после каждого ответа вебхука, пока 24-часовое окно остаётся открытым после нажатия «Начать», поэтому для них не требуется другой одобренный шаблон.
Как это работает
Собрать и отправить
Когда появляется новый лид, система отправляет персонализированный шаблон приветствия и приглашение пройти короткую квалификацию.
POST/sendTemplate
Статус отслеживается
Лид нажимает «Начать» — событие приходит через вебхук, и сессия открывается в 24-часовом окне WhatsApp.
status: "read"
В рамках сессии
В ходе сессии интегратор задаёт уточняющие вопросы один за другим (бюджет, сроки, размер компании, вариант использования).
POST/sendTemplate
Каждый ответ фиксируется
Каждый ответ фиксируется вебхуком и сохраняется в профиле квалификации.
status: "read"
Доставлено
После сбора всех ключевых полей профиль передаётся в CRM или отдел продаж для дальнейшей работы.
#!/usr/bin/env bash
set -euo pipefail
# === Configuration (replace "___" placeholders) ===
API_BASE_URL="https://api.1msg.io" # production 1MSG API base URL
CHANNEL_ID="___" # channel ID from 1MSG dashboard
API_TOKEN="___" # channel JWT token (Bearer)
TEMPLATE_NAME="___" # approved template name
TEMPLATE_NAMESPACE="___" # template namespace (required — send fails without it)
TEMPLATE_LANGUAGE="___" # template language code, e.g. "en"
# === Test data ===
TEST_PHONE="___" # client phone in international format
TEST_LEADNAME="___" # {{1}} lead name
TEST_PRODUCTCONTEXT="___" # {{2}} product context
PHONE_NORM="$(printf '%s' "$TEST_PHONE" | tr -cd '0-9')"
for pair in "CHANNEL_ID=$CHANNEL_ID" "API_TOKEN=$API_TOKEN" \
"TEMPLATE_NAME=$TEMPLATE_NAME" "TEMPLATE_NAMESPACE=$TEMPLATE_NAMESPACE" \
"TEMPLATE_LANGUAGE=$TEMPLATE_LANGUAGE" "TEST_PHONE=$TEST_PHONE" \
"TEST_LEADNAME=$TEST_LEADNAME" \
"TEST_PRODUCTCONTEXT=$TEST_PRODUCTCONTEXT"; do
val="${pair#*=}"
if [ -z "$val" ] || [ "$val" = "___" ]; then
echo "Missing configuration value: ${pair%%=*}" >&2
exit 1
fi
done
if [ -z "$PHONE_NORM" ]; then
echo "Error: phone number has no digits after normalization" >&2
exit 1
fi
URL="${API_BASE_URL%/}/${CHANNEL_ID}/sendTemplate"
# params carries body ONLY. Button text is fixed in the Meta template — no button param.
# {{1}} lead name → ${TEST_LEADNAME}
# {{2}} product context → ${TEST_PRODUCTCONTEXT}
read -r -d '' PAYLOAD <<JSON || true
{
"phone": "${PHONE_NORM}",
"template": "${TEMPLATE_NAME}",
"namespace": "${TEMPLATE_NAMESPACE}",
"language": { "policy": "deterministic", "code": "${TEMPLATE_LANGUAGE}" },
"params": [
{
"type": "body",
"parameters": [
{ "type": "text", "text": "${TEST_LEADNAME}" },
{ "type": "text", "text": "${TEST_PRODUCTCONTEXT}" }
]
}
]
}
JSON
RESPONSE="$(curl -s -w '\n%{http_code}' -X POST "$URL" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${API_TOKEN}" \
-d "$PAYLOAD")"
HTTP_CODE="$(printf '%s' "$RESPONSE" | tail -n1)"
BODY="$(printf '%s' "$RESPONSE" | sed '$d')"
case "$BODY" in
*'"sent":true'*) ok=1 ;;
*) ok=0 ;;
esac
if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ] && [ "$ok" -eq 1 ]; then
echo "Message sent to client."
echo "API response: $BODY"
else
echo "Send failed. HTTP status: $HTTP_CODE" >&2
echo "$BODY" >&2
exit 1
fi
Статус ответа и доставки
HTTP 2xx и JSON "sent": true означают, что 1MSG приняла сообщение для отправки — это не значит, что оно уже достигло телефона клиента. Сохраните поле id (выглядит как wamid.…), чтобы сопоставить уведомления о доставке.
Принято для отправки — ещё не попало на телефон клиента
id
Сохраните это; обратные вызовы доставки и hookInfo привязаны к этому
Доставка приходит позже, отдельным обратным вызовом. Зарегистрируйте вебхук (POST …/webhook), и 1MSG отправит обновление статуса на ваш HTTPS-эндпоинт в hooks[] полезной нагрузке верхнего уровня.
200 OKВебхук статуса доставки — данные, которые вы получаете
sent, delivered, read — или статус «Ошибка», если применимо
id
Соотносит обратный вызов с id, возвращённым вызовом send
timestamp
Unix-время в виде строки
Если вы предпочитаете не получать обратные вызовы, используйте опрос GET {base}/{channel}/hookInfo?messageId=<id> вместо этого. На практике доставка часто завершается в течение нескольких секунд, но контракт API этого не гарантирует, поэтому никогда не блокируйте процесс в ожидании этого.
Распространённые ошибки
Статус
Ответ
Причина
200
Message was not sent: template is not defined
namespace, template or language missing from the request body.
200
template name (…) does not exist in <language>
The template is approved in a different language than the one requested.
200
Message was not sent: provide chatId, phone, bsuid, or username
No recipient the channel could resolve.
403
access denied
The token is wrong, or belongs to a different channel than the URL.
429
too many requests. please try later
The channel is over its send rate.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Да, для холодных сообщений WhatsApp требуется одобренный Meta шаблон.