Интеграция 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 call limits). Все запросы к Salesforce выполняются через очередь (Laravel Queue/Horizon), чтобы не блокировать ответ пользователю и повторять при временных ошибках.
Срок разработки: 4–6 недель для полной двунаправленной интеграции с кастомными объектами и синхронизацией заказов.







