Kommo + Kit (ConvertKit): email-автоматизация из воронки продаж

Kommo + Kit (ConvertKit): email-автоматизация из воронки продаж

Kit (до 2024 года — ConvertKit) — платформа email-автоматизации с мощной тег-сегментацией и визуальным конструктором последовательностей. Без интеграции с Kommo маркетолог вручную добавляет нового клиента в Kit после Won, менеджер не знает в каких email-кампаниях участвует клиент, а отписка клиента не отражается в CRM. С интеграцией смена этапа воронки в Kommo автоматически запускает Kit-последовательность с правильными тегами, и каждое значимое email-событие появляется в карточке сделки.

Kit vs Customer.io: когда что выбирать

Kit ориентирован на creator economy и контент-бизнесы — курсы, SaaS с обучающим онбордингом, community-продукты. Сильные стороны: визуальные автоматизации, теги как основной механизм сегментации, интеграции с Teachable/Kajabi/Gumroad.

Customer.io — поведенческий маркетинг для product-led SaaS: события из продукта -> кампании. API-первый подход, сложные условия на основе свойств пользователя.

Для Kommo-интеграции оба реализуются аналогично. Customer.io интеграцию выбирают когда нужна тригерная отправка по событиям в продукте. Kit — когда онбординг строится через email-последовательности с тег-логикой.

Что синхронизируется

Kommo -> Kit:
— Won -> создать или обновить подписчика в Kit (upsert по email)
— Won -> добавить тег customer, plan:{plan_name}, source:{channel}
— Won -> добавить в последовательность онбординга
— Смена этапа -> изменить теги (убрать trial, добавить active)

Kit -> Kommo:
subscriber.unsubscribed -> Note + задача менеджеру: «Клиент отписался от Kit»
subscriber.bounced -> Note + задача проверить email
— Завершение последовательности -> Note: «Онбординг-кампания завершена»

Архитектура

Kommo Webhook: сделка перешла в Won
  ↓ Backend
  1. GET /api/v4/leads/{id} + contacts
     -> email, имя, тариф, источник из кастомных полей
  2. Kit API v4: POST /subscribers (upsert)
     -> email, first_name, custom fields (plan, kommo_deal_id)
  3. Kit API v4: POST /tags/{tag_id}/subscribers
     -> добавить теги: customer, plan:{plan}, source:{source}
  4. Kit API v4: POST /sequences/{seq_id}/subscribers
     -> добавить в онбординг-последовательность
  5. Kommo: POST /leads/{id}/notes
     -> «Kit: подписчик добавлен, теги: customer, plan:growth»

Kit Webhook: subscriber.unsubscribed
  ↓ Backend
  1. Из payload: subscriber.email
  2. Найти сделку по email контакта в Kommo
  3. Kommo: POST /leads/{deal_id}/notes
     -> «Kit: клиент отписался от рассылки»
  4. Kommo: POST /tasks
     -> «Уточнить предпочтения - клиент отписался от Kit»

Kit API v4: ключевые запросы

Base URL: https://api.kit.com/v4/.
Аутентификация: Bearer token — Authorization: Bearer {api_key}.
API key: Kit -> Settings -> Developer -> API keys.

Создать или обновить подписчика:

import requests

KIT_API_KEY = "your_kit_api_key"
KIT_BASE_URL = "https://api.kit.com/v4"

headers = {
    "Authorization": f"Bearer {KIT_API_KEY}",
    "Content-Type": "application/json"
}

def upsert_subscriber(email: str, first_name: str, custom_fields: dict) -> dict:
    # Kit v4 upsert: если подписчик с email существует - обновляет; если нет - создаёт
    resp = requests.post(
        f"{KIT_BASE_URL}/subscribers",
        headers=headers,
        json={
            "email_address": email,
            "first_name": first_name,
            "fields": custom_fields,
            "state": "active"
        }
    )
    resp.raise_for_status()
    return resp.json()

def add_tag_to_subscriber(subscriber_id: str, tag_id: str) -> None:
    resp = requests.post(
        f"{KIT_BASE_URL}/tags/{tag_id}/subscribers",
        headers=headers,
        json={"subscriber_id": subscriber_id}
    )
    resp.raise_for_status()

def add_to_sequence(subscriber_id: str, sequence_id: str) -> None:
    resp = requests.post(
        f"{KIT_BASE_URL}/sequences/{sequence_id}/subscribers",
        headers=headers,
        json={"subscriber_id": subscriber_id}
    )
    resp.raise_for_status()

def on_deal_won(lead: dict, contact: dict):
    email = get_contact_email(contact)
    first_name = contact["name"].split()[0]
    plan = get_custom_field(lead, PLAN_FIELD_ID) or "starter"
    source = get_custom_field(lead, SOURCE_FIELD_ID) or "unknown"

    subscriber = upsert_subscriber(email, first_name, {
        "plan": plan,
        "kommo_deal_id": str(lead["id"]),
        "source": source
    })
    subscriber_id = subscriber["subscriber"]["id"]

    # Теги из словаря: имя тега -> tag_id (получить из Kit API заранее)
    tags_to_add = [TAG_IDS["customer"], TAG_IDS.get(f"plan_{plan}")]
    for tag_id in tags_to_add:
        if tag_id:
            add_tag_to_subscriber(subscriber_id, tag_id)

    # Добавить в онбординг-последовательность
    add_to_sequence(subscriber_id, ONBOARDING_SEQUENCE_ID)

    create_kommo_note(
        lead["id"],
        f"Kit: подписчик добавлен (теги: customer, plan:{plan}), "
        f"запущена онбординг-последовательность"
    )

Получить ID тегов и последовательностей:

def get_tags() -> dict:
    resp = requests.get(f"{KIT_BASE_URL}/tags", headers=headers)
    resp.raise_for_status()
    tags = resp.json().get("tags", [])
    return {tag["name"]: tag["id"] for tag in tags}

def get_sequences() -> dict:
    resp = requests.get(f"{KIT_BASE_URL}/sequences", headers=headers)
    resp.raise_for_status()
    seqs = resp.json().get("sequences", [])
    return {seq["name"]: seq["id"] for seq in seqs}

Обработка Kit Webhook:

from flask import Flask, request

app = Flask(__name__)

@app.route("/webhooks/kit", methods=["POST"])
def kit_webhook():
    # Kit webhook не имеет встроенной верификации HMAC в v4
    # Защита: секретный путь + IP whitelist
    payload = request.json
    event = payload.get("type")
    subscriber = payload.get("subscriber", {})
    email = subscriber.get("email_address")

    if not email:
        return "", 200

    deal_id = find_kommo_deal_by_contact_email(email)
    if not deal_id:
        return "", 200

    if event == "subscriber.unsubscribed":
        create_kommo_note(deal_id, "Kit: клиент отписался от email-рассылки")
        create_kommo_task(deal_id,
            "Уточнить предпочтения по коммуникации - клиент отписался от Kit")

    elif event == "subscriber.bounced":
        create_kommo_note(deal_id, "Kit: email не доставлен (bounce)")
        create_kommo_task(deal_id, "Проверить и обновить email клиента - Kit зафиксировал bounce")

    return "", 200

Kit Webhook настройка: Settings -> Developer -> Webhooks -> Add endpoint. В Kit v4 верификация через секретный путь + IP whitelist (Kit публикует список IP-адресов).

Тег-сегментация: стратегия маппинга

Теги в Kit — основной механизм сегментации. Продуманный маппинг из Kommo:

Событие в KommoТег в Kit
Won (любой тариф)customer
Won, тариф Growthplan_growth
Won, тариф Scaleplan_scale
Источник = LinkedInsource_linkedin
Churn (потеря клиента)churned
Апгрейдupgraded, убрать plan_growth, добавить plan_scale

Теги атомарны: добавление/удаление через отдельные API-вызовы. Не перезаписывают — мерджат. Это позволяет строить Kit-автоматизации на логике «есть тег X И тег Y -> кампания Z».

Реальный кейс

Creator-SaaS (US, образовательная платформа, Kommo + Kit, 60–80 новых клиентов в месяц):

  • До: маркетолог экспортировал список Won из Kommo раз в день, импортировал в Kit. Первое email уходило с задержкой 24–48 часов. Теги проставлялись вручную — часто ошибки.
  • После: Won -> Kit-подписчик + теги + онбординг-последовательность за 5 секунд. Первое приветственное письмо — в пределах часа от закрытия сделки.
  • Дополнительно: subscriber.bounced -> задача обновить email -> спасли 8% контактов с неверным email в первый месяц.

Для кого актуально

  • SaaS и курсы с email-онбордингом через Kit
  • Команды, где маркетолог работает в Kit, продажи в Kommo — разные системы без связи
  • 30+ новых клиентов в месяц — ручная синхронизация создаёт задержки и ошибки
  • Продукты с несколькими тарифами — тег-сегментация под каждый план

Часто задаваемые вопросы

Kit или Mailchimp для интеграции с Kommo?

Mailchimp интеграция работает через аудитории и теги. Kit работает только через теги — более гибкая сегментация для сложных онбординг-сценариев. Mailchimp лучше для массовых рассылок по сегментам базы. Kit лучше для последовательностей, запускаемых по событиям.

Как найти ID тегов и последовательностей в Kit?

GET /v4/tags — список тегов с ID. GET /v4/sequences — список последовательностей. Рекомендуем сохранить маппинг name -> id в конфиг при первичной настройке — ID стабильны и не меняются.

Kit v3 vs v4 API?

Kit v4 (актуальный): https://api.kit.com/v4/, Bearer token. Kit v3 (устаревший): https://api.convertkit.com/v3/, api_key как query param. Новые интеграции писать только на v4 — v3 поддерживается, но не развивается.

Как удалять теги при смене этапа в Kommo?

DELETE /v4/tags/{tag_id}/subscribers/{subscriber_id} — удалить конкретный тег у подписчика. Для смены тарифа: удалить plan_growth, добавить plan_scale. Реализуется через PATCH /api/v4/leads webhook при изменении кастомного поля «Тариф».

Итого

  • Kit API v4: Bearer token, https://api.kit.com/v4/
  • Upsert подписчика: POST /subscribers (по email)
  • Добавить тег: POST /tags/{tag_id}/subscribers
  • Добавить в последовательность: POST /sequences/{sequence_id}/subscribers
  • Webhook: subscriber.unsubscribed, subscriber.bounced — без HMAC, защита через секретный URL
  • Стратегия тегов: маппинг тариф/источник/статус -> теги в Kit для правильной сегментации

Если вы используете Kit и Kommo и хотите автоматизировать онбординг по этапам воронки — опишите структуру тарифов и последовательностей. Exceltic.dev настроит маппинг и webhook-обработчик.

Ещё статьи

Все →