Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда в ходе проверки KYC или на этапе контроля соответствия возникает необходимость выполнить действие в заданный срок. Сообщение включает имя клиента, требуемое действие и крайний срок. Статическая кнопка URL открывает портал верификации или процесс загрузки документов.
Пример шаблона
Здравствуйте, {{1}}! Для вашей KYC-верификации нужно действие: {{2}} завершите её до {{3}}, используя кнопку ниже. Если у вас есть вопросы — мы готовы помочь.
Пройти KYC
{{1}}
имя клиента
{{2}}
требуемое действие KYC (например, загрузить подтверждение адреса, обновить информацию о компании, пройти проверку личности)
{{3}}
срок действия (например, 15 марта 2026 г.)
“Пройти KYC”
кнопка — исправлено в шаблоне Meta
Когда использовать это
Используйте этот сценарий, когда проверка KYC или соблюдение требований показывает, что клиент должен предпринять конкретное действие — загрузить документ, обновить данные компании или пройти проверку личности — до указанного срока, а чата в WhatsApp у него нет и связаться можно только через одобренный шаблон. Это подходит для финтех-команд, активирующих аккаунты после KYC, маркетплейсов, которые поддерживают актуальность соблюдения требований продавцов, и агентств, направляющих события, требующие действий, из платформ CRM или онбординга в WhatsApp.
Меньше пропущенных сроков KYC
Три переменные в теле подставляют в WhatsApp имя клиента, требуемое действие и срок выполнения, поэтому уведомление указывает, что нужно сделать и когда, а не стандартное письмо о соблюдении, которое легко игнорировать.
Одним нажатием — в портал подтверждения
Статическая кнопка URL с надписью «Пройти KYC» открывает портал или процесс загрузки, закреплённые в шаблоне Meta — через API отправляется только текст тела, а ссылка остаётся в утверждённом шаблоне.
Связывайтесь с клиентами без чата
Поскольку активного разговора нет, отправка происходит через утверждённый шаблон WhatsApp по API 1MSG — это единственный канал, который может уведомить клиента вне 24-часового окна сеанса.
Отсутствие ручного отслеживания в масштабе
Когда система KYC или соответствия отмечает, что требуется действие, она разрешает телефон и создаёт шаблон из полей обзора — никто вручную не перепечатывает уведомления о действиях для аккаунтов.
Доставка зафиксирована для проверки соблюдения требований
Результат доставки фиксируется после отправки, чтобы CRM или отделы комплаенса могли отслеживать, кто получил уведомление о необходимом действии, прежде чем доступ будет ограничен.
Как это работает
Действия клиента
Проверка KYC или выполнения требований сигнализирует, что клиент должен выполнить конкретное действие до установленного срока.
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_ACTION="___" # {{2}} action name
TEST_DUEDATE="___" # {{3}} due date
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_ACTION=$TEST_ACTION" \
"TEST_DUEDATE=$TEST_DUEDATE"; 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}} action name → ${TEST_ACTION}
# {{3}} due date → ${TEST_DUEDATE}
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_ACTION}" },
{ "type": "text", "text": "${TEST_DUEDATE}" }
]
}
]
}
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.…), чтобы сопоставить уведомления о доставке.
Принято для отправки — ещё не доставлено на телефон клиента
id
Храните это: обратные вызовы доставки и hookInfo базируются на этом ключе
Доставка происходит позже, в виде отдельного вызова. Зарегистрируйте вебхук (POST …/webhook) и 1MSG будет отправлять обновления статуса на ваш HTTPS-адрес в верхнеуровневом hooks[] содержимом.
200 OKВебхук статуса доставки — данные, которые вы получаете
sent, delivered, read — или статус ошибки, если применимо
id
Соотносит callback с 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 шаблон.