Автоматизация рассылок ·

Mailer: холодные письма под каждый бизнес — не шаблон, проходят фильтры

Mailer пишет каждое письмо под конкретный бизнес и ведёт себя как живой человек: рабочее расписание, паузы, реальные ящики. Проходит фильтры — и читается как личное.

С чем пришла задача

Привет! С задачей пришёл клиент — оптовый поставщик, который продаёт в B2B. Он ведёт холодные рассылки, чтобы выходить на покупателей и партнёров для своего бизнеса. Запрос был чёткий: письма без шаблонов и без ручного разбора каждого сайта, каждое — про конкретный бизнес получателя. И чтобы письмо выглядело так, будто его написал и отправил живой человек: именно это позволяет пройти фильтры и получить ответ. Эту систему мы собрали под него.

Холодные письма работают ровно в одном случае — когда получатель читает про свой бизнес. Не «мы поставляем оптом и хотим предложить вам…», а «я зашёл на ваш сайт и увидел, что вы принимаете заявки через кнопку “перезвоните нам”». Разница читается с первой строки.

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

Что было сложно:

  • На каждую компанию нужно отдельно изучать сайт: что за бизнес, что там работает, что предложить
  • Написать тон «с уважением к тому, что уже построено» — не в каждом черновике получается с первой попытки
  • Следить, чтобы письма не уходили слишком часто с одного ящика и не попадали под фильтры
  • Не потерять контроль: когда процесс автоматизируется, легко начать отправлять то, что клиент не одобрял
Воронка пайплайна рассылки и таблица лидов по этапам
Вкладка «Рассылка»: воронка показывает, где сейчас находится каждая компания из базы — от первичного сбора до кнопки «Отправить». Часть ждёт назначения палитры, часть уже её получила.

Как это работает

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

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

Приборная панель кампании

Первое, что видит клиент при входе, — дашборд. Не таблица лидов, не настройки — именно сводка состояния кампании в реальном времени.

Отправка по веткам. Две карточки — русская и международная ветка — раздельно. В каждой: сколько писем ушло сегодня, сколько ещё уйдёт до конца дня в рамках дневного лимита, и прогноз на ближайшие дни с учётом настроенного расписания. Видно темп каждой ветки отдельно — если что-то замедлилось или остановилось, это видно сразу.

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

Мониторинг входящей почты. Переключатель «неделя / месяц» — и счётчики по типам входящих писем: постоянные отказы, временные ошибки, отклонения как спам, автоответы, живые ответы людей. Отдельно подсвечены сигналы технических проблем на стороне отправителя — это главный индикатор «не горит ли репутация». Всё обновляется само, пока вкладка открыта.

Дашборд — контрольный пункт: за минуту видно, идёт ли кампания в штатном режиме или нужно разобраться.

Дашборд с двумя ветками, палитрами и мониторингом входящих
Дашборд в живом состоянии: обе ветки в работе, статистика входящих за месяц показывает постоянные отказы, живые ответы и сигналы спам-фильтров. Кампания в штатном режиме.

Источники лидов: три разных канала в одном месте

Сбор запускается прямо из интерфейса. Три варианта:

  • Геокаталоги — выбираем источник (2ГИС, Яндекс.Карты или Google Maps для локальных компаний), нишу и город. Данные собирают Apify-акторы и приходят фоново через webhook, пока клиент занимается другим — запустил и ушёл. Результат появляется в таблице автоматически, до этого крутится индикатор ожидания.
  • CSV-файл — загружаем любой готовый список контактов.
  • PDF-каталог выставки — загружаем файл, система читает его постранично через pdfjs: находит название компании, контакт, сайт если есть. Бумажный справочник становится базой контактов без ручного переноса. Сразу при загрузке выбираем набор предложений, который пойдёт этой волне.

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

Вкладка Парсинг с формами запуска по 2ГИС и Google Maps
Два рынка в одном интерфейсе: слева запускаем сбор по нише в 2ГИС для русской ветки, справа — Google Maps с геотаргетингом по стране и городу для международной.

Разведка сайта без продуктовой призмы

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

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

А зачем так усложнять — два отдельных агента вместо одного, который и смотрит сайт, и выбирает что предложить? Ответ прямой: агент, который уже знает что продавать, будет «видеть» на сайте именно это — даже если там нет поводов.

Тон разведки — позитивно-нейтральный. Промпт содержит жёсткий запрет: фиксируем что на сайте уже есть, не чего не хватает. Формулировки «нет X», «не хватает Y», «устарело» — запрещены явно. Даже замаскированный негатив «X есть, но Y нет» — тоже запрещён. Получатель должен почувствовать уважение к тому, что он построил, а не разбор недостатков.

Только на следующем шаге подключается второй агент — он видит и наблюдения о компании, и палитру предложений клиента, и находит точки пересечения. Для каждого рекомендованного предложения он формулирует «улику» с сайта: не «нет онлайн-записи», а «на сайте только номер телефона и кнопка “перезвоните нам”». Эта формулировка потом дословно попадает в письмо.

Минимум ИИ — максимум кода

Если объяснять просто: языковой модели мы доверяем только то, что действительно требует суждения — понять текст, связать наблюдения, написать живым языком. Всё остальное делает жёсткий код. Потому что то, что зафиксировано в коде, модель не может переврать. И каждый вызов модели стоит денег.

Мы выбрали третий путь — гибридный. Не стали строить всё с нуля, но и не арендовали чужой сервис рассылок: взяли готовые инструменты там, где они сильны — LLM для суждений, Apify для сбора лидов, обычный SMTP для доставки, Readability для чтения сайтов. А кастомную логику написали там, где важна точность: анти-повтор первого предложения в письме, цензор, защита от дублей при перезапуске сервера. Это дешевле во владении, чем чужой SaaS с ежемесячной данью, и надёжнее — потому что мы знаем каждую часть.

Модели подобрали по цене задачи: дорогую Claude Sonnet — на анализ сайта, написание и цензуру письма, где важно качество; дешёвую Haiku — на первичную квалификацию и предварительное ревью; GPT-4.1-mini — на подбор предложений. Все запросы идут через OpenRouter единым ключом. Принцип один: дорогую модель — только туда, где она реально нужна.

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

Цензор и редполитика письма

Языковая модель, которая пишет письмо, работает в жёстких рамках. Список запретов в промпте — не «постарайся», а «никогда» и «запрещено»:

  • никакого CTA внутри тела письма («напишите мне», «обсудим», «свяжитесь»)
  • никаких контактов в теле — их добавляет код автоматически
  • никаких выдуманных цифр, сроков и кейсов
  • никаких клише «под ключ», «комплексный подход»
  • только «я», не «мы» и не «наша команда» — письмо должно читаться как личная записка одного живого человека, менеджера со стороны клиента
  • никаких ссылок — ссылки в холодном письме немедленно срабатывают как спам-сигнал

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

После генерации цензор-агент читает черновик и принимает одно из трёх решений: одобрить, отправить на точечную правку (меняет конкретное слово или предложение, не переписывает с нуля), или вернуть на полную регенерацию — например, если агент написал «на вашем сайте…» у компании, у которой сайта нет.

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

Имитация живого человека: расписание, паузы и ящики

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

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

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

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

Интеграция с обычной почтой — письмо уходит через прямой SMTP-протокол и сразу копируется через IMAP в папку «Отправленных» того же ящика. Никакого стороннего рассыльщика — обычный почтовый ящик, просто управляется автоматически. Вся переписка видна в Apple Mail, Outlook, Thunderbird — как обычная деловая корреспонденция. Ответ получателя приходит туда же. Если клиент хочет ответить сам — пишет прямо из почтовика.

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

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

Настройки расписания и пауз для двух веток рассылки
Рабочие часы, лимиты и паузы настроены раздельно для каждой ветки: будние дни, свой дневной потолок, случайная пауза в несколько десятков минут между письмами.
Папка «Отправленные» русской ветки с персонализированными письмами по нишам
Русская ветка в обычном почтовом клиенте: письма разным компаниям, каждое с персональной темой про конкретный бизнес. Выглядит как рабочая переписка, а не рассылка.
Папка Sent международной ветки в Apple Mail с английскими письмами по нишам
Международная ветка в Apple Mail (скриншот с тестовой версии системы): темы заточены под нишу получателя, открытое письмо справа начинается с наблюдения о конкретном магазине.

Палитры предложений — рычаг «что продвигаем прямо сейчас»

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

Палитра — это список предложений: каждая строка — одно товарное направление. Можно вставить список прямо из чата с ИИ или из документа — символы форматирования уберутся автоматически. Для каждой ветки (русской и международной) можно назначить дефолтную палитру. Перед запуском волны — выбираем нужную, и именно из неё система будет подбирать предложения под каждого получателя.

Это рычаг смены акцентов: хочет клиент в этом месяце продвигать одни позиции в медицинской нише — создаёт нужную палитру и назначает её этой волне. Без изменения промптов и без перезапуска.

Вкладка Палитры с двумя карточками предложений для EN и RU веток
Две дефолтные палитры — одна для русской ветки, другая для международной. В каждой десятки строк с описаниями предложений; перед новой волной можно заменить палитру без правки промптов.

Центр управления: одна панель на всю кампанию

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

Дневной лимит. Для каждой ветки — мягкий потолок: сколько писем максимум уйдёт за день. Мягкий — потому что случайные паузы могут сократить фактическое число. Лимит — ориентир, не жёсткий дедлайн. Вместе с расписанием и паузами это третий инструмент управления темпом.

Режим: ручной или автоматический. Один тумблер переключает всю систему между двумя режимами. В ручном режиме — клиент сам одобряет каждое письмо перед отправкой. В автоматическом — вместо него работает цензор-агент: он читает письмо, одобряет, при необходимости точечно правит, при серьёзных проблемах отправляет на полную регенерацию. Переключение между режимами — вопрос одной секунды.

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

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

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

Репутация почты — фоновый контроль

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

Каждые 15 минут система читает входящую почту по протоколу IMAP — только читает, ничего не трогает. Каждое входящее письмо классифицируется по техническим заголовкам без языковых моделей: постоянный отказ, временная ошибка, отклонено как спам, автоответ, живой ответ человека. Классификатор работает по RFC-кодам — надёжно и бесплатно, даже если LLM-сервисы недоступны.

Отдельно фиксируется причина: вина лида (несуществующий адрес) или техническая проблема на нашей стороне (настройки почтовой аутентификации, репутация домена-отправителя). Это разные ситуации и разные действия.

Домены с повторными отказами система предлагает добавить в блок-фильтр — клиент одобряет или отклоняет. Блок-фильтр применяется при следующем импорте: такие адреса просто не попадут в базу.

Вкладка Блокировки с автоматически заблокированным проблемным доменом
Система сама добавила проблемный домен в блок-фильтр после постоянных ошибок доставки. Раздел предложений пуст — все предыдущие уже одобрены или отклонены.

Что изменилось

Утром клиент открывает интерфейс и видит список готовых писем. Система уже сделала разведку, подобрала предложения, написала черновики — задача клиента: просмотреть и нажать «Одобрить» или «Перегенерировать».

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

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

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

Это не «ИИ работает за тебя» — это «ИИ берёт аналитику и черновики, а решения принимает человек».

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

Задел на будущее

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

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

Новые источники лидов. Сейчас три геокаталога и PDF-каталоги выставок. Логика обработки не привязана к конкретному источнику — добавить новый канал (отраслевой справочник, список участников конференции) можно без переработки остального конвейера.

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

Держим связь, команда Grumete.

Похожая задача?

Напишите нам прямо сейчас, постараемся вам помочь.