Lead qualifier
Что делает: incoming форма с сайта (Tilda) → AI классифицирует лида (hot / warm / cold) → создаёт сделку в amoCRM с правильным pipeline-status’ом → в hot-случае уведомляет менеджера в Telegram.
Производительность: ~1.5-2 секунды от submit’а формы до сделки в CRM. Scale: 500+ лидов в день без upgrade’а.
Prerequisites
Section titled “Prerequisites”- Tilda-страница с webhook-форму (setup)
- amoCRM long-lived token + subdomain (setup)
- Telegram bot + chat_id команды (setup)
- LLM API key в OPORA (встроенный pricing; см.
/usageв UI)
Secrets
Section titled “Secrets”amocrm-token-mainamocrm-subdomaintelegram-bot-tokenWorkflow DAG
Section titled “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
Section titled “Node-by-node”1. webhook.trigger
Section titled “1. webhook.trigger”validation: none # Tilda не подписывает webhook'иbodyFormat: form-urlencoded # Tilda шлёт x-www-form-urlencoded2. ai.classify
Section titled “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
Section titled “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.liststatus_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→ шаг 5warm/cold→ terminal (run done)
5. telegram.message.send (только для hot)
Section titled “5. telegram.message.send (только для hot)”chat_id: -1001234567890 # id Telegram-чата команды продажparse_mode: HTMLtext: | 🔥 <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
Section titled “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-чате приходит в течение секунды после сделки
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
Section titled “Variations”Источник — не Tilda, а Bitrix24-форма сайта
Section titled “Источник — не Tilda, а Bitrix24-форма сайта”Замените webhook.trigger на bitrix24.webhook.trigger (с event
ONFORMSUBMIT). Payload-структура другая (Bitrix шлёт JSON), поправьте
template-references соответствующе.
Не amoCRM, а Bitrix24 CRM
Section titled “Не amoCRM, а Bitrix24 CRM”Замените amocrm.lead.create на bitrix24.lead.create. Поля
custom_fields_values → UF_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.
Troubleshooting
Section titled “Troubleshooting”AI кладёт всех в одну категорию
Section titled “AI кладёт всех в одну категорию”Prompt в labels — разный для вашего бизнеса. Переформулируйте так,
чтобы границы классов были чёткими («с телефоном» vs «без
телефона»). Модель gpt-4o-mini иногда упрощает — попробуйте 4o
если бизнес-ценность высока.
amoCRM pipeline_id не тот
Section titled “amoCRM pipeline_id не тот”Поставьте 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...)?
UTM-поля пустые
Section titled “UTM-поля пустые”Tilda не всегда шлёт UTM’ы — зависит от того, как пользователь
попал на форму. Добавьте {{trigger.utm_source || 'direct'}} в
tag’ах чтобы fallback’ить на 'direct'.