Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда ему необходимо подписать документ или подтвердить переданные данные для продолжения. Сообщение включает имя клиента, название документа или процесса и инструкции по подписанию. Статическая кнопка URL открывает портал для подписи или подтверждения данных.
Пример шаблона
Здравствуйте, {{1}}! Проверьте и подпишите ваши {{2}}. {{3}} Нажмите кнопку ниже, чтобы подписать или подтвердить данные. Если у вас есть вопросы — мы готовы помочь.
Подписать документ
{{1}}
имя клиента
{{2}}
документ или процесс подписания (например, договор на оказание услуг, заявление на кредит, подтверждение данных)
{{3}}
инструкции по подписанию или подтверждению (например, ознакомьтесь с условиями и подпишите электронно на портале до пятницы)
“Подписать документ”
кнопка — исправлена в шаблоне Meta
Когда использовать
Используйте этот сценарий, когда клиент должен подписать документ или подтвердить отправленные данные, прежде чем могут продолжиться онбординг, соблюдение требований или запрос на услугу, но клиент ещё не завершил этот шаг, и активной сессии в WhatsApp нет. Это подходит для команд, которые ждут подписания контрактов, финтех-процессов, требующих подтверждения данных заявки перед одобрением, и агентств, которые интегрируют шлюзы CRM, BPM или провайдера электронных подписей в напоминания о подписании через WhatsApp.
Сбор подписей без напоминания на email
Три переменные в теле содержат имя клиента, метку документа или процесса и инструкции по подписанию, поэтому запрос точно объясняет, что подписать или подтвердить, вместо общего сообщения «заполните свой профиль».
Портал для входа в один клик
Статическая кнопка URL с надписью «Подписать документ» открывает портал электронной подписи или подтверждения данных — ссылка фиксирована в утверждённом шаблоне Meta, а текст тела отправляется через API.
Связывайтесь с клиентами после 24 часов
Поскольку активного разговора нет, для отправки используется одобренный шаблон WhatsApp через API 1MSG — это единственный канал, который может инициировать диалог, когда клиент не написал первым.
Нет необходимости вручную отслеживать каждую ожидающую подпись
Когда срабатывает триггер, требующий подписи или подтверждения, на этапе онбординга, комплаенса или поддержки, система определяет номер телефона и отправляет шаблон вместо того, чтобы кто-то вручную копировал и вставлял инструкции для подписи.
Доставка зарегистрирована для дальнейших действий в «Как это работает»
Результат доставки фиксируется после отправки, чтобы команды 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_PROCESS="___" # {{2}} process 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_PROCESS=$TEST_PROCESS" \
"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}} process name → ${TEST_PROCESS}
# {{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_PROCESS}" },
{ "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.…), чтобы сопоставить обратные вызовы по доставке.
Храните это — обратные вызовы доставки и 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.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ (FAQ)
Да, для холодных сообщений WhatsApp требуется одобренный Meta шаблон.