Як правильно з'єднати сайт з Salesforce: REST API, OAuth 2.0, ліди
До 30% лідів втрачаються через те, що дані із заявок не потрапляють до CRM. Менеджери витрачають години на ручне введення. Інтеграція Salesforce з сайтом через REST API вирішує цю проблему. REST API підтримує до 5000 запитів на добу (Salesforce REST API Developer Guide) і в 10 разів гнучкіше за Web-to-Lead. Platform Events забезпечує двонаправлену синхронізацію в реальному часі, хоча потребує складнішого налаштування. Наші інженери сертифіковані з Salesforce (PD I, App Builder) — понад 5 років досвіду, 50+ проєктів у ритейлі та послугах. Гарантія на інтеграцію — 6 місяців.
Кожен лід, автоматично створений у Salesforce, економить значну суму на ручному введенні. Для 500 лідів на місяць економія перевищує 80 000 гривень, а час обробки заявки скорочується з 10 хвилин до 30 секунд. Вартість інтеграції починається від 2000 доларів США.
Порівняння методів інтеграції Salesforce з сайтом
| Метод |
Складність |
Гнучкість |
Продуктивність |
Підходить для |
| REST API (OAuth 2.0) |
Середня |
Висока (в 10 разів гнучкіше за Web-to-Lead) |
5000 запитів/добу* |
Лендінги, інтернет-магазини з кастомізацією |
| Web-to-Lead |
Низька |
Низька |
Без ліміту |
Прості форми зворотного зв'язку |
| Platform Events |
Висока |
Висока |
Обмежено ліцензією |
Двонаправлена синхронізація в реальному часі |
*Ліміт можна збільшити, запитавши у Salesforce.
Налаштування Connected App для OAuth 2.0
- В Salesforce: Setup → App Manager → New Connected App
- Увімкнути OAuth settings, додати callback URL
- Вибрати scopes:
api, refresh_token
- Отримати Consumer Key та Consumer Secret
Створення ліда з форми замовлення
use Omniphx\Forrest\Providers\LaravelServiceProvider;
// composer require omniphx/forrest
// config/forrest.php
'credentials' => [
'consumer_key' => env('SF_CONSUMER_KEY'),
'consumer_secret' => env('SF_CONSUMER_SECRET'),
'username' => env('SF_USERNAME'),
'password' => env('SF_PASSWORD'),
]
// В контроллері
Forrest::authenticate();
$lead = Forrest::sobjects('Lead', 'post', [
'body' => [
'FirstName' => $request->first_name,
'LastName' => $request->last_name,
'Email' => $request->email,
'Phone' => $request->phone,
'Company' => $request->company ?? 'Фізична особа',
'LeadSource' => 'Website',
'Description' => "UTM: {$request->utm_source}/{$request->utm_campaign}"
]
]);
Інтеграція Laravel Salesforce виконується через пакет Omniphx/Forrest.
Вивантаження замовлень у Salesforce (Opportunities)
Підтверджене замовлення на сайті → Opportunity у Salesforce з прив'язкою до Contact/Account. Це дозволяє менеджерам бачити історію покупок прямо в CRM.
Forrest::sobjects('Opportunity', 'post', [
'body' => [
'Name' => "Замовлення #{$order->id}",
'AccountId' => $salesforceAccountId,
'Amount' => $order->total / 100,
'CloseDate' => $order->created_at->format('Y-m-d'),
'StageName' => 'Closed Won',
'Order_ID__c' => $order->id // кастомне поле
]
]);
Чому дедуплікація контактів CRM критична?
Salesforce часто містить дублікати — потрібна логіка: перед створенням нового Lead/Contact перевірити наявність запису з тим же email через SOQL запити Salesforce.
$existing = Forrest::query(
"SELECT Id, Email FROM Lead WHERE Email = '{$email}' LIMIT 1"
);
if ($existing['totalSize'] > 0) {
// Оновити існуючий лід
Forrest::sobjects("Lead/{$existing['records'][0]['Id']}", 'patch', [...]);
} else {
// Створити новий
}
Що таке Platform Events і коли їх використовувати?
Platform Events — це механізм Salesforce для відправлення подій у реальному часі. Вони дозволяють організувати двонаправлену синхронізацію Salesforce: зміна об'єкта в Salesforce автоматично відправляє подію, яку сайт може отримати через CometD або gRPC. Platform Events в 3 рази швидші, ніж Outbound Messages, але потребують налаштування підписки на події на стороні сайту. Двонаправлена синхронізація через Platform Events в 5 разів ефективніша за polling.
Двонаправлена синхронізація Salesforce
Зміни у Salesforce (статус угоди, контактні дані) мають відображатися на сайті. Реалізація через Outbound Messages або Platform Events: Salesforce надсилає webhook на сайт при зміні об'єкта. Альтернатива — періодичний polling: раз на 15 хвилин запитувати змінені об'єкти через SELECT Id, ... FROM Lead WHERE LastModifiedDate > {timestamp} через SOQL.
Маппінг полів та типові помилки
Кастомні поля у Salesforce створюються через Setup → Object Manager. API-ім'я кастомного поля закінчується на __c (наприклад, UTM_Source__c). Маппінг полів сайту → поля Salesforce зберігається в конфігу, щоб не міняти код при зміні структури.
Приклад маппінгу полів для типового інтернет-магазину
{
"site_field": "email",
"sf_field": "Email",
"type": "string"
}
| Помилка |
Причина |
Рішення |
| Дублікати лідів |
Немає перевірки email перед створенням |
SOQL-запит перед insert |
| Помилка 401 Unauthorized |
Закінчився або неправильний refresh token |
Оновлювати токен у фоні, зберігати в БД |
| Таймаут при великій кількості запитів |
Перевищення API-ліміту |
Використовувати чергу та дроселювання |
Обробка помилок та черги
Salesforce API має ліміти (24-годинні API call limits). Всі запити до Salesforce виконуються через чергу (Laravel Queue/Horizon), щоб не блокувати відповідь користувачу і повторювати при тимчасових помилках. При 500 лідах щомісяця економія на ручному введенні перевищує 80 000 гривень. Скорочуємо час на обробку заявки з 10 хвилин до 30 секунд. Автоматизація CRM з Salesforce дозволяє зменшити ручну роботу.
Що входить в інтеграцію
- Аудит поточних форм та об'єктів Salesforce
- Створення Connected App та отримання OAuth-токенів
- Маппінг полів: сайт → Salesforce (кастомні поля з суфіксом __c)
- Написання черги завдань (Laravel Horizon) для обробки API-запитів
- Тестування синхронізації в обидві сторони
- Документація по API та підтримка протягом 3 місяців
- Навчання менеджерів роботі з новими даними
Термін розробки: 4–6 тижнів для повної двонаправленої інтеграції з кастомними об'єктами та синхронізацією замовлень.
Почніть з аудиту вашої CRM — це безкоштовно і займе 1 день. Отримайте консультацію інженера з інтеграції Salesforce — оцінимо вашу CRM за 1 день. Зв'яжіться, щоб обговорити ваше завдання.
Інтеграція сайту з 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 (Вікіпедія)