Kommo + Heap: события воронки продаж в продуктовую аналитику с авто-захватом

Kommo + Heap: события воронки продаж в продуктовую аналитику с авто-захватом

Heap — product analytics платформа с принципиально иным подходом: вместо ручной разметки событий (track("button_clicked")) Heap автоматически захватывает все взаимодействия пользователя — каждый клик, скролл, ввод, навигацию. Аналитик определяет события ретроактивно, уже имея данные. В отличие от Amplitude или PostHog, не нужно думать о разметке заранее. Интеграция с Kommo добавляет CRM-слой: Won -> identify в Heap -> ретроактивный анализ поведения paying-клиентов ещё до покупки.

Почему авто-захват меняет аналитику

Классическая проблема: product team обнаруживает что фича X коррелирует с retention. Хочет понять как пользователи находили фичу X. Но данные о кликах на кнопку X не собирались — разработчик не поставил track(). Нужно ждать следующие 30+ дней.

Heap: кнопка X кликалась все это время — данные есть. Аналитик создаёт «событие» ретроактивно через UI, и оно мгновенно доступно за всю историю. Ретроактивный анализ — ключевое преимущество Heap.

С Kommo-интеграцией добавляется: «покажи мне поведение клиентов с тарифом Growth в первые 14 дней ДО и ПОСЛЕ Won». Heap может это ретроактивно — если identify с plan=Growth был отправлен.

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

Kommo -> Heap:
— Won -> identify пользователя с CRM-свойствами: plan, mrr, source, deal_id
— Смена тарифа -> обновить свойства пользователя в Heap
— Lost -> добавить свойство churned: true

Heap -> Kommo:
— Через Heap Connect (Data Science) — экспорт сегментов пользователей в CRM (enterprise)
— Через Heap API: получить список пользователей из сегмента -> задача менеджеру (at-risk users)

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

Server-side Track API (для событий из backend):
Base URL: https://heapanalytics.com/api.
Аутентификация: app_id в теле запроса (публичный, как и для client-side).

import requests
from datetime import datetime, timezone

HEAP_APP_ID = "your_app_id"  # из Heap Account Settings
HEAP_BASE_URL = "https://heapanalytics.com/api"

def heap_identify(identity: str, properties: dict) -> None:
    # identity: уникальный идентификатор - email или userId
    # Связывает server-side события с browser-side сессиями
    resp = requests.post(
        f"{HEAP_BASE_URL}/identify",
        json={
            "app_id": HEAP_APP_ID,
            "identity": identity,
            "properties": properties,
        },
        timeout=10,
    )
    resp.raise_for_status()

def heap_track(identity: str, event: str, properties: dict = None) -> None:
    # Server-side track event
    payload = {
        "app_id": HEAP_APP_ID,
        "identity": identity,
        "event": event,
        "properties": properties or {},
        "timestamp": datetime.now(timezone.utc).isoformat(),
    }
    resp = requests.post(
        f"{HEAP_BASE_URL}/track",
        json=payload,
        timeout=10,
    )
    resp.raise_for_status()

def heap_add_user_properties(identity: str, properties: dict) -> None:
    # Обновить свойства существующего пользователя
    heap_identify(identity, properties)  # identify идемпотентен - обновляет при повторном вызове

def on_deal_won(lead: dict, contact: dict):
    email = get_contact_email(contact)
    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)

    # Identify - установить CRM-свойства пользователя
    heap_identify(
        identity=email,
        properties={
            "plan": plan,
            "mrr": amount,
            "customer": True,
            "won_date": datetime.now(timezone.utc).strftime("%Y-%m-%d"),
            "crm_source": source,
            "kommo_deal_id": lead["id"],
        }
    )

    # Track server-side событие конверсии
    heap_track(
        identity=email,
        event="crm_deal_won",
        properties={
            "plan": plan,
            "amount": amount,
            "deal_id": lead["id"],
            "pipeline_id": lead.get("pipeline_id"),
        }
    )

    create_kommo_note(lead["id"],
        f"Heap: пользователь идентифицирован (plan={plan}, mrr={amount})")

def on_plan_upgrade(lead: dict, contact: dict, old_plan: str, new_plan: str):
    email = get_contact_email(contact)
    heap_add_user_properties(email, {"plan": new_plan})
    heap_track(email, "crm_plan_upgraded", {
        "from_plan": old_plan,
        "to_plan": new_plan,
    })

def on_deal_lost(lead: dict, contact: dict):
    email = get_contact_email(contact)
    heap_add_user_properties(email, {
        "customer": False,
        "churned": True,
        "churn_date": datetime.now(timezone.utc).strftime("%Y-%m-%d"),
    })
    heap_track(email, "crm_churned", {"deal_id": lead["id"]})

Ретроактивный анализ: главная ценность Heap + Kommo

После интеграции product team может:

1. Что делали paying-клиенты до Won:
— Heap знает все действия пользователя с момента первого визита
— После identify с plan=Growth — ретроактивно сегментировать: «Growth-клиенты за 30 дней до покупки»
— Выявить: какие фичи пробовали, где застревали, что коррелирует с конверсией

2. Activation patterns по тарифу:
crm_deal_won (server-side) -> retention-когорта в Heap
— Сравнить: Growth-клиенты vs Starter-клиенты — разные паттерны использования продукта
— Найти «aha moment» для каждого тарифа

3. Churn prediction:
— Пользователи с churned=True -> что происходило за 14–30 дней до оттока
— Ретроактивно — без необходимости заранее думать что трекать

Heap vs Mixpanel vs PostHog: чем отличается авто-захват

ПараметрHeapMixpanelPostHog
Авто-захватВсе события автоматическиНет — ручная разметкаОпционально (autocapture)
Ретроактивный анализДаНетНет
Session replayНет (отдельный продукт)НетДа, встроен
Open-sourceНетНетДа
Self-hostedНетНетДа

Heap выигрывает когда: не знаете заранее что важно трекать; нужен исторический анализ без переразметки; много «нежданных» вопросов к данным.

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

B2B SaaS (US, Kommo + Heap, 30–50 новых клиентов в месяц):

  • До: product team хотела понять почему Growth-клиенты остаются лучше Starter. Данных о поведении до покупки — нет (ручная разметка не покрывала нужные события).
  • После identify с plan из Kommo: ретроактивный анализ за 6 месяцев. Выяснилось: Growth-клиенты в первые 7 дней активировали интеграцию с API — Starter не активировали. Корреляция с 12-месячным retention: 91% vs 34%.
  • Действие: добавили API-setup в onboarding flow для Starter -> 12-мес retention Starter вырос на 23%.

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

  • Product-команды с «неожиданными» аналитическими вопросами — ретроактивный анализ
  • SaaS с несколькими тарифами — нужна сегментация paying customers vs trial
  • Компании где product и sales используют разные инструменты без связи
  • Компании без data engineer — авто-захват не требует разметки от разработчика

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

Heap авто-захват — не создаёт ли он лишний шум в данных?

Создаёт, если не структурировать. Heap предлагает «Event Visualizer»: кликнуть на элемент в браузере -> создать именованное событие из авто-данных. Все сырые клики хранятся, аналитик работает только с именованными событиями. Шум остаётся на уровне raw data, не мешает анализу.

Heap identify — когда делать на клиенте, когда на сервере?

На клиенте (heap.identify(userId)) — при логине пользователя в браузере. Это связывает anonymous session с userId. Server-side identify (POST /api/identify) — для обновления свойств из CRM-событий (Won, план, mrr), где нет браузерного контекста. Оба метода совместимы — Heap мержит сессии.

Heap Data Science / Connect — что это?

Enterprise-функция: Heap Connect экспортирует данные в Snowflake/Redshift/BigQuery. Heap Data Science — predictive сегменты (at-risk users, likely to convert). Для Kommo-интеграции это означает: at-risk сегмент из Heap -> задача менеджеру в Kommo (через API). Доступно на Growth+ планах.

Heap app_id — публичный или приватный?

app_id публичный — используется в client-side JS-коде и в server-side API. Не является секретом. Для защиты данных используется server-side API с validation (не принимает данные от неизвестных доменов).

Итого

  • Heap Server-side API: POST /api/identify + POST /api/track, app_id в теле
  • identify: установить CRM-свойства (plan, mrr, won_date) при Won
  • track: crm_deal_won, crm_churned, crm_plan_upgraded — server-side конверсионные события
  • Ключевое преимущество: ретроактивный анализ поведения до Won — без предварительной разметки
  • Обновление свойств: повторный вызов identify с новыми значениями

Если вы используете Heap и Kommo и хотите добавить CRM-контекст в product analytics — опишите какие свойства клиентов важны для сегментации. Exceltic.dev настроит server-side identify и трекинг конверсионных событий.

Ещё статьи

Все →