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 настроит маппинг и обработку всех событий воронки.