Сценарий отправляет персонализированный шаблон WhatsApp, когда в каталоге появляются новые товары или коллекция. В сообщении указываются имя контакта, тема новинок или название коллекции и краткое описание поступления. Кнопка со статичной ссылкой открывает страницу с новинками.
Пример шаблона
Здравствуйте, {{1}}! Поступили новинки: {{2}}. {{3}} Нажмите кнопку ниже, чтобы посмотреть новые поступления.
Просмотреть новинки
{{1}}
имя клиента или контакта
{{2}}
название темы или подборки новых поступлений
{{3}}
Краткий обзор новинок и причин заглянуть прямо сейчас
“Просмотреть новинки”
кнопка — исправлена в шаблоне Meta
Когда использовать
Используйте этот сценарий, когда ваш каталог пополняется новыми поступлениями — доставкой, сезонной коллекцией или обновлённым меню — и вы хотите, чтобы подписчики узнали об этом раньше, чем сами обнаружат. Это подходит для обновлений в моде и розничной торговле, объявлений о пополнении запасов в интернет-магазинах, а также для ресторанов, предлагающих новые блюда постоянным гостям.
Трафик, пока товар ещё новый
Когда система учёта или PIM отмечает новинки, шаблон отправляется контактам, согласившимся на рассылку в WhatsApp, с названием коллекции и выделенной частью текста в трёх переменных в теле сообщения, чтобы интерес к просмотру достиг максимума, пока поступление всё ещё в новость.
Объявления, посвящённые снижению
Три переменные в теле содержат имя контакта, тему поступлений и что именно прибыло, поэтому сообщение воспринимается как конкретное обновление по пополнению, а не как общая рассылка каталога.
Один тап на страницу новинок
Кнопка с постоянным URL в шаблоне Meta открывает страницу новых поступлений или коллекции, чтобы контакты могли просматривать без ожидания в 24-часовом окне ответов.
Без ручного обновления складских остатков
Событие catalogue-live создаёт и отправляет шаблон автоматически из полей PIM или складских данных, поэтому никому не нужно перепечатывать названия коллекций или уведомлять каждый сегмент вручную.
Отслеживание доставки кампании
Результат доставки фиксируется для маркетинговой аналитики или дальнейшей работы в CRM, чтобы команда знала, дошло ли объявление перед планированием следующей рассылки.
Как это работает
Триггер
Inventory, PIM или POS отправляет событие «новые поступления» или «коллекция доступна» для сегмента.
event · triggered
Зафиксировать событие
Система извлекает номера телефонов получателей и поля персонализации из данных кампании.
phone: "+…"
Собрать и отправить
Персонализированное сообщение-шаблон создаётся с тремя переменными в теле и статической кнопкой URL.
POST/sendTemplate
Доставлено
Контакты, давшие согласие, получают объявление о новинках в WhatsApp.
delivered
Статус отслеживается
Результат доставки фиксируется для анализа маркетинговой кампании или последующей работы в CRM.
#!/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_TOPIC="___" # {{2}} topic or subject
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_TOPIC=$TEST_TOPIC" \
"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}} topic or subject → ${TEST_TOPIC}
# {{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_TOPIC}" },
{ "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 основаны на этом
Доставка поступает позже, в виде отдельного обратного вызова. Зарегистрируйте вебхук (POST …/webhook), и 1MSG будет отправлять обновления статуса на ваш HTTPS-эндпоинт в hooks[] верхнеуровневом payload.
200 OKВебхук статуса доставки — данные, которые вы получаете
sent, delivered, read — или статус ошибки, если применимо
id
Соотносит обратный вызов с id возвращаемым значением вызова send
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 шаблон.