Сценарий отправляет клиенту персонализированный шаблон сообщения в WhatsApp с приглашением на консультацию перед покупкой. Текст включает имя клиента, продукт или услугу, которые его заинтересовали, и компанию или специалиста, готового ответить на вопросы. Кнопка со ссылкой ведёт на страницу для бронирования или оформления запроса на консультацию.
Пример шаблона
Здравствуйте, {{1}}!
Вы интересовались {{2}}. Специалист {{3}} готов провести бесплатную консультацию перед покупкой и ответить на ваши вопросы.
Записаться на консультацию
{{1}}
имя клиента
{{2}}
название продукта или услуги, которыми интересовался клиент
{{3}}
название компании или имя специалиста, проводящего консультацию
“Записаться на консультацию”
кнопка — исправлена в шаблоне Meta
Когда использовать это
Используйте этот сценарий, когда кто-то явно проявил интерес к покупке — добавил товар в корзину, запросил предложение или оставил контактные данные — но ещё не купил, и нет открытого диалога в WhatsApp для ответа в свободной форме. Он подходит для электронной коммерции и маркетплейсов с брошенными корзинами, команд B2B, предлагающих коммерческие предложения или демонстрации продукта, а также для агентств, подключающих CRM или платформы для заказов для нескольких клиентов.
Привлекайте тёплые лиды без холодных звонков
Нет открытого разговора, поэтому сначала можно отправить только утверждённый шаблон — приглашение поступит в WhatsApp за пределами 24-часового окна, вместо того чтобы представитель звонил или писал в пустоту.
Консультация, связанная с тем, что они просматривали
Три переменные в теле содержат имя клиента, продукт или услугу, к которым он проявил интерес, а также компанию или специалиста, готового помочь, так что сообщение выглядит как прямой ответ на его действие.
Одно нажатие, чтобы забронировать звонок
Статическая кнопка URL в шаблоне Meta открывает страницу бронирования или форму запроса на консультацию — только переменные в теле отправляются через API.
Меньше ручной работы с конвейером
CRM, e-commerce или форма для лидов отправляют сообщение при обнаружении намерения совершить покупку, чтобы никому не приходилось перестраивать список или заново перепечатывать предложение для каждого контакта.
Фоллоуап остаётся в CRM
Результат доставки фиксируется для воронки продаж, поэтому та же запись, которая запустила приглашение, отслеживает, что произошло дальше.
Как это работает
Триггер
Система обнаруживает намерение совершить покупку или событие, подходящее для предложения консультации (корзина, запрос цены, форма заявки).
event · triggered
Обработка события
Телефон клиента, контекст продукта или услуги, а также данные компании или специалиста берутся из CRM, e-commerce или формы лида.
phone: "+…"
Сборка и отправка
Персонализированный шаблон сообщения создаётся с тремя переменными в теле и статической кнопкой URL для бронирования консультации.
POST/sendTemplate
Доставлено
Клиент получает сообщение в WhatsApp и может перейти по ссылке, чтобы записаться или запросить консультацию.
delivered
Статус отслеживается
Результат доставки фиксируется в 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_CUSTOMERNAME="___" # {{1}} customer name
TEST_PRODUCTORSERVICENAME="___" # {{2}} product or service name
TEST_COMPANYORSPECIALISTNAME="___" # {{3}} company or specialist name
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_CUSTOMERNAME=$TEST_CUSTOMERNAME" \
"TEST_PRODUCTORSERVICENAME=$TEST_PRODUCTORSERVICENAME" \
"TEST_COMPANYORSPECIALISTNAME=$TEST_COMPANYORSPECIALISTNAME"; 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}} customer name → ${TEST_CUSTOMERNAME}
# {{2}} product or service name → ${TEST_PRODUCTORSERVICENAME}
# {{3}} company or specialist name → ${TEST_COMPANYORSPECIALISTNAME}
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_CUSTOMERNAME}" },
{ "type": "text", "text": "${TEST_PRODUCTORSERVICENAME}" },
{ "type": "text", "text": "${TEST_COMPANYORSPECIALISTNAME}" }
]
}
]
}
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[]верхнем уровне payload
200 OKВебхук статуса доставки — получаемая вами полезная нагрузка
sent, delivered, read — или статус ошибки, если это возможно
id
Соотносит callback с 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 шаблон.