Kommo + Mailchimp: синхронизация контактов и сегментация по этапу воронки

Kommo + Mailchimp: синхронизация контактов и сегментация по этапу воронки

Mailchimp — самая распространённая платформа email-маркетинга в мире с REST API v3 и поддержкой аудиторий, тегов, merge fields и вебхуков. Без интеграции с Kommo маркетолог вручную экспортирует контакты из CRM и загружает в Mailchimp — теряя актуальность и контекст (на каком этапе воронки, Won это или потерянная сделка). С интеграцией контакты синхронизируются автоматически, теги обновляются по событиям воронки.

Что даёт связка Kommo + Mailchimp

Без интеграции:
— Маркетолог раз в неделю экспортирует CSV из Kommo, загружает в Mailchimp
— Нет актуальных данных об этапе воронки — рассылки не сегментированы
— Won-клиенты получают продающие письма, которые уже не нужны
— Отписки в Mailchimp не отражаются в Kommo — менеджер звонит отписавшемуся

С интеграцией:
— Контакт создан в Kommo -> автоматически добавляется в Mailchimp audience
— Сделка Won -> тег «Customer» -> нет в нутринг-цепочках, переход в онбординг
— Сделка Lost -> тег «Lost Lead» -> реактивационная кампания через 30 дней
— Отписка в Mailchimp -> Note в Kommo чтобы менеджер не звонил с коммерческим

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

Kommo -> Mailchimp:
— Email, имя, компания контакта -> member в Mailchimp audience
— Merge fields: телефон, компания, источник лида
— Теги по событию: New Lead, In Progress, Customer, Lost Lead
— Статус подписки: subscribed / unsubscribed (по согласию из Kommo)

Mailchimp -> Kommo:
— Webhook unsubscribe -> Note в сделке Kommo: «Контакт отписался от рассылки»
— Webhook campaign_open / click (опционально) -> Note с активностью

Архитектура

Kommo Webhook: контакт или сделка создана/обновлена
  ↓ Backend
  1. GET /api/v4/contacts/{id}
     -> email, имя, компания, кастомные поля
  2. Mailchimp API: PUT /lists/{list_id}/members/{subscriber_hash}
     -> upsert по email-хешу (MD5)
     -> merge_fields + tags

Kommo Webhook: статус сделки изменён (Won/Lost)
  ↓ Backend
  1. Получить email контакта
  2. Mailchimp API: POST /lists/{list_id}/members/{hash}/tags
     -> добавить/убрать теги по событию

Mailchimp Webhook: unsubscribe
  ↓ Backend
  1. Найти контакт Kommo по email
  2. Kommo: POST /contacts/{id}/notes
     -> «Отписан от email-рассылки {дата}»

Mailchimp API v3: ключевые запросы

Base URL: https://{server}.api.mailchimp.com/3.0/ (server = dc-суффикс из API key, например us14). Аутентификация: Basic Auth, username = anystring, password = api_key.

Upsert контакта в аудитории:

import hashlib
import requests
from requests.auth import HTTPBasicAuth

MC_API_KEY = 'your_api_key'
MC_SERVER = 'us14'  # последние символы из API key
LIST_ID = 'your_audience_id'
BASE = f'https://{MC_SERVER}.api.mailchimp.com/3.0'
AUTH = HTTPBasicAuth('anystring', MC_API_KEY)

def get_subscriber_hash(email: str) -> str:
    return hashlib.md5(email.lower().encode()).hexdigest()

def upsert_contact(email: str, first_name: str, last_name: str,
                   company: str, phone: str = '', tags: list = None):
    sub_hash = get_subscriber_hash(email)
    payload = {
        'email_address': email,
        'status_if_new': 'subscribed',  # только для новых, не перезаписывает unsubscribe
        'merge_fields': {
            'FNAME': first_name,
            'LNAME': last_name,
            'COMPANY': company,
            'PHONE': phone
        }
    }
    resp = requests.put(
        f'{BASE}/lists/{LIST_ID}/members/{sub_hash}',
        auth=AUTH,
        json=payload
    )
    # Добавить теги если переданы
    if tags:
        add_tags(email, tags)
    return resp.status_code

Управление тегами:

def add_tags(email: str, tags_to_add: list, tags_to_remove: list = None):
    sub_hash = get_subscriber_hash(email)
    tag_payload = []
    for tag in (tags_to_add or []):
        tag_payload.append({'name': tag, 'status': 'active'})
    for tag in (tags_to_remove or []):
        tag_payload.append({'name': tag, 'status': 'inactive'})

    requests.post(
        f'{BASE}/lists/{LIST_ID}/members/{sub_hash}/tags',
        auth=AUTH,
        json={'tags': tag_payload}
    )

# При Won-событии в Kommo:
add_tags(client_email,
         tags_to_add=['Customer'],
         tags_to_remove=['New Lead', 'In Progress'])

# При Lost-событии:
add_tags(client_email,
         tags_to_add=['Lost Lead'],
         tags_to_remove=['In Progress'])

Обработка webhook Mailchimp (отписка):

from flask import Flask, request

app = Flask(__name__)

@app.route('/webhooks/mailchimp', methods=['POST'])
def mailchimp_webhook():
    event_type = request.form.get('type')
    email = request.form.get('data[email]')

    if event_type == 'unsubscribe' and email:
        # Найти контакт в Kommo по email
        contact = find_kommo_contact_by_email(email)
        if contact:
            note_text = (
                f'Контакт отписался от email-рассылки Mailchimp. '
                f'Не включать в email-кампании.'
            )
            create_kommo_note(contact['id'], note_text)

    return '', 200

Mailchimp webhook настройка: Mailchimp требует URL, который возвращает 200 на GET-запрос (verification). Webhook настраивается в UI: Audience -> Manage Audience -> Settings -> Webhooks.

Merge Fields: кастомные поля в Mailchimp

По умолчанию Mailchimp audience содержит FNAME, LNAME. Для данных из Kommo нужно добавить кастомные поля:

# Создать merge field через API
requests.post(
    f'{BASE}/lists/{LIST_ID}/merge-fields',
    auth=AUTH,
    json={
        'tag': 'COMPANY',
        'name': 'Company Name',
        'type': 'text',
        'required': False
    }
)

После создания поле доступно как COMPANY в merge_fields при upsert.

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

B2B SaaS-компания (EU-рынок, 200–300 новых лидов в месяц, смешанный трафик SEO + paid):

  • До: маркетолог вручную выгружал новых лидов из Kommo раз в две недели, загружал в Mailchimp. Won-клиенты оставались в нутринговых цепочках ещё 3–4 недели после покупки.
  • После: каждый новый контакт в Kommo -> в Mailchimp через 5 минут с тегом New Lead. Won -> тег Customer, удалён из нутринга. Реактивационная кампания автоматически стартует через 30 дней после Lost.
  • Дополнительно: менеджеры видят Note в Kommo когда контакт открыл email — дополнительный сигнал для звонка.

Если нужна более мощная поведенческая сегментация — рассмотрите Klaviyo. Mailchimp лучше подходит для простой сегментации по тегам; Klaviyo — для многоуровневых event-триггеров.

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

  • Используется Mailchimp как основная email-платформа
  • 50+ новых контактов в месяц из Kommo
  • Маркетинг хочет сегментировать по этапу воронки (нутринг для потенциальных, онбординг для клиентов)
  • Нужна двусторонняя синхронизация: отписки из Mailchimp -> видны менеджерам в Kommo

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

Mailchimp API — как найти server prefix для URL?

Server prefix (например us14) — это последние символы вашего API key после дефиса: abc123def456-us14. Он же указан в URL Mailchimp при входе в аккаунт: https://us14.admin.mailchimp.com/.

Что такое subscriber hash и зачем он нужен?

Subscriber hash — MD5-хеш email адреса в нижнем регистре. Mailchimp использует его как идентификатор в URL вместо email (чтобы не передавать email в path). hashlib.md5(email.lower().encode()).hexdigest() — стандартный способ получить его в Python.

Mailchimp перезаписывает unsubscribe при PUT?

Нет — параметр status_if_new применяется только к новым контактам. Существующий unsubscribed контакт не будет повторно подписан через PUT. Это защита от случайной подписки отказавшихся.

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

Mailchimp — проще, дешевле ($0–13/мес для небольших списков), достаточно для тегов и базовой автоматизации. ActiveCampaign — сложнее, дороже, но мощнее в автоматизации и CRM-функциях. Для B2B SaaS с длинным циклом сделки — ActiveCampaign + Kommo даёт больше возможностей.

Нужно ли согласие на подписку (GDPR)?

Да. Если контакты из EU, нужно явное согласие перед добавлением в Mailchimp. В Kommo это решается через кастомное поле «Согласие на рассылку» — интеграция проверяет его перед upsert и устанавливает status = subscribed только при наличии согласия.

Итого

  • Mailchimp API v3: Basic Auth с API-ключом, PUT /lists/{id}/members/{hash} для upsert, POST /tags для сегментации
  • Теги по событиям Kommo: New Lead -> In Progress -> Customer / Lost Lead
  • Webhook Mailchimp на unsubscribe -> Note в Kommo для менеджера
  • Merge fields создаются через API для кастомных данных из CRM
  • Типовой срок разработки — 1–2 недели

Если вы используете Mailchimp и Kommo и хотите автоматизировать синхронизацию контактов — опишите вашу структуру аудиторий и какие данные из CRM нужны. Exceltic.dev настроит маппинг и обработку всех событий воронки.

Ещё статьи

Все →