WhatsApp Business API для запроса отзыва после приобретения
Сценарий отправляет клиенту персонализированный шаблон WhatsApp после покупки, когда нужно оставить отзыв, предлагая оценить товар и поделиться мнением.
Сценарий отправляет клиенту персонализированный шаблон в WhatsApp после покупки, когда необходимо оставить отзыв, с просьбой оценить продукт и поделиться мнением. Сообщение включает имя клиента, номер заказа и название продукта. Статическая кнопка URL открывает форму отзыва или страницу продукта.
Пример шаблона
Здравствуйте, {{1}}! Ваш заказ №{{2}} «{{3}}» выполнен. Пожалуйста, оставьте отзыв — это займет около минуты.
Оставить отзыв
{{1}}
имя клиента
{{2}}
номер заказа
{{3}}
название продукта
“Оставить отзыв”
кнопку исправили в шаблоне Meta
Когда это использовать
Используйте этот сценарий, когда заказ достигает послепродажного этапа, и команде необходимо отправить структурированный запрос на отзыв о продукте в WhatsApp, а не вручную через сообщение агента или только по электронной почте. Это подходит для брендов в сфере электронной коммерции и прямых продаж потребителю, собирающих звездные оценки после доставки, маркетплейсов, которые связывают запросы отзывов с номером заказа и названием продукта, а также агентств, которые подключают триггеры отзывов из процессов в Shopify, WooCommerce или собственных OMS.
Более высокий процент ответов на отзывы
Запрос на отзыв приходит в WhatsApp с именем, номером заказа и названием товара в виде трех переменных в теле, чтобы просьба оценить была в канале, который клиент уже использует, вместо опроса по электронной почте, который они никогда не открывают.
Сообщение после покупки, соответствующее правилам
Платформа электронной коммерции отправляет утвержденный шаблон, когда заказ соответствует условиям, поэтому запрос на отзыв поступает клиенту даже без открытого чата, а ответы в свободной форме не разрешены.
Не отправлять сообщения для повторной проверки вручную
Триггер после покупки заполняет поля с телефоном получателя и заказом, создает шаблон с тремя переменными в теле и статичной кнопкой URL, чтобы агентам не нужно было снова вводить данные заказа или помнить об отправке ссылки на отзыв.
Контекст заказа и продукта перед оценкой
Имя клиента, номер заказа и название продукта отображаются в тексте сообщения, чтобы клиент точно знал, какую покупку он будет оценивать, прежде чем нажать на кнопку «Оставить отзыв», которая открывает форму для отзыва.
Доставка отмечена для дальнейшего анализа
Результат доставки записывается обратно на платформу электронной коммерции или в CRM, а отправка отзыва отслеживается в связанном формуляре, чтобы дальнейшая работа с отзывом оставалась привязанной к тому же заказу.
Как это работает
Собрать и отправить
Платформа электронной коммерции отправляет триггер отзыва после покупки, когда заказ становится подходящим.
POST/sendTemplate
Отслеживать событие
Система определяет номер телефона получателя и поля заказа.
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_PRODUCTNAME="___" # {{3}} product 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_PROCESS=$TEST_PROCESS" \
"TEST_PRODUCTNAME=$TEST_PRODUCTNAME"; 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}} product name → ${TEST_PRODUCTNAME}
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_PRODUCTNAME}" }
]
}
]
}
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
Связывает обратный вызов с idданными, возвращенными вызовом send
timestamp
Cтрока Unix-секунд
If you would rather not receive callbacks, poll GET {base}/{channel}/hookInfo?messageId=<id> instead. In practice delivery often completes within seconds — but the API contract does not guarantee it, so never block a flow waiting on it.
Распространенные ошибки
Статус
Ответ
Причина
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 шаблона.