Enrich-and-Pitch — B2B Outbound Research & Generation (Казахстан)
End-to-end пайплайн для персонализированного outbound: от названия компании до готовых opening сообщений под конкретных ЛПР с публично подтверждаемым контекстом.
Архитектура отчёта — две вкладки в одном HTML:
- Аналитика — всё что мы знаем. Порядок: Главное → Профиль → Hiring → ЛПР (раскрывающиеся карточки с вложенным контекстом) → Шаг 2 (market) → Шаг 3 (LinkedIn) → Шаг 4 (social) → Источники в конце. Черновика письма на Аналитике НЕТ — это только Коммуникация.
- Коммуникация — как мы пишем. Ровно одна для главного primary ЛПР (top-1, см. ниже как выбрать). Внутри неё с 4 полными версиями письма (v1 база, v2 +рынок, v3 +LinkedIn, v4 +соцсети). В v2/v3/v4 добавки относительно предыдущей версии обёрнуты в
<span class="added-v2/v3/v4">…</span>
— это даёт визуальный diff. Никаких отдельных hook-блоков сверху. Письма для других ЛПР НЕ генерируем автоматически — сейл пишет им по тому же шаблону, если нужно.
ЯЗЫК — простой русский, без жаргона:
- ✅ «Заход», «С чего зайти», «Что для него важно», «Где совпадаем» · ❌ «Hook», «Persona-fit», «outreach», «buyer»
- ✅ «Главный», «Второстепенный» · ❌ «Primary», «Secondary», «gatekeeper»
- ✅ «Текущая / Предыдущая версия», «База (бесплатно)», «+ Рынок», «+ LinkedIn», «+ Соцсети» · ❌ «Current / Previous», «Free baseline», «+ Market», «+ Social»
- ✅ «Свежие события», «Активность по найму», «Кто принимает решение» · ❌ «Recent events», «Hiring intelligence», «ЛПР»
- ✅ «Бесплатные источники», «Платные источники», «через Apify» · ❌ «free стек», «paid», «paid stack»
- ✅ «AI-агенты», «инструменты для отдела продаж», «оценка лидов» · ❌ «agentic AI», «sales tools», «lead scoring»
- Прямые цитаты людей оставляем на оригинальном языке (если их LinkedIn на английском) + переводим в скобках для контекста
Цель: продавец-неангличанин читает отчёт без напряга. Жаргон скрывает выводы.
КЛЮЧЕВОЙ ПРИНЦИП Analytics tab — выводы, не данные:
Сейл за 10 секунд должен понять что ВАЖНО, а не получить data dump. Каждая секция отвечает на вопрос «что я с этим делаю».
| Что | Как делать ✅ | Как НЕ делать ❌ |
|---|
| Каждая секция | 1 заголовок + 2-4 строки выводов | Fact-grid с 8-10 rows |
| Длинные данные | <details> collapsed по умолчанию | Всё всегда видно |
| Профиль компании | 3 строки (сектор + recent + клиенты) | Полный grid юр.данных на виду |
| Hiring | 3-5 буллетов выводов + collapsed список вакансий | Раскладка по 13 позициям |
| Market | 3 буллета напряжений + collapsed конкуренты | Sector definition + 5+ конкурентов + 7 dynamics |
| LinkedIn | 1 ключевая цитата + 3-4 факта + collapsed full | 8 fact-rows headline/about/edu/awards/skills |
| Полные досье | Внутри collapsed | Всегда видимый раздел |
| Источники | Внутри collapsed | Длинный список на виду |
Принцип: «что брать в outreach» > «что мы нашли».
4-шаговая ladder эволюции письма:
| Шаг | Что добавляем | Free/Paid | Версия письма |
|---|
| 1 | Company + ЛПР + Hiring (free) | Free | v1 (полное письмо — база) |
| 2 | Market context (free, через Claude) | Free | v2 (v1 + market-добавки в ) |
| 3 | LinkedIn deep dive (Apify) | Paid | v3 (v2 + LinkedIn-добавки в ) |
| 4 | Social signals FB/IG/TikTok (Apify) | Paid | v4 (v3 + social-добавки в ) |
Каждый шаг → regenerate
полное письмо → новая версия в
на вкладке Коммуникация. Latest становится
, предыдущие —
(dimmed). Добавленные с предыдущего шага фрагменты обёрнуты в
<span class="added-v{N}">…</span>
чтобы был визуально виден diff.
Hook больше не отдельная сущность — он часть письма.
Когда использовать
Пользователь просит:
- Исследовать компанию и подготовить outbound коммуникацию
- Сделать «контекст-360» по компании / ЛПР
- Найти decision-makers в компании и написать первое сообщение
- Подготовиться к холодному звонку / письму в KZ B2B
Входные данные
Обязательно:
- Компания — название (например, «Globalink Logistics») или БИН (например, 110842011929)
- Наш оффер — 1-2 предложения о том, что продаём (например: «AI-инструменты для отдела продаж: лидген, скоринг входящих, аналитика звонков»)
Опционально:
3. Target роль — Buyer / Champion / User / Decision Maker если известно
4. Сигналы для использования — recent hiring, funding, expansion, события
Если каких-то обязательных входов не хватает — спроси у пользователя ДО старта.
Workflow — 4 стейджа
Stage 1: Company Discovery
Цель: факт-чекнутый профиль компании.
Stage 1.0 — ПОДТВЕРЖДЕНИЕ КОМПАНИИ (обязательный gate перед research)
Прежде чем тратить время на full research — найди кандидата и подтверди с пользователем. Это занимает 10 сек и страхует от прогона на не той компании (особенно частая ситуация с холдингами, где у одного бренда 3-5 юр.лиц).
Алгоритм:
-
Первичный поиск через WebSearch:
- — это даёт самый надёжный hit
-
Найди 1-3 кандидатов (юр.лиц с похожим названием). Например, для «Globalink» в Казахстане их 3:
- ТОО «Глобалинк» Транспортэйшн энд Лоджистикс Ворлдвайд (БИН 991140002859, операционная)
- Представительство Globalink Logistics Group Limited (БИН 110842011929)
- Documentolog Global Limited (для других кейсов)
-
Покажи кандидатов пользователю в чате компактно:
Нашёл кандидатов для «<input>»:
1. ТОО «Глобалинк» Транспортэйшн энд Лоджистикс Ворлдвайд
БИН 991140002859 · Алматы · 501-1000 человек · директор Балаев Р.О.
Действующая, 26 лет на рынке, грузовой автотранспорт
2. Представительство Globalink Logistics Group Limited
БИН 110842011929 · Алматы · 16-20 человек · директор Мансур Сохаил
Действующее представительство, 14 лет
Какая нужна — 1, 2, обе, или другая? (если другая — уточни название/БИН)
-
Ожидай реакции:
- «1» / «вторая» / «обе» → продолжай research на выбранной(ых)
- «другая, вот ссылка/БИН/полное название» → новый поиск с уточнением
- «не та / не нашли» → попроси у пользователя более конкретный идентификатор (БИН, сайт, полное юр. название)
Если найден ТОЛЬКО ОДИН кандидат:
Всё равно подтверди, но коротко:
Нашёл: ТОО Documentolog (БИН 070840007503, Астана, 41-50 человек, директор Аманбекова М.А., разработка ПО). Это та компания? (да/нет)
После подтверждения — переходи к stage 1.1 (full research).
Stage 1.1 — Full research (только после подтверждения)
Параллельно выполни:
-
WebSearch — найти БИН и идентификаторы:
"<company>" Казахстан БИН
site:adata.kz "<company>"
→ получи URL вида pk.adata.kz/counterparty/main/company/{БИН}/basic-info
- Если на вход дали БИН — пропусти этот шаг
-
WebFetch adata.kz на
https://pk.adata.kz/counterparty/main/company/{БИН}/basic-info
:
- Полное юридическое название
- БИН (верификация)
- Статус (активна / ликвидирована / приостановлена)
- Директор (имя)
- Дата регистрации
- Адрес
- ОКЭД (вид деятельности)
- Размер (по числу сотрудников)
- Регистрирующий орган
-
WebFetch официального сайта (если SSL валидный):
- или
- или или
- или
- Если WebFetch падает на SSL → fallback:
WebSearch site:<domain> "<keyword>"
-
WebSearch hh.kz для employer_id:
site:hh.kz "<company>" вакансии
→ найди employer URL вида
-
WebFetch ПОЛНЫЙ список вакансий (не employer-страницу):
- URL pattern:
https://almaty.hh.kz/search/vacancy?employer_id={id}&items_on_page=50
- Если редирект — следуй на almaty.hh.kz или astana.hh.kz
- Извлеки список ВСЕХ открытых вакансий: title, локация, диапазон зарплаты, требуемый опыт
-
Активность по найму — КОМПАКТНО. 3 блока, никакой воды:
A. Stats — 1 строка:
N вакансий · Астана X / Алматы Y · ЗП мин–макс ₸ · ссылка на источник
B. Кого нанимают (3-5 буллетов): группировка функций + ⭐ для критичных позиций
- Группируй похожие роли в одну строку («Customer Success — 4 роли»)
- Senior leadership / новые функции → отдельный буллет с ⭐
- НЕ перечисляй все 13 вакансий по одной — только агрегированные блоки
C. Где нет людей (2-3 буллета): значимые ОТСУТСТВИЯ
- «0 AI/ML вакансий — внутренняя команда укомплектована или outsource»
- «0 системных Sales — продажи ещё не масштабируются»
- «0 Marketing/Brand — bottom-of-funnel не приоритет»
- Каждое отсутствие → одно интерпретирующее предложение
D. Что это значит — 1-2 предложения, добавляет интерпретацию (не дублирует bullets):
- Какой моментум: formation новой функции / scaling / replacement?
- Как связан с recent events?
- Пример GOOD: «Скейлят CS на существующей базе + формируют новую международную партнёрскую функцию после интеграции с Контур. Sales infrastructure ещё не построена — окно для встраивания тулсов ДО legacy.»
- Пример BAD: «Активно нанимают, открыты 13 вакансий» (без интерпретации)
- Пример BAD: длинное эссе на абзац (слишком много)
Правила гигиены:
- Весь блок Hiring Intelligence помещается на 1/3 экрана без скролла
- Stats — 1 строка
- Кого нанимают — 3-5 буллетов
- Где нет людей — 2-3 буллета
- Что это значит — 1-2 короткие фразы
-
WebSearch news:
"<company>" 2026 OR 2025 новости
"<company>" интервью OR пресс-релиз
"<company>" "назначен" OR "возглавил" OR "новый руководитель"
-
(Опционально, paid) Если
доступен:
- REST:
GET https://ows.goszakup.gov.kz/v3/subject/biin/{BIN}
+ Bearer header → детали + сотрудники
- REST:
GET https://ows.goszakup.gov.kz/v3/contract?supplier_biin={BIN}
→ выигранные госконтракты
- REST:
GET https://ows.goszakup.gov.kz/v3/rnu/{BIN}
→ проверка по реестру недобросовестных
Output Stage 1: структурированный профиль компании + hiring intelligence (1 главный инсайт + категоризация ролей + ⭐ звёздные позиции). Каждый факт с источником.
Stage 2: ЛПР Identification
Цель: 1-3 конкретных человека, принимающих решения по нашему офферу.
-
Reasoning step (без вызова инструментов). На основе:
- Профиля компании из Stage 1
- Описания нашего оффера
Определи роли ЛПР, релевантных нашему предложению:
- Для AI sales tools: Commercial Director / Head of Sales / Chief Sales Officer / CMO / Founder
- Для ERP/IT: CIO / CFO / COO / CTO / Founder
- Для логистики: Operations Director / Supply Chain Lead / CEO
- Подумай: кто Buyer (бюджет), Champion (продвинет внутри), User (будет использовать)
-
Найди имена для каждой роли:
- Директор уже известен из adata.kz (Stage 1)
- С официального сайта /team — другие топы (если есть)
- WebSearch
"<company>" CEO OR директор OR президент
- WebSearch
"<company>" "<specific role>"
(например, "коммерческий директор")
- WebSearch
site:linkedin.com/in/ "<company>"
→ LinkedIn snippets с именами и должностями
- WebSearch
"<company>" "назначен" OR "возглавил"
→ recent appointments
-
(Опционально, paid) Если
доступен:
- Вызов Apify actor
LinkedIn Company People Search
→ полный список сотрудников с должностями
Output Stage 2: 1-3 человека с именем, ролью, обоснованием «почему этот человек ЛПР для нашего оффера».
Failure modes:
- Если найден 0 ЛПР → стоп. Зарепортить: «недостаточно публичной информации о руководстве. Рекомендую: outreach на общий info@ или сначала установить контакт через LinkedIn по company name».
- Если найдено >3 → выбери топ-3 наиболее релевантных нашему офферу.
Stage 3: Personal Deep Dive
Цель: context-360 на каждого выявленного ЛПР.
Для каждого ЛПР параллельно:
- WebSearch → подтверждение роли + public mentions
- WebSearch
"<name>" интервью OR подкаст OR выступление
→ public statements
- WebSearch
"<name>" site:forbes.kz OR site:kursiv.kz OR site:kapital.kz OR site:inbusiness.kz
→ KZ business медиа
- WebSearch
"<name>" site:linkedin.com/in/
→ LinkedIn snippets из Google
- WebSearch
"<name>" telegram канал OR t.me/
→ проверь наличие TG-канала
- Если канал найден → вызови telegram-channel-parser на канал → последние 20 постов
- WebSearch
"<name>" награды OR премии
→ recognition signals
- (Опционально, paid) Если : full LinkedIn profile + last 20 posts через Apify
Для каждого ЛПР собери:
- Background: история, predecessor roles, education если public
- Recent activity (последние 3-6 мес): посты, выступления, интервью, события
- Themes: о чём консистентно говорит (например, «scaling Eurasian corridor», «digital transformation», «AI in operations»)
- Specific recent events: конкретные интервью / награды / mentions
Output Stage 3: context dossier на каждого ЛПР с указанием источников.
⭐ Правила для черновика сообщения (КРИТИЧНО для KZ B2B)
Сообщение — это не пересказ research, это снайперский выстрел в pain ЛПР с peer-уважением. Правила выработаны итерациями на реальных B2B-кейсах в KZ:
Объём и структура
| Параметр | Значение |
|---|
| Слов | 120-160 |
| Абзацев | 2-3 (target: 3) |
| SPSV checklist | Все 5 элементов обязательны, но складываются в 3 параграфа |
| Структура | Параграф 1 = Контекст · Параграф 2 = Предложение · Параграф 3 = Действие |
Hook (первый параграф)
- ✅ Короткий KZ-warmup в 1 фразу (5-10 слов) перед диагнозом: «Слежу за X давно», «Внимательно наблюдаю», «Меня заинтересовала траектория Y». KZ-культура уважает признание контекста перед основной мыслью.
- ✅ Переход к диагнозу через тире / «и сейчас» / «и обратил внимание» — плавно из warmup в напряжение
- ✅ 1 предложение с контрастом из их данных сразу после warmup
- ✅ Сильные signal-числа из research — pain-метрики (маржа, конверсия) обязательны если есть
- ✅ Сильные формулировки показывают экспертизу: «редкое сочетание сигналов», «выходит на первый план раньше производства»
- ❌ НЕ длинный warmup на абзац: не «хотел поделиться наблюдением. Накануне я посмотрел релиз...» — это уже церемония, перебор
- ❌ НЕ fake-льстивый: не «вы крутые», не «уважаю всё что вы делаете» — это flattery, а не уважение
- ❌ НЕ accusatory: не «масштабирование убытка», не «вы делаете не то». Insight без осуждения.
Пример хорошего открытия (Радчук, Bayan Sulu):
«Андрей Сергеевич, добрый день. Слежу за "Баян Сулу" давно — и сейчас у вас редкое сочетание сигналов: валовая маржа за 9 мес 2025 минус 13.2%, при этом мощность к концу 2026 растёт на +13 тыс тонн...»
5 слов KZ-warmup → тире → сразу контраст из их P&L → strong frame.
Body (второй параграф)
- Что мы делаем (1 предложение) + конкретная ценность с числами (1 предложение)
- Параллель с их собственной экспертизой если есть в research («тот же подход, что у вас в X, только повёрнутый в Y»)
- Числа конкретные и проверяемые из их P&L или industry-бенчмарков
CTA (третий параграф)
- KZ-уважение: «при возможности», «на ваше усмотрение», «если будет удобно»
- 2 дня недели на выбор, не агрессивный «давайте в среду»
- Не «вам было бы интересно» (риторика отсеется)
Цифры
- 2-4 ключевые в письме (не россыпь)
- В Hook — 1-2 контрастных (pain + opportunity)
- В Body — 1 ценность (bench + база)
- ❌ НЕ кладите 8 цифр в одно письмо — это slide, не sms
Запретный жаргон (НЕ использовать)
- AI-pipeline, SFA, sell-out, контекст-360, FMCG-бенчмарк, канальная видимость, sales-process
- KPI, ROI, customer journey, value proposition, pain points (в значении «боли»)
- Английские термины без перевода если есть нормальный русский
KZ-формулы уважения (обязательны)
- Полное имя-отчество в обращении и в подписи
- На «вы» (не «ты»)
- «Накануне я посмотрел...» / «Я обратил внимание...» (subject + verb, не «увидел»)
- «При возможности», «на ваше усмотрение», «если будет удобно» — в CTA
- «С уважением, [полное имя]» в подписи
Не выдумывай
Если по какому-то блоку SPSV (особенно «Проблема») нет данных в research — лучше пропустить блок, чем добавить generic фразу. Принцип: каждая фраза должна быть подкреплена находкой из Stages 1-4.
Replace, не add
На v→v+1 (после нового шага research) — заменяем generic-фразы на specific, объём НЕ растёт. Если v3 > 170 слов — режем generic, не добавляем новое.
Stage 4: Synthesis — заходы и черновики сообщений
Делаем два артефакта:
- Заход (hook) — короткое insight-предложение «с чего начать диалог», главная единица персонализации
- Черновик сообщения — собран по структуре «анатомия» (см. ниже), включает заход + value prop + CTA
Оба эволюционируют с каждым шагом research. Чем больше слоёв data — тем выше качество по 5 измерениям.
📐 Framework качества — что делает заход и сообщение лучше
5 измерений, по которым растёт качество при каждом новом слое:
| # | Измерение | Что значит | Как растёт v1→v3 |
|---|
| 1 | Конкретика | Привязка к этой компании / человеку, не template | компания → +рынок → +персона |
| 2 | Свежесть сигнала | Recency reference: на что мы ссылаемся | вакансия (дни-недели) → рынок (мес) → LinkedIn-пост (часы-дни) |
| 3 | Их язык vs наш | Используем их собственные слова/фрейминг | 0% → их сектор-термины → прямая цитата |
| 4 | Доказательность | Получатель может проверить, что мы готовились | вакансия проверяема → +источники → +цитата (неоспоримо) |
| 5 | Peer-feel | Звучит как коллега пишет, или как cold-sales | холодное → знаем рынок → знаем тебя лично |
Это substantive-измерения. По ним можно сравнить любые две версии и сказать, какая сильнее.
✏️ Анатомия хорошего сообщения — 4 элемента, каждое 1 фраза
| Элемент | Содержание |
|---|
| Personal context | Конкретное событие / факт из их публичной активности |
| Why now | Связь с нашим продуктом и моментом |
| Specific value | Что именно решаем под их контекст (не «у нас классный продукт») |
| Low-friction CTA | 15-20 минут, конкретный день, не «вам было бы интересно» |
Правила гигиены:
- 3-5 предложений максимум
- Прямой тон, без лести, без buzzwords
- НЕТ слов: «надеюсь, у вас всё хорошо», «коротко о нас», «уделите 5 минут», «думаю, вам будет интересно»
- Specific, не generic: если можно заменить название компании и смысл не сломается — слишком общее
🎨 Highlight-разметка в HTML-отчёте
В полных письмах на вкладке Коммуникация подсвечиваем что было добавлено на каждом шаге:
<span class="added-v2">синий</span>
— добавлено после Шага 2 (Рынок)
<span class="added-v3">зелёный</span>
— добавлено после Шага 3 (LinkedIn)
<span class="added-v4">оранжевый</span>
— добавится после Шага 4 (Соцсети)
Это даёт визуальный diff: пользователь видит, какие именно куски текста появились благодаря какому слою research.
ВАЖНО: эти span-обёртки применяются ТОЛЬКО внутри
блоков (вкладка Коммуникация). На вкладке Аналитика — в person-cards, в Шаге 2, в раскрытом контексте ЛПР — НИКАКИХ
span'ов не должно быть. Если возникает соблазн подсветить «добавление» на Аналитике (например, что market context добавил что-то к «С чего зайти») — НЕ делай этого. CSS для
scope'нут на
, и подсветка вне его не сработает; но и span'ы туда не вставляй — это смешивает уровни.
В framework-блоке Communication tab — легенда с этими цветами.
Stage 4a — Person-First Action Summary (обязательное)
Цель: для каждого PRIMARY ЛПР собрать «карточку действий для сейла» — что нужно знать за 10 секунд.
Что включает person-card:
-
В приоритете сейчас (2-4 буллета) — что у этого ЛПР на тарелке прямо сейчас:
- Recent moves (последние 3-6 мес) с датами / именами / источниками
- Что лично говорит / постит / выступает
- На что он публично потратил время, деньги, внимание
- НЕ обобщения: «занимается AI» = плохо. «Запустил D8N.ai в 2025, инвестировал $100K в MOST Fund в Q4» = хорошо.
-
С чего зайти (1 событие + опорная фраза) — конкретный opening:
- ОДНО событие/факт (свежее, верифицируемое)
- Опорная фраза которая привязывает событие к диалогу
- Источник для этого события (чтобы сейл мог проверить)
-
Стык с нашим оффером (1-2 фразы) — где их фокус пересекает наш продукт:
- Обязательно. Без этого карточка не имеет ценности для сейла.
- Не «у нас классный продукт». А «они делают X — наш Y усиливает X»
Приоритизация ЛПР для карточек:
Per-tier hierarchy для ВЫБОРА кого включать в person-cards:
| Tier | Кто это | Включать в Главное? |
|---|
| Primary | Buyer / Champion / Decision Maker по нашему офферу | ✅ Полная карточка |
| Secondary | Gatekeeper / co-decision (юрист / финансист) | ❌ Только в «Идентифицированные ЛПР» list. Без person-card. |
Правила гигиены person-cards (вкладка Аналитика → Главное):
- 1-3 карточки максимум, только primary ЛПР
- Если только 1 primary найден — 1 карточка. Не заполняй искусственно.
- Если 0 primary — стоп. Сообщи: «не нашёл persona-level контекста для personalized outreach, рекомендую company-level подход».
Выбор ГЛАВНОГО ЛПР для COMM_CARDS (вкладка Коммуникация):
Если primary ЛПР больше одного — выбираем ровно одного для генерации полного письма. Критерии в порядке убывания приоритета:
-
Уровень в иерархии: CEO/Owner/Founder > C-level (CFO, CMO, CRO, COO, CTO) > VP > Head of > Director > Manager. Выше = главнее.
-
Final budget authority по нашему офферу: для AI-инструментов отдела продаж — Head of Sales / CRO / коммерческий директор; для серверов — IT-директор / CIO; для маркетинговых сервисов — CMO. Если top-1 по иерархии не имеет authority в нашей категории, а #2 имеет — берём #2.
-
Свежесть signals: при равных iерархии и authority — берём того, у кого больше recent public активности (новости, посты, выступления) за 30 дней.
-
Если совсем равны: берём первого по алфавиту фамилии (детерминированно).
В Executive Summary остаются 1-3 person-cards — все primary ЛПР с контекстом для сейла. Но кнопка «Перейти к письму →» (
data-target="#comm-<slug>"
) активна
только у главного ЛПР. У остальных кнопка либо отсутствует, либо отображается как disabled с подписью «Письмо генерируем только для главного — для этого ЛПР используй шаблон главного как основу».
Хороший пример (Documentolog → Канафин):
В приоритете сейчас:
• Cross-border расширение через Контур (фев 2026)
• Запуск D8N.ai в продакшен + укомплектование AI Research dept
• Формирование международной партнёрской функции (открыта senior позиция)
С чего зайти:
Открытая вакансия руководителя международных партнёрских продаж —
formation moment коммерческой функции после Контур. Конкретное публичное событие, можно сослаться напрямую.
Стык с нашим оффером:
Канафин уже строит вертикальный AI (D8N.ai) и инвестирует в B2B AI
(MOST Fund). Наш стек — «D8N.ai для коммерческих команд». Категория,
которую он сам признаёт ценной.
Плохой пример (без personalization):
В приоритете сейчас:
• Развивает компанию
• Расширяется
• Внедряет AI
С чего зайти:
Поговорить про AI
Стык с нашим оффером:
У нас есть AI-решение для продаж.
Stage 5: HTML Report Generation & Auto-Open
Цель: красивый, копируемый HTML-отчёт, автоматически открывается в браузере.
-
Подготовь данные для подстановки в шаблон (все собранные на Stage 1-4 факты + сообщения).
-
Прочитай шаблон:
Read: .claude/skills/enrich-and-pitch/templates/report.html
В конце шаблона есть HTML-комментарий с описанием всех placeholder'ов и структур повторяющихся блоков — следуй им строго.
-
Сгенерируй заполненный HTML:
- Header / meta: , , (формат «20 мая 2026, 14:30»), , ,
- ⭐ — секция «Главное»: 1-3 person-action карточки из Stage 4a (только PRIMARY ЛПР). Action-link ведёт к раскрывающейся карточке ЛПР ниже; кнопка
data-target="#comm-<slug>"
переключает на вкладку Коммуникация и скроллит к нужному сообщению.
{{COMPANY_FACTS_COMPACT}}
+ — компания: компактные видимые факты + legal в collapsed
- Активность по найму: (1 строка), (3-5 буллетов), (2-3 буллета), (1-2 фразы вывода)
- ⭐ — раскрывающиеся
<details class="lpr-card" id="lpr-<slug>">
per ЛПР. Summary — компактная карточка (имя, должность, why). Внутри раскрытия — контекст (background, recent activity, themes, угол захода). Черновика письма внутри НЕТ — он живёт только на вкладке Коммуникация.
- — Market context, идёт сразу после ЛПР. STUB по умолчанию (Stage 5), FULL после Stage 6.
- / — LinkedIn / Social. STUB по умолчанию (paid).
- — все использованные URL из всех стейджей. Всегда в самом конце вкладки Аналитика.
- ⭐ — РОВНО ОДНА для главного primary ЛПР (top-1, см. правило выбора в Stage 4a). Внутри только с 4 полными версиями письма (v1 база, v2 +рынок, v3 +LinkedIn, v4 +соцсети). Каждая версия = ПОЛНОЕ письмо. В v2/v3/v4 фрагменты, которые добавились относительно предыдущей версии, обёрнуты в
<span class="added-v2">…</span>
/ / — это даёт визуальный diff. Никаких отдельных hook-блоков. Для остальных primary ЛПР письма не генерируем — они остаются в person-cards Executive Summary с раскрывающимся контекстом, но без кнопки «Перейти к письму».
Контекст ЛПР живёт ВНУТРИ — каждый
<details class="lpr-card" id="lpr-<slug>">
содержит
(компактная карточка) +
<div class="lpr-context">
(background, recent activity, themes, угол захода). Отдельного
плейсхолдера нет.
Порядок секций на вкладке Аналитика (фиксированный):
- Главное (PERSON_CARDS)
- Профиль компании
- Активность по найму (HIRING_*)
- Идентифицированные ЛПР (LPR_CARDS — с вложенным контекстом)
- Шаг 2: Market context (STEP2_SECTION)
- Шаг 3: LinkedIn deep dive (STEP3_SECTION)
- Шаг 4: Social signals (STEP4_SECTION)
- Источники (в самом конце)
-
Определи путь файла:
bash
COMPANY_SLUG=$(echo "<COMPANY_NAME>" | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr -cd 'a-z0-9-')
TIMESTAMP=$(date +%Y%m%d-%H%M)
REPORT_PATH="reports/${COMPANY_SLUG}-${TIMESTAMP}.html"
-
Создай папку если её нет + добавь в (чтобы пользовательские отчёты не пачкали репо):
bash
mkdir -p reports
if [ -f .gitignore ] && ! grep -q "^reports/$" .gitignore; then
echo "reports/" >> .gitignore
fi
-
Сохрани HTML через Write tool на
.
-
Автооткрытие в браузере (cross-platform):
bash
open "$REPORT_PATH" 2>/dev/null \
|| xdg-open "$REPORT_PATH" 2>/dev/null \
|| start "" "$REPORT_PATH" 2>/dev/null \
|| echo "Отчёт сохранён: $REPORT_PATH (открой вручную)"
-
Финальный ответ пользователю:
✅ Готово. Отчёт открыт в браузере.
Файл: reports/<slug>-<timestamp>.html
Использовано: <stack>
Stage 5b: Предложить Шаг 2 в чате
Сразу после Stage 5 (после генерации и открытия HTML) — в чате Claude Code предложи запуск Stage 6.
В
HTML вставь STUB-state:
html
<section class="step2-stub">
<h2>📍 Шаг 2: Market context — не запущен</h2>
<p>Добавь контекст сектора и конкурентов — скажи в чате Claude Code <code>«запусти Шаг 2»</code></p>
</section>
В чате после summary дай предложение:
🔬 Шаг 2 — Market context
Хочешь добавить понимание сектора, конкурентов и динамики рынка?
Это займёт ещё ~3-5 минут — тот же HTML обновится с market research.
Скажи «да» / «запусти Шаг 2» — пойду собирать market context.
Ожидай реакции пользователя. Если «да» / «запусти Шаг 2» / эквивалент → переходи к Stage 6.
Если «нет» / «пока хватит» / молчание → завершай. Пользователь может позже сам запустить.
Stage 6: Market Research (только если пользователь сказал «да» в Stage 5b)
Цель: через WebSearch + WebFetch собрать market context. Не уходи в claude.ai — работаешь теми же тулзами что и в Stages 1-4.
Параллельные WebSearch'и:
-
Конкуренты компании в секторе:
"{сектор}" Казахстан конкуренты топ-5
"{сектор}" Казахстан крупнейшие компании
"{сектор}" {company} конкуренты
- Из ответов извлеки 3-5 имён с краткой позицией (~10-15 слов про каждого)
- Сгруппируй: KZ-локальные / региональные (РФ/CIS) / глобальные
-
Динамика рынка 2024-2026:
"{сектор}" Казахстан рынок 2026
"{сектор}" Казахстан объём рост
"{сектор}" регулирование Казахстан 2026
- Ищи: объём рынка, темпы роста, регуляторные изменения, мандатное внедрение, ключевые milestones
-
AI / технологические тренды в категории:
"{сектор}" AI внедрение тренды 2026
"{сектор}" автоматизация AI Казахстан
- Какие именно use cases AI в этой категории, кто из конкурентов внедряет, что мейнстрим
-
Что меняется в 2026 (макро):
- Год AI в РК → как это влияет на сектор
- Регуляторные изменения
- Cross-border / regional shifts
-
Уязвимости лидера сегмента:
- Угрозы со стороны глобалов / новых entrants / regulator
- Где компания МОЖЕТ потерять долю
- На что AI-native новички могут заходить
Hallucination guard: те же правила что Stage 1 — каждый факт с источником, неточные пометить.
Stage 7: Update HTML — Step 2 + regenerate full message (v1 → v2)
Двойная задача:
- Заменить STUB Step 2 section на FULL market context (на вкладке Аналитика, между ЛПР и Шагом 3)
- Regenerate полное письмо v2 на вкладке Коммуникация — с подсветкой market-добавок через
После Stage 6:
7a. Regenerate full message v2 (Шаг 2 evolution)
Для каждого PRIMARY ЛПР:
- Возьми v1 — полное письмо после Шага 1 (Personal context → Why now → Specific value → CTA)
- Сгенерируй v2 — то же письмо, но с добавкой market layer: конкуренты, регуляторный контекст, динамика сектора. Добавки обворачивай в
<span class="added-v2">…</span>
чтобы они визуально подсвечивались
- v2 должен звучать резко сильнее v1: если только переставил слова — не меняй (нет смысла в evolution)
- Добавь блок под v2 — 1-2 предложения, что именно добавилось
Пример (Sulpak v1 → v2):
- v1: «80% покупок через карты лояльности → нагрузка на CRM 24/7, AXELOT WMS расширяется. Готовы обсудить серверы под этот контур»
- v2: v1 +
<span class="added-v2">Mechta в 2024 потеряла 15%, категория упёрлась в насыщение → loyalty-data становится единственным защищаемым активом</span>
+ <span class="added-v2">регулятор движется тремя волнами поправок в 2026: 18 января уже в силе, 11 июля финальная</span>
7b. Update HTML
-
Найди STUB Step 2 section → замени на FULL market context (HTML-шаблон ниже в этом файле).
-
На вкладке Коммуникация — единственная comm-card для главного ЛПР:
- v1 (текущая) → переезжает в
- v2 (новая) → становится на самом верху
- v3 / v4 stubs остаются как есть
html
<div class="message-versions">
=== LATEST version (current) ===
<div class="message-version current">
<button class="copy-btn">Скопировать</button>
<div class="message-version-meta">
<span class="message-version-badge">v2 · + Рынок</span>
<span class="message-version-status">Текущая версия — после Шага 2</span>
</div>
<pre>{Имя}, добрый день.
{Personal context v1.} <span class="added-v2">{Market addition.}</span>
{Why now v1.} <span class="added-v2">{Market frame.}</span> {Specific value.}
{CTA.}
С уважением,
[Ваше имя]</pre>
<div class="what-changed">
<strong>Что изменилось в v2:</strong> 1-2 предложения объяснения добавленных market-слоёв.
</div>
</div>
=== Previous version (v1 base) ===
<div class="message-version previous">
<button class="copy-btn">Скопировать</button>
<div class="message-version-meta">
<span class="message-version-badge">v1 · База</span>
<span class="message-version-status">Предыдущая версия — после Шага 1</span>
</div>
<pre>{Full v1 letter without market additions.}</pre>
</div>
=== v3 / v4 stubs (остаются как есть) ===
...
</div>
-
Никаких изменений на вкладке Аналитика в LPR-карточках — там черновика письма нет, контекст ЛПР остаётся прежним.
-
Сохрани файл, открой:
-
В чате: «✅ Шаг 2 добавлен. Обнови вкладку (Cmd+R). На вкладке Коммуникация v2 — с подсвеченными market-добавками. Старая v1 рядом для сравнения.»
Stage 8: Шаг 3 — Paid sources (опционально, если есть keys)
Сразу после Stage 7 (после Шаг 2 готов) — снова предложение в чате:
🔬 Шаг 3 — Paid sources (LinkedIn deep dive + goszakup)
Хочешь добавить личные данные ЛПР через paid sources?
- Apify LinkedIn Profile + последние 10 постов
- (опционально) goszakup history если есть token
Это ещё ~2-3 мин, hook эволюционирует в v3 с laser-точным контекстом.
Скажи «да» / «запусти Шаг 3».
Если пользователь сказал «да»:
-
bash
if [ -f .env ]; then source .env; fi
if [ -z "$APIFY_API_KEY" ]; then
echo "Нет APIFY_API_KEY. Положи в .env."; exit
fi
-
Найди LinkedIn URL primary ЛПР (из Stage 3 — если был snippet, или WebSearch заново)
-
Вызови Apify LinkedIn Profile Scraper:
bash
curl -X POST "https://api.apify.com/v2/acts/dev_fusion~linkedin-profile-scraper/run-sync-get-dataset-items?token=$APIFY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"profileUrls": ["https://www.linkedin.com/in/<lpr-handle>"]}'
Альтернативный actor если первый не работает:
bebity/linkedin-premium-actor
,
curious_coder/linkedin-profile-scraper
.
-
Из ответа извлеки:
- Recent posts (последние 10)
- About / Summary
- Skills и эндорсменты
- Network connections (high-profile)
- Recent activity (likes, comments, reposts)
-
Regenerate полное письмо v3 — на основе LinkedIn-данных:
- v3 включает конкретный recent LinkedIn signal (цитата из поста, недавняя активность) обёрнутый в
<span class="added-v3">…</span>
- Пример добавки: «Видел ваш пост от [дата] про [тема] — пересекается с тем что вы делаете в [продукт]»
- v3 = v2 как база + LinkedIn-добавки, не переписываем письмо целиком
-
Update HTML — Stage 9.
Stage 9: Update HTML — Step 3 → v3 current
-
На вкладке Коммуникация — единственная comm-card для главного ЛПР:
- v2 (current) → переезжает в
- v3 (новый) → становится на самом верху
- v1 (previous) → остаётся , ниже v2
- Stub v3 → удаляется
- v3 содержит ПОЛНОЕ письмо v2 + LinkedIn-добавки обёрнутые в
<span class="added-v3">…</span>
(personal post quote, дата, тема). Цвет подсветки автоматически зелёный (см. CSS .added-v3)
- Добавь блок под v3 с описанием LinkedIn-слоя
-
Опционально: добавить новую секцию
с raw LinkedIn data (свёрнуто по умолчанию через
). Положи между Шаг 2 и Шаг 4 на вкладке Аналитика.
-
Никаких изменений на вкладке Аналитика в LPR-карточках — там черновика письма нет.
-
Open + chat:
✅ Шаг 3 готов. На вкладке Коммуникация v3 — теперь с personal LinkedIn context (зелёная подсветка). v1, v2 рядом для сравнения.
Market context HTML template (для замены STUB в Stage 7)
html
<section class="step2-full">
<h2>📍 Шаг 2: Market context</h2>
<div class="summary-subtitle">Сектор, конкуренты, динамика, что из этого торчит</div>
<dl class="market-grid">
<dt>Сектор</dt>
<dd>...определение сегмента (1 фраза)...</dd>
<dt>Положение компании</dt>
<dd>...лидер / challenger / niche, размер доли если известно...</dd>
<dt>Конкуренты</dt>
<dd>
<ul>
<li><strong>Имя</strong> — позиционирование (KZ-локальный)</li>
<li><strong>Имя</strong> — позиционирование (региональный)</li>
<li><strong>Имя</strong> — позиционирование (глобал)</li>
</ul>
</dd>
<dt>Динамика</dt>
<dd>
<ul>
<li class="up">что растёт / drives the market</li>
<li class="up">регуляторные tailwinds</li>
<li class="down">что давит / угрозы / headwinds</li>
</ul>
</dd>
</dl>
<div class="market-insight">
<div class="market-insight-label">Что из этого торчит для нашего outreach</div>
<div class="market-insight-body">
1-2 предложения вывод. Как контекст сектора усиливает наш заход к этому ЛПР.
</div>
</div>
<div class="market-sources">
Источники: <a href="...">name1</a>, <a href="...">name2</a>, <a href="...">name3</a>
</div>
</section>
Output Format (для пользователя в чате)
В начале (Stage 1.0 — подтверждение):
🔍 Ищу компанию...
Нашёл кандидата(ов) для «<input>»:
1. ТОО Documentolog
БИН 070840007503 · Астана · 41-50 человек · директор Аманбекова М.А.
Разработка ПО, 18 лет на рынке
2. (если есть второй) ...
Какую исследуем? (1 / 2 / обе / уточнить)
Жди подтверждения. После него — иди в полный цикл.
После Stage 5 (Шаг 1 готов):
✅ Контекст-360 по <Company> готов. Отчёт открыт в браузере.
📄 reports/<slug>-<timestamp>.html
Найдено ЛПР: <N> (из них primary: <N>, главный: <Имя Фамилия>)
Сгенерировано писем: 1 (полное письмо для главного ЛПР)
Использовано: <stack>
Время: ~<X> сек
—————————————————————————
🔬 Шаг 2 — Market context
Хочешь добавить понимание сектора, конкурентов и динамики рынка?
~3-5 мин. Тот же HTML обновится с market research.
Скажи «да» / «запусти Шаг 2» — пойду собирать.
Ожидай реакции пользователя.
После Stage 7 (если Шаг 2 был запущен):
✅ Шаг 2 добавлен в отчёт.
Использовано: <stack> + market research
Время Шага 2: ~<X> мин
Источников добавлено: <N>
Обнови вкладку браузера (Cmd+R) — Market context появится после Источников.
Hallucination Guards (КРИТИЧНО)
- Каждый факт в output должен иметь URL-источник.
- Если факт не подтверждён → пометь или опусти.
- Если человек / компания не верифицируется → не выдумывай: «не нашёл публичных данных о X».
- НИКОГДА не выдумывай: имена ЛПР, должности, факты биографии, финансовые данные, конкретные события, цитаты из интервью.
- Если goszakup данные не доступны → не выдумывай историю контрактов.
- Если LinkedIn профиль не найден → не выдумывай содержание постов.
Tool Detection (auto-graceful degradation)
В начале работы проверь доступные env vars:
- → enables Apify LinkedIn calls (Stage 2-3)
- → enables goszakup API (Stage 1)
- → enables Scrape.do для заблокированных сайтов (Stage 1)
- → enables yandex-search-api для глубокого RU/KZ SERP
В output финальная строка перечисляет что использовалось:
или
Использовано: free + apify + goszakup
.
Failure Modes
- Компания не найдена в adata.kz: попробуй разные варианты написания (русский / казахский / English). Fallback: только WebSearch.
- 0 ЛПР найдено: report и стоп. Не генери generic сообщения.
- ЛПР без public footprint: сообщение можно сделать на основе только company context, но честно отметить «контекст по человеку ограничен».
- Все paid недоступны: продолжай на free стеке, в output пометь.
Расчётное время выполнения
- Free стек: 60-120 сек на компанию
-
-
Примеры запроса от пользователя
✅ «Сделай контекст-360 на Globalink Logistics. Мы продаём AI-инструменты для отдела продаж: лидген, скоринг входящих, аналитика звонков.»
✅ «Обогати БИН 110842011929 и подготовь outreach. Наш оффер: SaaS для логистических компаний — управление документооборотом и отслеживание грузов.»
✅ «Найди ЛПР в Documentolog и напиши первое сообщение. Продаём: коучинг отделов продаж через AI-анализ переписки.»
Что НЕ делает этот skill
- Не отправляет письма (только генерирует драфты)
- Не сохраняет в CRM (только производит markdown)
- Не работает с компаниями вне Казахстана как primary use case (для них adata.kz и goszakup не релевантны — нужен другой набор источников)
- Не делает audio/voice анализ (это отдельная Surfnote-история)