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

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

JustCall — cloud phone система для sales-команд: входящие/исходящие звонки, SMS и WhatsApp, power dialer, predictive dialer, AI-транскрипция с coaching insights, SMS-кампании. Популярна в US/EU стартапах и scale-up командах как альтернатива Aircall или Dialpad. JustCall предлагает 100+ нативных интеграций — но Kommo в их числе нет. Разбираем как строить двустороннюю интеграцию: звонок завершён -> Note с записью и AI-саммари в Kommo; контакты из Kommo -> JustCall.

JustCall vs Aircall vs Dialpad

ПараметрJustCallAircallDialpad
Power / Predictive DialerОбаНетPower Dialer
AI транскрипцияJustCall AI (add-on)Через партнёраНативная
SMS-кампанииДаНетНет
WhatsAppДаНетНет
Цена (per user/мес)от $29от $30от $15
Нативная KommoНетНетНет
100+ интеграцииДа100+70+

JustCall выбирают команды которым нужен power dialer + SMS-кампании в одном инструменте и бюджет ограничен.

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

JustCall -> Kommo:
call_completed -> Note: агент, направление, длительность, ссылка на запись, AI-транскрипт
call_missed -> Task: «Перезвонить на {phone}»
sms_received -> Note: текст SMS + номер отправителя

Kommo -> JustCall:
— Новый контакт -> POST /contacts в JustCall (для CallerID при входящих)
— Изменение телефона/имени -> обновление JustCall контакта

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

Base URL: https://api.justcall.io/v1. Аутентификация: Basic Auth (API Key как логин, API Secret как пароль — из JustCall -> Settings -> Developers -> API Keys).

import requests
from requests.auth import HTTPBasicAuth

JC_API_KEY    = "your_api_key"
JC_API_SECRET = "your_api_secret"
JC_BASE       = "https://api.justcall.io/v1"
JC_AUTH       = HTTPBasicAuth(JC_API_KEY, JC_API_SECRET)

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

def get_call_transcript(call_id: str) -> str:
    resp = requests.get(
        f"{JC_BASE}/calls/{call_id}/transcript",
        auth=JC_AUTH,
    )
    if resp.status_code == 404:
        return ""
    resp.raise_for_status()
    data = resp.json().get("data", {})
    return data.get("transcript", "")

def get_call_ai_summary(call_id: str) -> str:
    resp = requests.get(
        f"{JC_BASE}/calls/{call_id}/summary",
        auth=JC_AUTH,
    )
    if resp.status_code in (404, 422):
        return ""
    resp.raise_for_status()
    return resp.json().get("data", {}).get("summary", "")

def create_justcall_contact(name: str, phone: str,
                             email: str = "", company: str = "") -> dict:
    payload = {
        "firstname": name.split()[0] if name else "",
        "lastname":  " ".join(name.split()[1:]) if len(name.split()) > 1 else "",
        "phone":     phone,
        "email":     email,
        "company":   company,
    }
    resp = requests.post(
        f"{JC_BASE}/contacts",
        auth=JC_AUTH,
        json=payload,
    )
    resp.raise_for_status()
    return resp.json().get("data", {})

def send_sms(from_number: str, to_number: str, message: str) -> dict:
    resp = requests.post(
        f"{JC_BASE}/texts",
        auth=JC_AUTH,
        json={
            "justcall_number": from_number,
            "contact_number":  to_number,
            "body":            message,
        },
    )
    resp.raise_for_status()
    return resp.json().get("data", {})

Webhook: JustCall -> Kommo

JustCall поддерживает webhooks: Settings -> Integrations -> Webhooks -> Add URL.

@app.route("/webhooks/justcall", methods=["POST"])
def justcall_webhook():
    payload = request.json
    event   = payload.get("type", "")
    data    = payload.get("data", {})

    if event == "call_completed":
        call_id   = str(data.get("id", ""))
        phone     = data.get("contact_number", "")
        direction = data.get("direction", "")
        duration  = data.get("duration", 0)
        agent     = data.get("agent_name", "")
        recording = data.get("recording_url", "")

        # Попробовать получить AI-данные (требует JustCall AI add-on)
        ai_summary = get_call_ai_summary(call_id)
        transcript = "" if ai_summary else get_call_transcript(call_id)

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

        dir_label = "Входящий" if direction == "inbound" else "Исходящий"
        note_lines = [
            f"JustCall: {dir_label} ({agent}), {duration} сек.",
        ]
        if recording:
            note_lines.append(f"Запись: {recording}")
        if ai_summary:
            note_lines.append(f"AI саммари: {ai_summary}")
        elif transcript:
            note_lines.append(f"Транскрипт: {transcript[:400]}...")

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

    elif event == "call_missed":
        phone   = data.get("contact_number", "")
        lead_id = find_kommo_lead_by_phone(phone)
        if lead_id:
            create_kommo_note(lead_id, f"JustCall: пропущенный звонок с {phone}")
            create_kommo_task(lead_id, f"JustCall: перезвонить на {phone}")

    elif event == "sms_received":
        phone   = data.get("contact_number", "")
        body    = data.get("body", "")
        lead_id = find_kommo_lead_by_phone(phone)
        if lead_id:
            create_kommo_note(lead_id, f"JustCall SMS от {phone}: {body}")

    return "", 200

Power Dialer + Kommo: очередь звонков из воронки

JustCall Power Dialer работает со списками контактов. Для автоматической очереди из Kommo-воронки: cron каждый час выбирает лиды в нужном этапе -> экспортирует контакты в JustCall Campaign через API.

def create_dialer_campaign(name: str, justcall_number: str) -> str:
    resp = requests.post(
        f"{JC_BASE}/autodialer/campaigns",
        auth=JC_AUTH,
        json={"name": name, "justcall_number": justcall_number},
    )
    resp.raise_for_status()
    return resp.json().get("data", {}).get("id", "")

def add_contacts_to_campaign(campaign_id: str, contacts: list):
    for contact in contacts:
        requests.post(
            f"{JC_BASE}/autodialer/campaigns/{campaign_id}/contacts",
            auth=JC_AUTH,
            json={"phone": contact["phone"], "name": contact["name"]},
        )

def sync_kommo_stage_to_dialer(stage_id: int, campaign_id: str):
    leads = get_kommo_leads_by_stage(stage_id)
    contacts = []
    for lead in leads:
        contact = get_kommo_contact(lead["id"])
        phone   = get_contact_phone(contact)
        if phone:
            contacts.append({"phone": phone, "name": contact.get("name", "")})
    if contacts:
        add_contacts_to_campaign(campaign_id, contacts)

JustCall AI: coaching insights в Kommo

JustCall AI (add-on «AI Coaching») анализирует звонок и выдаёт: overall call score, talk-listen ratio, sentiment, key topics, follow-up actions. Всё это доступно через GET /calls/{id}/summary. При наличии AI add-on в Note добавляется структурированный саммари вместо сырого транскрипта.

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

B2B SDR-команда (US, 8 агентов, Kommo + JustCall):

  • До: после каждого звонка агент 3–5 минут писал заметку в Kommo. Пропущенные звонки — задача только если агент не забыл. SMS от клиентов — только в JustCall, в Kommo не попадали.
  • После: call_completed -> Note автоматически, call_missed -> Task автоматически, sms_received -> Note. AI саммари (JustCall AI add-on) -> короткий итог звонка в Note без дословного транскрипта.
  • Дополнительно: power dialer campaign заполняется из Kommo каждый день в 08:00 через cron — агенты утром открывают JustCall и видят актуальную очередь лидов из воронки.

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

  • SDR/BDR команды с высоким объёмом исходящих звонков — power dialer + история в CRM
  • Компании где продажи идут через SMS + звонки (US рынок, e-commerce B2B)
  • Руководители которым нужны AI-insights по звонкам агентов прямо в Kommo
  • Команды с ограниченным бюджетом — JustCall дешевле Aircall при аналогичном функционале

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

JustCall нативные интеграции — почему Kommo не в списке?

JustCall поддерживает 100+ нативных интеграций (HubSpot, Salesforce, Pipedrive, Zoho, Freshsales). Kommo — не в официальном списке. JustCall позиционирован на US/западный рынок, Kommo — на EU/LatAm. Кастомная интеграция через JustCall webhook + REST API полностью покрывает функционал нативных интеграций: Notes, Tasks, Contact sync.

JustCall SMS-кампании — можно ли запустить из Kommo?

Да, через JustCall Bulk SMS API: POST /texts/bulk с массивом получателей. Для кампании из Kommo-сегмента: выбрать лиды по тегу или этапу -> получить телефоны -> POST в JustCall Bulk SMS. Статус доставки (delivered/failed) возвращается через webhook sms_status.

JustCall AI доступен на всех планах?

JustCall AI (транскрипция + coaching insights) — отдельный add-on, доступен на Team и Business планах (минимум 2 пользователя). На базовом Solo плане AI-транскрипции нет. При отсутствии AI: GET /calls/{id}/summary вернёт 404. В коде использован fallback: если summary нет -> получить raw transcript через /transcript.

Как сопоставить JustCall агента с Kommo пользователем?

В JustCall webhook payload поле agent_email. Если email агента совпадает с email пользователя Kommo — создавать Note от нужного пользователя через Kommo API (параметр created_by в Note endpoint). Маппинг: {jc_agent_email: kommo_user_id} хранить в конфиге или получать через Kommo GET /users.

Итого

  • API: Basic Auth (API Key + API Secret), base URL https://api.justcall.io/v1
  • Webhook: call_completed -> Note (запись + AI саммари), call_missed -> Task, sms_received -> Note
  • AI саммари: GET /calls/{id}/summary (требует JustCall AI add-on), fallback на /transcript
  • Power Dialer: POST /autodialer/campaigns + contacts — очередь из Kommo-воронки
  • Bulk SMS: POST /texts/bulk — SMS-кампания по сегменту из Kommo

Если вы используете JustCall и Kommo и хотите автоматическую историю звонков и SMS в CRM — опишите объём звонков и нужен ли power dialer. Exceltic.dev настроит интеграцию за 2–4 рабочих дня.

Ещё статьи

Все →