Kommo + GetResponse: email-автоматизация и вебинары из воронки продаж

Kommo + GetResponse: email-автоматизация и вебинары из воронки продаж

GetResponse — польская платформа email-маркетинга и вебинаров с EU-хостингом: email-автоматизация, лендинги, вебинары (до 1000 участников), push-уведомления. Популярна в EU как GDPR-compliant альтернатива Mailchimp. В отличие от Klaviyo или Drip, GetResponse включает вебинарный модуль в base-план — важно для B2B компаний с webinar-based продажами. Без интеграции с Kommo email-контакты и CRM-сделки живут отдельно. С интеграцией Won -> контакт в правильном сегменте GetResponse автоматически.

GetResponse vs Mailchimp vs Brevo для EU-команд

ПараметрGetResponseMailchimpBrevo
ВебинарыДа, нативно (до 500 или 1000)НетНет
EU-хостингДа (Польша)USФранция
GDPR-complianceДа, встроеноЧастичноДа
АвтоматизацияВизуальный builderБазоваяХорошая
Цена (1000 контактов)$19/мес$26/мес$25/мес
APIREST v3, API KeyREST, API KeyREST, API Key

GetResponse выбирают EU-компании с вебинарной стратегией и строгими GDPR-требованиями к хранению данных.

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

Kommo -> GetResponse:
— Won -> создать/обновить Contact с тегами customer, plan_{tier}, source_{channel}
— Won -> добавить в список «Paying Customers»
— Смена тарифа -> обновить тег
— Потеря клиента -> тег churned, удалить из «Paying Customers»

GetResponse -> Kommo:
— Вебинар-регистрация -> создать лид в Kommo (имя, email, вебинар)
subscriber.unsubscribed -> Note + задача менеджеру
— Email-клик на ключевую ссылку -> Note в сделку (опционально)

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

Base URL: https://api.getresponse.com/v3.
Аутентификация: X-Auth-Token: api-key {api_key}.
API Key: GetResponse -> Account Settings -> Integrations -> API.

import requests
from datetime import datetime, timezone

GR_API_KEY = "your_api_key"
GR_BASE_URL = "https://api.getresponse.com/v3"
HEADERS = {
    "X-Auth-Token": f"api-key {GR_API_KEY}",
    "Content-Type": "application/json",
}

def upsert_contact(email: str, name: str, campaign_id: str,
                   tags: list, custom_fields: dict = None) -> dict:
    # GetResponse не имеет истинного upsert - используем GET+POST или UPDATE
    existing = get_contact_by_email(email)
    if existing:
        return update_contact(existing["contactId"], tags, custom_fields or {})
    return create_contact(email, name, campaign_id, tags, custom_fields or {})

def get_contact_by_email(email: str) -> dict | None:
    resp = requests.get(
        f"{GR_BASE_URL}/contacts",
        headers=HEADERS,
        params={"query[email]": email},
    )
    resp.raise_for_status()
    contacts = resp.json()
    return contacts[0] if contacts else None

def create_contact(email: str, name: str, campaign_id: str,
                   tags: list, custom_fields: dict) -> dict:
    payload = {
        "email": email,
        "name": name,
        "campaign": {"campaignId": campaign_id},
        "tags": [{"name": t} for t in tags],
    }
    if custom_fields:
        payload["customFieldValues"] = [
            {"customFieldId": k, "value": [v]}
            for k, v in custom_fields.items()
        ]
    resp = requests.post(
        f"{GR_BASE_URL}/contacts",
        headers=HEADERS, json=payload,
    )
    if resp.status_code == 202:
        return {"status": "queued"}
    resp.raise_for_status()
    return resp.json()

def update_contact(contact_id: str, tags: list, custom_fields: dict) -> dict:
    payload = {"tags": [{"name": t} for t in tags]}
    if custom_fields:
        payload["customFieldValues"] = [
            {"customFieldId": k, "value": [v]}
            for k, v in custom_fields.items()
        ]
    resp = requests.post(
        f"{GR_BASE_URL}/contacts/{contact_id}",
        headers=HEADERS, json=payload,
    )
    resp.raise_for_status()
    return resp.json()

GR_CAMPAIGN_ID = "your_campaign_id"  # из GetResponse Contacts -> Lists -> ID

def on_deal_won(lead: dict, contact: dict):
    email = get_contact_email(contact)
    name = contact["name"]
    plan = get_custom_field(lead, PLAN_FIELD_ID) or "starter"
    source = get_custom_field(lead, SOURCE_FIELD_ID) or "direct"
    amount = lead.get("price", 0)

    tags = ["customer", f"plan_{plan}", f"source_{source}", "active"]

    custom_fields = {
        GR_FIELD_PLAN:    plan,
        GR_FIELD_MRR:     str(amount),
        GR_FIELD_DEAL_ID: str(lead["id"]),
        GR_FIELD_WON_DATE: datetime.now(timezone.utc).strftime("%Y-%m-%d"),
    }

    upsert_contact(email, name, GR_CAMPAIGN_ID, tags, custom_fields)
    create_kommo_note(lead["id"],
        f"GetResponse: контакт добавлен (теги: customer, plan_{plan})")

def on_webinar_registration(webinar_id: str, contact_data: dict):
    # GetResponse webhook при регистрации на вебинар
    email = contact_data.get("email", "")
    name  = contact_data.get("name", "")
    webinar_name = contact_data.get("webinar_name", webinar_id)

    # Создать лид в Kommo
    create_kommo_lead(
        title=f"Вебинар: {webinar_name} - {name}",
        contact_email=email,
        contact_name=name,
        tags=["webinar-lead", f"webinar_{webinar_id}"],
    )

Webhook GetResponse (подписка/отписка):

@app.route("/webhooks/getresponse", methods=["POST"])
def gr_webhook():
    payload = request.json
    action  = payload.get("action")
    contact = payload.get("contact", {})
    email   = contact.get("email", "")

    if not email:
        return "", 200

    deal_id = find_kommo_deal_by_contact_email(email)

    if action == "subscribe" and payload.get("origin") == "webinar":
        webinar = payload.get("webinar", {})
        on_webinar_registration(webinar.get("id", ""), {
            "email": email,
            "name": contact.get("name", ""),
            "webinar_name": webinar.get("name", ""),
        })

    elif action == "unsubscribe" and deal_id:
        create_kommo_note(deal_id, "GetResponse: клиент отписался от рассылок")
        create_kommo_task(deal_id,
            "Уточнить предпочтения - клиент отписался от GetResponse")

    return "", 200

Вебинарный поток: GetResponse как лид-магнит

Для B2B с вебинарной стратегией интеграция работает в обе стороны:

Из GetResponse в Kommo (генерация лидов):
— Регистрация на вебинар -> лид в Kommo с тегом webinar-{название}
— Посещение вебинара -> обновить статус лида (через GetResponse API: список attended vs registered)
— Вопрос в чате вебинара -> Note в лид (если интегрировать через GetResponse API)

Из Kommo в GetResponse (нурчеринг лидов):
— Лид из вебинара не купил -> попадает в GetResponse nurture sequence
— После Won -> перемещается в post-purchase sequence

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

B2B-консалтинг (Польша + EU, 200 email-подписчиков + 4 вебинара в квартал, Kommo + GetResponse):

  • До: вебинарные лиды вручную копировались из GetResponse в Kommo (Excel-выгрузка -> импорт). Delay 1–3 дня. 20% лидов терялись. Paying-клиенты получали nurture emails как будто они не купили.
  • После: вебинар-регистрация -> лид в Kommo за минуту. Won -> тег customer в GetResponse -> клиент исключается из prospect sequences, попадает в onboarding sequence. 0 потерянных лидов, 0 «продающих» писем платным клиентам.

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

  • EU-компании с GDPR-требованиями к email-маркетингу (GetResponse EU-хостинг)
  • B2B с вебинарной стратегией привлечения: регистрации -> CRM-лиды автоматически
  • SaaS с тарифной линейкой: разные email-sequences для каждого плана
  • Компании которые уже на GetResponse и хотят связать с Kommo

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

GetResponse создаёт контакт с задержкой (202 Accepted) — как это обработать?

GetResponse API возвращает 202 при создании контакта — это асинхронная операция, контакт создаётся в очереди. Нет немедленного ID. Для последующих операций (update, tag) — нужно сделать GET по email через несколько секунд. В production: сохранить email как ключ и retry через 5–10 секунд если GET вернул пустой массив.

Как получить список посетивших вебинар (attended) vs только зарегистрированных?

GET /webinars/{webinar_id}/attendees — список подтверждённых участников. GET /webinars/{webinar_id}/registrants — все зарегистрированные. Разница позволяет построить два разных сценария в Kommo: no-show -> задача follow-up; attended -> лид с высоким приоритетом.

GetResponse поддерживает double opt-in при создании через API?

Да. Параметр dayOfCycle: 0 в теле запроса при create_contact. GetResponse отправит confirmation email. После подтверждения статус меняется на subscribed. Для EU-команд с GDPR double opt-in — обязательно указывать при создании через API.

Как GetResponse webhook авторизовать?

GetResponse использует shared secret в URL или проверку IP. Рекомендуется: секретный path (/webhooks/getresponse/{token}) + IP whitelist. GetResponse публикует список своих IP в документации.

Итого

  • GetResponse API: X-Auth-Token: api-key {key}, https://api.getresponse.com/v3
  • Create contact: POST -> 202 Accepted (async), нужен retry для последующих операций
  • Upsert: GET по email -> если есть: PATCH, если нет: POST
  • Webhook: подписка, отписка, вебинар-события
  • Вебинар-поток: регистрация -> лид в Kommo; Won -> контакт в GetResponse с правильными тегами
  • EU-хостинг: данные в Польше, GDPR double opt-in через API

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

Ещё статьи

Все →