Team Inbox APIЕщё
1msg official logo

WhatsApp Business API для запроса подтверждения от клиента

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

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

Сценарий отправляет клиенту персонализированный WhatsApp-шаблон с просьбой подтвердить или отменить запланированное действие. Сообщение включает имя клиента, название действия, дату и время, а также адрес. Кнопки быстрых ответов «Подтвердить» и «Отменить» передают выбор клиента через вебхук на ваш сервер.

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

Здравствуйте, {{1}}! Подтвердите {{2}}. Дата и время: {{3}}. Адрес: {{4}}. Если вам нужна помощь, просто ответьте на это сообщение, и мы вам поможем.

Подтвердить
  • {{1}}
    имя клиента
  • {{2}}
    действие или предмет для подтверждения (например, бронирование консультации, доставка на дом)
  • {{3}}
    дата и время (например, 15 июля, 14:00)
  • {{4}}
    адрес или местоположение (например, адрес или точка самовывоза)
  • “Подтвердить”
    кнопка — исправлено в шаблоне Meta
WhatsApp Business API for client confirmation request

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

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

Меньше пропусков и пропущенных интервалов
Четыре переменные в теле содержат имя клиента, действие для подтверждения, дату и время, а также адрес в WhatsApp, чтобы клиент видел все детали перед отправкой или доставкой и мог подтвердить их одним нажатием на быстрый ответ.
Без напоминаний по почте и телефону
Одобренный шаблон отправляется клиенту при отсутствии открытой беседы, поэтому вы запрашиваете подтверждение в WhatsApp вместо ожидания ответа на электронную почту или обратного звонка.
Подтверждение или отмена передаётся в ваш бэкенд
Подтвердить и Отменить — это фиксированные кнопки быстрых ответов в шаблоне Meta; каждое нажатие приходит через вебхук, чтобы CRM или система планирования могли обновить бронирование или процесс без ручного ввода.
Нет необходимости подтверждать вручную
Система планирования, CRM или Workflow отправляет событие запроса подтверждения, и шаблон отправляется с уже заполненными четырьмя полями — никто не перепечатывает данные и не отслеживает ответы вручную.

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

  1. Триггер

    Система планирования, CRM или Как это работает отправляют событие-запрос подтверждения.

    event · triggered

  2. Действия клиента

    Система сопоставляет номер телефона получателя с полями подтверждения.

    user action

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

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

    POST /sendTemplate

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

    Клиент получает запрос на подтверждение WhatsApp.

    delivered

  5. Статус отслежен

    Когда клиент нажимает «Подтвердить» или «Отменить», вебхук отправляет событие для обработки на сервер.

    status: "read"

WhatsApp Business API for client confirmation request

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

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

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

Примеры кода

#!/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_DATE="___"         # {{3}} date or time
TEST_ADDRESS="___"         # {{4}} address or location

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_DATE=$TEST_DATE" \
            "TEST_ADDRESS=$TEST_ADDRESS"; 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}} date or time → ${TEST_DATE}
# {{4}} address or location → ${TEST_ADDRESS}
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_DATE}" },
        { "type": "text", "text": "${TEST_ADDRESS}" }
      ]
    }

  ]
}
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[] теле.

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 Flow с sendFlow в течение 24-часового окна обслуживания клиентов.
Записи и напоминания
WhatsApp Business API для напоминания о будущих бронированиях
Сценарий отправляет клиенту персонализированный шаблон WhatsApp за несколько дней до назначенного визита.
Записи и напоминания
WhatsApp Business API для подтверждения бронирования
Сценарий отправляет клиенту персонализированный шаблон WhatsApp сразу после того, как бронирование подтверждено.

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