Документация
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→ шаг 5warm/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'а:
/runs— новый run со status'омrunning- Через ~1.5 sec — status
done, все 4 шага с timing'ами в trace'е ai.classify.output.labelвиден в step-output'е- В amoCRM — новая сделка с правильным status_id'ом
- Если 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_values → UF_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'.