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

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

CloudTalk — cloud-based call center решение для EU-команд продаж и поддержки: AI-транскрипция звонков, power dialer, IVR, 160+ готовых интеграций, серверы в ЕС (GDPR-compliant). Популярен в европейских SaaS и e-commerce — особенно где важна локализация номеров (CloudTalk предоставляет номера в 160+ странах). В отличие от Aircall или Dialpad, CloudTalk делает акцент на EU-инфраструктуре и compliance. Нативной интеграции с Kommo в маркетплейсе нет — разбираем правильную архитектуру через API.

CloudTalk vs Aircall vs Dialpad для Kommo-команд

ПараметрCloudTalkAircallDialpad
СерверыEU (GDPR)EU + USUS (EU PoP)
AI транскрипцияДа (CloudTalk AI)Через интеграциюНативная
Power DialerДаНетДа
Номера160+ стран100+ стран70+ стран
Нативная интеграция KommoНетНетНет
Цена (per user/мес)от $25от $30от $15

CloudTalk выбирают EU-команды где GDPR и локализация номеров — требования, а не опции.

Архитектура: что синхронизируется

CloudTalk -> Kommo:
call.ended -> Note с длительностью, направлением (in/out), ссылкой на запись
call.ended + AI transcript -> Note с текстом транскрипта (если подключён CloudTalk AI)
— Пропущенный входящий -> Task менеджеру «Перезвонить»

Kommo -> CloudTalk:
— Новый контакт/лид -> синхронизация в CloudTalk Phone Book
— Изменение имени/компании -> обновление CloudTalk Contact

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

Base URL: https://my.cloudtalk.io/api. Аутентификация: Basic Auth (API key как логин, API secret как пароль из CloudTalk -> Account -> Integrations -> API).

import requests
from requests.auth import HTTPBasicAuth

CT_API_KEY    = "your_api_key"
CT_API_SECRET = "your_api_secret"
CT_BASE_URL   = "https://my.cloudtalk.io/api"
CT_AUTH       = HTTPBasicAuth(CT_API_KEY, CT_API_SECRET)

def get_call_detail(call_id: str) -> dict:
    resp = requests.get(
        f"{CT_BASE_URL}/calls/{call_id}.json",
        auth=CT_AUTH,
    )
    resp.raise_for_status()
    return resp.json().get("responseData", {})

def get_call_recording_url(call_id: str) -> str:
    call = get_call_detail(call_id)
    return call.get("recordingUrl", "")

def create_cloudtalk_contact(name: str, phone: str, email: str = "",
                              company: str = "") -> dict:
    payload = {
        "name":    name,
        "phone":   phone,
        "email":   email,
        "company": company,
    }
    resp = requests.post(
        f"{CT_BASE_URL}/contacts.json",
        auth=CT_AUTH,
        json=payload,
    )
    resp.raise_for_status()
    return resp.json().get("responseData", {})

def update_cloudtalk_contact(contact_id: str, data: dict) -> dict:
    resp = requests.put(
        f"{CT_BASE_URL}/contacts/{contact_id}.json",
        auth=CT_AUTH,
        json=data,
    )
    resp.raise_for_status()
    return resp.json().get("responseData", {})

Webhook: CloudTalk -> Kommo Note

CloudTalk поддерживает webhooks: Account -> Integrations -> Webhook -> Add. Событие call-ended отправляет payload с деталями звонка.

@app.route("/webhooks/cloudtalk", methods=["POST"])
def cloudtalk_webhook():
    payload  = request.json
    event    = payload.get("event")
    call     = payload.get("call", {})

    if event != "call-ended":
        return "", 200

    call_id     = call.get("id")
    phone       = call.get("callerNumber") or call.get("destinationNumber", "")
    direction   = call.get("direction", "")
    duration    = call.get("talkTime", 0)
    recording   = call.get("recordingUrl", "")
    agent_name  = call.get("agentName", "")
    transcript  = call.get("transcript", "")

    lead_id = find_kommo_lead_by_phone(phone)
    if not lead_id:
        return "", 200

    dir_label = "Входящий" if direction == "inbound" else "Исходящий"
    note_parts = [
        f"CloudTalk: {dir_label} звонок ({agent_name}), {duration} сек.",
    ]
    if recording:
        note_parts.append(f"Запись: {recording}")
    if transcript:
        short = transcript[:500] + ("..." if len(transcript) > 500 else "")
        note_parts.append(f"Транскрипт: {short}")

    create_kommo_note(lead_id, "\n".join(note_parts))

    if direction == "inbound" and duration == 0:
        create_kommo_task(lead_id, f"CloudTalk: пропущенный звонок с {phone} - перезвонить")

    return "", 200

Синхронизация контактов Kommo -> CloudTalk

При создании нового лида в Kommo — контакт добавляется в CloudTalk Phone Book. Это позволяет агентам CloudTalk видеть имя звонящего и историю звонков:

@app.route("/webhooks/kommo", methods=["POST"])
def kommo_lead_webhook():
    payload = request.json
    event   = payload.get("type")

    if event == "contact_add":
        contact = payload.get("data", [{}])[0]
        name    = contact.get("name", "")
        phone   = get_phone_from_contact(contact)
        email   = get_email_from_contact(contact)
        company = get_company_from_contact(contact)

        if phone:
            ct_contact = create_cloudtalk_contact(name, phone, email, company)
            save_cloudtalk_contact_id(contact["id"], ct_contact.get("id"))

    elif event == "contact_update":
        contact    = payload.get("data", [{}])[0]
        ct_id      = get_cloudtalk_contact_id(contact["id"])
        if ct_id:
            update_cloudtalk_contact(ct_id, {
                "name":    contact.get("name"),
                "company": get_company_from_contact(contact),
            })

    return "", 200

CloudTalk AI: транскрипция и саммари

CloudTalk AI (доступен на Expert планах) автоматически транскрибирует звонки и генерирует саммари. Транскрипт передаётся в webhook payload в поле transcript, саммари — в aiSummary. Для Kommo Note достаточно включить оба поля:

def format_cloudtalk_note(call: dict) -> str:
    lines = []
    direction = "Входящий" if call.get("direction") == "inbound" else "Исходящий"
    lines.append(
        f"CloudTalk: {direction}, {call.get('talkTime', 0)} сек, "
        f"агент: {call.get('agentName', '')}"
    )
    if call.get("recordingUrl"):
        lines.append(f"Запись: {call['recordingUrl']}")
    if call.get("aiSummary"):
        lines.append(f"AI саммари: {call['aiSummary']}")
    elif call.get("transcript"):
        preview = call["transcript"][:300]
        lines.append(f"Транскрипт: {preview}...")
    return "\n".join(lines)

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

B2B SaaS (Czech Republic, 40 человек, Kommo + CloudTalk + EU номера):

  • До: после каждого звонка менеджер вручную писал заметку в Kommo — что обсудили, следующий шаг. 5–10 минут административной работы на звонок. Пропущенные звонки терялись — не было системного follow-up.
  • После: call-ended -> Note с длительностью + ссылкой на запись автоматически. CloudTalk AI transcript -> первые 300 символов в Note. Пропущенный -> Task «Перезвонить» на того же менеджера.
  • Результат: административная нагрузка на звонок — с 8 мин до 0 (менеджер только добавляет итог своими словами если нужно). Follow-up на пропущенные: 100% vs ~60% ранее. Team lead начал слушать записи через Kommo Notes напрямую — без входа в CloudTalk.

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

  • EU-команды продаж где GDPR важен: данные звонков на EU-серверах CloudTalk
  • Компании с локализованными номерами (Германия, Франция, Нидерланды) — CloudTalk 160+ стран
  • SDR/BDR команды с высоким объёмом исходящих — power dialer + автоматическая история
  • Support-команды где история взаимодействий в CRM критична

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

CloudTalk нативная интеграция с Kommo — есть ли?

В CloudTalk есть нативные интеграции с HubSpot, Pipedrive, Salesforce, Freshdesk. Kommo — нет. CloudTalk поддерживает Generic CRM Integration через их открытый webhook + REST API. Exceltic.dev строит кастомный двусторонний коннектор: CloudTalk webhook -> Kommo Notes, Kommo webhook -> CloudTalk Contacts.

Как CloudTalk определяет какой менеджер отвечал за звонок?

В webhook payload поле agentId и agentName — CloudTalk агент кто принял/совершил звонок. Если Kommo пользователи совпадают с CloudTalk агентами (один email), можно матчить по email и создавать Note от правильного пользователя через Kommo API с created_by параметром.

CloudTalk Power Dialer — как интегрировать с очередью звонков из Kommo?

CloudTalk Power Dialer работает со списками контактов внутри CloudTalk. Для автоматической загрузки очереди из Kommo: cron-задача каждый час выбирает лиды в нужном этапе воронки -> через CloudTalk Contacts API создаёт/обновляет контакты -> добавляет в Dialer Campaign через POST /campaigns/{id}/contacts. Так менеджер утром открывает CloudTalk и видит очередь звонков из Kommo-воронки.

Где хранятся записи CloudTalk звонков?

На серверах CloudTalk (EU, AWS eu-west-1). Ссылка в webhook — прямая ссылка на MP3/WAV, действительна 7 дней без авторизации. Для долгосрочного хранения: при получении webhook — скачать запись в S3/GCS, сохранить постоянную ссылку в Kommo Note. CloudTalk Enterprise предлагает кастомный retention period.

Итого

  • API: Basic Auth (API key + API secret), base URL https://my.cloudtalk.io/api
  • Webhook call-ended -> Note в Kommo: направление, длительность, агент, запись, транскрипт
  • CloudTalk AI transcript и aiSummary доступны на Expert планах — не нужен отдельный сервис
  • Пропущенный звонок -> Task «Перезвонить» — 100% follow-up
  • Синхронизация Kommo Contacts -> CloudTalk Phone Book — агент видит имя клиента при звонке

Если вы используете CloudTalk и Kommo и хотите автоматическую историю звонков в CRM — опишите объём звонков и нужны ли AI-транскрипты. Exceltic.dev настроит интеграцию за 3–5 рабочих дней.

Ещё статьи

Все →