Mailer: холодные письма под каждый бизнес — не шаблон, проходят фильтры
Mailer пишет каждое письмо под конкретный бизнес и ведёт себя как живой человек: рабочее расписание, паузы, реальные ящики. Проходит фильтры — и читается как личное.
С чем пришла задача
Привет! С задачей пришёл клиент — оптовый поставщик, который продаёт в B2B. Он ведёт холодные рассылки, чтобы выходить на покупателей и партнёров для своего бизнеса. Запрос был чёткий: письма без шаблонов и без ручного разбора каждого сайта, каждое — про конкретный бизнес получателя. И чтобы письмо выглядело так, будто его написал и отправил живой человек: именно это позволяет пройти фильтры и получить ответ. Эту систему мы собрали под него.
Холодные письма работают ровно в одном случае — когда получатель читает про свой бизнес. Не «мы поставляем оптом и хотим предложить вам…», а «я зашёл на ваш сайт и увидел, что вы принимаете заявки через кнопку “перезвоните нам”». Разница читается с первой строки.
Писать такие письма вручную — час на одно. Отправлять шаблон — письмо уйдёт в спам или будет проигнорировано, а заодно постепенно сожжёт репутацию почтового домена. Классическая вилка: качественно — медленно, быстро — не работает и вредит. Клиенту нужен был инструмент, который берёт на себя разведку и черновик, но при этом письмо выглядит так, будто его написал и отправил живой человек.
Что было сложно:
- На каждую компанию нужно отдельно изучать сайт: что за бизнес, что там работает, что предложить
- Написать тон «с уважением к тому, что уже построено» — не в каждом черновике получается с первой попытки
- Следить, чтобы письма не уходили слишком часто с одного ящика и не попадали под фильтры
- Не потерять контроль: когда процесс автоматизируется, легко начать отправлять то, что клиент не одобрял
Как это работает
Мы собрали систему из нескольких узкоспециализированных агентов — каждый видит только свой участок задачи. Ни один не делает «всё сразу», и это сделано намеренно: один агент, который одновременно анализирует сайт, выбирает что предложить и пишет письмо, в каждой из этих задач будет ошибаться незаметно.
Плюс три точки, где в процесс возвращается клиент: одобрить компанию, выбрать набор предложений, просмотреть письмо перед отправкой. Это не ограничение — это условие, при котором системе вообще можно доверять.
Приборная панель кампании
Первое, что видит клиент при входе, — дашборд. Не таблица лидов, не настройки — именно сводка состояния кампании в реальном времени.
Отправка по веткам. Две карточки — русская и международная ветка — раздельно. В каждой: сколько писем ушло сегодня, сколько ещё уйдёт до конца дня в рамках дневного лимита, и прогноз на ближайшие дни с учётом настроенного расписания. Видно темп каждой ветки отдельно — если что-то замедлилось или остановилось, это видно сразу.
Использование палитр. Следом — сводка по наборам предложений: какие палитры сейчас активны в каждой ветке и насколько задействованы. Помогает видеть, не ушла ли кампания в одну узкую нишу.
Мониторинг входящей почты. Переключатель «неделя / месяц» — и счётчики по типам входящих писем: постоянные отказы, временные ошибки, отклонения как спам, автоответы, живые ответы людей. Отдельно подсвечены сигналы технических проблем на стороне отправителя — это главный индикатор «не горит ли репутация». Всё обновляется само, пока вкладка открыта.
Дашборд — контрольный пункт: за минуту видно, идёт ли кампания в штатном режиме или нужно разобраться.
Источники лидов: три разных канала в одном месте
Сбор запускается прямо из интерфейса. Три варианта:
- Геокаталоги — выбираем источник (2ГИС, Яндекс.Карты или Google Maps для локальных компаний), нишу и город. Данные собирают Apify-акторы и приходят фоново через webhook, пока клиент занимается другим — запустил и ушёл. Результат появляется в таблице автоматически, до этого крутится индикатор ожидания.
- CSV-файл — загружаем любой готовый список контактов.
- PDF-каталог выставки — загружаем файл, система читает его постранично через pdfjs: находит название компании, контакт, сайт если есть. Бумажный справочник становится базой контактов без ручного переноса. Сразу при загрузке выбираем набор предложений, который пойдёт этой волне.
После попадания в базу каждый лид проходит первичный отбор автоматически: проверяется реальность почтового домена через DNS, а нерелевантные получатели отсеиваются языковой моделью по соответствию нише.
Разведка сайта без продуктовой призмы
Агент, который изучает сайт компании, намеренно не знает, какие предложения у клиента. Он видит только текст сайта и одну задачу: зафиксировать что там есть, что работает, найти один конкретный факт для зачина письма. Никакого подгона наблюдений под продукт.
Представьте следователя, которому дали задание описать квартиру — не оценивать, просто зафиксировать что там есть. Он пишет рапорт, не зная, кто его заказал. Именно поэтому рапорт честный. Если бы следователь знал, что продаётся охранная сигнализация — он бы «видел» только незакрытые окна.
А зачем так усложнять — два отдельных агента вместо одного, который и смотрит сайт, и выбирает что предложить? Ответ прямой: агент, который уже знает что продавать, будет «видеть» на сайте именно это — даже если там нет поводов.
Тон разведки — позитивно-нейтральный. Промпт содержит жёсткий запрет: фиксируем что на сайте уже есть, не чего не хватает. Формулировки «нет X», «не хватает Y», «устарело» — запрещены явно. Даже замаскированный негатив «X есть, но Y нет» — тоже запрещён. Получатель должен почувствовать уважение к тому, что он построил, а не разбор недостатков.
Только на следующем шаге подключается второй агент — он видит и наблюдения о компании, и палитру предложений клиента, и находит точки пересечения. Для каждого рекомендованного предложения он формулирует «улику» с сайта: не «нет онлайн-записи», а «на сайте только номер телефона и кнопка “перезвоните нам”». Эта формулировка потом дословно попадает в письмо.
Минимум ИИ — максимум кода
Если объяснять просто: языковой модели мы доверяем только то, что действительно требует суждения — понять текст, связать наблюдения, написать живым языком. Всё остальное делает жёсткий код. Потому что то, что зафиксировано в коде, модель не может переврать. И каждый вызов модели стоит денег.
Мы выбрали третий путь — гибридный. Не стали строить всё с нуля, но и не арендовали чужой сервис рассылок: взяли готовые инструменты там, где они сильны — LLM для суждений, Apify для сбора лидов, обычный SMTP для доставки, Readability для чтения сайтов. А кастомную логику написали там, где важна точность: анти-повтор первого предложения в письме, цензор, защита от дублей при перезапуске сервера. Это дешевле во владении, чем чужой SaaS с ежемесячной данью, и надёжнее — потому что мы знаем каждую часть.
Модели подобрали по цене задачи: дорогую Claude Sonnet — на анализ сайта, написание и цензуру письма, где важно качество; дешёвую Haiku — на первичную квалификацию и предварительное ревью; GPT-4.1-mini — на подбор предложений. Все запросы идут через OpenRouter единым ключом. Принцип один: дорогую модель — только туда, где она реально нужна.
Примеры того, что делает код, а не ИИ: фразы-представления в начале письма, переходные фразы между блоками, прощальные строки — берутся случайным образом из фиксированных наборов прямо в коде. ИИ получает готовую фразу и вставляет её дословно. Это даёт вариативность — два письма из одной волны не похожи друг на друга — без риска, что модель что-то переформулирует не так. Подпись и контакты тоже вшиты в код: даже если агент попытается написать свой вариант, он вырезается и заменяется правильным блоком.
Цензор и редполитика письма
Языковая модель, которая пишет письмо, работает в жёстких рамках. Список запретов в промпте — не «постарайся», а «никогда» и «запрещено»:
- никакого CTA внутри тела письма («напишите мне», «обсудим», «свяжитесь»)
- никаких контактов в теле — их добавляет код автоматически
- никаких выдуманных цифр, сроков и кейсов
- никаких клише «под ключ», «комплексный подход»
- только «я», не «мы» и не «наша команда» — письмо должно читаться как личная записка одного живого человека, менеджера со стороны клиента
- никаких ссылок — ссылки в холодном письме немедленно срабатывают как спам-сигнал
Здесь стоит отметить контраст: этот кейс мы рассказываем от лица команды, но сама система пишет письма от первого лица одного человека — от имени клиента. Так и задумано: получатель должен почувствовать живого собеседника, а не рассылку «от компании».
После генерации цензор-агент читает черновик и принимает одно из трёх решений: одобрить, отправить на точечную правку (меняет конкретное слово или предложение, не переписывает с нуля), или вернуть на полную регенерацию — например, если агент написал «на вашем сайте…» у компании, у которой сайта нет.
Имитация живого человека: расписание, паузы и ящики
Спам-фильтры и люди одинаково реагируют на признаки автоматической рассылки: письма в три часа ночи, пулемётная очередь раз в двадцать секунд, все письма с одного адреса. Система устроена так, чтобы эти признаки исключить.
Расписание — настраивается раздельно для русской и международной ветки. Выбираем дни недели и часовой коридор. Письма уходят только в рабочие часы — как у сотрудника, не у сервера, который работает круглосуточно.
Паузы — между письмами выбирается случайное время из настраиваемого диапазона. Не раз в двадцать секунд, а как у человека: написал, отвлёкся, потом следующее.
Несколько ящиков — система сама ротирует между почтовыми аккаунтами по принципу равной нагрузки, не перегружая один адрес.
Интеграция с обычной почтой — письмо уходит через прямой SMTP-протокол и сразу копируется через IMAP в папку «Отправленных» того же ящика. Никакого стороннего рассыльщика — обычный почтовый ящик, просто управляется автоматически. Вся переписка видна в Apple Mail, Outlook, Thunderbird — как обычная деловая корреспонденция. Ответ получателя приходит туда же. Если клиент хочет ответить сам — пишет прямо из почтовика.
Русская и международная ветки живут в разных почтовых ящиках и разных клиентах: российские письма — в одном ящике, английские — в другом. Обе папки «Отправленных» выглядят как обычная деловая почта — никаких признаков, что за ними стоит система.
Расписание, паузы, реальные ящики, папка «Отправленных» — всё это вместе даёт одно: письмо выглядит так, будто его написал и отправил живой человек. Не потому что это приятно. А потому что именно это позволяет пройти фильтры и получить ответ.
Палитры предложений — рычаг «что продвигаем прямо сейчас»
Набор предложений, которые система предлагает в письмах, хранится не в настройках где-то в глубине — это отдельная сущность, которую клиент редактирует в интерфейсе.
Палитра — это список предложений: каждая строка — одно товарное направление. Можно вставить список прямо из чата с ИИ или из документа — символы форматирования уберутся автоматически. Для каждой ветки (русской и международной) можно назначить дефолтную палитру. Перед запуском волны — выбираем нужную, и именно из неё система будет подбирать предложения под каждого получателя.
Это рычаг смены акцентов: хочет клиент в этом месяце продвигать одни позиции в медицинской нише — создаёт нужную палитру и назначает её этой волне. Без изменения промптов и без перезапуска.
Центр управления: одна панель на всю кампанию
Когда нужно сменить темп, поменять режим или добавить свежее предложение под нишу — открывается одна вкладка. Расписание, лимиты, режим работы, контент писем, ящики — всё здесь, всё меняется на лету, без перезапуска.
Дневной лимит. Для каждой ветки — мягкий потолок: сколько писем максимум уйдёт за день. Мягкий — потому что случайные паузы могут сократить фактическое число. Лимит — ориентир, не жёсткий дедлайн. Вместе с расписанием и паузами это третий инструмент управления темпом.
Режим: ручной или автоматический. Один тумблер переключает всю систему между двумя режимами. В ручном режиме — клиент сам одобряет каждое письмо перед отправкой. В автоматическом — вместо него работает цензор-агент: он читает письмо, одобряет, при необходимости точечно правит, при серьёзных проблемах отправляет на полную регенерацию. Переключение между режимами — вопрос одной секунды.
Дополнительный текст к письму. Самая точечная настройка и при этом одна из самых влиятельных. В конце каждого письма, перед подписью, система добавляет произвольный текст, который клиент вписывает сам — отдельно для русской и международной ветки. Сюда идёт свежее релевантное предложение под нишу текущей волны: одна-две фразы про актуальную позицию или условие, которое хочется подсветить именно этой группе получателей. Это живой акцент, привязанный к конкретному периоду и нише — не вечный шаблон «у нас богатый ассортимент». Текст обновляется раз в волну, без правки промптов и без перезапуска системы.
Карусель ящиков. Включение и список аккаунтов по каждой ветке — тоже здесь. Подробнее об этом в разделе про имитацию живого человека выше.
Репутация почты — фоновый контроль
Холодные письма умеют тихо сжечь репутацию почтового ящика — и узнаёшь об этом, только когда письма уже давно уходят в спам. Система следит за этим фоново, пока клиент занимается другим.
Каждые 15 минут система читает входящую почту по протоколу IMAP — только читает, ничего не трогает. Каждое входящее письмо классифицируется по техническим заголовкам без языковых моделей: постоянный отказ, временная ошибка, отклонено как спам, автоответ, живой ответ человека. Классификатор работает по RFC-кодам — надёжно и бесплатно, даже если LLM-сервисы недоступны.
Отдельно фиксируется причина: вина лида (несуществующий адрес) или техническая проблема на нашей стороне (настройки почтовой аутентификации, репутация домена-отправителя). Это разные ситуации и разные действия.
Домены с повторными отказами система предлагает добавить в блок-фильтр — клиент одобряет или отклоняет. Блок-фильтр применяется при следующем импорте: такие адреса просто не попадут в базу.
Что изменилось
Утром клиент открывает интерфейс и видит список готовых писем. Система уже сделала разведку, подобрала предложения, написала черновики — задача клиента: просмотреть и нажать «Одобрить» или «Перегенерировать».
Каждое письмо про конкретный бизнес. Первый абзац — наблюдение с сайта компании. Получатель читает про себя.
Ответы приходят в обычную почту — туда же, где отправленные письма. Переписка видна как деловая корреспонденция, не в каком-то отдельном инструменте. На ответ получателя клиент отвечает прямо из почтовика.
Контроль при этом остался у клиента. Он знает каждое письмо, которое отправила система. Он одобряет каждую новую волну и видит, что система предлагает заблокировать.
Это не «ИИ работает за тебя» — это «ИИ берёт аналитику и черновики, а решения принимает человек».
Две ветки — русская и международная — работают одновременно и независимо. Каждая со своими ящиками, расписанием, палитрой, языком и тоном. Клиент ведёт локальную и зарубежную кампанию параллельно, не переключаясь между инструментами.
Задел на будущее
Три ручных точки в системе — одобрение лидов, выбор палитры, ревью письма — не случайные остановки, а осознанные точки, где решение остаётся за клиентом. По мере накопления статистики каждую из них можно сделать умнее.
Автоподбор палитры. Сейчас набор предложений назначается вручную под каждую волну. Следующий шаг: система видит нишу и профиль компании и предлагает, какая палитра подойдёт — клиент подтверждает или меняет. Данных для этого уже достаточно.
Новые источники лидов. Сейчас три геокаталога и PDF-каталоги выставок. Логика обработки не привязана к конкретному источнику — добавить новый канал (отраслевой справочник, список участников конференции) можно без переработки остального конвейера.
Постепенное расширение авто-режима ревью. Цензор уже умеет одобрять и точечно исправлять сам — тумблер «Режим работы» в настройках переводит систему на автопилот в любой момент. По мере накопления статистики — видеть, в каких нишах и ситуациях цензор работает надёжно, и постепенно расширять его автономию там, где доверие накоплено.
Держим связь, команда Grumete.