Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда его оплата просрочена. Сообщение включает имя клиента, сумму задолженности и дату просрочки. Статическая кнопка URL открывает страницу оплаты онлайн.
Пример шаблона
Здравствуйте, {{1}} это дружеское напоминание о том, что ваша оплата от {{2}} просрочена с {{3}}. Завершите оплату в ближайшее время, чтобы избежать прерывания обслуживания. Если вы уже оплатили, проигнорируйте это сообщение.
Оплатить
{{1}}
имя клиента
{{2}}
сумма неоплаченной оплаты
{{3}}
дата просрочки оплаты
“Оплатить”
кнопка — исправлено в шаблоне Meta
Когда использовать это
Используйте этот сценарий, когда выставленный счёт помечен как просроченный, а напоминания по электронной почте или через SMS остаются без внимания, и ручные звонки для взыскания задолженности нагружают команду. Это подходит для выставления счетов за подписку, B2B-услуг с непогашенными контрактными балансами и агентств, подключающих ERP или бухгалтерские системы к автоматическим WhatsApp-напоминаниям о платеже.
Меньше пропущенных уведомлений о задолженности
Имя клиента, сумма задолженности и дата просрочки приходят как три переменные в теле сообщения WhatsApp, чтобы напоминание оставалось видимым в чате, который они проверяют, вместо того чтобы теряться в электронной почте.
Оплата в один клик
Фиксированная кнопка со статическим URL в утверждённом шаблоне Meta открывает страницу онлайн-оплаты, чтобы клиент мог завершить оплату, не отвечая в чате.
Меньше ручной работы по сбору данных
Биллинг или бухгалтерия обнаруживает событие просрочки и отправляет шаблон автоматически, поэтому никто не вводит заново суммы и даты для каждого просроченного аккаунта.
Доставка зарегистрирована для контроля
Результат доставки фиксируется для учёта или CRM, чтобы процессы знали, дошло ли напоминание до клиента до следующего шага эскалации.
Как это работает
Триггер
Система биллинга или учёта обнаруживает, что оплата просрочена.
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_PAYMENTAMOUNT="___" # {{2}} payment amount
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_PAYMENTAMOUNT=$TEST_PAYMENTAMOUNT" \
"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}} payment amount → ${TEST_PAYMENTAMOUNT}
# {{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_PAYMENTAMOUNT}" },
{ "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.…), чтобы сопоставить обратные вызовы доставки.
Храните это; обратные вызовы доставки и hookInfo зависят от этого ключа
Сама доставка поступает позже, в виде отдельного обратного вызова. Зарегистрируйте вебхук (POST …/webhook), и 1MSG будет отправлять обновления статуса на ваш HTTPS-эндпоинт в корневом hooks[] payload.
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 шаблон.