Kommo + Jotform: заявки из форм сразу в воронку без ручного переноса

Kommo + Jotform: заявки из форм сразу в воронку без ручного переноса

Форма на сайте заполнена — и данные оседают в Jotform. Менеджер заходит в таблицу Jotform, копирует имя, email, телефон и вставляет в Kommo вручную. При 20+ заявках в день это несколько часов потерянного времени в неделю, плюс ошибки при копировании. Webhook-интеграция Jotform -> Kommo создаёт лид в CRM в момент отправки формы — с полным маппингом полей, вложениями и маршрутизацией по нужной воронке.

Почему нативной интеграции Jotform недостаточно

Jotform имеет встроенные интеграции с несколькими CRM. Для Kommo (amoCRM) официального коннектора нет — есть обходные пути через Zapier или Make. Эти решения создают лид, но не передают:

  • Файловые вложения (Jotform отдаёт URL файла, не бинарные данные — нужна дополнительная обработка)
  • Условный роутинг по воронкам в зависимости от ответов в форме
  • Дедупликацию контактов (повторная заявка от того же email создаёт дубль)
  • Кастомные поля Kommo, требующие числового ID поля

Вебхук-интеграция решает эти ограничения.

Как работает Jotform Webhook

Jotform отправляет POST-запрос на указанный URL при каждой отправке формы. Настройка: Form Builder -> Settings -> Integrations -> Webhooks.

Полезная нагрузка (payload) содержит все поля формы в формате:

{
  "rawRequest": {
    "q1_firstName": "Иван",
    "q2_lastName": "Петров",
    "q3_email[0]": "ivan@company.com",
    "q4_phone[full]": "+1 234 567 8901",
    "q5_company": "Acme Corp",
    "q6_service": "CRM Integration",
    "q7_budget": "5000-10000",
    "q8_file": "https://www.jotform.com/uploads/.../brief.pdf"
  },
  "formID": "240123456789",
  "submissionID": "5847291034"
}

ID полей (q1_, q2_ и т.д.) задаются в настройках формы. Их стоит задавать явно при разработке формы — так маппинг читаемее.

Маппинг полей Jotform -> Kommo

Каждое поле Jotform маппируется на стандартное или кастомное поле Kommo:

Поле JotformПоле KommoТип Kommo
q1_firstName + q2_lastNamecontact.nameСтандартное
q3_emailcontact.email (field_id: 264)Мультифилд
q4_phonecontact.phone (field_id: 265)Мультифилд
q5_companycontact.company_nameСтандартное
q6_servicelead.nameСтандартное
q7_budgetcustom_field_id: 1234Текст/Список
q8_filenote на лиде (ссылка на файл)Примечание

Кастомные поля Kommo требуют числового field_id — его можно получить через GET /api/v4/leads/custom_fields.

Роутинг по воронкам

Одна компания может использовать несколько воронок в Kommo: «Новые клиенты», «Партнёры», «Повторные продажи». Jotform позволяет создать разные формы для разных сегментов или использовать одну форму с полем-маршрутизатором.

def route_to_pipeline(form_data: dict) -> tuple[int, int]:
    service = form_data.get("q6_service", "")
    budget = form_data.get("q7_budget", "")

    if "partnership" in service.lower():
        return PIPELINE_PARTNERS, STATUS_NEW_PARTNER
    elif budget in ["50000+", "20000-50000"]:
        return PIPELINE_ENTERPRISE, STATUS_QUALIFICATION
    else:
        return PIPELINE_SMB, STATUS_NEW_LEAD

Триггер роутинга — значение конкретного поля формы. Это недоступно в Zapier без платного тарифа и условий.

Обработка вложений

Jotform передаёт URL файла, а не его содержимое. Чтобы файл появился в Kommo, нужно:

import requests

def attach_file_to_lead(lead_id: int, file_url: str, filename: str):
    # Скачиваем файл с Jotform
    response = requests.get(file_url)
    file_content = response.content

    # Загружаем в Kommo как вложение к лиду
    kommo.leads.notes.create(
        lead_id=lead_id,
        note_type="file",
        attachment={
            "filename": filename,
            "content": base64.b64encode(file_content).decode()
        }
    )

Важно: файлы Jotform доступны по URL только ограниченное время (обычно 7 дней). Скачивать и загружать в Kommo нужно сразу при получении webhook.

Дедупликация контактов

Если клиент подал заявку повторно — не нужно создавать второй контакт в Kommo. Правильная логика:

def find_or_create_contact(email: str, name: str) -> int:
    # Ищем существующий контакт
    contacts = kommo.contacts.search(query=email)
    if contacts:
        return contacts[0].id

    # Создаём новый
    contact = kommo.contacts.create(name=name, email=email)
    return contact.id

Поиск по email -> если нашли, привязываем новый лид к существующему контакту. История повторных заявок сохраняется на одном контакте.

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

Образовательная компания (3 формы: консультация, корпоративное обучение, партнёрство):

  • До интеграции: менеджер проверял Jotform три раза в день, вручную переносил заявки. Задержка до 4 часов. При 40+ заявках в неделю — 3–4 часа ручного труда.
  • После: webhook -> лид в нужной воронке Kommo за 2–3 секунды после отправки формы. Роутинг: «партнёрство» -> воронка партнёров, бюджет 20k+ -> воронка Enterprise, остальное -> SMB.
  • Результат: 0 задержки по лидам. Бриф (PDF из формы) автоматически прикрепляется к лиду — менеджер открывает карточку и сразу видит весь контекст.

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

Интеграция Kommo + Jotform имеет смысл если:
— Основной источник лидов — формы на сайте или лендингах (Jotform или похожие)
— Есть несколько типов заявок с разным маршрутом в CRM
— Клиенты прикладывают файлы (бриф, ТЗ, документы) при заявке
— Нужна дедупликация при повторных обращениях

Аналогичная логика работает с Typeform — там своя специфика интеграции с HubSpot, разобранная в статье о Typeform + HubSpot. Принцип webhook -> CRM универсален, меняется только структура payload и API назначения.

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

Jotform имеет нативную интеграцию с amoCRM — она не работает?

Jotform интегрируется с amoCRM (Kommo) через сторонние коннекторы. Нативная поддержка ограничена: передаются базовые поля, нет роутинга по воронкам, нет обработки вложений. Для простых форм (имя + email + телефон) коннектор работает. Для форм с условной логикой и файлами — нет.

Как обновить существующий лид при повторной заявке?

При нахождении контакта по email можно создать новый лид и привязать его к существующему контакту — тогда вся история заявок видна. Либо обновить текущий лид, если бизнес-логика предполагает только одну активную сделку на контакт. Выбор зависит от процесса продаж.

Что если Jotform изменил структуру webhook payload?

Ведите маппинг полей отдельно от бизнес-логики. Любое изменение формы (добавление поля, изменение порядка) не должно ломать интеграцию. Логируйте полный payload каждого webhook — это упрощает отладку при изменениях в форме.

Можно интегрировать несколько Jotform-форм в одну Kommo-воронку?

Да. Настройте один webhook-endpoint, который принимает все формы. Различать форму можно по formID в payload — и применять нужный маппинг полей для каждой. Одна точка входа, несколько источников.

Сколько времени занимает разработка?

Простая интеграция (одна форма, базовые поля) — 1 неделя. С роутингом по воронкам, обработкой вложений и дедупликацией — 2–3 недели.

Итого

  • Jotform webhook -> Kommo: заявка попадает в CRM за 2–3 секунды без ручного переноса
  • Кастомный маппинг полей, роутинг по воронкам, вложения — это то, чего нет в Zapier-коннекторе
  • Дедупликация по email обязательна — иначе повторные заявки создают дублирующие контакты
  • Файлы Jotform нужно скачивать сразу при получении webhook — URL доступен ограниченное время
  • Типовой срок разработки — 2–3 недели

Если вы используете Jotform для сбора заявок и тратите время на ручной перенос данных в Kommo — опишите структуру ваших форм и логику распределения заявок. Exceltic.dev разберёт маппинг и предложит схему интеграции.

Ещё статьи

Все →