Передача заявок у CRM: автоматизація без помилок
Заявки з сайту надходять на пошту — менеджер витрачає до 30 хвилин на день на ручне перенесення в CRM. Помилки в контактах, втрата лідів, затримки реакції. Ми усуваємо цей біль: форма надсилає дані безпосередньо через API, заявка миттєво опиняється у воронці, менеджер отримує сповіщення в Telegram. Без шаблонних листів, без дублювання. UTM-мітки зберігаються, спам-боти блокуються.
Вибір протоколу — REST API з OAuth2 (amoCRM, Salesforce) або вебхуки (Битрикс24, HubSpot) — впливає на швидкість та надійність. REST API вдвічі швидший і дозволяє повторювати запит при помилці. Всі токени кешуються в Redis і оновлюються автоматично. Інтеграція працює роками без збоїв, економлячи менеджеру до 10 годин на тиждень. Економія коштів: при 100 лідах на місяць ви заощаджуєте до $500 на ручному вводі. Вартість розробки починається від $300, що окупається за місяць-два.
Які технічні складності вирішуємо?
- OAuth2-токени amoCRM живуть 24 години — без автооновлення форма перестає працювати. Реалізовано менеджер токенів: refresh-токен продовжує сесію, access_token кешується на 23 години.
- Бітрікс24 вимагає налаштування вебхуків і власної авторизації. Перевірка підпису гарантує, що запити надходять тільки від вашої форми.
- UTM-мітки губляться, якщо не зберігати їх при першому візиті. Ми пишемо їх у кукі на 30 днів і передаємо разом із формою.
- Дублікати контактів блокуються перевіркою існуючих записів у CRM за email або телефоном.
- Спам-боти відсіюються honeypot-полем і прихованою капчею.
Як ми інтегруємо форму з CRM?
Розглянемо інтеграцію з amoCRM на Laravel 11 (PHP 8.3). Сервіс створює лід, контакт і заповнює кастомні поля (джерело, коментар).
class AmoCrmService { private string $subdomain; private string $accessToken; public function createLead(array $formData): int { $resp = Http::withToken($this->accessToken) ->post("https://{$this->subdomain}.amocrm.ru/api/v4/leads", [ [ 'name' => "Заявка з сайту: {$formData['name']}", 'status_id' => config('amocrm.initial_status_id'), 'pipeline_id' => config('amocrm.pipeline_id'), '_embedded' => [ 'contacts' => [[ 'name' => $formData['name'], 'custom_fields_values' => [ ['field_code' => 'EMAIL', 'values' => [['value' => $formData['email']]]], ['field_code' => 'PHONE', 'values' => [['value' => $formData['phone'], 'enum_code' => 'WORK']]], ], ]], ], 'custom_fields_values' => [ ['field_id' => config('amocrm.source_field_id'), 'values' => [['value' => 'Сайт']]], ['field_id' => config('amocrm.comment_field_id'), 'values' => [['value' => $formData['message']]]], ], ] ]); return $resp->json('_embedded.leads.0.id'); } } Токен оновлюється через AmoCrmTokenManager, який кешує access_token у Redis на 23 години.
class AmoCrmTokenManager { public function getValidToken(): string { $stored = Cache::get('amocrm_access_token'); if ($stored) return $stored; // Оновлюємо через refresh_token $resp = Http::post("https://{$this->subdomain}.amocrm.ru/oauth2/access_token", [ 'client_id' => config('amocrm.client_id'), 'client_secret' => config('amocrm.client_secret'), 'grant_type' => 'refresh_token', 'refresh_token' => decrypt(Setting::get('amocrm_refresh_token')), 'redirect_uri' => config('amocrm.redirect_uri'), ]); $tokens = $resp->json(); Cache::put('amocrm_access_token', $tokens['access_token'], 82800); // 23 години Setting::set('amocrm_refresh_token', encrypt($tokens['refresh_token'])); return $tokens['access_token']; } } Автоматизація UTM-міток: як це працює
Без UTM ви не дізнаєтесь, який канал приніс лід. Ми фіксуємо параметри при першому візиті в кукі (термін 30 днів) і передаємо разом із формою.
// Зберігаємо UTM при першому візиті const utmParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']; const params = new URLSearchParams(window.location.search); utmParams.forEach(param => { if (params.has(param)) { document.cookie = `${param}=${params.get(param)};path=/;max-age=2592000`; } }); // При відправці форми додаємо UTM function getUtmData() { return Object.fromEntries( utmParams.map(p => [p, getCookie(p) || '']).filter(([, v]) => v) ); } Для прямого заходу підставляємо 'direct', щоб не втрачати аналітику.
Порівняння підходів: REST API vs Webhook
| Критерій | REST API | Webhook |
|---|---|---|
| Час відгуку | 0.5–2 сек | 1–3 сек |
| Потрібен токен | Так (OAuth2) | Ні (але потрібна перевірка підпису) |
| Обробка помилок | Можна повторити запит | Помилка на стороні CRM — втрата сповіщення |
| Підходить для | amoCRM, Salesforce, Pipedrive | Бітрікс24, HubSpot, WordPress |
Як уникнути втрати заявок при збої CRM?
При відмові CRM ми повторюємо відправку до 3 разів з інтервалом у 10 секунд. Якщо всі спроби невдалі, заявка зберігається в локальному лозі, а адміністратор отримує алерт у Telegram. Це гарантує, що жодна заявка не буде втрачена. Для критичних сценаріїв підключаємо чергу через Redis — дані зберігаються до відновлення CRM.
Що входить в інтеграцію
- Проектування логіки: маппінг полів, вибір протоколу, обробка помилок.
- Розробка форми: валідація, стилізація (опціонально), інтеграція з CRM.
- Автоматизація токенів: OAuth2 refresh, кешування в Redis.
- UTM-мітки: запис у кукі, передача в кастомні поля.
- Документація: опис API-точок, приклади запитів, інструкція для менеджерів.
- Підтримка при запуску: налаштування моніторингу, алерти в Telegram/Slack.
Етапи інтеграції форми з CRM
| Етап | Опис | Термін (роб. днів) |
|---|---|---|
| 1. Аналітика | Узгодження маппінгу полів, вибір протоколу, проектування логіки | 1 |
| 2. Реалізація | Розробка форми, написання сервісу інтеграції, обробка помилок | 2–4 |
| 3. Тестування | Перевірка всіх сценаріїв (успіх, таймаут, дублікат, спам) | 1 |
| 4. Документація | Опис точок інтеграції, приклади запитів, інструкція | 0.5 |
| 5. Деплой | Налаштування кешування токенів, моніторинг, сповіщення | 0.5 |
Додатково підключаємо надсилання сповіщень у Telegram/Slack при успіху або збої.
Терміни та вартість
Інтеграція з однією CRM (без кастомного дизайну форми) займає 3–5 робочих днів. Якщо потрібна унікальна форма (стилізація, складна валідація, додаткові поля) — термін збільшується до 7–10 днів.
Вартість розраховується індивідуально після знайомства зі стеком та обсягом. Зв'яжіться з нами — оцінимо проект за 1 день. У нас 50+ подібних інтеграцій. Гарантуємо стабільну роботу форми: якщо виникають помилки, виправляємо протягом дня. Замовте інтеграцію і забудьте про ручний ввід заявок.
Підхід заснований на офіційній документації amoCRM REST API.







