Skip to content

Lead qualifier

Что делает: incoming форма с сайта (Tilda) → AI классифицирует лида (hot / warm / cold) → создаёт сделку в amoCRM с правильным pipeline-status’ом → в hot-случае уведомляет менеджера в Telegram.

Производительность: ~1.5-2 секунды от submit’а формы до сделки в CRM. Scale: 500+ лидов в день без upgrade’а.

  • Tilda-страница с webhook-форму (setup)
  • amoCRM long-lived token + subdomain (setup)
  • Telegram bot + chat_id команды (setup)
  • LLM API key в OPORA (встроенный pricing; см. /usage в UI)
amocrm-token-main
amocrm-subdomain
telegram-bot-token
┌──────────────────┐
│ webhook.trigger │ ← Tilda POST
│ (generic) │
└────────┬─────────┘
│ {name, email, phone, utm_*, formname}
┌──────────────────┐
│ ai.classify │ labels: ["hot", "warm", "cold"]
│ │ input: formname + name + phone-presence
└────────┬─────────┘
│ {label: "hot" | "warm" | "cold", confidence: 0.9}
┌──────────────────┐
│ amocrm.lead. │ pipeline_id / status_id зависят от label
│ create │
└────────┬─────────┘
│ {id: 123456, ...}
┌──────┴──────┐
│ switch on │
│ classify │
└──────┬──────┘
┌────┴────┐
│ hot? │
└────┬────┘
yes │ no (warm/cold)
↓ ↓
┌─────────┐ ✓ done
│telegram.│
│message. │
│send │
└─────────┘
validation: none # Tilda не подписывает webhook'и
bodyFormat: form-urlencoded # Tilda шлёт x-www-form-urlencoded
input: |
Форма: {{trigger.formname}}
Имя: {{trigger.name}}
Телефон: {{trigger.phone}}
UTM: {{trigger.utm_source}}/{{trigger.utm_campaign}}
labels:
- hot: "Лид с телефоном, заполненная форма «Звонок», UTM platformed-ads"
- warm: "Лид с email но без телефона, любая форма кроме прямого контакта"
- cold: "Форма «Скачать прайс», UTM organic/direct, пустые поля"
model: gpt-4o-mini # дешевле чем 4o, достаточно для 3-класс'а
name: "{{trigger.name}} — {{classify.output.label}}"
custom_fields_values:
- field_code: "PHONE"
values: [{ value: "{{trigger.phone}}", enum_code: "WORK" }]
- field_code: "EMAIL"
values: [{ value: "{{trigger.email}}", enum_code: "WORK" }]
tags: ["{{trigger.utm_source}}", "{{classify.output.label}}"]
pipeline_id: 12345 # ваш ID, найти через amocrm.pipelines.list
status_id:
# Разные статусы для разных label'ов
# (обычно: hot → «Обращаться сейчас», warm → «В работе»,
# cold → «Скачали прайс»)
expression: |
{{classify.output.label == 'hot' ? 23456 : classify.output.label == 'warm' ? 23457 : 23458}}

4. control.switch на classify.output.label

Section titled “4. control.switch на classify.output.label”

Две ветки:

  • hot → шаг 5
  • warm / cold → terminal (run done)

5. telegram.message.send (только для hot)

Section titled “5. telegram.message.send (только для hot)”
chat_id: -1001234567890 # id Telegram-чата команды продаж
parse_mode: HTML
text: |
🔥 <b>Hot lead!</b>
Имя: {{trigger.name}}
Телефон: {{trigger.phone}}
Источник: {{trigger.utm_source}} / {{trigger.formname}}
<a href="https://{{secrets.amocrm-subdomain}}.amocrm.ru/leads/detail/{{amocrm.lead.create.id}}">Открыть в amoCRM</a>

После Tilda-submit’а:

  1. /runs — новый run со status’ом running
  2. Через ~1.5 sec — status done, все 4 шага с timing’ами в trace’е
  3. ai.classify.output.label виден в step-output’е
  4. В amoCRM — новая сделка с правильным status_id’ом
  5. Если hot — сообщение в Telegram-чате приходит в течение секунды после сделки
  • ai.classify — 1-2 копейки за run на gpt-4o-mini (~200 tokens)
  • amocrm.lead.create — 0 (amoCRM API free)
  • telegram.message.send — 0
  • Итого: ~1 коп/лид. На 1000 лидов в день — 10 руб/день.

Для pro-tier’а с unlimited usage — полностью покрывается планом.

Источник — не Tilda, а Bitrix24-форма сайта

Section titled “Источник — не Tilda, а Bitrix24-форма сайта”

Замените webhook.trigger на bitrix24.webhook.trigger (с event ONFORMSUBMIT). Payload-структура другая (Bitrix шлёт JSON), поправьте template-references соответствующе.

Замените amocrm.lead.create на bitrix24.lead.create. Поля custom_fields_valuesUF_CRM_* (Bitrix-конвенция). См. Bitrix24 guide (секция «Ноды Bitrix24»).

Добавить dedupe по телефону

Section titled “Добавить dedupe по телефону”

Перед lead.create вставьте:

amocrm.crm.list
entity: contacts
filter: {custom_fields_values: [{field_code: "PHONE", values: [{value: "{{trigger.phone}}"}]}]}
control.switch on list.results.length
> 0 → amocrm.lead.create (linkedContact = list.results[0].id)
== 0 → amocrm.contact.create + amocrm.lead.create

Расширить классификацию до 5 классов

Section titled “Расширить классификацию до 5 классов”

Просто дополните labels в ai.classify — LLM справится. Для сотен классов стоит подумать о ai.extract с structured output’ом вместо .classify.

AI кладёт всех в одну категорию

Section titled “AI кладёт всех в одну категорию”

Prompt в labels — разный для вашего бизнеса. Переформулируйте так, чтобы границы классов были чёткими («с телефоном» vs «без телефона»). Модель gpt-4o-mini иногда упрощает — попробуйте 4o если бизнес-ценность высока.

Поставьте temporary amocrm.pipelines.list ноду в начале workflow’а → проверьте output в /runs/<id>/traces → найдите правильный pipeline_id → вставьте в lead.create → уберите temporary ноду.

Telegram hot-уведомление не приходит

Section titled “Telegram hot-уведомление не приходит”
  • control.switch кондишн работает? Проверьте в trace’е classify.output.label совпадает с "hot" (case-sensitive)
  • Бот добавлен в целевой чат как admin? (/setprivacy disable в BotFather)
  • chat_id отрицательный (для групп всегда -100...)?

Tilda не всегда шлёт UTM’ы — зависит от того, как пользователь попал на форму. Добавьте {{trigger.utm_source || 'direct'}} в tag’ах чтобы fallback’ить на 'direct'.