Campaigns API — Кампании, Шаблоны, Потоки

Справочник API кампаний: создание, запуск, A/B тесты, Flow Builder, триггеры.

Обзор модуля кампаний

Модуль кампаний Trigly охватывает полный цикл маркетинговых коммуникаций: от создания шаблона до анализа результатов. Он включает 80 эндпоинтов, распределённых по 7 подмодулям.

Подмодули:

Подмодуль Эндпоинты Описание
Кампании 37 CRUD, запуск, статистика, AI, аналитика
Шаблоны 11 CRUD, библиотека, предпросмотр
Потоки (Flows) 14 Journey Builder, DAG-движок
A/B тесты 5 Сплит-тестирование, выбор победителя
Триггеры 7 Событийные рассылки
Трекинг 4 Пиксель, клики, отписка
Webhooks 5 Исходящие уведомления

Базовый URL: https://api.trigly.ru/api/v1


Кампании

Типы кампаний

Тип Описание
one_time Разовая рассылка по сегменту
recurring Повторяющаяся по cron-расписанию
triggered Запускается при наступлении события

Жизненный цикл кампании

draft → scheduled → running → completed
                  ↓
               paused → running
                  ↓
               failed

Создание кампании

POST /api/v1/campaigns
{
  "name": "Весенняя распродажа 2026",
  "channel": "email",
  "campaign_type": "one_time",
  "segment_id": "SEGMENT_UUID",
  "template_id": "TEMPLATE_UUID",
  "subject": "Скидки до 50% — только 3 дня! 🔥",
  "scheduled_at": "2026-03-25T10:00:00Z",
  "tags": ["весна", "распродажа"],
  "folder": "Промо"
}

Каналы: email, sms, telegram, whatsapp, push

Дополнительные поля для омниканальных кампаний:

{
  "fallback_channels": ["email", "telegram", "sms"],
  "send_local_time": "10:00"
}
  • fallback_channels — цепочка каналов: если первый не доступен, Trigly попробует следующий
  • send_local_time — отправка по местному времени получателя (на основе customer.timezone)

Повторяющаяся кампания

{
  "name": "Еженедельный дайджест",
  "channel": "email",
  "campaign_type": "recurring",
  "segment_id": "SEGMENT_UUID",
  "template_id": "TEMPLATE_UUID",
  "subject": "Ваш дайджест за неделю",
  "cron_expression": "0 10 * * 1"
}

Поддерживается стандартный cron-формат (5 полей). Celery beat проверяет расписание каждые 60 секунд.

Список кампаний

GET /api/v1/campaigns?page=1&per_page=20&status=running&channel=email

Параметры фильтрации:

Параметр Описание
status draft, scheduled, running, paused, completed, failed
channel email, sms, telegram, whatsapp, push
campaign_type one_time, recurring, triggered
folder Имя папки
search Поиск по названию

Запуск кампании

POST /api/v1/campaigns/{campaign_id}/launch
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/launch \
  -H "Authorization: Bearer $TOKEN"

Ответ:

{
  "id": "CAMPAIGN_ID",
  "status": "running",
  "total_recipients": 1543,
  "started_at": "2026-03-20T10:00:00Z"
}

При запуске Trigly:

  1. Загружает получателей из сегмента
  2. Исключает отписанных и подавленных контактов
  3. Проверяет частотные ограничения (frequency capping)
  4. Рендерит шаблон для каждого получателя (Jinja2)
  5. Отправляет пакетами по 50 через канальный адаптер
  6. Логирует каждое сообщение в PostgreSQL

Пауза и возобновление

# Пауза
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/pause \
  -H "Authorization: Bearer $TOKEN"

# Возобновление
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/resume \
  -H "Authorization: Bearer $TOKEN"

Клонирование кампании

POST /api/v1/campaigns/{campaign_id}/clone

Создаёт копию кампании в статусе draft с суффиксом « (копия)» в названии.

Статистика кампании

GET /api/v1/campaigns/{campaign_id}/stats
{
  "total_recipients": 1543,
  "sent": 1540,
  "delivered": 1498,
  "opened": 734,
  "clicked": 189,
  "bounced": 42,
  "failed": 3,
  "suppressed": 12,
  "open_rate": 49.0,
  "click_rate": 12.6,
  "bounce_rate": 2.8
}

Список сообщений кампании

GET /api/v1/campaigns/{campaign_id}/messages?page=1&per_page=50&status=delivered

Тестовая отправка

POST /api/v1/campaigns/{campaign_id}/test-send
{
  "email": "test@company.ru"
}

Отправляет одно тестовое сообщение на указанный адрес, не затрагивая статистику кампании.

AI-генерация контента

# Генерация вариантов темы
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/ai/generate-copy \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"prompt": "промо-рассылка для интернет-магазина обуви"}'

# AI-оценка темы
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/ai/score-subject \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"subject": "Скидки 50% на кроссовки — только 3 дня!"}'

# Предсказание эффективности
curl -X POST https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/ai/predict-performance \
  -H "Authorization: Bearer $TOKEN"

# Оптимальное время отправки
curl https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/ai/optimize-send-times \
  -H "Authorization: Bearer $TOKEN"

# Рекомендация сегмента
curl https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/ai/recommend-segment \
  -H "Authorization: Bearer $TOKEN"

Аналитика кампаний

# Сравнение кампаний
curl "https://api.trigly.ru/api/v1/campaigns/analytics/compare?campaign_ids=id1,id2,id3" \
  -H "Authorization: Bearer $TOKEN"

# Выручка
curl "https://api.trigly.ru/api/v1/campaigns/analytics/revenue?period=30d" \
  -H "Authorization: Bearer $TOKEN"

# Тепловая карта открытий
curl "https://api.trigly.ru/api/v1/campaigns/CAMPAIGN_ID/analytics/heatmap" \
  -H "Authorization: Bearer $TOKEN"

# Доставляемость
curl "https://api.trigly.ru/api/v1/campaigns/analytics/deliverability?period=30d" \
  -H "Authorization: Bearer $TOKEN"

# Когортный анализ
curl "https://api.trigly.ru/api/v1/campaigns/analytics/cohort?period=90d" \
  -H "Authorization: Bearer $TOKEN"

# Календарь рассылок
curl "https://api.trigly.ru/api/v1/campaigns/analytics/calendar?month=2026-03" \
  -H "Authorization: Bearer $TOKEN"

Оценка стоимости кампании

POST /api/v1/campaigns/{campaign_id}/estimate-cost

Рассчитывает предварительную стоимость на основе количества получателей и канала. Учитывает сегментацию SMS и стоимость шаблонов WhatsApp.

Умное расписание

POST /api/v1/campaigns/{campaign_id}/schedule-smart

AI анализирует исторические данные об открытиях и рекомендует оптимальное время отправки.


Шаблоны

Создание шаблона

POST /api/v1/templates
{
  "name": "Промо — скидка на обувь",
  "channel": "email",
  "subject": "{{ first_name }}, ваша скидка {{ discount }}% ждёт!",
  "body_html": "<div style='font-family: Arial'><h1>Привет, {{ first_name }}!</h1><p>Мы приготовили для вас скидку <b>{{ discount }}%</b> на {{ category }}.</p><p>Промокод: <code>{{ promo_code }}</code></p><a href='{{ shop_url }}'>Перейти в магазин</a></div>",
  "body_text": "Привет, {{ first_name }}! Скидка {{ discount }}% на {{ category }}. Промокод: {{ promo_code }}. {{ shop_url }}",
  "variables": ["first_name", "discount", "category", "promo_code", "shop_url"]
}

Шаблонизатор

Trigly использует Jinja2 SandboxedEnvironment. Доступные возможности:

Переменные контакта:

Переменная Описание
{{ first_name }} Имя
{{ last_name }} Фамилия
{{ email }} Email
{{ city }} Город
{{ phone }} Телефон
{{ custom_fields.KEY }} Произвольные поля

Встроенные фильтры:

Фильтр Пример Результат
currency {{ 4990 | currency }} 4 990 ₽
date_format {{ date | date_format('%d.%m.%Y') }} 20.03.2026

Условия и циклы:

{% if total_orders > 5 %}
  <p>Спасибо за лояльность! Ваша персональная скидка — 15%.</p>
{% else %}
  <p>Добро пожаловать! Промокод WELCOME10 для первого заказа.</p>
{% endif %}

Предпросмотр шаблона

POST /api/v1/templates/{template_id}/preview
{
  "variables": {
    "first_name": "Иван",
    "discount": 20,
    "category": "кроссовки",
    "promo_code": "SPRING20"
  }
}

Омниканальный предпросмотр

POST /api/v1/templates/{template_id}/preview-omni

Показывает как шаблон будет выглядеть во всех каналах: email (HTML), Telegram (Markdown), SMS (plain text), WhatsApp (template), Push (title + body).

Библиотека готовых шаблонов

GET /api/v1/templates/library

15 готовых шаблонов: welcome, promo, cart_abandoned, order_confirmation, shipping, review_request, birthday, reactivation, newsletter, flash_sale, loyalty_points, referral, survey, win_back, seasonal.


Потоки (Flows) — Journey Builder

Потоки позволяют создавать автоматизированные цепочки коммуникаций с DAG-движком (направленный ациклический граф).

Создание потока

POST /api/v1/campaigns/flows
{
  "name": "Welcome-серия",
  "trigger_type": "event",
  "trigger_config": {
    "event_name": "signup"
  },
  "steps": [
    {
      "id": "step_1",
      "type": "send_email",
      "config": {
        "template_id": "TEMPLATE_UUID",
        "subject": "Добро пожаловать!"
      },
      "next": ["step_2"]
    },
    {
      "id": "step_2",
      "type": "wait",
      "config": {"duration": "2d"},
      "next": ["step_3"]
    },
    {
      "id": "step_3",
      "type": "condition",
      "config": {
        "field": "total_orders",
        "operator": "greater_than",
        "value": 0
      },
      "next_true": ["step_4_yes"],
      "next_false": ["step_4_no"]
    },
    {
      "id": "step_4_yes",
      "type": "send_email",
      "config": {
        "template_id": "THANKS_TEMPLATE",
        "subject": "Спасибо за первый заказ!"
      },
      "next": []
    },
    {
      "id": "step_4_no",
      "type": "send_telegram",
      "config": {
        "text": "Привет! У нас есть промокод FIRST10 для вашего первого заказа 🎁"
      },
      "next": []
    }
  ],
  "settings": {
    "exit_on_goal": true,
    "goal_event": "purchase",
    "max_duration_days": 30
  }
}

Типы шагов

Шаг Описание
send_email Отправка email
send_sms Отправка SMS
send_telegram Отправка в Telegram
send_whatsapp Отправка WhatsApp
send_push Web Push уведомление
smart_send AI выбирает лучший канал
channel_switch Условный выбор канала
wait Задержка (1h, 2d, 1w)
condition Ветвление по условию
update_contact Обновление полей контакта
add_tag Добавление тега
remove_tag Удаление тега
exit Завершение потока

Активация и управление

# Активация
curl -X POST https://api.trigly.ru/api/v1/campaigns/flows/FLOW_ID/activate \
  -H "Authorization: Bearer $TOKEN"

# Пауза
curl -X POST https://api.trigly.ru/api/v1/campaigns/flows/FLOW_ID/pause \
  -H "Authorization: Bearer $TOKEN"

# Архивация
curl -X POST https://api.trigly.ru/api/v1/campaigns/flows/FLOW_ID/archive \
  -H "Authorization: Bearer $TOKEN"

Пресеты потоков

GET /api/v1/campaigns/flows/presets

5 готовых пресетов:

Пресет Описание
abandoned_cart Брошенная корзина: напоминание через 1ч, скидка через 24ч
welcome Welcome-серия из 3 писем
reactivation Реактивация неактивных (email → telegram → SMS)
birthday Поздравление с ДР + промокод
post_purchase Пост-покупка: благодарность → отзыв → допродажа

Статистика потока

GET /api/v1/campaigns/flows/FLOW_ID/stats

Выполнения потока

GET /api/v1/campaigns/flows/FLOW_ID/executions?page=1&per_page=20

Тестирование потока

POST /api/v1/campaigns/flows/FLOW_ID/test
{
  "customer_id": "CUSTOMER_UUID"
}

A/B тесты

Создание A/B теста

POST /api/v1/campaigns/ab-tests
{
  "campaign_id": "CAMPAIGN_UUID",
  "test_percentage": 20,
  "winner_criteria": "open_rate",
  "auto_select_winner": true,
  "min_sample_size": 100,
  "variants": [
    {
      "name": "Вариант A",
      "subject": "Скидки до 50% — только сегодня!",
      "template_id": "TEMPLATE_A_UUID",
      "weight": 50
    },
    {
      "name": "Вариант B",
      "subject": "🔥 Последний шанс: -50% на всё",
      "template_id": "TEMPLATE_B_UUID",
      "weight": 50
    }
  ]
}

Критерии выбора победителя

Критерий Описание
open_rate Процент открытий
click_rate Процент кликов
conversion_rate Процент конверсий

Ручной выбор победителя

POST /api/v1/campaigns/ab-tests/{test_id}/select-winner
{
  "variant_id": "VARIANT_A_UUID"
}

При выборе победителя оставшиеся 80% аудитории получают победивший вариант.

Байесовский анализ

Trigly использует байесовский подход с Beta-распределениями и методом Монте-Карло (10 000 симуляций) для определения статистической значимости результатов.


Триггеры

Создание триггера

POST /api/v1/campaigns/triggers
{
  "campaign_id": "CAMPAIGN_UUID",
  "name": "Покупка — благодарность",
  "event_type": "purchase",
  "conditions": {
    "revenue": {"operator": "greater_than", "value": 1000}
  },
  "delay_seconds": 3600,
  "is_active": true,
  "priority": 10,
  "max_triggers_per_contact": 1,
  "cooldown_seconds": 86400
}

Параметры триггера

Параметр Описание
event_type Тип события, на которое реагирует триггер
conditions Условия фильтрации свойств события
delay_seconds Задержка перед отправкой (для branding campaigns)
priority Приоритет (выше — важнее, при конкуренции триггеров)
max_triggers_per_contact Максимальное количество срабатываний на контакт
cooldown_seconds Минимальный интервал между срабатываниями

Активация/деактивация

curl -X POST https://api.trigly.ru/api/v1/campaigns/triggers/TRIGGER_ID/activate \
  -H "Authorization: Bearer $TOKEN"

curl -X POST https://api.trigly.ru/api/v1/campaigns/triggers/TRIGGER_ID/deactivate \
  -H "Authorization: Bearer $TOKEN"

Ручное срабатывание

POST /api/v1/campaigns/triggers/{trigger_id}/fire
{
  "customer_id": "CUSTOMER_UUID",
  "event_data": {
    "revenue": 5990,
    "product": "Кроссовки"
  }
}

Трекинг (публичные эндпоинты)

Эти эндпоинты не требуют аутентификации — они используются в email-сообщениях.

Пиксель открытия

GET /api/v1/campaigns/track/pixel?message_id=MSG_UUID

Возвращает прозрачный 1x1 GIF. Обновляет статус сообщения на opened и увеличивает счётчик открытий кампании.

Отслеживание кликов

GET /api/v1/campaigns/track/click?tracking_id=TRACK_UUID

Редирект на оригинальный URL. Обновляет статус сообщения на clicked и увеличивает total_clicks у TrackedLink.

Отписка

GET /api/v1/campaigns/track/unsubscribe?message_id=MSG_UUID

Устанавливает is_unsubscribed = true для контакта и показывает страницу подтверждения отписки.

Статистика трекинга

GET /api/v1/campaigns/track/stats?campaign_id=CAMPAIGN_UUID

Исходящие Webhooks

Создание webhook

POST /api/v1/campaigns/webhooks
{
  "url": "https://myapp.ru/webhooks/trigly",
  "event_types": ["message.sent", "message.delivered", "message.opened", "message.clicked", "message.bounced"],
  "secret": "my_webhook_secret_key",
  "is_active": true
}

Подпись запросов

Trigly подписывает каждый webhook HMAC-SHA256. Заголовок X-Trigly-Signature содержит hex-дайджест тела запроса.

Проверка подписи:

import hmac
import hashlib

def verify_webhook(body: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)

Повторные попытки

Если ваш сервер отвечает кодом >= 400 или не отвечает в течение 10 секунд, Trigly повторит запрос до 3 раз с экспоненциальной задержкой.


Frequency Capping

Trigly ограничивает частоту отправки на уровне контакта для предотвращения спама:

Ограничение Лимит
В день 3 сообщения на контакт
В неделю 10 сообщений на контакт
В месяц 30 сообщений на контакт
Тихие часы 22:00 — 09:00 (по часовому поясу контакта)

Rate limiting на уровне организации:

Канал Лимит в минуту
Email (SMTP) 100
Email (Unisender) 50
Telegram 30
SMS 100
WhatsApp 80
Push 100

Проверка и управление:

# Проверить можно ли отправить контакту
curl "https://api.trigly.ru/api/v1/campaigns/frequency/check?customer_id=CUSTOMER_ID" \
  -H "Authorization: Bearer $TOKEN"

Все счётчики хранятся в Redis и обнуляются при сбросе Redis. Это не влияет на безопасность, так как после сброса лимиты просто начинают считаться заново.

Не нашли ответ?

Swagger UI с интерактивной документацией и поддержка в Telegram.