Документация

Lead qualifier

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

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

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

Prerequisites

  • Tilda-страница с webhook-форму (setup)
  • amoCRM long-lived token + subdomain (setup)
  • Telegram bot + chat_id команды (setup)
  • LLM API key в SUMMING (встроенный pricing; см. /usage в UI)

Secrets

amocrm-token-main
amocrm-subdomain
telegram-bot-token

Workflow DAG

┌──────────────────┐
│ 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     │
└─────────┘

Node-by-node

1. webhook.trigger

validation: none          # Tilda не подписывает webhook'и
bodyFormat: form-urlencoded  # Tilda шлёт x-www-form-urlencoded

2. ai.classify

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-класс'а

3. amocrm.lead.create

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

Две ветки:

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

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>

Runtime behavior

После 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-чате приходит в течение секунды после сделки

Cost

  • 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 — полностью покрывается планом.

Variations

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

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

Не amoCRM, а Bitrix24 CRM

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

Добавить 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 классов

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

Troubleshooting

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

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

amoCRM pipeline_id не тот

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

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

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

UTM-поля пустые

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