Cold Outreach Pipeline — это система автоматизации B2B cold outreach. Она помогает находить контактные данные руководителей компаний, которых нет в публичных реестрах: финансовых директоров, коммерческих директоров, HR-директоров, CTO и других.
Какую задачу решает
В публичных реестрах (ЕГРЮЛ, Checko) можно найти только генерального директора и учредителей. Но для B2B-продаж нужно выходить на конкретных руководителей: кто отвечает за финансы, за продажи, за IT. Эта система автоматически ищет таких людей в открытых источниках — на сайтах компаний, в новостях, на конференциях, в профессиональных сетях — и заносит их в таблицу Google Sheets с оценкой достоверности.
Как это работает (в двух словах)
Этап 1 — Обогащение компаний. Вы отмечаете компании в Google Sheets галочкой, нажимаете кнопку «Начать работу». Система автоматически подтягивает данные из Checko (реквизиты, контакты, учредители), DaData (бренд, описание), проверяет сайт компании и записывает всё обратно в таблицу.
Этап 2 — Поиск руководителей. Для каждой компании система формирует 16 поисковых запросов в Яндекс, скачивает найденные страницы, извлекает ФИО и должности через AI (нейросети), оценивает достоверность каждого найденного человека и записывает лучших кандидатов в таблицу.
Технический стек
Yandex Cloud (Cloud Functions, Object Storage S3, Workflows, Lockbox, YDB), Python 3.12, Google Sheets API, Yandex Search API (асинхронный режим), AI-модели gpt-oss-20b и DeepSeek V3.2. Весь код — 11 serverless-функций для поиска людей + 7 для обогащения + 1 для дашборда (CRUD) + 1 для авторизации + 1 триггер.
Ключевые метрики
Pipeline функций
—
Этап 1 + Этап 2 (без служебных)
В Yandex Cloud
—
Всего функций в облаке (вкл. служебные)
Открытых проблем
—
Прогонов
—
Стоимость обработки 100 компаний
Компонент
Расчёт
Стоимость
Источник тарифа
ЭТАП 1 — ОБОГАЩЕНИЕ
Checko Company (E2)
100 компаний × 0.15 ₽/запрос
~15 ₽
checko.ru, апр. 2026
Checko Finances (E3)
100 компаний × 0.15 ₽/запрос
~15 ₽
checko.ru, апр. 2026
DaData Brand (E4)
100 компаний × 7 ₽/бренд
~700 ₽
dadata.ru, апр. 2026. Списание если есть название + сайт + описание
ЭТАП 2 — ПОИСК РУКОВОДИТЕЛЕЙ
Yandex Search API (async)
100 × 16 = 1 600 запросов × 30.50 ₽/1000
~49 ₽
Тариф на апр. 2026
LLM gpt-oss-20b
~300 страниц × 1 200 токенов × 0.10 ₽/1K
~36 ₽
AI Studio, апр. 2026
LLM DeepSeek V3.2 (fallback ~10%)
~30 страниц × 1 200 токенов × 0.50 ₽/1K
~18 ₽
AI Studio, апр. 2026
Search API верификация (09a)
~50 запросов × 30.50 ₽/1000
~2 ₽
Тариф на апр. 2026
Итого
~835 ₽
~8.35 ₽ за компанию
Главный расход — DaData Brand (84%). Кэш 730 дней (2 года) снижает стоимость при повторных прогонах. При повторном прогоне тех же компаний: Checko кэш 30 дней, DaData кэш 2 года, SERP кэш 14 дней → реальная стоимость значительно ниже.
Схема работы pipeline
Полный путь данных: от нажатия кнопки в Google Sheets до появления найденных руководителей в таблице. Каждый блок — это отдельная Cloud Function в Yandex Cloud.
Запуск
Пользователь отмечает компании галочкой (столбец A) в Google Sheets и нажимает кнопку «Начать работу» в меню. GAS-скрипт отправляет запрос на Cloud Function outreach-trigger, которая запускает Yandex Workflow.
📊 Google SheetsКнопка «Начать работу»→⚡ GAS Scriptspreadsheet_id + token→outreach-triggerЗапускает Workflow
▼
Этап 1 — Обогащение компаний
Считывает отмеченные компании, запрашивает данные из трёх внешних API параллельно (с while-циклом для больших объёмов), проверяет сайт, записывает всё обратно в таблицу.
08 Склейка + ролиДедупликация ФИО→09 СкорингОценка достоверности 0–100→10 Запись в SheetsНовые строки + группировка
▼
Результат
📊 Google SheetsНовые строки с руководителями под каждой компанией+📱 TelegramИтоговый отчёт
Запуск (GAS)
Обогащение (Этап 1)
Поиск людей (Этап 2)
Результат / Запись
Скоринг и Quality Gates
Pipeline оценивает каждого найденного человека по 5 факторам. Итоговый балл 0–100 определяет, попадёт ли человек в таблицу. Кроме того, на каждом этапе pipeline есть контрольные точки — Quality Gates.
Пороги отбора
60–100
✅ Принят
Записывается в таблицу Google Sheets
40–59
⚠️ На проверку
Попадает в review queue
<40
❌ Отброшен
Недостаточно доказательств
5 факторов оценки
score = источник × свежесть × подтверждение × качество × привязкаШаг 09 • pipeline-score-select
Источник
55–90
Главный фактор. Откуда взята информация о человеке
Свежесть
×0.4–1.0
Насколько старый источник. Может снизить до −60%
Подтверждение
×1.0–1.2
Найден в 2+ источниках? Бонус +20%
Качество
×0.7–1.0
Есть ли цитата с ФИО + должность рядом
Привязка
×0.0–1.0
Принадлежит ли человек этой компании
Калькулятор скоринга
100
Веса источников
Источник
Балл
Доверие
🏢 Сайт компании (/team, /about)
90
Высокое
📄 PDF-документ / отчёт
80
Высокое
📰 Новость / интервью
72
Среднее
🎯 Конференция / спикер
70
Среднее
💬 TenChat
68
Среднее
🔗 LinkedIn
65
Ниже среднего
📝 Тендер
60
Ниже среднего
💼 hh.ru
55
Низкое
Множители детально
⏳ Свежесть источника
<1 года
×1.0
Нет штрафа
1–2 года
×0.8
− 20%
2–3 года
×0.6
− 40%
3+ лет
×0.4
− 60%
Без даты
×0.5
− 50%
🔗 Привязка к компании
URL на домене компании
×1.0
Точно свои
Бренд в цитате
×0.9
Упомянут рядом
Бренд в контексте ±500
×0.85
Вероятно свои
DOM-парсер не совпал
×0.0
Точно чужой
Не найдено
×0.3
Отсеется
Шаг 07 (evidence-build) + шаг 09a (verify)
✅ Кросс-подтверждение
Найден в 2+ независимых источниках → ×1.2
Один источник → ×1.0
Например: найден на сайте + в новости = 2 источника
📝 Качество доказательства
Цитата с ФИО + должность рядом → ×1.0
Только должность без имени → ×0.7
Проверка: evidence_quote содержит фамилию (шаг 07)
Последний этап: поисковая верификация (шаг 09a)
Для кандидатов из внешних источников делается дополнительный поиск: "Фамилия Имя" "бренд". Если они встречаются на одной странице — probability ×1.3. Если нет — probability ×0.5. Кандидаты с сайта компании не проверяются.
Quality Gates — контроль на каждом этапе
Если метрика ниже порога — отправляется Telegram-алерт. Pipeline не останавливается.
01Определение бренда — у скольких % компаний есть бренд≥ 88%Мёртвые сайты → поиск без бренда даёт мусор
04Скачивание страниц — % успешно скачанных≥ 70%Блокировки → 30% данных потеряно
07Сбор фактов — % компаний с хотя бы 1 человеком≥ 30%Нет людей → pipeline бесполезен
10Экспорт — итоговое покрытие (компании с хотя бы 1 ролью)≥ 55%Мало контактов для outreach
Pipeline ищет руководителей по 9 целевым ролям. Для каждой роли настроен словарь синонимов — система распознаёт разные варианты написания должности и приводит их к единому виду.
Роль
Синонимы (base / extended / full)
Источник данных
Словарь загружается из S3: config/roles_synonyms.json. Используется функцией pipeline-serp-fetch для генерации поисковых запросов. Три уровня синонимов: base (режим base), extended (режим extended), full (режим full).
Редактировать роль
Хранилище S3
Все данные pipeline хранятся в Yandex Object Storage (S3-совместимое хранилище). Bucket: cold-outreach. Используется гибридная архитектура: общий кэш API-ответов (один запрос на ИНН для всех таблиц) + отдельные сессии для каждой таблицы.
Общий кэш API-ответов
Один ИНН в двух таблицах = один API-запрос. Кэш общий для всех таблиц. Путь: cache/
Прогресс + метрики каждого шага, группировка по run_id
Кэши Этапа 2
Путь: sessions/{spreadsheet_id}/pipeline/cache/
Папка
TTL
Ключ
Содержимое
serp/
14 дней
md5(query_text)
Кэш поисковых выдач Яндекса
pages/
30 дней
md5(url)
text + html_snippet (300KB для DOM-доменов, 100KB для остальных)
llm/
Бессрочный
md5(url + text_hash)
Ответы AI-моделей (экономия при перезапуске)
Настройки (общие)
Можно менять без передеплоя функций. Путь: config/
Файл
Назначение
Где используется
roles_synonyms.json
Словарь синонимов должностей → 9 целевых ролей
Шаг 08 (нормализация)
url_patterns.json
Правила классификации URL по типу
Шаг 03 (фильтрация)
source_weights.json
Веса источников для скоринга
Шаг 09 (оценка)
Принципы проектирования
Ключевые решения, определяющие архитектуру pipeline. Полезно перечитать перед внесением изменений.
01
Сначала факты, потом люди
Каждое упоминание человека из любого источника записывается как отдельный факт (person_fact) с цитатой, ссылкой и датой. Только потом факты склеиваются в людей. Это позволяет прозрачно проследить, откуда взялась каждая запись.
02
Два источника лучше одного
Если человека нашли на сайте компании И в новости — его оценка умножается на 1.2. Мульти-source подтверждение резко повышает достоверность.
03
Без доказательства — нет факта
Каждый person_fact обязан содержать цитату из источника (evidence_quote) и ссылку (source_url). Без них — запись не попадает в финал.
04
Продолжение с места остановки
Каждая функция сохраняет свой прогресс в S3 (progress/). При перезапуске — пропускает уже обработанное. Таймер 240 секунд + механизм partial/complete для больших объёмов.
05
Настройки без передеплоя
Словари ролей, веса скоринга, паттерны URL — всё хранится в JSON-файлах в S3 (config/). Можно менять без пересборки функций.
06
AI только когда нужен
Сначала бесплатный DOM-парсинг → потом проверка маркеров должностей → только потом AI. Дешёвая модель (gpt-oss-20b за 0.10₽/1K) → дорогая (DeepSeek за 0.50₽/1K) только для перспективных страниц (/team, /about).
07
Кэш по ИНН, не по строке
Строки в таблице удаляются и пересоздаются. UUID нестабилен. Единственный надёжный идентификатор компании — ИНН. Все кэши привязаны к нему.
08
Минимум обращений к Google Sheets
Один get_all_values() в начале → все изменения собираются в памяти → 1–3 batch-вызова API в конце. Иначе — ошибка 429 (rate limit).
09
Асинхронный поиск = 16× экономия
Yandex Search API в async-режиме: 30.50₽ за 1 000 запросов вместо 488₽. Платим за ожидание 5+ минут, экономим 16 раз.
10
Логи прежде всего
При дебаге Cloud Functions — всегда сначала yc serverless function logs, только потом гипотезы. Не фантазировать, не гадать — читать логи.
Шаг 1: создать JSON без BOM. ВАЖНО:[System.IO.File]::WriteAllText() БЕЗ второго параметра кодировки — иначе BOM сломает парсинг.
[System.IO.File]::WriteAllText("$env:USERPROFILE\Downloads\changelog_entry.json", '{"action":"upsert","table":"changelog","item":{"id":"ch-YYYYMMDD-NAME","date":"DD.MM.YYYY HH:MM","function_name_ru":"Название","function_name":"tech-name","problem":"Что было не так","fix":"Что сделали","result":"Результат"}}')
Шаг 2: вызвать API.
yc serverless function invoke --name ydb-dashboard-api --data-file "$env:USERPROFILE\Downloads\changelog_entry.json"
Облако и API
Вся инфраструктура в Yandex Cloud. Клик на ID открывает соответствующую страницу в консоли.