💬 Командный WhatsApp-Инбокс на новой ПлатформеЕщё
1msg official logo

WhatsApp Business API для рассылки новым клиентам

Сценарий отправляет персонализированный шаблон WhatsApp, когда в каталоге появляются новые товары или коллекция.

Обзор сценария

Сценарий отправляет персонализированный шаблон WhatsApp, когда в каталоге появляются новые товары или коллекция. В сообщении указываются имя контакта, тема новинок или название коллекции и краткое описание поступления. Кнопка со статичной ссылкой открывает страницу с новинками.

Пример шаблона

Здравствуйте, {{1}}! Поступили новинки: {{2}}. {{3}} Нажмите кнопку ниже, чтобы посмотреть новые поступления.

Просмотреть новинки
  • {{1}}
    имя клиента или контакта
  • {{2}}
    название темы или подборки новых поступлений
  • {{3}}
    Краткий обзор новинок и причин заглянуть прямо сейчас
  • “Просмотреть новинки”
    кнопка — исправлена в шаблоне Meta
WhatsApp Business API for new arrivals broadcast

Когда использовать

Используйте этот сценарий, когда ваш каталог пополняется новыми поступлениями — доставкой, сезонной коллекцией или обновлённым меню — и вы хотите, чтобы подписчики узнали об этом раньше, чем сами обнаружат. Это подходит для обновлений в моде и розничной торговле, объявлений о пополнении запасов в интернет-магазинах, а также для ресторанов, предлагающих новые блюда постоянным гостям.

Трафик, пока товар ещё новый
Когда система учёта или PIM отмечает новинки, шаблон отправляется контактам, согласившимся на рассылку в WhatsApp, с названием коллекции и выделенной частью текста в трёх переменных в теле сообщения, чтобы интерес к просмотру достиг максимума, пока поступление всё ещё в новость.
Объявления, посвящённые снижению
Три переменные в теле содержат имя контакта, тему поступлений и что именно прибыло, поэтому сообщение воспринимается как конкретное обновление по пополнению, а не как общая рассылка каталога.
Один тап на страницу новинок
Кнопка с постоянным URL в шаблоне Meta открывает страницу новых поступлений или коллекции, чтобы контакты могли просматривать без ожидания в 24-часовом окне ответов.
Без ручного обновления складских остатков
Событие catalogue-live создаёт и отправляет шаблон автоматически из полей PIM или складских данных, поэтому никому не нужно перепечатывать названия коллекций или уведомлять каждый сегмент вручную.
Отслеживание доставки кампании
Результат доставки фиксируется для маркетинговой аналитики или дальнейшей работы в CRM, чтобы команда знала, дошло ли объявление перед планированием следующей рассылки.

Как это работает

  1. Триггер

    Inventory, PIM или POS отправляет событие «новые поступления» или «коллекция доступна» для сегмента.

    event · triggered

  2. Зафиксировать событие

    Система извлекает номера телефонов получателей и поля персонализации из данных кампании.

    phone: "+…"

  3. Собрать и отправить

    Персонализированное сообщение-шаблон создаётся с тремя переменными в теле и статической кнопкой URL.

    POST /sendTemplate

  4. Доставлено

    Контакты, давшие согласие, получают объявление о новинках в WhatsApp.

    delivered

  5. Статус отслеживается

    Результат доставки фиксируется для анализа маркетинговой кампании или последующей работы в CRM.

    status: "read"

WhatsApp Business API for new arrivals broadcast

Техническая реализация

Предварительные требования

  1. Ключ API для 1MSG · Как получить ключ API
  2. Аккаунт WhatsApp Business · Как подключить WABA
  3. Шаблон WhatsApp · Как утвердить шаблон WABA
  4. Согласие клиента на участие · Как управлять согласием клиентов

Примеры кода

#!/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.…), чтобы сопоставить обратные вызовы по доставке.

200 OKОтвет
{
  "sent": true,
  "id": "wamid.HBgLMzgwNjM5...",
  "message": "Message accepted for delivery"
}
  • sent

    Принято для отправки — ещёне на телефоне клиента

  • id

    Сохраните это; обратные вызовы доставки и hookInfo основаны на этом

Доставка поступает позже, в виде отдельного обратного вызова. Зарегистрируйте вебхук (POST …/webhook), и 1MSG будет отправлять обновления статуса на ваш HTTPS-эндпоинт в hooks[] верхнеуровневом payload.

200 OKВебхук статуса доставки — данные, которые вы получаете
{
  "hooks": [
    {
      "id": "gBGGeSaGViBfAgnlzOSHEwK9O6F",
      "type": "message",
      "status": "sent",
      "timestamp": "1654864094",
      "recipient_id": "556123122026"
    }
  ]
}
  • status

    sent, delivered, read — или статус ошибки, если применимо

  • id

    Соотносит обратный вызов с id возвращаемым значением вызова send

  • timestamp

    Unix-секунды в виде строки

Если вы предпочитаете не получать обратные вызовы, используйте опрос GET {base}/{channel}/hookInfo?messageId=<id>. На практике доставка обычно завершается в течение нескольких секунд, но контракт API этого не гарантирует, поэтому никогда не блокируйте процесс в ожидании её завершения.

Распространённые ошибки

СтатусОтветПричина
200Message was not sent: template is not definednamespace, template or language missing from the request body.
200template name (…) does not exist in <language>The template is approved in a different language than the one requested.
200Message was not sent: provide chatId, phone, bsuid, or usernameNo recipient the channel could resolve.
403access deniedThe token is wrong, or belongs to a different channel than the URL.
429too many requests. please try laterThe channel is over its send rate.

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

Да, для холодных сообщений в WhatsApp нужен одобренный Meta шаблон.

Связанные

Маркетинговые кампании
WhatsApp Business API для рассылки контента для вовлечения клиентов
Сценарий отправляет персонализированный шаблон WhatsApp при публикации образовательного или развлекательного контента для контактов, давших согласие.
Маркетинговые кампании
WhatsApp Business API для постпродажного взаимодействия
Сценарий отправляет персонализированный шаблон WhatsApp после покупки при наличии предложения — пополнение или сопутствующий товар.
Маркетинговые кампании
WhatsApp Business API для сезонной рассылки кампании
Сценарий отправляет персонализированный маркетинговый шаблон WhatsApp, когда начинается сезонная кампания по календарю.
Маркетинговые кампании
WhatsApp Business API для рассылки каталогов товаров и услуг
Сценарий отправляет персонализированный маркетинговый шаблон WhatsApp контактам, давшим согласие, когда бизнес публикует или обновляет весь каталог.
Маркетинговые кампании
WhatsApp Business API для рассылки промо-баннеров
Сценарий отправляет персонализированный шаблон WhatsApp, когда отдел маркетинга запускает визуальную кампанию.
Маркетинговые кампании
WhatsApp Business API для рекламной рассылки предложений
Сценарий отправляет персонализированный маркетинговый шаблон WhatsApp контактам, которые дали согласие, при начале промокампании.
Маркетинговые кампании
WhatsApp Business API для повторного вовлечения старого лида
Сценарий отправляет персонализированный шаблон WhatsApp клиенту или лиду, которые ранее проявили интерес, но стали неактивными.
Маркетинговые кампании
WhatsApp Business API для приветственного сообщения при регистрации
Сценарий отправляет персонализированный шаблон WhatsApp, когда пользователь завершает регистрацию.

Интегрируйте WhatsApp за часы
без проблем с инфраструктурой