Передача заявок у 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.







