Kommo + 8x8: запись звонков и транскрипты UCaaS-платформы в карточку сделки

Kommo + 8x8: запись звонков и транскрипты UCaaS-платформы в карточку сделки

При интеграции Kommo и 8x8 каждый завершённый звонок автоматически появляется в хронологии нужной сделки: дата, длительность, направление (входящий/исходящий), запись и транскрипт. Менеджер не переключается между вкладками и не вводит заметки вручную.

8x8 - UCaaS (Unified Communications as a Service) платформа, которая объединяет голосовую связь, видеоконференции и командный чат в одном решении. Популярна среди международных компаний как корпоративная замена разрозненным телефонным системам. В отличие от специализированных sales-диалеров (Aircall, JustCall), 8x8 - это полноценная корпоративная телефония, что создаёт сложности при интеграции с CRM: API устроен иначе, события звонков приходят в другом формате.

В 7 из 10 проектов по интеграции корпоративной UCaaS-телефонии с Kommo мы сталкиваемся с одной и той же картиной: менеджеры по продажам работают в двух системах параллельно - звонят через 8x8, а контекст разговора пытаются вспомнить по памяти или перенести вручную в CRM. Нативный виджет 8x8 не передаёт кастомные поля звонка (направление, длительность по сегментам, результат) и не умеет привязать запись к конкретной сделке, если у контакта несколько активных pipeline. Именно на этом шаге теряется контекст при передаче клиента между менеджерами. В этой статье - архитектура интеграции, которая закрывает эти пробелы, с кастомными полями в Kommo и автоматическим логированием всего цикла звонка.

Почему нативная интеграция не работает

8x8 не имеет готовой интеграции с Kommo. В Marketplace Kommo 8x8 отсутствует. Единственный путь без разработки - Zapier, но здесь возникают три проблемы:

Во-первых, 8x8 Zapier trigger срабатывает на «завершённый звонок», но не передаёт идентификатор контакта из Kommo - это значит, что автоматически привязать звонок к нужной сделке невозможно без дополнительной логики сопоставления по номеру телефона.

Во-вторых, 8x8 хранит записи звонков на своих серверах с ограниченным сроком хранения (зависит от тарифа). Zapier не умеет скачивать аудиофайл и прикреплять его к карточке Kommo.

В-третьих, транскрипты звонков в 8x8 появляются с задержкой до 15-20 минут после окончания разговора. Zapier-зоонк на момент триггера видит только метаданные, но не текст.

Что реализовывается - архитектура решения

8x8 (звонок завершён)
        |
        v
  8x8 Webhook -> Ваш сервер
  - phone_from, phone_to, duration, call_id
        |
        v
  Логика сопоставления:
  - поиск контакта в Kommo по номеру телефона
  - определение активной сделки контакта
        |
        v
  Kommo API:
  - добавить заметку о звонке
  - создать задачу если нет ответа
        |
  (через 20 минут - polling или webhook)  |
        v
  8x8 API: получить транскрипт
        |
        v
  Kommo API: добавить транскрипт к заметке

Ключевой момент архитектуры - сопоставление номера телефона из 8x8 с контактом в Kommo. 8x8 передаёт номера в формате E.164 (+12025551234). Kommo хранит телефоны в разных форматах. Нормализация обоих значений перед сравнением - обязательный шаг.

Технические детали

8x8 предоставляет два вида API: CPaaS API (для программируемой телефонии) и Work API (для UCaaS-функционала). Для интеграции с CRM используется Work API v2 - он даёт доступ к call records, recordings и transcripts.

Аутентификация - OAuth 2.0 с токеном типа Bearer. Webhook настраивается через 8x8 Admin Console -> Integrations -> Webhooks.

import requests
import re
from flask import Flask, request, jsonify
import time

app = Flask(__name__)

EIGHTx8_API_BASE = "https://api.8x8.com/work/v2"
EIGHTx8_TOKEN = "your_8x8_api_token"

def normalize_phone(phone: str) -> str:
    """Нормализует номер телефона до формата E.164 без +"""
    digits = re.sub(r"\D", "", phone)
    if len(digits) == 10:  # US number without country code
        digits = "1" + digits
    return digits

def find_kommo_deal_by_phone(phone: str):
    """Ищет сделку в Kommo по номеру телефона контакта"""
    normalized = normalize_phone(phone)
    contacts = kommo_api.search_contacts_by_phone(normalized)
    if not contacts:
        return None
    # Берём контакт с открытой сделкой
    for contact in contacts:
        deals = kommo_api.get_contact_deals(contact["id"], statuses=["open"])
        if deals:
            return deals[0], contact
    return None

@app.route("/8x8/webhook", methods=["POST"])
def handle_8x8_webhook():
    data = request.json
    event = data.get("event")  # call.ended
    
    if event != "call.ended":
        return jsonify({"ok": True})
    
    call_data = data["call"]
    call_id = call_data["id"]
    duration_sec = call_data.get("duration", 0)
    direction = call_data.get("direction", "inbound")  # inbound | outbound
    
    # Определяем, кто внешний абонент
    if direction == "outbound":
        external_phone = call_data["to"]
    else:
        external_phone = call_data["from"]
    
    result = find_kommo_deal_by_phone(external_phone)
    if not result:
        # Контакт не найден - создать новый лид или пропустить
        return jsonify({"ok": True, "msg": "Contact not found"})
    
    deal, contact = result
    duration_min = duration_sec // 60
    duration_str = f"{duration_min} мин {duration_sec % 60} сек"
    
    note_text = (
        f"Звонок 8x8 ({direction})\n"
        f"Длительность: {duration_str}\n"
        f"Номер: {external_phone}\n"
        f"Call ID: {call_id}"
    )
    
    if duration_sec == 0:
        note_text += "\nБез ответа"
        kommo_api.create_task(
            deal["id"],
            text=f"Перезвонить: пропущенный звонок от {external_phone}",
            deadline_hours=2
        )
    
    kommo_api.add_note(deal["id"], note_text)
    
    # Запланировать получение транскрипта через 20 минут
    schedule_transcript_fetch(call_id, deal["id"], delay_seconds=1200)
    
    return jsonify({"ok": True})

def fetch_and_attach_transcript(call_id: str, deal_id: int):
    headers = {"Authorization": f"Bearer {EIGHT_X8_TOKEN}"}
    resp = requests.get(
        f"{EIGHT_X8_API_BASE}/calls/{call_id}/transcript",
        headers=headers
    )
    if resp.status_code == 200:
        transcript = resp.json().get("text", "")
        if transcript:
            kommo_api.add_note(
                deal_id,
                f"Транскрипт звонка 8x8:\n\n{transcript[:2000]}"
            )

Пошаговая реализация

Шаг 1. Включите API доступ в 8x8

Войдите в 8x8 Admin Console -> Account -> API Access. Создайте API ключ с правами calls:read, recordings:read, transcripts:read. Сохраните токен - он понадобится для всех API-запросов.

Шаг 2. Настройте webhook в 8x8

В 8x8 Admin Console -> Integrations -> Webhooks создайте новый webhook с URL https://yourserver.com/8x8/webhook. Выберите события: call.ended, call.missed. Система отправит тестовый запрос для проверки доступности endpoint.

Шаг 3. Настройте кастомные поля в Kommo

Добавьте поля для сделки: last_call_duration (текст), last_call_direction (список), call_count_total (число). Это даст возможность строить отчёты и фильтровать сделки по активности коммуникаций.

Шаг 4. Настройте логику неотвеченных звонков

При duration = 0 интеграция создаёт задачу «Перезвонить» с дедлайном 2 часа и назначает её ответственному менеджеру сделки. Это критически важно для команд, где входящие звонки - основной канал лидов.

Шаг 5. Настройте хранение записей

Если нужно сохранять записи звонков (не только ссылки), добавьте логику скачивания аудиофайла через 8x8 API и загрузки в облачное хранилище (S3, Google Cloud Storage). Ссылку на файл добавляйте в заметку Kommo. Это важно, если тариф 8x8 не включает долгосрочное хранение записей.

Реальный кейс с цифрами

Европейская B2B-компания, предоставляющая профессиональные услуги, использует 8x8 как корпоративную АТС. 15 менеджеров по продажам совершают 200-300 звонков в неделю.

До интеграции ситуация была типичной: менеджеры логировали звонки вручную после разговора, примерно 30-40% звонков вообще не попадали в CRM. История коммуникаций с клиентом была неполной, руководителю было сложно понять на каком этапе работы находится сделка.

Частая ситуация: менеджер менялся, новый сотрудник открывал карточку и не видел контекста - звонил клиенту заново, повторял те же вопросы, терял доверие.

После интеграции Kommo + 8x8 через Exceltic.dev:

  • 100% звонков фиксируются в карточке сделки автоматически
  • Транскрипты помогают руководителю слышать реальные разговоры без прослушивания записей
  • Задачи на перезвон создаются автоматически - ни один неотвеченный звонок не теряется
  • Время на ручное логирование: 0

О том, как правильно настроить воронку Kommo CRM с учётом телефонной активности - в отдельном материале.

Для кого подходит

Интеграция Kommo + 8x8 актуальна для:

  • Компаний, использующих 8x8 как корпоративную АТС и желающих видеть историю звонков в CRM
  • Команд с 10+ менеджерами по продажам, где ручное логирование неэффективно
  • B2B с длинным циклом сделки - история коммуникаций критична для передачи клиента между менеджерами
  • Компаний с compliance-требованиями к записи переговоров - интеграция помогает хранить и находить нужные записи

Если вы используете специализированный sales-диалер (Aircall, JustCall, CloudTalk) - для него уже существуют готовые решения. 8x8 как UCaaS-платформа требует кастомной разработки, но это оправдано когда телефония используется всей компанией, а не только отделом продаж.

Больше об интеграции IP-телефонии с CRM-системами - в обзорном материале.

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

8x8 поддерживает webhook-уведомления о звонках?

Да. 8x8 Work API поддерживает webhook для событий call.ended, call.missed, call.answered. Webhook настраивается в Admin Console и доставляет события в реальном времени. Документация доступна на developer.8x8.com. Для использования API нужен тариф не ниже X2 или X4 (Business тарифы).

Как интеграция определяет к какой сделке привязать звонок?

По номеру телефона. Когда 8x8 отправляет webhook с номером внешнего абонента, сервер ищет контакт в Kommo с этим номером (с нормализацией формата). Если у контакта несколько открытых сделок - используется самая последняя активная. Если контакта нет - можно настроить автоматическое создание нового лида или отправку уведомления менеджеру.

Транскрипты доступны на всех тарифах 8x8?

Транскрипция звонков (AI-powered) доступна на тарифах X4 и выше. На X2 доступны только записи без транскрипта. Если транскрипция не нужна, интеграция всё равно работает - просто без шага получения текста разговора.

Можно ли настроить автоматическое создание лида для входящего звонка с неизвестного номера?

Да. Если 8x8 присылает webhook с номером, которого нет в Kommo, сервер может автоматически создать новый контакт и сделку на первом этапе воронки. Это особенно полезно для компаний, у которых входящий звонок - основной канал новых заявок. Подробнее о кастомных интеграциях в Kommo для автоматизации входящих запросов.

Сколько времени занимает разработка интеграции Kommo + 8x8?

Базовый вариант (логирование звонков + заметки + задачи на перезвон) - 2-3 недели. С транскрипцией и записями - 3-4 недели. Если нужна интеграция с другими системами компании (ERP, helpdesk) - оцениваем отдельно.


Если 8x8 - ваша корпоративная телефония и вы хотите видеть все звонки в Kommo - опишите задачу команде Exceltic.dev. Разберём архитектуру под ваш стек звонков и оценим объём работ.

Ещё статьи

Все →