Discuss your task

Search

Start typing to search articles, cases, and services.

navigate Esc close

Kommo + Gong: AI call analysis and transcripts in the deal card

Gong is a revenue intelligence platform: it records manager calls, builds transcripts, highlights key topics (objections, competitors, budget, next step), and analyzes talk/listen ratio. Without Kommo integration, Gong data lives separately — the manager must manually transfer call outcomes to CRM. With integration, every completed Gong call automatically appears in the deal card: recording link, AI summary, key topics.

Why integrate Gong with Kommo

A typical problem: the manager conducted a call, the client mentioned a competitor and a budget constraint. Three days later — the next call with a different manager. Without a CRM record, context is lost. With Gong + Kommo, call history is in the deal: every conversation, its summary, identified objections — all in one place.

Comparison with other tools from this blog:
Kommo + Fireflies.ai — meeting transcripts, cheaper, no revenue intelligence
Kommo + TL;DV — meeting timestamps, focused on video
Kommo + Gong — enterprise revenue intelligence: AI coaching, forecasting, analysis of won/lost deals

What gets synchronized

Gong -> Kommo:
— Call completed -> Note with AI summary, recording link, duration
— Key conversation topics (competitors, objections, next step) -> Note
— Manager talk ratio -> Note (for coaching)
— Update “Last Contact” field in deal

Kommo -> Gong:
— Won -> add won_customer tag to contact in Gong
— Deal data (plan, amount) -> custom call fields in Gong (for won deal analysis)

Gong API: key requests

Base URL: https://api.gong.io/v2.
Authentication: 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:
    # Returns array of utterances with text and 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. Use for polling new calls
    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-highlighted key moments (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()

Main synchronization logic (polling or webhook):

from datetime import datetime, timezone, timedelta

def find_kommo_deal_by_email(email: str) -> int | None:
    # Find deal by call participant email
    # Search contact by email in Kommo, then find their open deal
    ...

def build_call_note(call: dict, highlights: dict) -> str:
    duration_sec = call.get("duration", 0)
    duration = f"{duration_sec // 60} min {duration_sec % 60} sec"
    url = call.get("url", "")
    title = call.get("title", "Call")
    started = call.get("started", "")[:10]

    # Talk ratio from 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"Recording: {url}",
        f"Manager spoke: {manager_ratio}% of the time",
    ]

    # Key points from AI
    key_points = highlights.get("keyPoints", [])
    if key_points:
        lines.append("\nKey moments:")
        for kp in key_points[:5]:
            lines.append(f"  • {kp.get('text', '')}")

    next_steps = highlights.get("nextSteps", [])
    if next_steps:
        lines.append("\nNext steps:")
        for ns in next_steps[:3]:
            lines.append(f"  -> {ns.get('text', '')}")

    return "\n".join(lines)

def sync_new_calls():
    # Process calls from the last hour, call via cron every 30 min
    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", [])

        # Find external participant email (client)
        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

        # Check that this call has not been added before
        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 (if available on your Gong plan):

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

    if event == "call.completed":
        call_id = payload.get("callId")
        # Async: process via queue (Gong requires response < 3 sec)
        enqueue_call_sync(call_id)

    return "", 200

Gong API: important limitations

  • Rate limits: 100 requests per minute per organization
  • Webhook: available only on the Enterprise plan. On Standard — polling only via GET /calls
  • Transcript lag: AI transcript is ready 1–4 hours after the call (not instant)
  • Data retention: depends on Gong plan, typically 12–24 months of recordings

This is why the real architecture for most teams is cron polling every 30 minutes instead of a webhook.

Real-world case

B2B SaaS (US + EU, enterprise sales, 15–20 calls per day, Kommo + Gong):

  • Before: after each call, the manager manually wrote outcomes in a Note. Took 5–10 minutes. 30% of calls had no Notes at all: “forgot” or “will write later.” The next call — without context from the previous one.
  • After: sync_new_calls() every 30 minutes -> Note with AI summary, link, and next steps. 100% of calls in CRM. The manager comes to the next call with Gong context.
  • Additionally: Gong analysis of won deals showed: managers with a talk ratio < 45% close 28% more often. Data is passed to Kommo -> the head of sales sees the call metric + outcome in the deal card.

Who this is relevant for

  • Enterprise sales teams with 10+ calls per day
  • Companies already using Gong — need to add the CRM layer
  • Head of sales who wants to see communication history without switching out of Kommo
  • Teams with a long deal cycle (60–180 days) — context is critical

Frequently asked questions

Is the Gong API available on all plans?

The Gong API is available on Business and Enterprise plans. On Starter — no API access. Before integrating, check the plan and request API credentials from your Gong account manager.

How do I find the right Kommo deal from Gong data?

Gong stores call participant emails. Search for a Contact in Kommo by email (GET /contacts?query={email}), then find an open deal by contact_id (GET /leads?contact_id={id}). If the email does not match (different format) — matching by phone number is possible.

Is the transcript available via API?

Yes, via GET /calls/{id}/transcript. Returns an array of utterances: speaker, text, start/end time. The full call text can be built for storage in CRM. Note: the transcript appears with a 1–4 hour delay after the call ends.

Does Gong send webhooks or is polling only?

Webhooks (call.completed, deal.updated) — Enterprise plan. Business — polling only via GET /calls with fromDateTime/toDateTime. For most teams, polling every 15–30 minutes is an acceptable delay.

Summary

  • Gong API: Basic Auth (access_key:secret), https://api.gong.io/v2
  • Main flow: GET /calls -> GET /calls/{id} -> GET /calls/{id}/highlights -> Note in Kommo
  • Polling every 30 minutes — a working solution for Business plan without webhook
  • AI highlights: keyPoints, nextSteps, risks — structured content for Notes
  • Talk ratio from metaData — coaching metric in CRM

If you use Gong and Kommo and want to see AI call summaries in deal cards — describe your call structure and which data is critical to capture. Exceltic.dev will configure polling and highlight mapping.

More articles

All
Get in touch your way
WhatsApp Telegram

Before you go: bonus months of Kommo

The implementation estimate is free: describe your sales process in a few words and we propose a solution, a plan and a quote with timelines.

We are an official Kommo partner in Europe: pay for the subscription through us and get bonus months.