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

WhatsApp Business API для повторного вовлечения старого лида

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

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

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

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

Здравствуйте, {{1}}! Ранее вы проявили интерес к «{{2}}». {{3}} Мы будем рады снова вам помочь — откройте актуальное предложение, нажав на кнопку ниже.

Открыть предложение
  • {{1}}
    имя клиента или лида
  • {{2}}
    продукт или услугу, которые их ранее заинтересовали
  • {{3}}
    крючок для повторного вовлечения (например, обновлённые цены, новая возможность, ограниченное по времени предложение)
  • “Открыть предложение”
    кнопка — исправлено в шаблоне Meta
WhatsApp Business API for re-engage previously interested lead

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

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

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

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

  1. Триггер

    CRM или система автоматизации маркетинга помечает неактивный контакт, который ранее проявлял интерес.

    event · triggered

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

    Система обрабатывает номер телефона и поля истории интересов.

    phone: "+…"

  3. Создать и отправить

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

    POST /sendTemplate

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

    Контакт получает сообщение о повторном подключении в WhatsApp.

    delivered

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

    Результат доставки отмечается в CRM для кампании по возвращению клиентов.

    status: "read"

WhatsApp Business API for re-engage previously interested lead

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

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

  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_PRODUCTORSERVICENAME="___"         # {{2}} product or service name
TEST_NEXTSTEP="___"         # {{3}} next step

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_PRODUCTORSERVICENAME=$TEST_PRODUCTORSERVICENAME" \
            "TEST_NEXTSTEP=$TEST_NEXTSTEP"; 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 or service name → ${TEST_PRODUCTORSERVICENAME}
# {{3}} next step → ${TEST_NEXTSTEP}
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_PRODUCTORSERVICENAME}" },
        { "type": "text", "text": "${TEST_NEXTSTEP}" }
      ]
    }

  ]
}
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 за часы
без проблем с инфраструктурой