Kommo + Gong: AI-анализ звонков и транскрипты в карточку сделки

Kommo + Gong: AI-анализ звонков и транскрипты в карточку сделки

Gong — платформа revenue intelligence: записывает звонки менеджеров, строит транскрипт, выделяет ключевые темы (возражения, конкуренты, бюджет, следующий шаг), анализирует talk/listen ratio. Без интеграции с Kommo данные из Gong живут отдельно — менеджер должен вручную переносить итоги звонка в CRM. С интеграцией каждый завершённый звонок из Gong автоматически появляется в карточке сделки: ссылка на запись, AI-саммари, ключевые темы.

Зачем интегрировать Gong с Kommo

Типичная проблема: менеджер провёл звонок, клиент упомянул конкурента и бюджетное ограничение. Через 3 дня — следующий звонок с другим менеджером. Без записи в CRM контекст теряется. С Gong + Kommo история звонков в сделке: каждый разговор, его резюме, выявленные возражения — всё в одном месте.

Сравнение с другими инструментами из блога:
Kommo + Fireflies.ai — транскрипты встреч, дешевле, нет revenue intelligence
Kommo + TL;DV — тайм-метки встреч, фокус на видео
Kommo + Gong — enterprise revenue intelligence: AI-коучинг, прогнозирование, анализ победных/проигранных сделок

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

Gong -> Kommo:
— Звонок завершён -> Note с AI-саммари, ссылкой на запись, длительностью
— Ключевые темы из разговора (конкуренты, возражения, следующий шаг) -> Note
— Talk ratio менеджера -> Note (для коучинга)
— Обновить поле «Последний контакт» в сделке

Kommo -> Gong:
— Won -> добавить тег won_customer к контакту в Gong
— Данные сделки (тариф, сумма) -> кастомные поля звонка в Gong (для анализа победных сделок)

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

Base URL: https://api.gong.io/v2.
Аутентификация: Basic Auth — access_key:access_key_secret (Base64).
Credentials: Gong Settings -> Company Settings -> API.

import requests
from requests.auth import HTTPBasicAuth

GONG_ACCESS_KEY = "your_access_key"
GONG_ACCESS_SECRET = "your_access_key_secret"
GONG_BASE_URL = "https://api.gong.io/v2"
GONG_AUTH = HTTPBasicAuth(GONG_ACCESS_KEY, GONG_ACCESS_SECRET)

def get_call(call_id: str) -> dict:
    resp = requests.get(
        f"{GONG_BASE_URL}/calls/{call_id}",
        auth=GONG_AUTH
    )
    resp.raise_for_status()
    return resp.json()

def get_call_transcript(call_id: str) -> list:
    # Возвращает массив utterances с текстом и speaker
    resp = requests.get(
        f"{GONG_BASE_URL}/calls/{call_id}/transcript",
        auth=GONG_AUTH
    )
    resp.raise_for_status()
    return resp.json().get("transcript", [])

def list_calls(from_dt: str, to_dt: str, cursor: str = None) -> dict:
    # from_dt, to_dt: ISO 8601. Используй для polling новых звонков
    params = {"fromDateTime": from_dt, "toDateTime": to_dt}
    if cursor:
        params["cursor"] = cursor
    resp = requests.get(
        f"{GONG_BASE_URL}/calls",
        auth=GONG_AUTH,
        params=params
    )
    resp.raise_for_status()
    return resp.json()

def get_call_highlights(call_id: str) -> dict:
    # AI-выделенные ключевые моменты (key points, next steps, risks)
    resp = requests.get(
        f"{GONG_BASE_URL}/calls/{call_id}/highlights",
        auth=GONG_AUTH
    )
    resp.raise_for_status()
    return resp.json()

Основная логика синхронизации (polling или webhook):

from datetime import datetime, timezone, timedelta

def find_kommo_deal_by_email(email: str) -> int | None:
    # Найти сделку по email участника звонка
    # Поиск контакта по email в Kommo, затем его открытую сделку
    ...

def build_call_note(call: dict, highlights: dict) -> str:
    duration_sec = call.get("duration", 0)
    duration = f"{duration_sec // 60} мин {duration_sec % 60} сек"
    url = call.get("url", "")
    title = call.get("title", "Звонок")
    started = call.get("started", "")[:10]

    # Talk ratio из metaData
    talk_ratio = call.get("metaData", {}).get("talkRatio", {})
    manager_ratio = round(talk_ratio.get("speakerRatio", {}).get("0", 0) * 100)

    lines = [
        f"Gong: {title} ({started}), {duration}",
        f"Запись: {url}",
        f"Менеджер говорил: {manager_ratio}% времени",
    ]

    # Ключевые точки из AI
    key_points = highlights.get("keyPoints", [])
    if key_points:
        lines.append("\nКлючевые моменты:")
        for kp in key_points[:5]:
            lines.append(f"  • {kp.get('text', '')}")

    next_steps = highlights.get("nextSteps", [])
    if next_steps:
        lines.append("\nСледующие шаги:")
        for ns in next_steps[:3]:
            lines.append(f"  -> {ns.get('text', '')}")

    return "\n".join(lines)

def sync_new_calls():
    # Прогнать звонки за последний час, вызывать через cron каждые 30 мин
    now = datetime.now(timezone.utc)
    from_dt = (now - timedelta(hours=1)).isoformat()
    to_dt = now.isoformat()

    result = list_calls(from_dt, to_dt)
    calls = result.get("calls", [])

    for call in calls:
        call_id = call.get("id")
        parties = call.get("parties", [])

        # Найти email внешнего участника (клиент)
        client_email = None
        for p in parties:
            if p.get("speakerType") == "External":
                client_email = p.get("emailAddress")
                break

        if not client_email:
            continue

        deal_id = find_kommo_deal_by_email(client_email)
        if not deal_id:
            continue

        # Проверить что не добавляли этот звонок раньше
        if call_already_synced(deal_id, call_id):
            continue

        full_call = get_call(call_id)
        highlights = {}
        try:
            highlights = get_call_highlights(call_id)
        except Exception:
            pass

        note = build_call_note(full_call, highlights)
        create_kommo_note(deal_id, note)
        mark_call_synced(deal_id, call_id)

Webhook (если доступен на вашем Gong-плане):

@app.route("/webhooks/gong", methods=["POST"])
def gong_webhook():
    # Gong Enterprise: webhooks для call.completed, deal.updated
    payload = request.json
    event = payload.get("event")

    if event == "call.completed":
        call_id = payload.get("callId")
        # Асинхронно: обработать через queue (Gong требует ответ < 3сек)
        enqueue_call_sync(call_id)

    return "", 200

Gong API: важные ограничения

  • Rate limits: 100 запросов в минуту на организацию
  • Webhook: доступен только на Enterprise-плане. На Standard — только polling через GET /calls
  • Transcript lag: AI-транскрипт готов через 1–4 часа после звонка (не мгновенно)
  • Data retention: зависит от плана Gong, обычно 12–24 месяца записей

Поэтому реальная архитектура для большинства команд — cron-polling каждые 30 минут вместо webhook.

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

B2B SaaS (US + EU, enterprise sales, 15–20 звонков в день, Kommo + Gong):

  • До: после каждого звонка менеджер вручную писал итоги в Note. Занимало 5–10 минут. 30% звонков — без Notes вообще: «забыл» или «напишу потом». Следующий звонок — без контекста предыдущего.
  • После: sync_new_calls() каждые 30 минут -> Note с AI-саммари, ссылкой и следующими шагами. 100% звонков в CRM. Менеджер приходит на следующий звонок с контекстом из Gong.
  • Дополнительно: Gong-анализ победных сделок показал: менеджеры с talk ratio < 45% закрывают на 28% чаще. Данные передаются в Kommo -> head of sales видит в карточке сделки метрику звонка + результат.

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

  • Enterprise sales команды с 10+ звонками в день
  • Компании уже использующие Gong — нужно достроить CRM-слой
  • Head of sales, который хочет видеть историю коммуникаций без переключения из Kommo
  • Команды с длинным циклом сделки (60–180 дней) — контекст критичен

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

Gong API доступен на всех планах?

Gong API доступен на Business и Enterprise планах. На Starter — нет API доступа. Перед интеграцией проверьте план и запросите API credentials у Gong account manager.

Как найти нужную сделку Kommo по данным из Gong?

Gong хранит email участников звонка. По email ищем Contact в Kommo (GET /contacts?query={email}), затем по contact_id — открытую сделку (GET /leads?contact_id={id}). Если email не совпадает (другой формат) — можно сопоставлять по номеру телефона.

Транскрипт доступен через API?

Да, через GET /calls/{id}/transcript. Возвращает массив utterances: speaker, text, start/end time. Можно строить полный текст звонка для хранения в CRM. Учитывайте: транскрипт появляется с задержкой 1–4 часа после завершения звонка.

Gong отправляет webhook или только polling?

Webhook (call.completed, deal.updated) — Enterprise план. Business — только polling через GET /calls с fromDateTime/toDateTime. Для большинства команд polling каждые 15–30 минут — приемлемая задержка.

Итого

  • Gong API: Basic Auth (access_key:secret), https://api.gong.io/v2
  • Основной поток: GET /calls -> GET /calls/{id} -> GET /calls/{id}/highlights -> Note в Kommo
  • Polling каждые 30 минут — рабочее решение для Business-плана без webhook
  • AI-хайлайты: keyPoints, nextSteps, risks — структурированный контент для Notes
  • Talk ratio из metaData — коучинговая метрика в CRM

Если вы используете Gong и Kommo и хотите видеть AI-резюме звонков в карточках сделок — опишите структуру своих звонков и какие данные критично фиксировать. Exceltic.dev настроит polling и маппинг хайлайтов.

Ещё статьи

Все →