Сценарий отправляет клиенту персонализированный WhatsApp-шаблон с просьбой подтвердить или отменить запланированное действие. Сообщение включает имя клиента, название действия, дату и время, а также адрес. Кнопки быстрых ответов «Подтвердить» и «Отменить» передают выбор клиента через вебхук на ваш сервер.
Пример шаблона
Здравствуйте, {{1}}! Подтвердите {{2}}. Дата и время: {{3}}. Адрес: {{4}}. Если вам нужна помощь, просто ответьте на это сообщение, и мы вам поможем.
Подтвердить
{{1}}
имя клиента
{{2}}
действие или предмет для подтверждения (например, бронирование консультации, доставка на дом)
{{3}}
дата и время (например, 15 июля, 14:00)
{{4}}
адрес или местоположение (например, адрес или точка самовывоза)
“Подтвердить”
кнопка — исправлено в шаблоне Meta
Когда использовать это
Используйте этот сценарий, когда требуется явное подтверждение клиента для визита, временного окна доставки или другого запланированного действия, прежде чем отправлять или выделять ресурсы. Если у клиента нет открытой переписки в WhatsApp, сначала можно отправить только утверждённый шаблон. Это подходит для специалистов по выездным услугам и команд, занимающихся назначением встреч, которым необходимо зафиксировать дату, время и адрес до выхода автомобиля, для логистических процессов, которым нужно подтвердить слот для доставки или получения, а также для агентств, которые подключают вебхуки CRM или расписания к кнопкам подтверждения и отмены в WhatsApp.
Меньше пропусков и пропущенных интервалов
Четыре переменные в теле содержат имя клиента, действие для подтверждения, дату и время, а также адрес в WhatsApp, чтобы клиент видел все детали перед отправкой или доставкой и мог подтвердить их одним нажатием на быстрый ответ.
Без напоминаний по почте и телефону
Одобренный шаблон отправляется клиенту при отсутствии открытой беседы, поэтому вы запрашиваете подтверждение в WhatsApp вместо ожидания ответа на электронную почту или обратного звонка.
Подтверждение или отмена передаётся в ваш бэкенд
Подтвердить и Отменить — это фиксированные кнопки быстрых ответов в шаблоне Meta; каждое нажатие приходит через вебхук, чтобы CRM или система планирования могли обновить бронирование или процесс без ручного ввода.
Нет необходимости подтверждать вручную
Система планирования, CRM или Workflow отправляет событие запроса подтверждения, и шаблон отправляется с уже заполненными четырьмя полями — никто не перепечатывает данные и не отслеживает ответы вручную.
Как это работает
Триггер
Система планирования, CRM или Как это работает отправляют событие-запрос подтверждения.
event · triggered
Действия клиента
Система сопоставляет номер телефона получателя с полями подтверждения.
user action
Создать и отправить
Персонализированное сообщение по шаблону составляется из четырёх переменных в теле и двух кнопок быстрых ответов.
POST/sendTemplate
Доставлено
Клиент получает запрос на подтверждение WhatsApp.
delivered
Статус отслежен
Когда клиент нажимает «Подтвердить» или «Отменить», вебхук отправляет событие для обработки на сервер.
#!/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_ACTION="___" # {{2}} action name
TEST_DATE="___" # {{3}} date or time
TEST_ADDRESS="___" # {{4}} address or location
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_ACTION=$TEST_ACTION" \
"TEST_DATE=$TEST_DATE" \
"TEST_ADDRESS=$TEST_ADDRESS"; 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}} action name → ${TEST_ACTION}
# {{3}} date or time → ${TEST_DATE}
# {{4}} address or location → ${TEST_ADDRESS}
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_ACTION}" },
{ "type": "text", "text": "${TEST_DATE}" },
{ "type": "text", "text": "${TEST_ADDRESS}" }
]
}
]
}
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.…), чтобы сопоставить обратные вызовы доставки.
Сохраните это; обратные вызовы доставки и 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 шаблон.