Начинаем перенос my.1msg.ioЕщё
1msg official logo

Уведомление о закрытии тикета через WhatsApp API

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

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

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

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

Здравствуйте, {{1}}! Ваш запрос №{{2}} закрыт. Причина: {{3}}. Чтобы возобновить обращение, напишите нам или откройте запрос по кнопке ниже.

История запроса
  • {{1}}
    имя клиента
  • {{2}}
    номер тикета или обращения
  • {{3}}
    причина закрытия (например, решено, повторный запрос, клиент не ответил)
  • “История запроса”
    кнопка задана в шаблоне Meta
WhatsApp Business API for ticket closed notification

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

Используйте сценарий, когда тикет закрыт, а клиенту нужно коротко объяснить почему — особенно если открытого чата в WhatsApp у него уже нет. Подходит хелпдескам, которые отправляют уведомления о закрытии с указанной причиной, корпоративной поддержке, которой важна прозрачная история общения, и агентствам, которые подключают вебхуки закрытия тикетов из Zendesk, Freshdesk или CRM.

Меньше вопросов «мой тикет ещё открыт?»
Три переменные в тексте передают имя клиента, номер тикета и причину закрытия, поэтому клиент видит в WhatsApp, почему обращение закрыто, не открывая почту и не перезванивая.
Финальное уведомление вне 24-часового окна
Хелпдеск отправляет одобренный шаблон при закрытии тикета, а шаблон можно отправить и без активной сессии — в отличие от обычного текста, который WhatsApp не пропустит.
Без ручных сообщений о закрытии
Система ловит событие закрытия, находит номер телефона и отправляет шаблон сама, поэтому операторам не нужно вписывать причину для каждого тикета.
Возобновить запрос без нового тикета
Кнопка со статическим URL из шаблона Meta открывает историю запроса или страницу для его возобновления, поэтому клиент продолжает в том же чате и не гадает, как связаться с поддержкой.

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

  1. Триггер

    Хелпдеск закрывает тикет и записывает причину закрытия.

    event · triggered

  2. Фиксация события

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

    phone: "+…"

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

    Собирается персональное сообщение по шаблону с тремя переменными в тексте и кнопкой со статическим URL.

    POST /sendTemplate

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

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

    delivered

  5. Отслеживание статуса

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

    status: "read"

WhatsApp Business API for ticket closed 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_CLOSUREREASON="___"         # {{3}} closure reason

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_CLOSUREREASON=$TEST_CLOSUREREASON"; 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}} closure reason → ${TEST_CLOSUREREASON}
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_CLOSUREREASON}" }
      ]
    }

  ]
}
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,
  "message": "Sent to [email protected]",
  "description": "Message has been sent to the provider",
  "id": "wamid.HBgLMzgwNjM5..."
}
  • sent

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

  • id

    Сохраните его: уведомления о доставке и hookInfo привязаны к этому значению

Связанные

Обслуживание клиентов
Уведомление о передаче тикета через WhatsApp API
Сценарий отправляет клиенту персональный шаблон WhatsApp, когда тикет передан в другой отдел.
Обслуживание клиентов
Уведомление о смене статуса тикета через WhatsApp API
Сценарий отправляет клиенту персональный шаблон WhatsApp, когда меняется статус тикета в поддержке.
Обслуживание клиентов
Уведомление об эскалации тикета через WhatsApp API
Сценарий отправляет клиенту персональный шаблон WhatsApp, когда тикет эскалирован, потому что решение занимает больше времени, чем обычно.
Обслуживание клиентов
Уведомление о создании тикета через WhatsApp API
Сценарий отправляет клиенту персональный шаблон WhatsApp, когда в поддержке создан новый тикет.
Обслуживание клиентов
Запрос фото или файла через шаблон WhatsApp API
Сценарий отправляет клиенту персональный шаблон WhatsApp, когда поддержке для работы над тикетом нужно фото, документ или подтверждение, а 24-часовое окно не открыто.
Обслуживание клиентов
WhatsApp Business API для запроса дополнительных сведений по тикету
Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда для решения тикета нужна дополнительная информация, а сеансовое окно не открыто.
Обслуживание клиентов
WhatsApp Business API для уведомления о принятии тикета
Сценарий отправляет клиенту персонализированный шаблон WhatsApp, когда его запрос в поддержку принят на обработку.
Обслуживание клиентов
WhatsApp Business API для командной рассылки — создать группу WhatsApp
В этом сценарии используется API групп с операцией создания, чтобы создать именованную группу WhatsApp для рассылок команды.

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