WhatsApp Business API для рассылки персональных рекомендаций товаров
Сценарий отправляет персонализированный шаблон WhatsApp, когда рекомендательный движок подбирает несколько товаров для контакта.
Обзор сценария
Сценарий отправляет персонализированный шаблон WhatsApp для маркетинга, когда рекомендательная система или мерчендайзер подготавливает подборку нескольких товаров для контакта. Сообщение включает имя клиента, контекст просмотра или покупки, на основании которого сделан выбор, и короткую заметку о подборке. Статическая кнопка URL открывает страницу с персональными рекомендациями одним нажатием.
Пример шаблона
Здравствуйте, {{1}}! На основании {{2}}мы подготовили для вас персональную подборку.{{3}} Нажмите кнопку ниже, чтобы открыть ваши рекомендации.
- {{1}}имя клиента
- {{2}}контекст просмотра или покупки, который повлиял на выбор продуктов
- {{3}}примечание к подобранной коллекции (например, количество товаров, тема или изменения мерчандайзера)
- “Просмотреть выбор”кнопка — исправлена в шаблоне Meta

Когда использовать это
Используйте этот сценарий, когда у вас уже есть контакты в WhatsApp с согласием, а система рекомендаций или мерчендайзер может составить короткий список из нескольких товаров для каждого человека — на основе истории просмотров, прошлых заказов или ручного редактирования — без отправки всего каталога или одной общей акции. Он подходит для интернет-магазинов, предлагающих персонализированные подборки, брендов с товарами для пополнения, рекомендующих дополнительные продукты, и агентств, подключающих CRM или рекомендательные триггеры в рассылки WhatsApp для клиентских брендов.
Как это работает
- Действия клиента
Рекомендательная система или CRM отмечает контакт как подходящий для персонализированного подбора товаров.
user action - Отслеживание события
Система определяет номер телефона и поля контекста просмотра или покупки.
phone:"+…" - Собрать и отправить
Шаблон персонализированных рекомендаций создается с тремя переменными в теле и статической кнопкой URL.
POST/sendTemplate - Доставлено
Контакт, давший согласие, получает сообщение в WhatsApp с ссылкой на выбранные материалы.
delivered - Отслеживаемый статус
Результаты доставки записываются для отслеживания эффективности рекомендательной кампании.
status:"read"

Техническая реализация
Предварительные условия
- 1MSG API ключ · Как получить API Key
- Аккаунт WhatsApp Business · Как подключить WABA
- Шаблон WhatsApp · Как одобрить шаблон WABA
- Согласие клиента · Как управлять согласием клиентов
Примеры кода
#!/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_PRODUCTCONTEXT="___" # {{2}} product context
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_PRODUCTCONTEXT=$TEST_PRODUCTCONTEXT" \
"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}} product context → ${TEST_PRODUCTCONTEXT}
# {{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_PRODUCTCONTEXT}" },
{ "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означают, что 1MSG приняла сообщение для отправки — не что оно уже доставлено на телефон клиента. Сохраните idполе (выглядит как wamid.…) для сопоставления уведомлений о доставке.
{
"sent": true,
"id": "wamid.HBgLMzgwNjM5...",
"message": "Message accepted for delivery"
}sentПринято для отправки — еще не на телефоне клиента
idСохраните это: обратные вызовы доставки и
hookInfoпривязаны к этому ключу
Доставка приходит позже, отдельным callback. Зарегистрируйте вебхук (POST …/webhook), и 1MSG отправит обновления статуса на ваш HTTPS endpoint в основных hooks[] данных.
{
"hooks": [
{
"id": "gBGGeSaGViBfAgnlzOSHEwK9O6F",
"type": "message",
"status": "sent",
"timestamp": "1654864094",
"recipient_id": "556123122026"
}
]
}statussent,delivered,read— или статус ошибки, если это возможноidСоотносит колбэк с
id, который возвращает вызов sendtimestampСтрока с Unix-временем в секундах
Если вы предпочитаете не использовать обратные вызовы, вместо этого опрашивайте API. На практике доставка часто завершается за несколько секунд, но 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. |

