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
| Параметр | JustCall | Aircall | Dialpad |
|---|---|---|---|
| Power / Predictive Dialer | Оба | Нет | Power Dialer |
| AI транскрипция | JustCall AI (add-on) | Через партнёра | Нативная |
| SMS-кампании | Да | Нет | Нет |
| Да | Нет | Нет | |
| Цена (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 рабочих дня.