Інтеграція CRM-системи Salesforce з сайтом
Salesforce — корпоративна CRM-платформа з широкими можливостями кастомізації. Інтеграція сайту з Salesforce дозволяє автоматично створювати лідів з форм, синхронізувати клієнтську базу, передавати дані про транзакції та будувати єдиний профіль клієнта для менеджерів продажу.
Способи підключення
REST API (Salesforce REST API) — основний варіант. Авторизація через OAuth 2.0 (Connected App). Підтримує CRUD-операції з об'єктами Salesforce (Lead, Contact, Account, Opportunity).
Salesforce Web-to-Lead — вбудована HTML-форма від Salesforce. Найпростіший варіант, але обмежені можливості: немає валідації, немає користувацьких полів, складно кастомізувати вигляд. Підходить тільки для простих випадків.
Salesforce Platform Events / Streaming API — для двунаправленої синхронізації в реальному часі.
Налаштування Connected App
- У 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}"
]
]);
Синхронізація замовлень (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 // користувацьке поле
]
]);
Двустороння синхронізація
Зміни у Salesforce (статус угоди, контактні дані) повинні відображатися на сайті. Реалізація через Outbound Messages або Platform Events: Salesforce відправляє webhook на сайт при зміні об'єкту.
Альтернатива — періодичний polling: раз у 15 хвилин запитувати змінені об'єкти через SELECT Id, ... FROM Lead WHERE LastModifiedDate > {timestamp} через SOQL.
Дедупликація контактів
Salesforce часто містить дублі — потрібна логіка: перед створенням нового Lead/Contact перевірити наявність запису з тим же email через SOQL-запит.
$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 {
// Створити новий
}
Маппінг полів
Користувацькі поля в Salesforce створюються через Setup → Object Manager. API-ім'я користувацького поля закінчується на __c (наприклад, UTM_Source__c). Маппінг полів сайту → поля Salesforce зберігається у конфігу, щоб не змінювати код при зміні структури.
Обробка ошибок та очереди
Salesforce API має обмеження (24-годинні обмеження на виклики API). Всі запити до Salesforce виконуються через очередь (Laravel Queue/Horizon), щоб не блокувати відповідь користувачу та повторювати при тимчасових помилках.
Терміни розробки: 4–6 тижнів для повної двусторонної інтеграції з користувацькими об'єктами та синхронізацією замовлень.







