Агент по работе с базой и клиентами в Телеграм

Описание Прогресс Лог работы

Я собираю базу контактов с 2018 года. Сейчас там 1073 человека. И несколько лет я не делал с ней почти ничего.

Собственная база для фрилансера — его золотая жила. Особенно во времена дорогого трафика. Лиды и клиенты в базе — это люди, которые однажды уже выбрали вас.

Лиды и клиенты в базе — это те люди, которые однажды выбрали вас. Кто-то заплатил денег, кто-то пришел рассказать о своем проекте. Поэтому именно эти люди могут повторно купить у вас или позвать к вам своих друзей, знакомых, коллег.

С чего всё началось

Нет заказов. Что делает большинство фрилансеров в такой ситуации? Идут искать новых клиентов. Пишут на биржи, делают рассылки, думают о рекламе. Я делал так же

К началу разработки подтолкнула одна ситуация. Ко мне обращается менеджер школы с просьбой помочь оформить Геткурс.

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

Человек меня знает. Мы уже работали. Просто прошло и он забыл, что я существую.

Тут я понял, что с базой надо начинать работать. Нашли бы другого — я потерял бы проект и клиента.

Идея автоматизации

В Ноушн лежала база из тысячи человек, которых я собирал с 2018 года. Где-то почту, где-то телефон, много контактов из ВК, но большая часть — это телеграм.

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

Так родилась идея: пусть бот делает эту рутину.

Концепция в трёх шагах:

  1. Раз в неделю бот ищет новые контакты в телеграме, добавляет их в базу.
  2. Регулярно проверяет базу: с кем давно не общались? Кому пора написать?
  3. Создает сообщение, отправляет человеку от моего аккаунта, обновляет дату контакта.

Первая попытка: сделать всё и сразу

Казалось, что задача простая. Берём контакт из Телеграма, читаем переписку, пишем сообщение, отправляем. Четыре шага — один скрипт.

Я начал строить это в лоб: единый процесс от начала до конца. И сразу же обнаружил, что на каждом шаге — куча деталей, которые не видны, пока не начнёшь.

Собрать контакты из папок. У кого-то нет юзернейма, у кого-то имя латиницей, а кто-то уже есть в базе.

Проанализировать диалог. Нужно понять тему, форму обращения, когда последний раз писали и не игнорируют ли тебя. И с какого из двух аккаунтов шла переписка — с рабочего или личного?

Написать сообщение. Нужно знать контекст, не повторять прошлое, обращаться правильно.

Ошибки сыпались на каждом этапе. Стало понятно: нельзя строить это как один монолит. Нужно разобрать процесс на части и проработать каждую отдельно.

Скрипт за скриптом

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

Скрипт 1: перенести контакты из Телеграма в Notion

Телеграм умеет раскладывать чаты по папкам. У меня были папки «Клиенты», «Лиды». Первый скрипт читал эти папки и добавлял каждый контакт в Notion — с именем, юзернеймом, датой первого сообщения.

Раньше это приходилось делать руками: открыл чат, скопировал имя, вставил в Notion. Скрипт делал то же самое за несколько минут и без ошибок.

Скрипт 2: когда последний раз общались?

Второй скрипт пробегал по базе и для каждого контакта находил дату последнего сообщения в Телеграме. Именно последнего — не первого. Это важно: именно по этой дате потом решается, кому пора написать.

Скрипт 3: чем занимается этот человек?

Я работаю с разными клиентами: кто-то делает курсы на Геткурсе, кто-то хочет сайт, кому-то нужен дизайн. Третий скрипт читал диалог и через GPT определял, к какому типу относится этот человек. Потом ставил тег в Notion.

Зачем это нужно? Чтобы потом отправлять уместные сообщения. Человеку с курсами не нужно писать про сайты на Тильде. А тому, кто делает лендинги, не интересны виджеты для Геткурса.

Скрипт 4: ты или Вы?

Звучит мелочью, но это не мелочь. Если я всё лето общался с человеком на «ты», а потом вдруг написал «Здравствуйте, Вы интересовались…» — это провал. Скрипт читал переписку, смотрел на паттерны обращений и записывал в Notion: с этим человеком на «ты», с тем — на «Вы».

Скрипт 5: перевести имя

В Telegram много людей с именами латиницей — Alexey, Dmitriy, Nastya. Если использовать их как есть, сообщение сразу выдаёт робота: «Alexey, добрый день!» — и всё, доверие потеряно. Скрипт через ИИ переводил имена в кириллицу: Алексей, Дмитрий, Настя. Заодно приводил уменьшительные к полным: Саша → Александр, Митя → Дмитрий.

Скрипт 6: какой статус у этого контакта?

Отдельный скрипт читал переписку и определял статус: уже сработались («Успех»), ещё в процессе («В работе»), человек отказал, или контакт просто не отвечает («Игнор»). Незачем писать людям, с которыми уже точно ничего не выйдет.

Скрипт 7: написать напоминание

Самый сложный. Он читал всю переписку, понимал контекст и через GPT генерировал текст сообщения. Не шаблонный, а живой — с упоминанием того, о чём мы говорили, с конкретным поводом написать.

Скрипт 8: отправить сообщение

Последний шаг. Брал готовые тексты из Notion и отправлял через Телеграм. С задержками, чтобы не получить бан. По одному, как будто это делает человек.

Скрипт, который пришлось написать неожиданно: с какого аккаунта этот человек?

У меня два Телеграм-аккаунта — рабочий и личный. И тут появляется неочевидная деталь: как бот поймет, с какого аккаунта писать клиенту? Будет странно, если вам прилетит сообщение о том, как вы раньше работали с другого аккаунта и в пустом диалоге. Надо было понять, где мы общались больше и где была последняя переписка.

Для этого надо было написать скрипт, который проходится по всей базе, каждый контакт проверяет в личном и рабочем аккаунте. Там где мы общались в последний раз и где больше сообщений — актуальные, значит ставим в поле «С какого аккаунта» пометку.

На первый взгляд — мелочь. На самом деле — фундамент. Без этого анализ диалога не отрабатывал корректно и отправленное сообщение было бы оторвано от реальности.

На этом первая рабочая сессия закончилась. Много маленьких рабочих функций — но целой системы ещё не было.

Вторая попытка: объединить маленькие части

Когда я вернулся к проекту, логика казалась очевидной: есть много маленьких работающих функций. Надо просто выстроить их в цепочку. Добавление из папок → куча функций анализа → генерация → отправка.

Я начал соединять. База кода росла. Функции тянули друг друга в разные стороны. Где-то перекрещивались логи, где-то дублировался код, где-то один модуль ломал другой. Цепочки не выходило — выходил клубок.

Я устал и снова остановился.

Третья попытка: четыре этапа

Когда я вернулся в третий раз, понял, в чём была проблема. Я пытался соединить мелкие кусочки — вместо того чтобы сначала определить крупные блоки и построить каждый до конца.

Я разбил всё на четыре этапа:

  1. импорт контактов из папок
  2. анализ диалогов,
  3. генерация сообщений,
  4. отправка.

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

Когда все четыре были готовы, я соединил их в одну систему. На этот раз всё встало на своё место.

Итоговая система

Вот что происходит каждый день — полностью без участия человека.

03:00 ночи. Импорт новых контактов

Раз в неделю система открывает Телеграм, заходит в настроенные папки и проверяет: есть ли новые люди, которых ещё нет в базе? Если есть — добавляет. Записывает имя, юзернейм, Телеграм ID, дату первого и последнего сообщения.

Параллельно смотрит историю диалога и определяет первичный статус: зачем этот человек писал? Это клиент или просто знакомый без рабочего контекста?

04:00 ночи. Сканирование базы

Система открывает Notion и ищет всех, кому пора написать. Критерий жёсткий: пять условий одновременно.

  1. Есть юзернейм в Телеграме — иначе не написать.
  2. Не стоит галочка «Исключён из рассылки».
  3. Статус не «Игнор», не «Неадекватные», не «Нет рабочего контекста» — таким людям писать незачем.
  4. Последний контакт был больше 60 дней назад — раньше беспокоить не нужно.
  5. Сообщение для отправки ещё не сгенерировано — не делать работу дважды.

05:00 ночи. Генерация сообщений

Для каждого человека из списка система идёт в Телеграм, читает переписку и передаёт её неронке. Нейронка читает последние 200 сообщений с человеком, подгружает все данные из его карточки в базе и на основании этого пишет сообщение напоминания.

11:00 утра. Отправка

Сгенерированные сообщения уходят адресатам. По одному. С рандомной паузой между отправками, чтобы не нарваться на блокировку от Телеграма. Максимум 25 сообщений в день.

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

Анализ диалога: что система понимает о каждом человеке

Это самая трудоёмкая часть проекта — и самая важная. Прежде чем генерировать сообщение, система должна понять, с кем она имеет дело. Человек купил и доволен? Отказал? Тянет время? Вообще перестал отвечать? Мы ему раньше напоминали о себе? Без этого понимания любое сообщение — выстрел вслепую.

Система читает последние 200 сообщений диалога. Но не все подряд — берёт первые 50 (чтобы понять, как всё начиналось) и последние 100 (чтобы видеть актуальное состояние). Весь текст обрезается до 15 000 символов — ровно столько нужно, чтобы ИИ не потерялся, но ничего важного не пропустил.

Что именно определяет анализ

Статус контакта. Главное поле — именно по нему система решает, писать человеку или нет. Все статусы делятся на три группы.

Финальные — система этим людям не пишет:

  • Успех — поработали, деньги получены.
  • Передал партнёрам — передал проект другому исполнителю.
  • Отказ — клиент отказался от сотрудничества.
  • Я отказал — сам отказал этому клиенту.
  • Игнор — несколько сообщений подряд без ответа дольше двух недель.
  • Неадекватные — проблемный клиент, с которым не хочу работать.
  • Нет рабочего контекста — знакомый, родственник, случайный чат без бизнес-темы.

Активные — идёт работа или переговоры:

  • Работаем — проект в процессе.
  • Обсуждаем детали — активные переговоры.
  • Делаем КП — готовится коммерческое предложение.
  • В ожидании решения — клиент думает.
  • Ждём доп. инфу — ждём данных от клиента.
  • Взять ОС или отзыв — проект сдан, нужно попросить отзыв.
  • Рекомендация и партнёрство — активный реферальный контакт.

Требуют напоминания — именно им система пишет:

  • Напомнить о себе — был контакт, потом тишина. Явного отказа не было.
  • Созвониться — нужен звонок, но тема не закрыта.

Тег — тип работы с клиентом.

  • Тильда (tilda) — сайт на Тильде
  • Геткурс (getcourse) — школа на Геткурсе
  • Вордпресс (wordpress) — сайт на WordPress
  • Битрикс (bitrix) — сайт на Битриксе
  • Тэплинк (taplink) — сайт на Тэплинке
  • UI/UX (design-uiux) — дизайн интерфейсов
  • Брендинг (design-brand) — фирменный стиль
  • Лендинг (landing) — одностраничный сайт
  • Разработка (coding) — кастомная разработка
  • Аудит (audit) — аудит сайта
  • Партнёры (partners) — реферальный контакт

Тег определяет, что попадёт в сообщение. Клиенту с Геткурсом — новости про Геткурс и виджеты. Клиенту с Тильдой — про Тильду. Информация про другие платформы до него не дойдёт.

Итог работы. Чем завершилось сотрудничество: успешный проект, передал другому исполнителю, клиент отказал или я отказал сам. Заполняется по результатам анализа переписки.

Причина отказа или паузы. Почему разговор оборвался. Система определяет одну из конкретных причин:

  • Цена — не устроила стоимость.
  • Другой специалист — выбрали кого-то другого.
  • Другая платформа — работают на платформе, с которой я не работаю.
  • Не подошёл продукт — задача не совпала с тем, что я делаю.
  • Недостаточно опыта — клиент посчитал, что у меня нет нужной экспертизы.
  • Неактуально — задача отпала сама по себе.
  • Отложили — отложили на потом, без конкретной даты.
  • Ушёл думать — сказал «подумаю» и пропал.
  • Тестят запуск — клиент ещё не запустился, не готов к работе.
  • Долго отвечали — потеряли интерес из-за задержки с нашей стороны.
  • Игнор — перестал отвечать без объяснений.
  • Возврат — клиент вернулся после паузы.

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

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

Источник. Откуда пришёл контакт: Рекомендации, Сайт, SEO, Телеграм, Вконтакте, Инстаграм, Youtube, Хабр фриланс, Биханс, Дрибл, Конференция, Оффлайн, Сайт-блог, Email рассылка, Курс, Cold Base. Позволяет понимать, какие каналы привлечения работают.

Правила, которые не даются ИИ на откуп

Чистый ИИ без ограничений ошибается. Слишком часто ставит «В работе» там, где давно всё закончилось. Или «Напомни» там, где человек три раза написал «нет». Поэтому в анализ встроены жёсткие правила.

Если в переписке была оплата — статус «Успех», и точка. Если человек написал что-то близкое к «нет, спасибо» — это отказ, а не «ещё думает». Если я отправил пять сообщений подряд без ответа и прошло больше двух недель — это «Игнор», без рассуждений.

Неопределённость тоже обрабатывается чётко: «подумаю» + тишина = «Напомни о себе». Вежливая неопределённость плюс молчание — это сигнал написать снова, а не ждать.

Почему система объясняет свои решения

ИИ не просто выдаёт ответ — он пишет, почему принял именно такое решение. «Ставлю статус „Напомни о себе“: клиент в апреле проявил интерес, в мае упомянул ограниченный бюджет, явного отказа не было, после июня тишина». Это видно в логах.

Зачем это нужно? Чтобы можно было проверить, правильно ли система понимает ситуацию. И чтобы, когда она ошибается, было понятно — не угадала или правило нужно уточнить.

Как система выбирает стратегию: реальный пример

Система не просто генерирует сообщение. Сначала она рассуждает: что известно об этом человеке, сколько раз уже писали, что сработает лучше всего сейчас.

Вот как это выглядит на практике.

Рассуждение системы

Последний контакт — июль 2025. Сейчас февраль 2026. Прошло около 7 месяцев. Это третье напоминание.

Три предыдущих напоминания уже были. Значит, «Контекст» и «Вопрос» — уже использовались. Стратегия «Чек-ин» — слишком нейтральная для семи месяцев молчания. Оптимальные варианты: «Чек-ин» или «Новинка».

Клиент работает на Геткурсе. В crm_context.md есть актуальный виджет для Геткурса — прогресс-бар с маскотом. Он решает задачу вовлечённости учеников, о которой клиент упоминал раньше. Выбираю стратегию Новинка.

Сгенерированное сообщение

Ольга, добрый день!

Вы упоминали, что хотите добавить шкалу прогресса и бейджики для учеников. Как раз появился новый виджет — [прогресс-бар с маскотом](https://remake.space/shop/tproduct/661 011 665−438 252 066 262-progress-bar-s-maskotom): персонаж меняется по мере того, как ученик набирает баллы за уроки. Для каждого уровня можно задать своё изображение и фразы — хорошо вписывается в геймификацию курса.

Если оформление школы ещё в планах — напишите, обсудим детали и когда удобно стартовать.

Детали, которые решают всё

Вот детали, которые делают систему рабочей.

Система понимает, что её игнорируют

Если я отправил пять сообщений подряд, а в ответ — тишина больше двух недель, система автоматически ставит статус «Игнор» и убирает этого человека из очереди. Больше не беспокоить.

Восемь стратегий напоминания — и никогда дважды одно и то же

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

  • Контекст — вспоминает конкретный разговор: «Ты тогда говорил про редизайн школы…»
  • Рекомендация — рассказывает про партнёрскую программу
  • Кейс — упоминает похожий проект: «Недавно сделали такое же для другой школы»
  • Новинка — сообщает о новой услуге или виджете
  • Вопрос — интересуется: «Как продвигается проект, о котором говорили?»
  • Сезон — привязывается к времени года или событию
  • Аудит — предлагает бесплатный разбор
  • Чек-ин — лёгкое касание без продажи, если уже несколько раз писали

При трёх и более напоминаниях система переключается только на «Чек-ин» — не давит, просто обозначает присутствие.

Новые услуги и допродажи — через один файл

Есть файл crm_context.md — обычный текстовый файл, который я редактирую руками. Туда я добавляю новые услуги и виджеты, интересные кейсы, изменения в прайсе.

Когда вышел новый виджет для Геткурса — я добавил строчку с описанием и ссылкой. На следующий же день система начала органично упоминать его в сообщениях клиентам с Геткурсом. Не агрессивно — «кстати, появился виджет, который решает то, о чём ты говорил». Никакой отдельной рассылки, никакого ручного труда.

Именно здесь живёт допродажа. Клиент когда-то заказал дизайн сайта. Прошло полгода. Система пишет ему напоминание — и в нужный момент упоминает новую услугу, которая логично продолжает то, что уже было сделано. Это не спам: сообщение строится вокруг его контекста, а новость про услугу — лишь деталь.

Каждый пункт в файле помечен тегом: этот виджет — только клиентам Геткурса, этот кейс — только тем, кто делает сайты. Система сама решает, кому что показывать. Добавил строчку — она сразу в работе.

Использование нескольких нейросетей: для анализа и написания сообщения

Для анализа используем дешевый DeepSeek, для написания сообщений дорогой Claude.

Сначала DeepSeek читает переписку, делает анализ диалога и добавляет контакт в базу. Когда нужно написать сообщение, включается Claude, так как у неё лучше получается писать сообщения и понимать контекст.

Стоимость анализа от Deepseek — ~$ 0.01, cтоимость сообщения от Claude — ~$ 0.04.

Обработка одного лида раз в 2 месяца: 4 рубля. Двадцать сообщений в день: 80 рублей в день. В месяц — 2400 рублей. За эти деньги бот напишет качественные сообщения 600 лидам и клиентам и предложит дополнительные услуги и товары.

Охренеть? Сам в шоке.

Форма обращения — всегда правильная

Система анализирует переписку на предмет «ты» и «Вы». Результат записывается в Notion. Сгенерированное сообщение автоматически использует правильную форму.

Это разница между «чувствует, что помнят» и «очевидный шаблон».

Защита от флуда и двойного запуска

Telegram не любит много запросов подряд. Если система замечает FloodWait, она автоматически делает паузу и продолжает потом. Задержки между запросами намеренно случайные: не 3 секунды ровно, а от 2 до 5 — поведение похоже на человеческое.

На сервере задачи запускаются по расписанию. Чтобы предыдущая задача не пересекалась со следующей, система создаёт файл-замок: пока он существует, вторая копия не запустится.

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

Я тестировал всю цепочку от добавления людей из папки в Notion до написания сообщения. На двадцати тестовых контактах.

На двадцати тестовых контактах теги и статусы считались верно во всех случаях. Сообщения получились разные — каждое под конкретную ситуацию, не шаблон.

Первые дни — запуск локально. Потом деплой на сервер и перевод в автоматический режим.

Расписание на сервере

  • 03:00 по Москве — импорт новых контактов из Телеграм-папок (раз в неделю)
  • 04:00 по Москве — сканирование базы: кому пора написать?
  • 05:00 по Москве — генерация сообщений через ИИ
  • 11:00 по Москве — отправка: люди уже за компьютерами

Шестичасовой интервал перед отправкой намеренный: если что-то сломается при генерации, есть время заметить и остановить отправку.

Что в итоге

Три попытки, потрачен календарный год на завершение работы. Система, которая:

  • сама знает, кому пора написать;
  • читает переписку и понимает контекст;
  • никогда не пишет одинаково дважды;
  • не трогает тех, кто явно не хочет общаться;
  • использует правильное обращение — ты или Вы;
  • пишет о том, что актуально для конкретного человека;
  • делает всё это ночью, пока я сплю.

База из тысячи человек перестала быть мёртвым архивом. Она стала живым каналом — который работает постоянно, не устаёт и не забывает ни о ком.

Теперь, когда нет заказов, не нужно идти искать новых клиентов. Нужно просто подождать до 11 утра.