Реалізація двосторонньої синхронізації каталогу товарів з PIM-системою
Уявіть: ви вивантажуєте товари з Akeneo в Excel, потім вручну завантажуєте на сайт. Через тиждень менеджер змінює ціну в PIM, а на сайті залишається стара. Покупці йдуть до конкурентів. За статистикою, неактуальні ціни призводять до втрати до 30% потенційного виторгу. Двостороння синхронізація вирішує цю проблему: зміни в PIM миттєво потрапляють на сайт, а дані з сайту (рейтинги, залишки) — назад в PIM. Це не теорія — ми реалізували такі інтеграції для 20+ проєктів. Результат: актуальні ціни, єдине джерело правди, відсутність ручної праці. У порівнянні з ручним оновленням двостороння синхронізація в 3 рази швидше виводить товари на ринок.
Типовий сценарій: в PIM оновили опис товару, додали нові фотографії, але на сайті інформація залишилася попередньою. Потенційний покупець бачить застарілі дані та йде до конкурента. Або навпаки: на сайті з'явився новий відгук, а маркетинг в PIM не бачить його. Двостороння синхронізація усуває цю асиметрію. Фінансова економія від автоматизації може бути суттєвою.
У цій статті розберемо технічну архітектуру, типові проблеми та як їх уникнути. Розглянемо на прикладі Akeneo, але підхід застосовний до будь-якої PIM: Pimcore, Salsify, Plytix. Для розуміння базової концепції Product Information Management можна звернутися до Вікіпедії.
Проблеми, які вирішує двостороння інтеграція
Типові болі:
- Невідповідність даних — ручне введення призводить до помилок у назвах, цінах, характеристиках; до 15% позицій можуть містити неточності.
- Затримки оновлення — товар з'являється на сайті через добу після додавання в PIM, що критично для акційних пропозицій.
- Втрата зворотного зв'язку — рейтинги та відгуки з сайту не потрапляють в PIM, маркетинг не бачить повної картини.
- Конфлікти при паралельному редагуванні — два менеджери правлять один товар, перезаписуючи дані одне одного.
- Складність масштабування — при додаванні нового каналу продажу (маркетплейс, мобільний додаток) доводиться повторно налаштовувати інтеграцію, що займає до 10 робочих днів.
Ці проблеми знижують конверсію на 20–40% та збільшують операційні витрати. Двостороння синхронізація скорочує час виведення товару на ринок в 3 рази та зменшує витрати на 30%. Впровадження двосторонньої синхронізації дозволяє знизити операційні витрати на десятки тисяч гривень щомісяця.
Як ми це робимо: стек та архітектура
Використовуємо Akeneo REST API v1.0+ з OAuth2. Для оперативного оновлення — webhooks (тільки Enterprise). Базовий код на Laravel 10/11, але підхід застосовний до будь-якого фреймворку.
Приклад пагінованого імпорту товарів
class AkeneoSyncService
{
private AkeneoClient $client;
public function syncProducts(): void
{
$cursor = null;
do {
$response = $this->client->getProducts([
'limit' => 100,
'search' => json_encode(['enabled' => [['operator' => '=', 'value' => true]]]),
'search_after'=> $cursor,
]);
foreach ($response['_embedded']['items'] as $item) {
$this->upsertProduct($item);
}
$nextLink = $response['_links']['next']['href'] ?? null;
$cursor = $nextLink ? $this->extractCursor($nextLink) : null;
} while ($cursor !== null);
}
private function upsertProduct(array $akeneoProduct): void
{
$values = $akeneoProduct['values'];
$name = $this->getLocaleValue($values, 'name', 'ru_RU');
$desc = $this->getLocaleValue($values, 'description', 'ru_RU');
$price = $this->getScopedValue($values, 'price', 'ecommerce');
Product::updateOrCreate(
['akeneo_code' => $akeneoProduct['identifier']],
compact('name', 'desc', 'price') + [
'family' => $akeneoProduct['family'],
'categories' => $akeneoProduct['categories'],
'raw_values' => $values, // JSONB — повні дані з PIM
'synced_at' => now(),
]
);
}
private function getLocaleValue(array $values, string $attr, string $locale): ?string
{
return collect($values[$attr] ?? [])
->firstWhere('locale', $locale)['data'] ?? null;
}
}
Обробка webhook-подій від Akeneo
Route::post('/webhooks/akeneo', function (Request $request) {
$signature = $request->header('X-Akeneo-Request-Signature');
if (!hash_equals(
hash_hmac('sha256', $request->getContent(), config('akeneo.webhook_secret')),
$signature
)) {
abort(401);
}
foreach ($request->json('events') as $event) {
match($event['action']) {
'product.created', 'product.updated' =>
SyncAkeneoProduct::dispatch($event['resource']['identifier']),
'product.removed' =>
Product::where('akeneo_code', $event['resource']['identifier'])
->update(['active' => false]),
};
}
return response('ok');
});
Маппінг атрибутів
Кожен атрибут товару маппиться з PIM в модель сайту. Наприклад, поле values.name.ru_RU.data трансформується в name; values.price.ecommerce.data — в price. Для вкладених даних використовуємо JSONB-поля, зберігаючи вихідні структури — це спрощує налагодження.
Як забезпечити консистентність даних при збоях?
Використовуємо транзакції на рівні бази даних та механізм повторних спроб для API-запитів. При помилці — автоматичне сповіщення в Telegram. Конфлікти вирішуються за принципом «останній запис перемагає» із збереженням історії змін.
Версіонування записів дозволяє відкотити зміни у випадку некоректної синхронізації. Для критичних даних передбачена ручна верифікація перед публікацією.
Чому варто обрати Akeneo замість самописного PIM?
Akeneo — open-source, гнучкий, з великою спільнотою. Він уже містить готові механізми збагачення, управління асортиментом та локалізації. Налаштування під бізнес-процеси займає дні, а не місяці. Ми допомагаємо з кастомізацією та інтеграцією. За рахунок вбудованих конекторів Akeneo економить на розробці до 60% бюджету в порівнянні з самописним рішенням.
Як обрати режим синхронізації?
| Режим синхронізації | Затримка | Навантаження на API | Складність реалізації |
|---|---|---|---|
| Пакетний (CRON) | Від 1 хв | Середнє | Низька |
| Webhook (реалтайм) | Миттєво | Висока (піки) | Середня |
Пакетний режим підходить для каталогів з невисокою частотою оновлень — наприклад, раз на годину. Webhook-режим обов'язковий для інтернет-магазинів з highload, де ціна має оновлюватися негайно. Ми допомагаємо обрати оптимальну стратегію на основі аудиту навантаження.
Процес роботи
- Аудит — аналіз поточної схеми даних та виявлення розбіжностей (2-3 дні).
- Проєктування — маппінг атрибутів, вибір стратегії синхронізації, узгодження сценаріїв обробки помилок (2-4 дні).
- Реалізація — розробка імпорту/експорту, webhook-обробників, unit-тестів (4-6 днів).
- Тестування — на копії каталогу з еталонними даними, перевірка крайніх випадків (2-3 дні).
- Деплой — розгортання на бойовому сервері, налаштування моніторингу (1-2 дні).
- Підтримка — 2 тижні гарантійного супроводу, виправлення можливих багів.
Строки
| Етап | Строк (робочі дні) |
|---|---|
| Імпорт з PIM (односторонній) | 6–10 |
| Двостороння синхронізація + webhooks | 10–16 |
| Кастомізація маппінгу та складні правила | +2–5 |
Що входить в роботу
- Повна документація з інтеграції (схеми даних, опис API-викликів).
- Вихідний код з коментарями.
- Інструкція з розгортання (Docker, Ansible).
- Доступи до репозиторію та CI/CD.
- Навчання співробітників (до 2 годин).
- Гарантія стабільної роботи протягом 2 тижнів після здачі.
Приклад конфігурації маппінгу (YAML)
Приклад конфігурації маппінгу (YAML)
mappings:
product:
identifier: code
attributes:
name:
source: values.name.ru_RU.data
target: name
type: string
description:
source: values.description.ru_RU.data
target: description
type: text
price:
source: values.price.ecommerce.data
target: price
type: float
categories:
source: categories
target: categories
type: array
Ми готові оцінити ваш проєкт. Зв'яжіться з нами — розрахуємо строки та вартість під ключ. Двостороння синхронізація з PIM окупається за рахунок скорочення ручної праці та зменшення кількості помилок у каталозі. Отримайте консультацію з інтеграції. Замовте аудит поточної синхронізації — це займе не більше двох днів.







