Сценарий отправляет персонализированный шаблон WhatsApp для маркетинга, когда рекомендательная система или мерчендайзер подготавливает подборку нескольких товаров для контакта. Сообщение включает имя клиента, контекст просмотра или покупки, на основании которого сделан выбор, и короткую заметку о подборке. Статическая кнопка URL открывает страницу с персональными рекомендациями одним нажатием.
Пример шаблона
Здравствуйте, {{1}}! На основании {{2}}мы подготовили для вас персональную подборку.{{3}} Нажмите кнопку ниже, чтобы открыть ваши рекомендации.
Просмотреть выбор
{{1}}
имя клиента
{{2}}
контекст просмотра или покупки, который повлиял на выбор продуктов
{{3}}
примечание к подобранной коллекции (например, количество товаров, тема или изменения мерчандайзера)
“Просмотреть выбор”
кнопка — исправлена в шаблоне Meta
Когда использовать это
Используйте этот сценарий, когда у вас уже есть контакты в WhatsApp с согласием, а система рекомендаций или мерчендайзер может составить короткий список из нескольких товаров для каждого человека — на основе истории просмотров, прошлых заказов или ручного редактирования — без отправки всего каталога или одной общей акции. Он подходит для интернет-магазинов, предлагающих персонализированные подборки, брендов с товарами для пополнения, рекомендующих дополнительные продукты, и агентств, подключающих CRM или рекомендательные триггеры в рассылки WhatsApp для клиентских брендов.
Рекомендации вместо перегруженного каталога
Сообщение открывает страницу с персональной подборкой, где для этого контакта выбраны несколько товаров, чтобы он увидел подходящий краткий список вместо полного ассортимента или случайного товара.
Рекомендации на основе реальных поведенческих сигналов
Три переменные в теле содержат имя клиента, контекст просмотра или покупки, а также заметку о выборе, поэтому рассылка воспринимается как персонализированная мерчендайзинг, а не массовая рассылка.
Отправка сообщений за пределами 24-часового окна в рамках правил
Утвержденный шаблон для MARKETING отправляет ссылку для выбора в WhatsApp, даже если беседа еще не открыта, поэтому рекомендации доходят до контактов, которые дали согласие, без необходимости ждать их первого сообщения.
Меньше ручной работы на контакт
Рекомендательная система или CRM заполняет контекстные поля, и шаблон отправляется по этому триггеру — ни один сотрудник не перестраивает списки и не вводит вручную заметки для каждого клиента.
Отслеживание доставки кампаний для сегментов аудитории
Результаты доставки фиксируются для аналитики рекомендательной кампании, чтобы маркетинг мог измерить охват до отслеживания кликов и конверсий на странице персонального подбора.
Как это работает
Действия клиента
Рекомендательная система или CRM отмечает контакт как подходящий для персонализированного подбора товаров.
user action
Отслеживание события
Система определяет номер телефона и поля контекста просмотра или покупки.
phone: "+…"
Собрать и отправить
Шаблон персонализированных рекомендаций создается с тремя переменными в теле и статической кнопкой URL.
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_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.…) для сопоставления уведомлений о доставке.
Сохраните это: обратные вызовы доставки и hookInfo привязаны к этому ключу
Доставка приходит позже, отдельным callback. Зарегистрируйте вебхук (POST …/webhook), и 1MSG отправит обновления статуса на ваш HTTPS endpoint в основных hooks[] данных.
200 OKВебхук статуса доставки — данные, которые вы получаете
sent, delivered, read — или статус ошибки, если это возможно
id
Соотносит колбэк с id, который возвращает вызов send
timestamp
Строка с 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.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Да, для отправки холодных сообщений в WhatsApp нужен одобренный Meta шаблон.