Kommo + Woodpecker: синхронизация лидов из холодного аутрича в CRM

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):

  1. Проспект отвечает на письмо - Woodpecker отправляет вебхук REPLIED.
  2. Сервис ищет контакт в Kommo по email. Если не найден - создаёт.
  3. Создаёт или обновляет сделку с тегом «Woodpecker» и данными кампании.
  4. Добавляет заметку: текст ответа, название кампании, шаг последовательности.

Схема работы (Kommo -> Woodpecker):

  1. Менеджер переводит сделку на этап «Квалифицирован» или «Встреча назначена».
  2. Kommo webhook уведомляет сервис о смене этапа.
  3. Сервис находит проспекта в 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 недели.

Ещё статьи

Все →