Сценарий отправляет клиенту персонализированный шаблон WhatsApp после взаимодействия с сервисом, прося оценить качество полученной услуги. Сообщение включает имя клиента, контекст компании или специалиста и краткий запрос на участие в опросе о качестве. Кнопка со статическим URL открывает форму обратной связи.
Пример шаблона
Здравствуйте, {{1}}! Вас обслужили в {{2}}. {{3}} Пожалуйста, оцените качество нашего обслуживания — это займет около минуты.
Оценить качество обслуживания
{{1}}
имя клиента
{{2}}
название компании или имя специалиста (например, филиал, салон, прикрепленный специалист)
{{3}}
Оцените качество обслуживания от 1 до 5. Это займет 1 минуту
“Оценить качество обслуживания”
кнопка — поправлено в шаблоне Meta
Когда использовать
Сценарий использования: применяйте, когда клиент завершает взаимодействие с сервисом — визит в магазин, встречу, доставку или обработанную заявку — и команде нужен структурированный отзыв о качестве обслуживания через WhatsApp, а не вручную отправленное сообщение или опрос только по электронной почте. Это подходит для розничной торговли и сферы гостеприимства, клиник и сервисных служб, а также для агентств, подключающих триггеры качества из CRM, систем бронирования или пользовательских процессов после взаимодействия.
Более высокая частота откликов на опросы по качеству обслуживания
Опрос о качестве поступает в WhatsApp, включая имя, название компании или контекст специалиста и вопрос в опросе как три переменные в теле. Благодаря этому запрос на отзыв оказывается в канале, который клиент уже использует, а не в виде анкеты по электронной почте, которую он никогда не открывает.
Сообщение, отправленное после взаимодействия, должно быть корректным
Триггер после взаимодействия отправляет утвержденный шаблон, когда случай подходит, поэтому опрос качества доходит до клиента, даже если нет открытого диалога и свободные ответы не разрешены.
Отключены сообщения опроса вручную
Триггер опроса определяет телефон и качество получателя, создает шаблон с тремя переменными в теле и статической кнопкой с URL, чтобы сотрудники не вводили заново контекст провайдера и не забывали отправлять ссылку на опрос.
Предоставьте контекст перед тем, как они оценят
Имя клиента и компания или контекст специалиста появляются в теле сообщения, чтобы клиент знал, какую услугу он оценивает, перед тем как нажать на кнопку «Оценить качество услуги», которая открывает форму обратной связи.
Доставка зарегистрирована для последующего анализа
Результат доставки записывается обратно в CRM или операционную систему, а завершение опроса отслеживается в связанной форме, чтобы информация о качестве обслуживания оставалась привязанной к той же записи взаимодействия.
Как это работает
Триггер
CRM или операционная система запускает триггер опроса качества обслуживания, когда взаимодействие является подходящим.
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_COMPANYORSPECIALISTNAME="___" # {{2}} company or specialist name
TEST_ADDITIONALINFO="___" # {{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_COMPANYORSPECIALISTNAME=$TEST_COMPANYORSPECIALISTNAME" \
"TEST_ADDITIONALINFO=$TEST_ADDITIONALINFO"; 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}} company or specialist name → ${TEST_COMPANYORSPECIALISTNAME}
# {{3}} additional info → ${TEST_ADDITIONALINFO}
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_COMPANYORSPECIALISTNAME}" },
{ "type": "text", "text": "${TEST_ADDITIONALINFO}" }
]
}
]
}
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 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.
Храните это; на этом строятся обратные вызовы доставки и hookInfo
Delivery itself arrives later, as a separate callback. Register a webhook (POST …/webhook) and 1MSG POSTs status updates to your HTTPS endpoint in a top-level hooks[] payload.
200 OKВебхук статуса доставки — данные, которые вы получаете
sent, delivered, read — или статус ошибки, если это применимо
id
Связывает обратный вызов с id возвращаемым значением функции отправки
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 шаблон.