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.