Что получится в результате
Соберем ИИ-агента для холодных B2B-продаж, который не “спамит всем подряд”, а работает как контролируемый outbound-процесс: берет ICP, подбирает компании, проверяет стоп-листы, ищет контакты, обогащает данные, считает fit score, готовит research note, пишет персонализированный черновик письма, отправляет спорные контакты на approval, ставит лидов в кампанию и записывает ответы в CRM.
Первая рабочая версия будет делать так:
- правила ICP хранятся в `icp_rules`;
- источники поиска лежат в `prospect_sources`;
- компании попадают в `company_queue`;
- enriched-данные компаний пишутся в `company_enrichment`;
- контакты попадают в `contact_queue`;
- проверка CRM-дублей пишется в `crm_match_log`;
- стоп-листы и отписки хранятся в `suppression_list`;
- правила безопасности outreach лежат в `outbound_policy`;
- fit score сохраняется в `prospect_scores`;
- заметки для персонализации пишутся в `research_notes`;
- шаблоны сообщений лежат в `message_templates`;
- черновики писем пишутся в `outreach_drafts`;
- sequence steps хранятся в `sequence_steps`;
- спорные письма уходят в `approval_queue`;
- готовые лиды попадают в `campaign_queue`;
- отправленные касания пишутся в `touch_log`;
- ответы попадают в `reply_inbox`;
- возражения сохраняются в `objection_log`;
- CRM-обновления пишутся в `crm_updates`;
- все действия фиксируются в `audit_log`;
- ошибки попадают в `error_log`;
- weekly report показывает качество outbound.
В первой версии агент не должен покупать базы, обходить отписки, писать по личным адресам без правил, обещать скидки, имитировать человека, массово отправлять письма без лимитов и запускать кампании без проверки. Цель MVP - качество списка, контроль рисков и черновики, которые менеджер может быстро подтвердить.
Что понадобится
- n8n Cloud или self-hosted n8n.
- Google Sheets для управляющих таблиц.
- CRM: HubSpot, amoCRM, Bitrix24, Pipedrive или другая.
- Prospecting/enrichment: Apollo, Clay, Clearbit, встроенные списки или ручная CSV-выгрузка.
- Outreach tool: Lemlist, Instantly, Smartlead, HubSpot Sequences или другой сервис.
- Почтовый домен, настроенный для outbound отдельно от основного домена.
- API-ключ LLM-провайдера.
- Список запретов: кому нельзя писать, какие темы нельзя обещать, какие сегменты исключить.
- Человек, который подтверждает запуск первой кампании.
Шаг 1. Выберите один outbound-сценарий
Не начинайте с “найти всех потенциальных клиентов”. Это быстро превращается в мусорный список.
Для первого MVP выберите один сценарий:
- найти компании из одной отрасли;
- найти компании с конкретной технологией на сайте;
- найти компании, которые недавно нанимают нужную роль;
- найти компании после события: раунд, запуск, вакансия, релокация, тендер;
- найти похожих клиентов на текущих лучших клиентов;
- подготовить список для партнерского outreach;
- запустить мягкий follow-up по старой базе;
- проверить качество существующего outbound-листа.
Самый безопасный старт - 50-100 компаний в одном ICP и без автоматической отправки.
Проверка: сценарий описывается одной фразой, например: `найти SaaS-компании 50-300 сотрудников, которым нужна автоматизация поддержки`.
Шаг 2. Опишите ICP
ICP нужен до поиска контактов. Без ICP агент будет красиво писать нерелевантным людям.
В `icp_rules` добавьте колонки:
rule_id
segment
field
condition
value
points
is_required
reason
is_active
updated_at
Пример:
ICP-001 | saas_support | industry | equals | SaaS | 20 | yes | Целевой сегмент
ICP-002 | saas_support | employee_count | between | 50-300 | 15 | yes | Достаточный размер команды
ICP-003 | saas_support | support_volume | greater_than | 1000/month | 20 | no | Есть нагрузка поддержки
ICP-004 | saas_support | country | in | RU,KZ,BY | 5 | no | Подходящий рынок
ICP-005 | saas_support | excluded_industry | in | gambling,adult,crypto | -100 | yes | Исключенный сегмент
Проверка: каждый критерий можно применить к компании и объяснить score.
Шаг 3. Создайте таблицу проекта
Создайте Google Sheet:
Outbound sales agent
Добавьте листы:
settings
icp_rules
prospect_sources
company_queue
company_enrichment
contact_queue
crm_match_log
suppression_list
outbound_policy
prospect_scores
research_notes
message_templates
outreach_drafts
sequence_steps
approval_queue
campaign_queue
touch_log
reply_inbox
objection_log
crm_updates
audit_log
weekly_report
error_log
Проверка: n8n может читать и писать в каждый лист.
Шаг 4. Заполните settings
В `settings` добавьте колонки:
key
value
description
updated_at
Заполните минимум:
default_segment | saas_support | первый ICP-сегмент
daily_new_contacts_limit | 25 | максимум новых контактов в день
daily_send_limit | 20 | максимум отправок в день на домен
auto_send_enabled | false | отправка только после approval
require_crm_dedupe | true | без CRM-проверки не писать
require_suppression_check | true | без стоп-листа не писать
min_fit_score | 70 | минимум для кампании
default_language | ru | язык письма
approval_channel | telegram | куда отправлять согласование
Проверка: автоотправка выключена, лимиты включены.
Шаг 5. Опишите источники prospecting
В `prospect_sources` добавьте колонки:
source_id
source_type
query
segment
owner_email
status
last_run_at
created_at
`source_type`:
apollo_search
clay_table
manual_csv
crm_lost_deals
website_list
event_attendees
linkedin_export
Пример:
SRC-001 | apollo_search | SaaS, 50-300 employees, customer support | saas_support | salesops@company.ru | active
Проверка: понятно, откуда пришла каждая компания.
Шаг 6. Настройте company_queue
`company_queue` хранит компании до enrichment и scoring.
Колонки:
company_id
source_id
company_name
domain
country
industry
employee_count
linkedin_url
status
created_at
updated_at
Статусы:
new
enriching
scoring
rejected
ready_for_contacts
duplicate
suppressed
error
Проверка: одна компания равна одной строке, а `domain` обязателен для проверки дублей.
Шаг 7. Сделайте дедупликацию компаний
Перед enrichment проверьте:
- `domain` уже есть в `company_queue`;
- `domain` уже есть в CRM;
- компания уже в active deal;
- компания есть в `suppression_list`;
- компания была в кампании последние 90 дней.
Правило:
если domain найден в active deal или suppression_list, статус company_queue = suppressed
Проверка: агент не пишет компании, с которой уже работает менеджер.
Шаг 8. Настройте company_enrichment
В `company_enrichment` добавьте колонки:
company_id
domain
website_title
website_summary
industry
employee_count
country
city
tech_stack
funding_stage
hiring_signals
support_signals
recent_events
source_payload_json
created_at
Что собирать:
- отрасль;
- размер компании;
- страна;
- стек технологий;
- вакансии;
- новости или события;
- признаки нагрузки поддержки;
- похожесть на ICP.
Проверка: для компании есть факты, которые можно использовать в scoring и персонализации.
Шаг 9. Найдите контакты
В `contact_queue` добавьте колонки:
contact_id
company_id
email
first_name
last_name
job_title
seniority
department
linkedin_url
email_status
status
created_at
updated_at
Ищите не “любого email”, а роли:
- Head of Support;
- Customer Support Lead;
- COO;
- Head of Customer Success;
- VP Operations;
- Founder для малых компаний;
- Sales/RevOps только для sales-oriented оффера.
Проверка: у каждого контакта есть роль, связанная с проблемой, которую решает продукт.
Шаг 10. Проверьте email status
Не ставьте в кампанию адреса без проверки.
Статусы:
verified
likely
unknown
invalid
catch_all
personal_email
role_email
Правила:
- `verified` можно готовить к approval;
- `likely` только после дополнительной проверки;
- `unknown` не отправлять автоматически;
- `invalid` исключить;
- `personal_email` исключить для B2B outbound;
- `role_email` использовать только для общих информационных сценариев.
Проверка: в `campaign_queue` не попадают `invalid`, `unknown` и личные адреса.
Шаг 11. Настройте crm_match_log
Перед любым письмом проверьте CRM.
В `crm_match_log` добавьте колонки:
match_id
company_id
contact_id
crm_system
crm_company_id
crm_contact_id
crm_deal_id
match_type
match_confidence
crm_status
action
created_at
`match_type`:
domain
email
company_name
linkedin
none
`action`:
allow
block_active_deal
block_existing_customer
block_unsubscribed
manual_review
Проверка: контакт не идет в outreach, пока нет CRM match decision.
Шаг 12. Создайте suppression_list
В `suppression_list` храните всех, кому нельзя писать.
Колонки:
suppression_id
type
value
reason
source
expires_at
created_at
`type`:
email
domain
company_name
crm_company_id
linkedin_url
Причины:
unsubscribed
do_not_contact
existing_customer
active_deal
competitor
partner
legal_block
bad_fit
manual_block
Проверка: отписка одного контакта может заблокировать весь домен, если таково правило компании.
Шаг 13. Опишите outbound_policy
В `outbound_policy` добавьте колонки:
policy_id
rule_type
condition
action
severity
owner
is_active
updated_at
Примеры:
POL-001 | sending | contact in suppression_list | block | critical | salesops
POL-002 | sending | active_deal exists | block | critical | salesops
POL-003 | message | contains_discount | approval | high | saleslead
POL-004 | message | contains_guarantee | approval | high | saleslead
POL-005 | volume | daily_send_limit exceeded | block | critical | salesops
POL-006 | contact | email_status != verified | review | medium | salesops
Проверка: опасные действия блокируются правилами, а не “на глаз”.
Шаг 14. Рассчитайте prospect_scores
В `prospect_scores` добавьте колонки:
score_id
company_id
contact_id
icp_score
contact_score
timing_score
risk_score
final_score
reasons_json
status
created_at
Формула для MVP:
final_score = icp_score + contact_score + timing_score - risk_score
Пример причин:
[
{"reason": "SaaS-компания", "points": 20},
{"reason": "50-300 сотрудников", "points": 15},
{"reason": "Head of Support", "points": 20},
{"reason": "есть вакансии support", "points": 10},
{"reason": "нет active deal в CRM", "points": 5}
]
Проверка: низкий score объяснен, а не просто “модель решила”.
Шаг 15. Подготовьте research_notes
В `research_notes` добавьте колонки:
note_id
company_id
contact_id
problem_hypothesis
personalization_facts
trigger_event
do_not_mention
source_urls
confidence
created_at
Prompt:
Ты готовишь research note для outbound.
Используй только переданные данные.
Не выдумывай факты.
Не делай персональные выводы о человеке.
Верни JSON:
{
"problem_hypothesis": "какая бизнес-проблема может быть релевантна",
"personalization_facts": ["факт 1", "факт 2"],
"trigger_event": "событие или null",
"do_not_mention": ["что нельзя писать"],
"confidence": "high|medium|low"
}
Проверка: персонализация строится на фактах о компании, а не на фантазии.
Шаг 16. Создайте message_templates
В `message_templates` добавьте колонки:
template_id
segment
step_number
channel
subject_template
body_template
cta_type
is_active
updated_at
Для первого письма используйте короткую структуру:
1. почему пишем именно им;
2. какая гипотеза пользы;
3. один конкретный вопрос;
4. мягкий CTA.
Пример CTA:
Если актуально, могу отправить короткий пример сценария для вашей команды поддержки.
Проверка: шаблон не содержит давления, фальшивой срочности и обещаний.
Шаг 17. Сгенерируйте outreach_drafts
В `outreach_drafts` добавьте колонки:
draft_id
company_id
contact_id
template_id
subject
body
personalization_used
contains_discount
contains_guarantee
contains_sensitive_claim
approval_required
status
created_at
Prompt:
Составь холодное B2B-письмо.
Пиши коротко: до 900 символов.
Не выдумывай факты.
Не говори, что знаком с человеком.
Не используй давление, страх, фальшивую срочность.
Не обещай скидки, гарантии, результаты и сроки.
Не упоминай, что письмо написано AI.
Верни JSON:
{
"subject": "до 55 символов",
"body": "текст письма",
"personalization_used": ["какие факты использованы"],
"risk_flags": []
}
Проверка: письмо выглядит как аккуратный деловой outreach, а не массовый шаблон.
Шаг 18. Проверьте черновик deterministic rules
Перед approval проверьте текст без LLM.
Флаги:
contains_discount
contains_guarantee
contains_fake_familiarity
contains_pressure
contains_sensitive_claim
contains_unverified_fact
contains_unsubscribe_missing
Запрещенные фразы:
мы гарантируем
точно увеличим
скидка только сегодня
как мы с вами обсуждали
я давно слежу за вами
последний шанс
ваши клиенты недовольны
Проверка: опасная фраза отправляет письмо в `approval_queue`, а не в кампанию.
Шаг 19. Создайте sequence_steps
В `sequence_steps` опишите касания.
Колонки:
sequence_id
segment
step_number
delay_days
channel
template_id
stop_if_replied
stop_if_unsubscribed
is_active
Минимальная последовательность:
SEQ-001 | saas_support | 1 | 0 | email | TPL-001 | yes | yes
SEQ-001 | saas_support | 2 | 4 | email | TPL-002 | yes | yes
SEQ-001 | saas_support | 3 | 9 | email | TPL-003 | yes | yes
Правила:
- не больше 3 касаний в MVP;
- пауза минимум 3-4 дня;
- любой ответ останавливает sequence;
- отписка останавливает весь домен или контакт по правилу;
- звонки и LinkedIn добавлять только после отдельного approval.
Проверка: sequence не выглядит агрессивно и имеет стоп-условия.
Шаг 20. Настройте approval_queue
В `approval_queue` добавьте колонки:
approval_id
object_type
object_id
company_id
contact_id
reason
preview
approver_email
status
created_at
decided_at
`object_type`:
outreach_draft
campaign_launch
low_confidence_research
policy_violation
manual_contact_review
Статусы:
pending
approved
rejected
needs_edit
expired
Проверка: менеджер видит причину approval и текст письма до запуска.
Шаг 21. Сделайте Telegram approval
В n8n создайте workflow:
Outbound approval
Цепочка:
- найти `approval_queue` со статусом `pending`;
- отправить preview в Telegram;
- добавить кнопки `Approve`, `Needs edit`, `Reject`;
- обновить статус после решения;
- записать действие в `audit_log`;
- только после approve перевести лид в `campaign_queue`.
Сообщение:
Нужно согласовать outbound-письмо
Компания: ООО Альфа
Контакт: Head of Support
Score: 82
Причина: внешний контакт + первая кампания
Subject: Вопрос про нагрузку поддержки
Preview: Добрый день...
[Approve] [Needs edit] [Reject]
Проверка: без approve контакт не попадает в отправку.
Шаг 22. Настройте campaign_queue
`campaign_queue` - очередь готовых лидов для outreach tool.
Колонки:
campaign_queue_id
campaign_id
company_id
contact_id
draft_id
sequence_id
outreach_tool
status
scheduled_at
external_lead_id
created_at
processed_at
Статусы:
ready
scheduled
sent_to_tool
paused
blocked
done
error
Правило:
добавлять в campaign_queue только final_score >= min_fit_score, verified email, CRM allow, suppression clear, approved draft
Проверка: очередь содержит только контакты, которые прошли все проверки.
Шаг 23. Подключите Lemlist или другой outreach tool
Для Lemlist workflow:
- взять строки `campaign_queue` со статусом `ready`;
- проверить дневной лимит;
- отправить лид в Lemlist campaign;
- передать custom variables: company, role, personalization, draft;
- записать `external_lead_id`;
- обновить статус на `sent_to_tool`;
- записать действие в `audit_log`.
Проверка: лид появляется в кампании, но только после всех блокировок и лимитов.
Шаг 24. Настройте touch_log
В `touch_log` пишите каждое касание.
Колонки:
touch_id
company_id
contact_id
campaign_id
sequence_id
step_number
channel
subject
body_snapshot
status
sent_at
external_event_id
created_at
Статусы:
scheduled
sent
delivered
opened
clicked
replied
bounced
unsubscribed
blocked
Проверка: можно восстановить, кому, когда и что отправили.
Шаг 25. Соберите reply_inbox
В `reply_inbox` добавьте колонки:
reply_id
company_id
contact_id
campaign_id
message_id
reply_text
reply_type
intent
sentiment
needs_human
created_at
`reply_type`:
positive
not_now
not_relevant
unsubscribe
objection
referral
auto_reply
angry
unknown
Правила:
- `unsubscribe` сразу добавляет email в `suppression_list`;
- `positive` создает задачу sales;
- `angry` ставит домен на manual review;
- `auto_reply` не запускает follow-up;
- `not_now` создает мягкий reminder через 30-90 дней.
Проверка: любой ответ останавливает sequence.
Шаг 26. Разберите objection_log
В `objection_log` добавьте колонки:
objection_id
reply_id
company_id
contact_id
objection_type
objection_text
recommended_answer
needs_human
created_at
Типы возражений:
price
no_budget
not_relevant
already_have_solution
security
timing
send_info
wrong_person
Проверка: менеджер получает не просто ответ, а рекомендуемый следующий шаг.
Шаг 27. Подготовьте crm_updates
В `crm_updates` храните черновики CRM-изменений.
Колонки:
crm_update_id
company_id
contact_id
crm_system
update_type
payload_json
approval_required
status
created_at
processed_at
`update_type`:
create_company
create_contact
create_task
add_note
create_deal_request
update_outbound_status
unsubscribe
Правило:
create_company, create_contact, add_note можно делать после проверок; create_deal_request только после положительного ответа или approval
Проверка: CRM остается источником правды, а агент не плодит мусорные сделки.
Шаг 28. Настройте audit_log
В `audit_log` добавьте колонки:
audit_id
actor
action
object_type
object_id
before_json
after_json
created_at
Логируйте:
- импорт компании;
- enrichment;
- поиск контакта;
- CRM match;
- suppression check;
- scoring;
- генерацию research note;
- генерацию письма;
- approval;
- добавление в кампанию;
- отправку;
- ответ;
- отписку;
- CRM update;
- ошибку API.
Проверка: по каждому письму видно, почему оно было отправлено.
Шаг 29. Настройте error_log
В `error_log` добавьте колонки:
error_id
company_id
contact_id
workflow_name
node_name
error_type
error_message
payload_snapshot
status
owner_email
created_at
Типы ошибок:
prospect_source_failed
enrichment_failed
crm_match_failed
suppression_check_failed
email_verification_failed
llm_invalid_json
approval_timeout
outreach_api_failed
reply_parse_failed
crm_update_failed
Проверка: если CRM check упал, контакт не отправляется “на удачу”.
Шаг 30. Соберите weekly_report
В `weekly_report` добавьте колонки:
week_start
companies_added
contacts_added
contacts_blocked
drafts_created
drafts_approved
emails_sent
replies_count
positive_replies
unsubscribes
bounces
meetings_booked
top_rejection_reasons
created_at
Минимальные метрики:
- сколько компаний добавлено;
- сколько контактов прошли фильтр;
- сколько заблокировано стоп-листом;
- сколько писем одобрено;
- сколько отправлено;
- сколько ответов;
- сколько положительных ответов;
- сколько отписок;
- сколько bounce;
- сколько встреч назначено.
Проверка: видно не только количество отправок, но и качество outbound.
Шаг 31. Протестируйте на 50 контактах
Возьмите маленький тестовый список.
Проверьте вручную:
- компания соответствует ICP;
- excluded industries не попали в кампанию;
- CRM-дубли заблокированы;
- отписки заблокированы;
- email status валидный;
- score объясним;
- письмо не содержит выдуманных фактов;
- письмо не обещает скидки и гарантии;
- approval работает;
- дневной лимит работает;
- reply останавливает sequence;
- unsubscribe попадает в `suppression_list`;
- положительный ответ создает задачу sales;
- bounce не идет в повторную отправку;
- все ошибки видны в `error_log`.
Проверка: минимум 40 из 50 контактов должны иметь понятное решение: отправлять, не отправлять или отправить на ручную проверку.
Минимальная проверка результата
MVP готов, если:
- ICP описан в `icp_rules`;
- источники есть в `prospect_sources`;
- компании попадают в `company_queue`;
- enrichment пишется в `company_enrichment`;
- контакты пишутся в `contact_queue`;
- CRM-дубли пишутся в `crm_match_log`;
- стоп-лист работает через `suppression_list`;
- outbound policy блокирует опасные действия;
- score пишется в `prospect_scores`;
- research note пишется в `research_notes`;
- шаблоны есть в `message_templates`;
- письма пишутся в `outreach_drafts`;
- sequence описан в `sequence_steps`;
- approval работает через `approval_queue`;
- готовые лиды попадают в `campaign_queue`;
- касания пишутся в `touch_log`;
- ответы пишутся в `reply_inbox`;
- возражения пишутся в `objection_log`;
- CRM updates остаются черновиками;
- audit и error logs заполнены;
- weekly report показывает качество.
Перед живой отправкой пройдите чек-лист:
- Добавьте 10 тестовых компаний.
- Добавьте 2 компании в `suppression_list`.
- Добавьте 1 компанию с active deal в CRM.
- Запустите enrichment.
- Запустите scoring.
- Проверьте 5 research notes.
- Проверьте 5 outreach drafts.
- Отклоните одно письмо через approval.
- Одобрите одно письмо через approval.
- Проверьте, что только одобренный контакт попал в `campaign_queue`.
Что нельзя автоматизировать в первой версии
- массовую отправку без approval;
- обход отписки и стоп-листа;
- отправку по личным адресам;
- покупку и загрузку сомнительных баз;
- обещания скидок, результатов, сроков и гарантий;
- имитацию личного знакомства;
- агрессивные follow-up без паузы;
- создание сделок без положительного ответа;
- письмо компаниям в active deal;
- отправку без лимитов домена;
- удаление bounce и unsubscribe из истории.
Частые вопросы
Можно ли полностью автоматизировать холодные письма?
Технически можно, но для первой версии лучше не надо. Сначала автоматизируйте поиск, scoring, проверку дублей, стоп-листы и черновики. Автоотправку включайте только после теста качества и с жесткими лимитами.
Чем outbound-агент отличается от агента лидогенерации?
Агент лидогенерации может работать с входящими заявками и формами. Outbound-агент сам выбирает компании и контакты, поэтому у него выше риск нерелевантной коммуникации, дублей, отписок и репутационных проблем.
Что важнее: персонализация или объем?
Для MVP важнее качество списка и релевантность. Персонализация должна быть короткой и фактической. Если агент пишет длинные “индивидуальные” письма с выдуманными фактами, это хуже обычного шаблона.
Как не испортить домен?
Используйте отдельный outbound-домен, маленькие дневные лимиты, проверку email status, стоп-листы, паузы между касаниями, обработку bounce и отписок. Не начинайте с сотен отправок в день.
Когда создавать сделку в CRM?
Лучше после положительного ответа, запрошенной встречи или ручного approval. До этого достаточно contact/company, outbound status, touch log и задачи менеджеру при интересе.