Kommo + Woodpecker: синхронизация лидов из холодного аутрича в CRM
Woodpecker - специализированная платформа для B2B cold email outreach с автоматическими follow-up последовательностями. Когда проспект отвечает на письмо - это сигнал интереса, который должен немедленно превратиться в сделку в Kommo. Woodpecker REST API и webhook-система позволяют построить двустороннюю интеграцию: ответы попадают в CRM, а статус из CRM возвращается в Woodpecker для остановки кампании.
Это важный сценарий для outbound-команд: без интеграции менеджер вручную проверяет Woodpecker, копирует данные в Kommo, забывает остановить кампанию - и проспект получает ещё три follow-up уже после того, как ответил и назначил встречу.
Почему нативная интеграция Woodpecker + Kommo не решает задачу
Woodpecker предлагает нативные интеграции с Pipedrive, HubSpot и несколькими другими CRM. Kommo в этом списке нет. Технически Woodpecker можно подключить к Kommo через Zapier - «при ответе проспекта создать контакт в Kommo». Но этот подход ломается на практике:
Одностороннее движение. Zapier создаёт контакт при ответе, но не умеет остановить кампанию в Woodpecker когда сделка в Kommo переходит на «Встреча назначена» или «Квалифицирован». В результате проспект продолжает получать письма уже после того, как стал активным лидом.
Отсутствие дедупликации. Если проспект уже есть в Kommo (например, был добавлен вручную ранее), Zapier создаст дубль вместо обновления существующего контакта.
Потеря контекста кампании. В Kommo не попадает информация о том, какую кампанию читал проспект, какое письмо зацепило, сколько follow-up было до ответа. Менеджер начинает разговор «вслепую».
Кастомная интеграция через Woodpecker API v1 решает все три проблемы.
Архитектура интеграции
Woodpecker API работает по REST, аутентификация через API-key в заголовке x-api-key. Вебхуки поддерживают события: REPLIED, BOUNCED, OPTED_OUT, INTERESTED, CALL_SCHEDULED.
Схема работы (Woodpecker -> Kommo):
- Проспект отвечает на письмо - Woodpecker отправляет вебхук
REPLIED. - Сервис ищет контакт в Kommo по email. Если не найден - создаёт.
- Создаёт или обновляет сделку с тегом «Woodpecker» и данными кампании.
- Добавляет заметку: текст ответа, название кампании, шаг последовательности.
Схема работы (Kommo -> Woodpecker):
- Менеджер переводит сделку на этап «Квалифицирован» или «Встреча назначена».
- Kommo webhook уведомляет сервис о смене этапа.
- Сервис находит проспекта в Woodpecker по email и помечает его статус
REPLIEDили останавливает кампанию.
import requests
import hashlib
import json
from typing import Optional
WOODPECKER_BASE = "https://api.woodpecker.co/rest/v1"
def get_woodpecker_prospect(api_key: str, email: str) -> Optional[dict]:
"""Ищем проспекта в Woodpecker по email."""
headers = {"x-api-key": api_key}
resp = requests.get(
f"{WOODPECKER_BASE}/prospect_list",
headers=headers,
params={"email": email}
)
if resp.status_code == 404:
return None
resp.raise_for_status()
data = resp.json()
return data[0] if data else None
def update_prospect_status(api_key: str, prospect_id: int, status: str):
"""
Обновляем статус проспекта в Woodpecker.
status: ACTIVE | PAUSED | REPLIED | BOUNCED | OPTED_OUT | NOT_CONTACTED
"""
headers = {"x-api-key": api_key, "Content-Type": "application/json"}
resp = requests.put(
f"{WOODPECKER_BASE}/prospect/{prospect_id}",
headers=headers,
json={"status": status}
)
resp.raise_for_status()
def handle_woodpecker_webhook(payload: dict, kommo_client, api_key: str):
"""
Обрабатываем событие REPLIED из Woodpecker.
"""
event = payload.get("event")
if event != "REPLIED":
return # Обрабатываем только ответы
prospect = payload["prospect"]
campaign = payload["campaign"]
email_addr = prospect["email"]
first_name = prospect.get("first_name", "")
last_name = prospect.get("last_name", "")
company = prospect.get("company", "")
reply_text = payload.get("reply_message", "")
# Ищем или создаём контакт в Kommo
contact = kommo_client.search_contact_by_email(email_addr)
if not contact:
contact = kommo_client.create_contact(
name=f"{first_name} {last_name}".strip(),
email=email_addr,
company=company,
)
# Ищем активную сделку или создаём новую
lead = kommo_client.get_active_lead_for_contact(contact["id"])
if not lead:
lead = kommo_client.create_lead(
contact_id=contact["id"],
name=f"{company} - Woodpecker",
tags=["woodpecker", "cold-outreach"],
custom_fields={
"campaign_name": campaign["name"],
"reply_step": str(payload.get("step", 1)),
}
)
# Добавляем заметку с текстом ответа
note = (
f"Ответ на cold email (Woodpecker)\n"
f"Кампания: {campaign['name']}\n"
f"Шаг последовательности: {payload.get('step', '?')}\n\n"
f"Текст ответа:\n{reply_text}"
)
kommo_client.add_note(lead["id"], note)
return lead
Пошаговая реализация
Шаг 1 - Woodpecker API Key. В настройках Woodpecker: Settings -> Integrations -> API. Генерируете ключ. Он передаётся в заголовке x-api-key каждого запроса.
Шаг 2 - настройка вебхуков Woodpecker. Settings -> Webhooks. Добавляете URL микросервиса. Выбираете события: REPLIED, INTERESTED, OPTED_OUT. Woodpecker поддерживает HMAC-SHA256 подпись для верификации.
Шаг 3 - Kommo webhook на смену этапа. Создаёте вебхук для событий смены статуса сделки. При переходе на «Квалифицирован» или «Won» - сервис обновляет статус проспекта в Woodpecker.
Шаг 4 - кастомные поля в Kommo. Создаёте в Kommo кастомные поля для сделки: «Кампания Woodpecker», «Шаг ответа», «ID проспекта Woodpecker». Они нужны для обратной синхронизации.
Шаг 5 - логика дедупликации. Перед созданием контакта всегда проверяйте по email. Перед созданием сделки - проверяйте, нет ли уже активной сделки у этого контакта. Это предотвращает дубли при повторном ответе проспекта на другую кампанию.
Шаг 6 - остановка кампании. Когда сделка переходит в «Won» или «Lost» - меняйте статус проспекта в Woodpecker на REPLIED (это останавливает отправку). Не удаляйте проспекта из Woodpecker - данные нужны для аналитики кампаний.
Реальный кейс: B2B SaaS, аутрич в US-рынок
SaaS-компания из Восточной Европы, продающая в US. Outbound-команда 3 SDR, около 200 проспектов в активных кампаниях Woodpecker. CRM - Kommo.
Проблема: SDR ежедневно проверяли Woodpecker вручную, копировали данные ответивших в Kommo. Кампании забывали останавливать. Один проспект получил 4 follow-up письма уже после того, как назначил демо - ушёл.
После интеграции: ответ в Woodpecker появляется в Kommo через 15 секунд. SDR видит уведомление в Kommo и сразу может ответить. При переходе сделки на «Демо назначено» кампания останавливается автоматически.
Результат за 3 месяца: время обработки лидов из аутрича сократилось с 2 часов/день до 15 минут. Ни один из квалифицированных лидов не получил лишних писем. Конверсия ответ -> встреча выросла на 18% - менеджеры стали отвечать быстрее.
Для кого подходит
Интеграция Kommo с Woodpecker нужна командам, у которых:
- Активный outbound-канал с объёмом 500+ писем в неделю
- SDR-команда, работающая в Woodpecker, и account executives в Kommo
- Требование к полной хронологии касаний с проспектом в CRM
- Проблема с «зомби-проспектами» - лидами, которые уже в воронке, но продолжают получать cold email
Для inbound-лидов из форм и рекламы задача другая - там нужны интеграции с формами или рекламными платформами. Outbound-специфика Woodpecker требует своей логики.
Часто задаваемые вопросы
Woodpecker умеет не только email - есть LinkedIn-шаги. Они тоже синхронизируются?
Woodpecker поддерживает LinkedIn-шаги в последовательностях, но они выполняются вручную (оператором). Webhook MANUAL_TASK_COMPLETED отправляется при выполнении ручного шага. Интеграция может получать это событие и добавлять заметку в Kommo: «Выполнен LinkedIn-шаг кампании X».
Как передавать UTM-метки или персонализацию из Woodpecker в Kommo?
Woodpecker хранит custom fields для каждого проспекта. В вебхуке они передаются в объекте prospect.custom_fields. Вы можете маппировать их в кастомные поля сделки Kommo. Например, company_size из Woodpecker -> поле «Размер компании» в Kommo.
Что происходит, если проспект отвечает negativно (“не интересует”)?
Woodpecker не определяет тональность ответа автоматически (без AI-анализа). Вебхук REPLIED приходит на любой ответ. В интеграции создаётся сделка с тегом «Требует квалификации» - менеджер сам читает ответ и решает: закрыть или развивать. Если Woodpecker настроен с категорией OPTED_OUT - такой проспект получает отдельный вебхук, и сделку можно сразу помечать как закрытую.
Можно ли инициировать запуск кампании Woodpecker из Kommo?
Да. Woodpecker API позволяет добавлять проспекта в кампанию через POST /prospect. Можно настроить: при добавлении тега «Для аутрича» в Kommo - сервис добавляет контакт в нужную кампанию Woodpecker. Полноценная двусторонняя связь.
Влияет ли интеграция на доставляемость писем Woodpecker?
Нет. Интеграция работает через API и не затрагивает механизм отправки писем. Woodpecker использует собственный SMTP или подключенный Gmail/Outlook аккаунт - это полностью независимо от API-интеграции с Kommo.
Следующий шаг
Если вы используете Woodpecker для outbound и Kommo для ведения сделок - опишите задачу команде Exceltic.dev. Разберём ваш процесс передачи лидов и предложим архитектуру интеграции. Стандартный проект - 1-2 недели.