Пошаговые инструкции intermediate 25 мин

Как сделать ИИ-агента для холодных продаж и outbound

Пошаговая инструкция от нуля до рабочего outbound-агента: ICP, prospecting, CRM-дубли, стоп-листы, scoring, письма, approval, кампании и ответы.

AI-агенты CRM outbound холодные продажи ICP prospecting approval cold email

Что получится в результате

Соберем ИИ-агента для холодных B2B-продаж, который не “спамит всем подряд”, а работает как контролируемый outbound-процесс: берет ICP, подбирает компании, проверяет стоп-листы, ищет контакты, обогащает данные, считает fit score, готовит research note, пишет персонализированный черновик письма, отправляет спорные контакты на approval, ставит лидов в кампанию и записывает ответы в CRM.

Первая рабочая версия будет делать так:

  1. правила ICP хранятся в `icp_rules`;
  2. источники поиска лежат в `prospect_sources`;
  3. компании попадают в `company_queue`;
  4. enriched-данные компаний пишутся в `company_enrichment`;
  5. контакты попадают в `contact_queue`;
  6. проверка CRM-дублей пишется в `crm_match_log`;
  7. стоп-листы и отписки хранятся в `suppression_list`;
  8. правила безопасности outreach лежат в `outbound_policy`;
  9. fit score сохраняется в `prospect_scores`;
  10. заметки для персонализации пишутся в `research_notes`;
  11. шаблоны сообщений лежат в `message_templates`;
  12. черновики писем пишутся в `outreach_drafts`;
  13. sequence steps хранятся в `sequence_steps`;
  14. спорные письма уходят в `approval_queue`;
  15. готовые лиды попадают в `campaign_queue`;
  16. отправленные касания пишутся в `touch_log`;
  17. ответы попадают в `reply_inbox`;
  18. возражения сохраняются в `objection_log`;
  19. CRM-обновления пишутся в `crm_updates`;
  20. все действия фиксируются в `audit_log`;
  21. ошибки попадают в `error_log`;
  22. 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 выберите один сценарий:

  1. найти компании из одной отрасли;
  2. найти компании с конкретной технологией на сайте;
  3. найти компании, которые недавно нанимают нужную роль;
  4. найти компании после события: раунд, запуск, вакансия, релокация, тендер;
  5. найти похожих клиентов на текущих лучших клиентов;
  6. подготовить список для партнерского outreach;
  7. запустить мягкий follow-up по старой базе;
  8. проверить качество существующего 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 проверьте:

  1. `domain` уже есть в `company_queue`;
  2. `domain` уже есть в CRM;
  3. компания уже в active deal;
  4. компания есть в `suppression_list`;
  5. компания была в кампании последние 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

Что собирать:

  1. отрасль;
  2. размер компании;
  3. страна;
  4. стек технологий;
  5. вакансии;
  6. новости или события;
  7. признаки нагрузки поддержки;
  8. похожесть на 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”, а роли:

  1. Head of Support;
  2. Customer Support Lead;
  3. COO;
  4. Head of Customer Success;
  5. VP Operations;
  6. Founder для малых компаний;
  7. Sales/RevOps только для sales-oriented оффера.

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

Шаг 10. Проверьте email status

Не ставьте в кампанию адреса без проверки.

Статусы:

verified
likely
unknown
invalid
catch_all
personal_email
role_email

Правила:

  1. `verified` можно готовить к approval;
  2. `likely` только после дополнительной проверки;
  3. `unknown` не отправлять автоматически;
  4. `invalid` исключить;
  5. `personal_email` исключить для B2B outbound;
  6. `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

Правила:

  1. не больше 3 касаний в MVP;
  2. пауза минимум 3-4 дня;
  3. любой ответ останавливает sequence;
  4. отписка останавливает весь домен или контакт по правилу;
  5. звонки и 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

Цепочка:

  1. найти `approval_queue` со статусом `pending`;
  2. отправить preview в Telegram;
  3. добавить кнопки `Approve`, `Needs edit`, `Reject`;
  4. обновить статус после решения;
  5. записать действие в `audit_log`;
  6. только после 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:

  1. взять строки `campaign_queue` со статусом `ready`;
  2. проверить дневной лимит;
  3. отправить лид в Lemlist campaign;
  4. передать custom variables: company, role, personalization, draft;
  5. записать `external_lead_id`;
  6. обновить статус на `sent_to_tool`;
  7. записать действие в `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

Правила:

  1. `unsubscribe` сразу добавляет email в `suppression_list`;
  2. `positive` создает задачу sales;
  3. `angry` ставит домен на manual review;
  4. `auto_reply` не запускает follow-up;
  5. `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

Логируйте:

  1. импорт компании;
  2. enrichment;
  3. поиск контакта;
  4. CRM match;
  5. suppression check;
  6. scoring;
  7. генерацию research note;
  8. генерацию письма;
  9. approval;
  10. добавление в кампанию;
  11. отправку;
  12. ответ;
  13. отписку;
  14. CRM update;
  15. ошибку 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

Минимальные метрики:

  1. сколько компаний добавлено;
  2. сколько контактов прошли фильтр;
  3. сколько заблокировано стоп-листом;
  4. сколько писем одобрено;
  5. сколько отправлено;
  6. сколько ответов;
  7. сколько положительных ответов;
  8. сколько отписок;
  9. сколько bounce;
  10. сколько встреч назначено.

Проверка: видно не только количество отправок, но и качество outbound.

Шаг 31. Протестируйте на 50 контактах

Возьмите маленький тестовый список.

Проверьте вручную:

  1. компания соответствует ICP;
  2. excluded industries не попали в кампанию;
  3. CRM-дубли заблокированы;
  4. отписки заблокированы;
  5. email status валидный;
  6. score объясним;
  7. письмо не содержит выдуманных фактов;
  8. письмо не обещает скидки и гарантии;
  9. approval работает;
  10. дневной лимит работает;
  11. reply останавливает sequence;
  12. unsubscribe попадает в `suppression_list`;
  13. положительный ответ создает задачу sales;
  14. bounce не идет в повторную отправку;
  15. все ошибки видны в `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 показывает качество.

Перед живой отправкой пройдите чек-лист:

  1. Добавьте 10 тестовых компаний.
  2. Добавьте 2 компании в `suppression_list`.
  3. Добавьте 1 компанию с active deal в CRM.
  4. Запустите enrichment.
  5. Запустите scoring.
  6. Проверьте 5 research notes.
  7. Проверьте 5 outreach drafts.
  8. Отклоните одно письмо через approval.
  9. Одобрите одно письмо через approval.
  10. Проверьте, что только одобренный контакт попал в `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 и задачи менеджеру при интересе.

Дальше по теме

Похожие материалы