Передача заявок у 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.
Інтеграція сайту з CRM: Бітрікс24, amoCRM, Salesforce, HubSpot
Менеджер з продажів веде угоди в CRM, а заявки з сайту падають на пошту. Він їх вручну переносить. Теряє половину. Забуває передзвонити. Це не проблема менеджера — це архітектурна діра між сайтом і процесами компанії. Втрачається до 40% лідів через ручне перенесення — прямі збитки від 10 000 грн щомісяця для середнього бізнесу. Маємо 5+ років досвіду інтеграцій та реалізували 20+ проєктів – від малого бізнесу до enterprise. Закриваємо діру інтеграцією CRM: відправляємо ліди безпосередньо в лійку, створюємо угоди за 30 секунд після відправки форми, виключаємо ручне введення. Замовте аудит поточної схеми — отримаєте план інтеграції під ключ.
Інтеграція — це не просто POST в API. Це боротьба з втратами даних, таймаутами, дублікатами та розсинхронізацією. Ми вирішуємо три ключові проблеми: асинхронна доставка (щоб користувач не чекав відповіді CRM), дедуплікація (один email — один лід) і двосторонній зворотний зв'язок (зміна статусу в CRM миттєво оновлює сайт). Нижче — як це працює на практиці.
Бітрікс24: REST API та події
Бітрікс24 — найпоширеніша CRM на українському ринку. REST API доступний через OAuth 2.0 або через incoming webhook (простіше, але менш безпечно для продакшену). Основні сутності: lead, deal, contact, company.
Створення ліда: POST /rest/crm.lead.add з набором полів. Прив'язка до лійки: SOURCE_ID. Додавання коментаря: crm.timeline.comment.add. Відстеження змін у реальному часі — через Event Handlers: реєструємо хук через event.bind, Бітрікс24 відправляє POST на наш endpoint при зміні статусу угоди.
Складність Бітрікс24 — кастомні поля. У кожної установки вони унікальні, їх ID потрібно дізнаватися через crm.lead.fields. Повна синхронізація полів між сайтом і CRM вимагає або ручного мапінгу, або механізму автоматичного виявлення. Ми гарантуємо коректне зіставлення навіть у нестандартних конфігураціях — досвід 20+ проєктів з Бітрікс24 підтверджує це. Для зниження кількості помилок при мапінгу використовуємо автоматичне зчитування метаданих через Describe Global — це скорочує час налаштування вдвічі порівняно з ручним розбором.
amoCRM: сучасний REST
amoCRM (тепер Kommo для міжнародного ринку) має чистіший API. OAuth 2.0 з refresh token, JSON API, передбачувані endpoint. Лійки — pipelines, угоди — leads, контакти — contacts.
Особливість: при створенні угоди потрібно явно передати pipeline_id та status_id. Без них угода потрапляє в дефолтну лійку, що часто не те, що потрібно. Теги для класифікації джерел лідів — через _embedded.tags. Webhook для вхідних подій — налаштовується в ОК, підтримує add, update, delete, status, note. Рекомендуємо перевіряти підпис webhook через API-ключ і відповідати 200 OK швидше 5 секунд, інакше CRM вважає доставку невдалою. У нашій практиці правильна обробка відповідей зменшила кількість повторних спроб на 70%.
Salesforce і HubSpot: enterprise-рівень
Salesforce — enterprise вибір. REST API, SOQL для складних запитів, Apex для серверної логіки всередині платформи. Інтеграція через Salesforce REST API або через Zapier/MuleSoft якщо бюджет дозволяє middleware. Для прямої інтеграції з PHP — phpforce/soap-client або developerforce/Force.com-Toolkit-for-PHP. Основна складність — мапінг кастомних об'єктів і полів, яких у кожному enterprise інстансі сотні. Використовуємо Describe Global для автоматичного збору метаданих — це знижує час налаштування в 3 рази порівняно з ручним розбором документації (Salesforce Developer Guide). Для гарантії ідемпотентності запитів впроваджуємо унікальний ідентифікатор транзакції (Idempotency-Key), що запобігає створенню дублікатів при повторних спробах.
HubSpot — популярний у SaaS-компаній та міжнародного B2B. HubSpot API v3 — REST, хороший SDK для PHP і Node.js (@hubspot/api-client). Contacts, Companies, Deals — стандартні об'єкти. Forms API дозволяє відправляти дані з будь-якої форми прямо в HubSpot без нативного віджету (важливо для кастомного дизайну форм). Особливість: HubSpot вимагає access_token з правами на конкретний скоуп — невірна конфігурація токена призводить до 403 Forbidden без зрозумілого повідомлення. Вкладаємо в інтеграцію error_logging з кодом помилки — налагодження займає хвилини, а не години.
Яку CRM обрати для вашого бізнесу?
| Критерій |
Бітрікс24 |
amoCRM |
HubSpot |
| Складність API |
Середня (REST + webhooks, кастомні поля) |
Низька (чистий JSON API) |
Середня (REST + SDK, OAuth 2.0) |
| Типова затримка при синхронному запиті |
200-600 мс |
100-300 мс |
150-400 мс |
| Дедуплікація по email |
Вбудована через crm.duplicate.findByComm |
Через пошук контактів |
Через contacts/search |
| Webhook (події) |
Event Handlers (push) |
Налаштовується в ОК |
Webhook + Automations |
| Найкраще підходить |
Український B2B, держсектор |
Середній і малий бізнес |
Міжнародний B2B, SaaS |
Чому важлива асинхронна відправка?
Синхронний запит до API CRM прямо з обробника форми — погана ідея. API може бути недоступним 2 секунди, користувач чекає. Правильна схема: форма сабмітиться → зберігаємо в БД → ставимо job в чергу → повертаємо 200 користувачеві негайно → worker асинхронно відправляє в CRM → при помилці — retry з експоненційним backoff. Ми використовуємо Redis + Bull (Node.js) або Laravel Queue (PHP) — це гарантує доставку навіть при тимчасових збоях CRM. Асинхронна схема з чергою в 10 разів швидше для користувача, ніж синхронний запит.
Як працює дедуплікація?
Один і той же контакт може заповнити форму двічі. CRM не повинна створювати два дублюючих ліди. Перевірка перед створенням: пошук по email через crm.duplicate.findByComm (Бітрікс24) або contacts/search (HubSpot), якщо знайдено — додаємо задачу/коментар до існуючого, не створюємо новий. Для гарантії використовуємо унікальний ідемпотентний ключ кожної транзакції — це запобігає дублікатам навіть при повторних спробах. Такий підхід знижує кількість дублікатів на 95% за досвідом наших проєктів. Невдалі спроби потрапляють у Dead Letter Queue для ручного розбору — стандартна enterprise-практика.
Двостороння синхронізація
Якщо менеджер змінює статус угоди в CRM — сайт повинен знати (наприклад, для особистого кабінету клієнта). Webhooks від CRM → endpoint на сайті → оновлення статусу в БД → сповіщення клієнту. Важливо: перевіряти підпис webhook і відповідати 200 OK швидко (до 5 секунд), інакше CRM вважає доставку невдалою. Ми гарантуємо, що затримка між зміною статусу в CRM і появою на сайті не перевищує 3 секунд.
Як ми проводимо інтеграцію: 5 кроків
-
Аудит потоків даних — аналізуємо поточну передачу заявок, структуру полів CRM, виявляємо вузькі місця. На виході — схема «як є» і «як буде». Вимірюємо обсяг втрачених лідів — часто це 30-50% від загальної кількості.
-
Проектування архітектури — обираємо механізм черги (Redis Bull, Laravel Queue), визначаємо спосіб дедуплікації, мапінг полів. Готуємо специфікацію endpoint з ідемпотентними ключами.
-
Реалізація на staging — пишемо код на Laravel або Node.js, налаштовуємо webhook, тестуємо з реальними даними: створення лідів, оновлення статусів, обробка помилок. Додаємо логування з кодом помилки для швидкого налагодження.
-
Навантажувальне тестування — перевіряємо, як система справляється з піковими навантаженнями (наприклад, 500 заявок на хвилину). Виправляємо таймінги та retry-політики. Симулюємо відмову CRM — перевіряємо, що черга не переповнюється.
-
Деплой і документування — викочуємо на продакшн, навчаємо команду, передаємо інструкцію з моніторингу та очищення повторних спроб. Налаштовуємо алерти при помилках доставки.
Що входить в роботу (deliverables)
- Аудит поточних процесів — схема потоків даних, структура полів CRM, типові помилки.
- Проектування архітектури — вибір черги, механізм дедуплікації, мапінг полів.
- Реалізація інтеграції — код на Laravel/Node.js, налаштування webhook, тестування на staging.
- Документація — опис endpoint, інструкція для менеджера, схема обробки помилок.
- Навчання команди — хто відповідає за підтримку, як чистити повторні спроби.
- Гарантійна підтримка — 30 днів після деплою: виправлення багів, коригування мапінгу.
Строки та вартість
| Сценарій |
Строк |
| Одна CRM, передача лідів з форм |
1–2 тижні |
| Двостороння синхронізація + статуси |
3–5 тижнів |
| Кілька CRM + мапінг кастомних полів |
4–8 тижнів |
Вартість розраховується індивідуально після аудиту поточних процесів та структури даних у CRM. Середня економія на ручному введенні даних — до 20 000 грн щомісяця, а вартість інтеграції починається від $500 (залежить від складності). Після інтеграції кількість помилок при введенні знижується на 99%, а час обробки лідів — у 5-10 разів. Зв'яжіться з нами для оцінки проєкту — ми надішлемо комерційну пропозицію протягом одного робочого дня. Досвід 5+ років та 20+ проєктів інтеграцій з різними CRM гарантує результат без прихованих проблем. Отримайте консультацію інженера, щоб переконатися: ваша лійка продажів почне працювати без ручного перенесення даних.
Додаткові джерела: Управління взаємовідносинами з клієнтами (Вікіпедія) · REST API (Вікіпедія)