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

WhatsApp Business API для уведомления об устранении проблемы

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

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

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

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

Здравствуйте, {{1}}! Ваш запрос {{2}} решён.{{3}} Если проблема возникнет снова, мы всегда готовы помочь.

Запросить статус
  • {{1}}
    имя клиента
  • {{2}}
    номер тикета или дела
  • {{3}}
    итог решения (например, возврат оформлен, настройки восстановлены, замена отправлена)
  • “Запросить статус”
    кнопка — исправлена в шаблоне Meta
WhatsApp Business API for issue resolved notification

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

Когда тикет поддержки помечен как «решено», и бизнесу нужно, чтобы клиент видел, что было сделано, а не просто закрытый статус в helpdesk, воспользуйтесь этим сценарием. Он подходит для команд helpdesk, отправляющих краткое резюме о результате, выездных бригад, подтверждающих исправление на месте, и агентств, подключающих вебхуки для решённых тикетов из Zendesk, Freshdesk или CRM.

Меньше вопросов «уже исправлено?»
Три переменные в теле содержат имя клиента, номер тикета и краткое резюме решения в WhatsApp, чтобы клиент узнал, что дело закрыто, не отправляя письмо в поддержку или не открывая портал.
Детали решения остаются в чате
Подтверждение попадает в переписку клиента в WhatsApp с номером тикета и текстом результата, чтобы они могли вернуться к этому, вместо того чтобы искать в электронной почте, что было сделано.
Одно касание для отправки тикета или отзыва
Фиксированная кнопка с постоянным URL в шаблоне Meta открывает страницу тикета или форму обратной связи — API отправляет только три переменные в теле.
Запретить ручное закрытие сообщений
Служба поддержки отправляет событие решения, система заполняет поля для телефона и решения, а одобренный шаблон отправляется без повторного ввода итогов агентом.
Доставка зарегистрирована в саппорте
Результат доставки фиксируется в системе технической поддержки или CRM, чтобы команда знала, дошло ли уведомление о закрытии до клиента.

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

  1. Перехват события

    Служба поддержки помечает тикет как решённый и отправляет событие о разрешении.

    phone: "+…"

  2. Определить телефон получателя

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

    phone: "+…"

  3. Собрать и отправить

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

    POST /sendTemplate

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

    Клиент получает подтверждение в WhatsApp с номером тикета и кратким описанием решения.

    delivered

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

    Результат доставки фиксируется в журнале; ошибки обрабатываются в соответствии с правилами платформы.

    status: "read"

WhatsApp Business API for issue resolved notification

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

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

  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_TICKETNUMBER="___"         # {{2}} ticket number
TEST_RESOLUTION="___"         # {{3}} resolution summary

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_TICKETNUMBER=$TEST_TICKETNUMBER" \
            "TEST_RESOLUTION=$TEST_RESOLUTION"; 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}} ticket number → ${TEST_TICKETNUMBER}
# {{3}} resolution summary → ${TEST_RESOLUTION}
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_TICKETNUMBER}" },
        { "type": "text", "text": "${TEST_RESOLUTION}" }
      ]
    }

  ]
}
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 and JSON "sent": true mean 1MSG accepted the message for sending — not that it already reached the customer's phone. Save the id field (looks like wamid.…) to correlate delivery callbacks.

200 OKОтвет
{
  "sent": true,
  "id": "wamid.HBgLMzgwNjM5...",
  "message": "Message accepted for delivery"
}
  • sent

    Принято для отправки — ещё не доставлено на телефон клиента

  • id

    Сохраните это; обратные вызовы и hookInfo привязаны к этому

Delivery itself arrives later, as a separate callback. Register a webhook (POST …/webhook) and 1MSG POSTs status updates to your HTTPS endpoint in a top-level 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 в виде строки

If you would rather not receive callbacks, poll GET {base}/{channel}/hookInfo?messageId=<id> instead. In practice delivery often completes within seconds — but the API contract does not guarantee it, so never block a flow waiting on it.

Типичные ошибки

СтатусОтветПричина
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
В этом сценарии используется API групп с операцией создания, чтобы создать именованную группу WhatsApp для рассылок команды.
Обслуживание клиентов
WhatsApp Business API для квитанции о доставке — реакции и прочтения
Этот сценарий объединяет sendReaction и readMessage в рамках 24-часового окна обслуживания клиентов.
Обслуживание клиентов
WhatsApp Business API для меню поддержки — интерактивные кнопки
Этот сценарий отправляет интерактивное сообщение с кнопкой с помощью sendButton в 24-часовое окно обслуживания клиентов.
Обслуживание клиентов
WhatsApp Business API для ответа в сессии — запрос данных
Этот сценарий отправляет бесплатное текстовое сообщение через WhatsApp с использованием sendMessage в рамках 24-часового окна обслуживания клиентов.
Обслуживание клиентов
WhatsApp Business API для передачи — поделитесь контактной карточкой
Этот сценарий отправляет контактную карточку WhatsApp через sendContact в течение 24-часового окна обслуживания клиентов.
Обслуживание клиентов
WhatsApp Business API для напоминания об ожидании ответа
Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда поддержка заблокирована, ожидая ответ клиента.
Обслуживание клиентов
WhatsApp Business API для уведомления о назначении агента
Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда тикет назначен специалисту.
Обслуживание клиентов
WhatsApp Business API для уведомлений об изменении процесса сервиса
Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда компания меняет способ предоставления услуги или выполнения процесса.

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