AutoPostBot технические детали
Технические детали

Как устроен AutoPostBot

Этот раздел для инвесторов, которые смотрят код, и для авторов каналов, которым важно, где хранятся их данные и что будет, если интернет отвалится.

01Стек

ЯзыкPython 3.12
Telegram-ботaiogram 3
Веб-кабинет и админкаFastAPI + Jinja-шаблоны
База данныхSQLite (WAL) локально, PostgreSQL через DATABASE_URL в проде — слой доступа один и тот же
Фоновые задачиAPScheduler, 17 задач
Сбор просмотровTelethon (MTProto-сессия пользователя: боты не видят статистику постов)
Дополнительный сервисGo — вынесенный в отдельный процесс микросервис
Выгрузка отчётовxlsxwriter
Покрытие21 автотест, запуск одной командой
РазвёртываниеDocker, деплой по push в main

02Микросервисы

Функции разделены по ответственности: каждый модуль можно тестировать и менять независимо.

МодульЗачем он выделен
МониторингРаньше состояние было видно только в логах хостинга. Теперь есть /healthz, /metrics и сводка в админке, а падение фоновой задачи даёт явный сигнал, а не тихий результат «0 обработано»
СверкаЧетыре инварианта: баланс против транзакций и выплат, покрытие ERID, налоговые статусы, счётчики. Расхождение уходит алертом, а не остаётся в логе
КомплаенсДоход по периодам, чеки самозанятого, отчёт для налоговой и для ОРД. Раньше группировки по месяцам в проекте не существовало вообще
Подбор офферовСоответствие оффера вертикали канала. Флаг автоподбора существовал в интерфейсе, но в логике публикации не читался ни разу — теперь читается
ВовлечениеРеакции на комментарии и работа с закреплением
АналитикаДоход на 1 000 просмотров по вертикалям и размерам каналов. Отвечает на вопрос, где на самом деле зарабатываем

Слои публикации — как должно быть и что есть сейчас

Целевая архитектура описана ниже. Пока она не реализована полностью, поэтому у каждого слоя указан фактический статус.

Подбор оффераРаботает Матчер выбирает оффер по вертикали канала. Выбор по доходу на 1 000 просмотров — следующая задача, база расчётов уже собрана в аналитике
Проверка допустимостиНе реализовано Проверка площадки, даты, статуса ограничения доступа и типа рекламы до публикации. Модуль написан быть должен, но в коде его нет
Адаптер площадкиНе реализовано Формат поста, разметка и отправка сейчас жёстко завязаны на Telegram и размазаны по трём модулям. Выделение в адаптеры — первая задача этапа
Аварийное отключениеЧастично Есть флаги на каналах и пользователях. Глобального выключателя публикаций по площадке нет — он появится вместе с адаптерами
Ручной режимНе реализовано Публикации с подтверждением администратора канала. Меняет юридическую позицию платформы, но не снимает запрет на рекламу в канале
Учёт и сверкаРаботает Постбэки, статусы, инварианты баланса. Раздельно по площадкам учёт ещё не сделан
ВыплатаРаботает Заявка, порог, чек самозанятого, запись в налоговый отчёт
Главное про этот раздел Три слоя из семи не реализованы, один работает частично. Мы перечисляем их как задачи, а не как защиту, потому что не реализованный механизм не может считаться защитой. Как только модуль написан и покрыт тестами — статус меняется здесь, в этом же документе.

Почему это не «переделка с нуля»

Разделение на слои нужно именно для того, чтобы изменение требований площадки было правкой механизма, а не новой разработкой. Офферы, ссылки, учёт конверсий, расчёты с авторами и кабинеты не содержат площадочной логики — они переживают смену публикатора.

Именно поэтому при ужесточении правил доход каналов и работа расчётов не обнуляются: меняется способ размещения, продолжают работать учёт, офферы и выплаты.

Мы предпочитаем показывать такие находки сами. Инвестору, который проверит код, обнаружить расхождение между документом и реальностью хуже, чем узнать о нём от нас. Часть функций мы раньше описывали как готовые, а в коде их не было. Часть из них дописана и покрыта тестами — они работают. Часть остаётся задачей и помечена выше статусом «не реализовано». Дописано и работает не всё, и мы не утверждаем обратного.

03Деньги и платежи

Как считается доход

Единственный источник данных о покупках — партнёрская сеть. Наш код не оценивает продажи сам, он принимает постбэки и ведёт их статусы.

«В ожидании»заказ проходит проверку у рекламодателя, 30–90 дней
«Доступно к выводу»заказы со статусом approved по данным сети, минимум 3 000 ₽
Оплатапо заявке в кабинете, перевод на карту
Чекобязателен в течение 24 часов после перевода, иначе выплата не закрывается
Важная оговорка о выплатах Начисление баланса происходит по статусу approved от партнёрской сети. Фактическое поступление денег от сети отстаёт на 30–90 дней. То есть мы кредитуем автора раньше, чем получаем деньги, и закрываем этот разрыв оборотным резервом.

Если сеть отменит заказ после того, как мы уже выплатили, убыток будет наш, не автора. Но если объём кредитования вырастет быстрее резерва, выплаты придётся задержать — и это тоже наша зона ответственности, а не автора.

Мы сознательно не называем это «фактически оплаченными заказами»: это неправда. Формулировка была исправлена на формулировку «подтверждённые сетью», потому что подмена одного другим в договоре опасно.

Защита от потери денег

Локализация персональных данных — блокер для подключения авторов

Не решено База и резервные копии сейчас на зарубежном хостинге. Закон требует хранения персональных данных на территории России. Согласие пользователя эту проблему автоматически не снимает — вопрос локализации решается юридически, а не формулировкой в согласии.

Что делаем: схему согласовываем с профильным юристом, переносим базу в российскую инфраструктуру — запись об этом есть в бюджете транша. До решения вопроса массовое подключение авторов не начинаем, работаем только с тестовыми данными. Варианты, которые рассматриваем: перенос базы в российский регион, обезличивание части данных либо письменное согласование схемы с Роскомнадзором.

Также в первый месяц транша подаётся уведомление об обработке персональных данных в Роскомнадзор, а текст согласия и политики обработки ПД готовятся с юристом.

Публичная политика обработки персональных данных на сайте не опубликована. Это необходимое условие полноценного онбординга авторов, а не деталь на потом. Публикуем до начала подключения реальных пользователей — вместе с согласием, которое не является заменой локализации.

04Открытые ограничения

Список того, что мы знаем как слабое место. Обновляется по мере работы.

ОграничениеСтепеньЧто делаем
Позиция ФАС по рекламе в Telegram. Ч. 10.7 ст. 5 № 38-ФЗ запрещает рекламу на ресурсах с ограниченным доступом; ФАС считает, что под это попадает и TelegramвысокаяПодробно — в разделе «Правовые вопросы». Техническая часть решения не готова: глобального выключателя площадки и модуля проверки допустимости в коде нет, это задачи этапа. Судебной практики по норме применительно к Telegram нет
Локализация персональных данных не решена. База на зарубежном хостингевысокаяБлокер для массового подключения авторов. Согласуем схему с юристом и переносим базу в РФ, запись в бюджете транша. До решения работаем только с тестовыми данными
Одна партнёрская сеть. Admitad может поднять ставки, изменить условия или уйтивысокаяВторая сеть — приоритет месяцев 5–9. Адаптер универсальный, подключение 2–3 недели. Спрос авторов не исчезает вместе с сетью — авторы идут туда, где есть офферы
Не подтвердилась экономика: конверсия ниже модельной или каналы отваливаются быстреевысокаяИменно это покупает транш 1. Замер на 40 каналах — до найма и масштаба. Если модель не сходится, мы перестраиваем её, а не масштабируем
Снижение ставок: бюджеты в Telegram упали на 22 % за полугодие 2026 годасредняяПересчёт ставок в первый месяц. При подтверждённом снижении план по каналам пересчитывается вверх до масштабирования
Статус платформы как распространителя или рекламной системысредняяВопрос вынесен юристу. Прорабатывается конструкция, где автор публикует сам, а платформа не получает процент с рекламы
Накрутки кликов в CPCсредняяАнтифрод и лимиты. Приоритет CPA в дорогих вертикалях
Ошибка в схеме отчётности ОРДсредняяЮрист с первого дня, схема фиксируется письменно до масштабирования
База и бэкапы на зарубежном хостингесредняяИзвестное несоответствие требованию о локализации. Переезд на российский хостинг в первый месяц транша
Ключевой участник уходитсредняяУдержание через долю в компании и долю от прибыли, а не только ставкой. Обещанием удержать нельзя — при уходе снимаем риск ранним наймом на замену
Отток каналовсредняяТранш 2 не открывается, если не набраны каналы. Потрачено 2,4 млн за проверенную гипотезу, решение по факту

Что в коде ещё не сделано

Честный список. Инвестору, который проверит код, обнаружить это самостоятельно хуже.

Почему разработчик не нужен на транше 1

При нулевом трекшене нанимать разработчика на полный день преждевременно: это оплата риска за чужой счёт. Часть задач выполняется подрядчиком по отдельному договору, без включения в постоянный зарплатный фонд. Отдельная штатная позиция появится только после подтверждения экономики.