Отправка и трекинг
Как SOULVO отправляет сообщения и отслеживает их результаты.
Как работает отправка
Процесс
- Celery Beat (планировщик) каждые несколько минут проверяет активные кампании
- Для каждой кампании определяет, какие контакты готовы к следующему шагу
- Приоритизация: в зависимости от настройки — сначала follow-up или новые
- Выбор аккаунта: система выбирает аккаунт из пула кампании, который ещё не исчерпал дневной лимит
- Отправка: Email через SMTP, Telegram через Telethon
- Логирование: каждое сообщение записывается в журнал (MessageLog)
Окно отправки
Сообщения отправляются только в рабочие часы, заданные в настройках кампании:
- По умолчанию: 09:00 - 18:00 по часовому поясу кампании
- Если включена отправка в выходные — отправка идёт и в субботу/воскресенье
- Между сообщениями соблюдается случайный интервал (не массовая пачка)
Ротация аккаунтов
Если в кампании несколько аккаунтов, система:
- Распределяет нагрузку равномерно
- Каждый аккаунт отправляет не больше своего безопасного лимита
- Если аккаунт исчерпал лимит — переключается на следующий
- Разные контакты получают письма с разных аккаунтов
Трекинг Email
Открытия (Open tracking)
В каждое email-письмо встраивается трекинг-пиксель — невидимое изображение (1x1 px). Когда получатель открывает письмо и загружает изображения, SOULVO фиксирует открытие.
Ограничения:
- Некоторые почтовые клиенты блокируют загрузку изображений → открытие не зафиксируется
- Apple Mail Privacy Protection может показать ложное открытие
- Open rate обычно занижен на 15-20%
Клики (Click tracking)
Ссылки в письмах автоматически заменяются на трекинг-ссылки. Когда получатель кликает:
- Переход идёт через SOULVO
- Фиксируется клик
- Получатель перенаправляется на оригинальный URL
Ответы
Для отслеживания ответов нужен настроенный IMAP на email-аккаунте:
- Система периодически проверяет входящие
- Сопоставляет по Message-ID с отправленными
- Создаёт запись в Inbox
- Обновляет статус контакта в кампании
Трекинг Telegram
Ответы
Telethon-клиент автоматически получает входящие сообщения:
- Слушает события новых сообщений от контактов
- Сопоставляет по chat_id с отправленными
- Создаёт запись в Inbox
- Поддерживает пересланные контакты (MessageMediaContact)
Прочтения
Telegram не предоставляет информацию о прочтении личных сообщений через API. Поэтому метрика "прочитано" недоступна для TG-канала.
Статусы сообщений
| Статус | Описание |
|---|---|
| Pending | В очереди на отправку |
| Sent | Отправлено |
| Delivered | Доставлено (email) |
| Opened | Открыто (email, по трекинг-пикселю) |
| Replied | Получен ответ |
| Bounced | Не доставлено (email вернулся) |
| Failed | Ошибка отправки |
Терминальные статусы контакта
Когда контакт переходит в один из этих статусов, ему больше не отправляются сообщения:
| Статус | Причина |
|---|---|
| Replied | Контакт ответил |
| Unsubscribed | Контакт отписался |
| Interested | Контакт выразил интерес (AI или ручная метка) |
Это защита от назойливых follow-up'ов после того, как контакт уже отреагировал.
Обработка ошибок
Email
| Ошибка | Действие |
|---|---|
| SMTP timeout | Повтор через 5 минут |
| Authentication failed | Пауза аккаунта, уведомление |
| Mailbox full (recipient) | Пропуск контакта |
| Bounced | Пометка контакта как невалидного |
Telegram
| Ошибка | Действие |
|---|---|
| FloodWait | Пауза аккаунта на N секунд |
| UserBannedInChannel | Пропуск, аккаунт помечается |
| PeerFlood | Пауза аккаунта, снижение лимита |
| AuthKeyUnregistered | Аккаунт забанен, уведомление |
Критические vs Некритические
- Критические ошибки (аккаунт забанен, авторизация сломана) → кампания ставится на паузу
- Некритические (временный таймаут, один контакт недоступен) → контакт пропускается, кампания продолжается