Как настроить каскадную рассылку

Каскадная рассылка — это не рассылка по аудитории (о ней — в статье «Запустите первую рассылку по аудитории бота») и не push. Это последовательная попытка достучаться до одного конкретного человека по номеру телефона через несколько каналов подряд: сначала через самый дешёвый и доступный, и только если это не сработало — через более дорогой следующий. Настраивается и запускается каскад целиком через API — в отличие от рассылок по аудитории, в интерфейсе платформы для этого отдельного экрана нет.

Разберём весь путь на примере каскада BOT → WhatsApp → VK Notify: сначала бесплатная попытка через бота, если человека там нет — WhatsApp, и в последнюю очередь — VK Notify.

Что даёт такая последовательность

Если пользователь уже писал вашему боту и его можно найти по номеру телефона, сообщение уйдёт туда бесплатно, и до платных каналов дело не дойдёт вовсе. Если нет — подключаются WhatsApp и VK Notify по очереди, платно, но с максимальной вероятностью, что сообщение всё-таки дойдёт хоть по одному из каналов.

Что нужно, прежде чем начать

  • Функция каскадов должна быть подключена на проекте 🔧 (это делается на стороне Fasttrack — уточни у своего менеджера или в поддержке, если каскады ещё не появились в личном кабинете).
  • api-key — ключ доступа к API каскадов.
  • Настроенный сценарий (узел) чат-бота для бесплатного шага — понадобится его ID.
  • Одобренный WhatsApp-шаблон и шаблон VK Notify — понадобятся их идентификаторы (name).

Как устроен запрос

Endpoint: https://cascades.fstrk.io/api/v1/transactions/async/
Метод: POST
Заголовки: api-key (ключ доступа), Content-Type: application/json

Пример полного запроса на каскад BOT → WHATSAPP → VK_NOTIFY:

curl -i -X POST \
 https://cascades.fstrk.io/api/v1/transactions/async/ \
 -H 'api-key: < >' \
 -H 'Content-Type: application/json' \
 -d '{
 "phone_number": "<НОМЕР ТЕЛЕФОНА>",
 "routing": [
 "BOT",
 "WHATSAPP",
 "VK_NOTIFY"
 ],
 "bot_node_id": 00001,
 "variables": {
    "first_name": "Иван"
},
 "whatsapp_template_name": "meet_presentation",
 "whatsapp_template_variables": {
    "v1": "Иван"
},
 "vk_notify_template_name": "meet_presentation",
 "vk_notify_template_variables": {
    "v1": "Иван"
},
 "waiting_time_route": 60,
 "validity_period_seconds": 600,
 "tag": "nedozvon",
 "context": {
    "cascade": "nedozvon",
    "deal_id": "18547661"
}
 }'

Важно: маршруты в routing выполняются строго в том порядке, в котором перечислены — переставить WHATSAPP и VK_NOTIFY местами означает изменить порядок попыток.

Разбор параметров запроса

ПараметрЧто задаёт
phone_numberНомер телефона получателя — по нему транзакция и ведётся через все каналы
routingСписок маршрутов по порядку: BOT, WHATSAPP, VK_NOTIFY и другие доступные каналы
bot_node_idID сценария (узла) чат-бота — это и есть бесплатный первый шаг каскада
variablesПеременные, которые будут доступны в сценарии узла, если сообщение ушло через бота
whatsapp_template_name / whatsapp_template_variablesИдентификатор одобренного WhatsApp-шаблона и его переменные
vk_notify_template_name / vk_notify_template_variablesТо же самое для VK Notify
waiting_time_routeСколько секунд ждать реакции на текущем маршруте, прежде чем перейти к следующему
validity_period_secondsЧерез сколько секунд транзакция считается просроченной целиком, независимо от того, на каком маршруте она остановилась
tagПроизвольная метка транзакции — для последующего поиска и группировки
contextЛюбые свои данные (id сделки, номер заказа и т. п.), которые сохранятся вместе с транзакцией и вернутся в событиях о её статусе

Синхронный и асинхронный режим

Для боевого запуска используется асинхронный режим (/transactions/async/, показан выше) — лимит 10 запросов в секунду, а по каждой транзакции дальше прилетают события о статусе (см. ниже).

Для теста, когда просто нужно сразу увидеть результат запроса на запуск, есть синхронный метод — https://cascades.fstrk.io/api/v1/transactions/, с теми же параметрами и заголовками, но с лимитом 1 запрос в секунду и с ответом сразу в теле, без ожидания событий.

РежимEndpointЛимитОтвет
Асинхронный (боевой).../transactions/async/10 RPS201 — задача поставлена в очередь, вернётся UUID транзакции; статус — через события
Синхронный (для теста).../transactions/1 RPS201 — сразу полный JSON созданной транзакции; 400 — неверный запрос

Оба метода при превышении лимита возвращают 429.

Как отследить результат

По каждой транзакции на ваш callback URL приходят два типа событий:

СобытиеКогда приходит
transaction.doneТранзакция завершена, а также при каждом обновлении статуса у провайдера (например, доставлено → прочитано)
transaction.errorОшибка в запросе — например, шаблон WhatsApp не найден

Пример transaction.done:

{
 "event_type": "transaction.done",
 "payload": {
 "uuid": "cc1f638a-f039-48b9-8885-af161e2838f8",
 "done_at": "2024-02-01T07:43:57.106701Z",
 "done_status": "MESSAGE_SENT",
 "successful_routes": ["WHATSAPP"],
 "route_details": {
 "BOT": {
    "uuid": "...",
    "state": "ERROR",
    "response_status": null,
    "response_description": null
},
 "WHATSAPP": {
    "uuid": "...",
    "state": "SENT",
    "response_status": "DELIVERED",
    "response_description": null
},
 "VK_NOTIFY": {
    "uuid": "...",
    "state": "CANCELLED",
    "response_status": null,
    "response_description": null
}
 },
 "context": {
    "some": "value"
}
 },
 "timestamp": 1706773437.1262264
}

В этом примере видно всю логику каскада разом: BOT не сработал (пользователя не нашли в боте), WHATSAPP сработал и сообщение доставлено, а до VK_NOTIFY дело не дошло — маршрут отменён, потому что предыдущий уже отработал.

state — статус на стороне Fasttrack:

ЗначениеЗначит
CREATEDСообщение создано
ENQUEUEDВ очереди на отправку
IN_PROCESSОтправляется
SENTОтправлено
ERRORОшибка при отправке
CANCELLEDОтправка отменена (обычно потому что сработал более ранний маршрут)

response_status — статус от провайдера канала:

ЗначениеЗначит
SENTОтправлено
DELIVEREDДоставлено
READПрочитано
ERRORОшибка при отправке
UNDELIVEREDНе доставлено

Коротко: от и до

  1. Убедитесь, что каскады подключены на проекте, и есть api-key.
  2. Подготовьте бесплатный шаг — сценарий бота (bot_node_id) — и платные шаги — одобренные шаблоны WhatsApp и VK Notify.
  3. Соберите запрос: порядок маршрутов в routing, переменные для каждого канала, время ожидания (waiting_time_route) и общий срок жизни транзакции (validity_period_seconds), при желании — tag и context.
  4. Для проверки — отправьте запрос синхронным методом (1 RPS, ответ сразу). Для боевого запуска — асинхронным (10 RPS, статус — через события).
  5. Настройте приём событий transaction.done / transaction.error на своём callback URL, чтобы видеть, через какой канал реально ушло сообщение.