HubSpot + Gong: что теряет нативная интеграция при передаче контекста звонков

HubSpot + Gong: что теряет нативная интеграция при передаче контекста звонков

Gong — revenue intelligence платформа: AI-анализ звонков, транскрипция, talk ratio, sentiment, рекомендации на основе паттернов winning calls. Нативная интеграция HubSpot + Gong существует в HubSpot App Marketplace — Gong устанавливается как App, звонки появляются в Timeline контакта. Звучит удобно. На практике интеграция решает только самую простую задачу — видимость звонков в HubSpot. Критичный контекст: AI-инсайты, атрибуция к Deal, обновление свойств по итогам разговора — всё это нативная интеграция не делает. Разбираем конкретно что теряется и как построить правильно.

Что умеет нативная интеграция (и что нет)

Умеет:
— Добавить запись о звонке в Timeline контакта (кто звонил, длительность, ссылка на Gong)
— Показать транскрипт в Gong при клике из HubSpot (переход на Gong-сайт)
— Синхронизировать контакты из HubSpot в Gong (для распознавания кто звонит)

Не умеет:
— Атрибутировать звонок к конкретной Deal (только к Contact / Company)
— Передавать AI-инсайты (talk ratio, ключевые темы, next steps) как HubSpot Deal properties
— Обновлять Deal Stage на основе итогов звонка
— Создавать HubSpot Task «Follow-up» по результатам Gong-анализа
— Передавать score звонка (Gong Deal Score) в HubSpot для сегментации

Что конкретно теряет бизнес

1. Атрибуция звонков к сделке.
Нативная интеграция записывает звонок к Contact. Но звонок произошёл в контексте конкретного Deal. Revenue Ops не может ответить на вопрос «сколько звонков было по сделке X и какие из них закончились продвижением по воронке». Данные есть в Gong, в HubSpot — не атрибутированы.

2. AI-инсайты остаются в Gong, не в CRM.
Gong после каждого звонка генерирует: talk ratio, longest monologue, topics (pricing, competition, timeline), key moments. Всё это доступно только в Gong UI. Deal properties в HubSpot — пустые или заполнены вручную тем что менеджер решил записать.

3. Deal Score не влияет на приоритизацию в HubSpot.
Gong Deal Score — предсказание вероятности закрытия сделки на основе паттернов звонков. Нативная интеграция не передаёт этот score в HubSpot. Менеджер видит score в Gong, в HubSpot — нет. Отчёты по pipeline в HubSpot не учитывают Gong-данные.

4. Next Steps из звонка не становятся HubSpot Tasks.
Gong AI выделяет Next Steps из транскрипта («Отправить proposal к пятнице», «Организовать demo для технической команды»). Нативная интеграция не создаёт Tasks в HubSpot по этим Next Steps — они остаются в Gong и забываются.

Правильная архитектура: Gong Webhooks + Engagements API

Gong call ended  ->  Gong Webhook  ->  Python handler
  ->  HubSpot Engagements API (создать Engagement: Call)
  ->  HubSpot CRM API (обновить Deal properties)
  ->  HubSpot Tasks API (создать Task по next steps)

Шаг 1: подписаться на Gong Webhook

Gong Webhooks настраиваются через Gong API: POST https://api.gong.io/v2/settings/webhooks/register.

import requests
from requests.auth import HTTPBasicAuth
import hmac, hashlib

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

HS_TOKEN = "your_hubspot_private_app_token"
HS_BASE  = "https://api.hubapi.com"
HS_HDRS  = {
    "Authorization": f"Bearer {HS_TOKEN}",
    "Content-Type":  "application/json",
}

def register_gong_webhook(callback_url: str):
    payload = {
        "url":      callback_url,
        "secret":   "your_webhook_signing_secret",
        "events":   ["call.processed"],
    }
    resp = requests.post(
        f"{GONG_BASE}/settings/webhooks/register",
        auth=GONG_AUTH,
        json=payload,
    )
    resp.raise_for_status()
    return resp.json()

Шаг 2: получить данные звонка из Gong

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

def get_gong_call_insights(call_id: str) -> dict:
    resp = requests.get(
        f"{GONG_BASE}/calls/{call_id}/extensive",
        auth=GONG_AUTH,
    )
    resp.raise_for_status()
    data   = resp.json()
    result = {}
    for section in data.get("contentInsights", []):
        result[section["insightType"]] = section.get("insights", [])
    return result

Шаг 3: создать Engagement в HubSpot + обновить Deal

def create_hubspot_call_engagement(deal_id: str, contact_id: str,
                                    call_data: dict) -> dict:
    duration_ms   = call_data.get("duration", 0) * 1000
    recording_url = call_data.get("url", "")
    title         = call_data.get("title", "Gong Call")

    payload = {
        "engagement": {
            "type":      "CALL",
            "timestamp": call_data.get("started", 0) * 1000,
            "active":    True,
        },
        "associations": {
            "dealIds":    [deal_id],
            "contactIds": [contact_id],
        },
        "metadata": {
            "body":          f"Gong recording: {recording_url}",
            "durationMilliseconds": duration_ms,
            "fromNumber":    call_data.get("callerPhoneNumber", ""),
            "toNumber":      call_data.get("calleePhoneNumber", ""),
            "status":        "COMPLETED",
            "title":         title,
            "recordingUrl":  recording_url,
        },
    }
    resp = requests.post(
        f"{HS_BASE}/engagements/v1/engagements",
        headers=HS_HDRS,
        json=payload,
    )
    resp.raise_for_status()
    return resp.json()

def update_deal_with_gong_insights(deal_id: str, insights: dict):
    topics = insights.get("Highlights", [])
    topics_str = ", ".join([t.get("text", "") for t in topics[:5]])

    props = {
        "gong_last_call_date":   "",
        "gong_key_topics":       topics_str,
    }
    resp = requests.patch(
        f"{HS_BASE}/crm/v3/objects/deals/{deal_id}",
        headers=HS_HDRS,
        json={"properties": props},
    )
    resp.raise_for_status()

Шаг 4: создать Tasks по Next Steps

def create_hubspot_tasks_from_next_steps(deal_id: str,
                                          next_steps: list, owner_id: str):
    for step in next_steps[:3]:
        task_text = step.get("text", "")
        if not task_text:
            continue
        payload = {
            "engagement": {"type": "TASK", "timestamp": None, "active": True},
            "associations": {"dealIds": [deal_id]},
            "metadata": {
                "body":   f"Gong Next Step: {task_text}",
                "status": "NOT_STARTED",
                "forObjectType": "DEAL",
            },
        }
        requests.post(f"{HS_BASE}/engagements/v1/engagements",
                      headers=HS_HDRS, json=payload)

@app.route("/webhooks/gong", methods=["POST"])
def gong_webhook():
    payload  = request.json
    event    = payload.get("eventType")
    call_id  = payload.get("callId", "")

    if event != "call.processed":
        return "", 200

    call     = get_gong_call_details(call_id)
    insights = get_gong_call_insights(call_id)

    email    = call.get("parties", [{}])[0].get("emailAddress", "")
    deal_id  = find_hubspot_deal_by_email(email)
    contact_id = find_hubspot_contact_by_email(email)

    if deal_id:
        create_hubspot_call_engagement(deal_id, contact_id, call)
        update_deal_with_gong_insights(deal_id, insights)
        next_steps = insights.get("NextSteps", [])
        if next_steps:
            create_hubspot_tasks_from_next_steps(deal_id, next_steps, "")

    return "", 200

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

B2B SaaS (US, 25 менеджеров по продажам, HubSpot + Gong):

  • С нативной интеграцией: RevOps пыталась сопоставить данные Gong (deal score, topics) с HubSpot pipeline вручную — еженедельный экспорт из Gong -> Excel -> HubSpot import. 3–4 часа в неделю. Deal Score в Gong был 85% по 12 сделкам, в HubSpot pipeline они оставались с «базовой» вероятностью закрытия.
  • После кастомной интеграции: call.processed -> Engagement к Deal -> Deal properties обновляются (ключевые темы, talk ratio). HubSpot Reports теперь могут фильтровать по gong_key_topics = "pricing" — видно какие сделки на стадии обсуждения цены. Next Steps -> Tasks -> менеджер видит в HubSpot очередь задач без перехода в Gong.

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

  • RevOps команды где Gong Deal Score нужен для pipeline review в HubSpot
  • Компании с 10+ sales рeps где ручная синхронизация Gong -> HubSpot занимает часы в неделю
  • Heads of Sales которым нужны отчёты «по каким темам чаще всего буксуют сделки» — данные есть в Gong, нужны в HubSpot
  • Компании где Next Steps из звонков исчезают потому что живут только в Gong

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

Gong API требует специальный доступ?

Gong API (api.gong.io) — не публичный в смысле open signup. Для получения API credentials нужно подать запрос через Gong Support или быть enterprise-клиентом с API access в тарифе. Access Key + Secret выдаются через Gong -> Company Settings -> Ecosystem -> API. Verify что API включён в вашем контракте с Gong.

HubSpot Engagements API v1 vs v2 — что использовать?

Engagements v1 (/engagements/v1/engagements) — старый endpoint, всё ещё работает, поддерживает type CALL с recordingUrl. CRM API v3 (/crm/v3/objects/calls) — новый, более строгая типизация. Для записи звонков с recording URL рекомендуется Engagements v1 — он поддерживает все metadata поля включая ссылку на запись.

Как найти HubSpot Deal по email из Gong?

POST /crm/v3/objects/contacts/search с фильтром {propertyName: "email", operator: "EQ", value: email} -> получить contact_id -> GET /crm/v3/objects/contacts/{id}/associations/deals -> получить deal_id. Если у контакта несколько сделок — выбрать последнюю активную по closedate или hs_lastmodifieddate.

Нативная интеграция HubSpot + Gong продолжает работать рядом с кастомной?

Зависит от настройки. Если нативная интеграция тоже записывает звонки в Timeline — будут дубли (нативный Activity + кастомный Engagement). Рекомендуется отключить нативную интеграцию Gong -> HubSpot (Gong -> Settings -> Integrations -> HubSpot -> disable call activity sync) и оставить только кастомный webhook. Контакты всё равно можно синхронизировать через нативную — это не конфликтует.

Итого

  • Нативная интеграция: звонки в Timeline контакта, без атрибуции к Deal, без AI-инсайтов
  • Правильный путь: Gong Webhook call.processed -> HubSpot Engagements API (с Deal association)
  • AI-инсайты -> Deal properties (custom): key topics, talk ratio, Gong deal score
  • Next Steps из транскрипта -> HubSpot Tasks -> менеджер видит очередь без перехода в Gong
  • Нативную интеграцию (call sync) отключить — оставить только contacts sync

Если у вас HubSpot + Gong и RevOps тратит время на ручную синхронизацию данных между системами — опишите какие поля нужны в HubSpot. Exceltic.dev настроит двустороннюю интеграцию через Gong Webhooks.

Ещё статьи

Все →