Сценарий отправляет клиенту персонализированный шаблон WhatsApp после доставки заказа, предлагая оценить качество доставки. Сообщение включает имя клиента, номер заказа и короткий запрос на участие в опросе. Статическая кнопка URL открывает форму для обратной связи о доставке или страницу опроса.
Пример шаблона
Здравствуйте, {{1}}! Заказ #{{2}} доставлен. {{3}} Пожалуйста, оцените качество доставки — это займет около минуты.
Оценить доставку
{{1}}
имя клиента
{{2}}
номер заказа
{{3}}
Оцените опыт доставки по шкале от 1 до 5. Это займет всего 1 минуту
“Оценить доставку”
кнопка — закреплено в шаблоне Meta
Когда использовать это
Этот сценарий используют, когда заказ помечен как доставленный, и необходимо провести структурированный опрос удовлетворенности доставкой через WhatsApp, а не отправлять ручное сообщение или опрос только по электронной почте. Он подходит для брендов в сфере e-commerce и D2C, собирающих отзывы от 1 до 5 звезд или по шкале NPS после последней мили доставки, для логистических команд, проводящих стандартизированные опросы после доставки, и агентств, подключающих триггеры завершения доставки из OMS, WMS или пользовательских процессов Как это работает e-commerce.
Высокий процент ответов на опросы после доставки
Запрос на опрос поступает в WhatsApp с именем, номером заказа и приглашением к опросу как тремя переменными, так что просьба дать оценку появляется в канале, который клиент уже использует, вместо электронной почты с анкетой, которую они никогда не открывают.
Сообщение доставлено в соответствии с требованиями
Перевозчик или OMS отправляет утвержденный шаблон, когда заказ доставлен, чтобы запрос на участие в опросе дошел до клиента, даже если нет открытого разговора, и ответ свободным текстом не допускается.
Не отправлять опросы о доставке вручную
Триггер завершения доставки заполняет поля с номером телефона получателя и опроса, собирает шаблон с тремя переменными в теле и статической кнопкой URL, чтобы сотрудники не вводили заново информацию о заказе и не забывали отправлять ссылку на опрос.
Уточните контекст заказа до оценки
Имя клиента и номер заказа отображаются в теле сообщения, чтобы клиент знал, какой доставленный заказ он оценивает, прежде чем нажать на кнопку «Оценить доставку», которая открывает форму опроса.
Доставка зарегистрирована для дальнейшего анализа
Результат доставки записывается обратно на платформу электронной коммерции или в CRM, завершение опроса отслеживается в связанной форме, чтобы последующее наблюдение за качеством доставки оставалось привязанным к той же записи заказа.
Как это работает
Триггер
Перевозчик или OMS отправляет событие о завершении доставки, когда заказ достигает клиента.
event · triggered
Отслеживать событие
Система определяет номер телефона получателя и поля анкеты.
phone: "+…"
Сборка и отправка
Персонализированный шаблон сообщения создается с тремя переменными в теле и статической кнопкой URL.
POST/sendTemplate
Доставлено
Клиент получает в WhatsApp запрос опроса о доставке с контекстом заказа.
delivered
Статус отслеживается
Результат доставки записывается в журнал, завершение опроса отслеживается вне WhatsApp.
#!/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_PROCESS="___" # {{2}} process name
TEST_INFO="___" # {{3}} additional info
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_PROCESS=$TEST_PROCESS" \
"TEST_INFO=$TEST_INFO"; 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}} process name → ${TEST_PROCESS}
# {{3}} additional info → ${TEST_INFO}
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_PROCESS}" },
{ "type": "text", "text": "${TEST_INFO}" }
]
}
]
}
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
Соотносит callback с idзначением, возвращенным вызовом send
timestamp
Секунды Unix в виде строки
GET {base}/{channel}/hookInfo?messageId=<id>Если вы предпочитаете не получать обратные вызовы, вместо них используйте polling. На практике доставка часто завершается в течение нескольких секунд, но контракт 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 шаблон.