Сценарий отправляет лиду персонализированный шаблон WhatsApp, если тот не ответил на предыдущее сообщение о продажах в ожидаемое время. Сообщение включает имя лида, продукт или обсуждаемую тему и короткий намёк на повторное вовлечение. Кнопка со статическим URL открывает страницу с предложением или бронированием.
Пример шаблона
Здравствуйте, {{1}}! Мы связались по поводу «{{2}}», но ещё не получили ответа. {{3}}Если предложение всё ещё актуально, откройте ссылку или ответьте на это сообщение.
Открыть предложение
{{1}}
лид или имя клиента
{{2}}
продукт, услуга или тема из предыдущего контакта с отделом продаж
{{3}}
подсказка для повторного вовлечения (предложение всё ещё действительно, забронируйте 15-минутный звонок)
“Открыть предложение”
кнопка — исправлено в шаблоне Meta
Когда использовать
Используйте этот сценарий, когда отдел продаж уже отправил сообщение в WhatsApp — первый контакт, приглашение на консультацию или краткое изложение предложения — и лид остался без ответа, а сделка ещё может быть актуальной. Это подходит для команд продаж, которые проводят второй этап общения, для B2B воронок, ожидающих ответа на предложения о демонстрации или консультации, и для агентств, которые переносят правила CRM на исходящие сообщения в WhatsApp.
Сделки не замирают в тишине
CRM или воронка продаж срабатывают, когда истекает тайм-аут на отсутствие ответа после касания, чтобы последующее действие отправилось, пока интерес ещё сохраняется, вместо ожидания, пока представитель заметит паузу.
Второе касание без свободного текста в соответствии с правилами
Если беседа не открыта, только утверждённый шаблон может первым дойти до лида; три переменные в теле содержат персонализированный текст, который API разрешено отправлять за пределами 24-часового окна.
Подсказка, привязанная к последнему разговору
Имя лида, продукт или тема из предыдущего контакта с продажами и намёк на повторное взаимодействие заполняют три переменные в теле, поэтому в сообщении упоминается то, что уже обсуждалось, вместо общего запроса на проверку.
Вернуться к предложению
Кнопка с фиксированным статическим URL в шаблоне Meta открывает страницу предложения или бронирования, а в теле сообщения предлагается ответить в том же треде, если предложение всё ещё актуально.
Следующий шаг готов для CRM
Результат доставки сохраняется в CRM после отправки, чтобы представитель видел, было ли сообщение доставлено, прежде чем выбрать следующий шаг продажи.
Как это работает
Триггер
CRM или процесс продаж определяет, что время ожидания ответа истёкло после взаимодействия с клиентом.
event · triggered
Захватить событие
Система определяет поля основного номера телефона и точки контакта лида.
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_NEXTSTEP="___" # {{3}} next step
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_NEXTSTEP=$TEST_NEXTSTEP"; 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}} next step → ${TEST_NEXTSTEP}
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_NEXTSTEP}" }
]
}
]
}
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 and JSON "sent": true mean 1MSG accepted the message for sending — not that it already reached the customer's phone. Save the id field (looks like wamid.…) to correlate delivery callbacks.
Принято для отправки — ещё не доставлено на телефон клиента
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 шаблон.