Двостороння синхронізація каталогу товарів з PIM-системою

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Двостороння синхронізація каталогу товарів з PIM-системою
Складний
від 2 тижнів до 3 місяців
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    956
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    947

Реалізація двосторонньої синхронізації каталогу товарів з 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, де ціна має оновлюватися негайно. Ми допомагаємо обрати оптимальну стратегію на основі аудиту навантаження.

Процес роботи

  1. Аудит — аналіз поточної схеми даних та виявлення розбіжностей (2-3 дні).
  2. Проєктування — маппінг атрибутів, вибір стратегії синхронізації, узгодження сценаріїв обробки помилок (2-4 дні).
  3. Реалізація — розробка імпорту/експорту, webhook-обробників, unit-тестів (4-6 днів).
  4. Тестування — на копії каталогу з еталонними даними, перевірка крайніх випадків (2-3 дні).
  5. Деплой — розгортання на бойовому сервері, налаштування моніторингу (1-2 дні).
  6. Підтримка — 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 окупається за рахунок скорочення ручної праці та зменшення кількості помилок у каталозі. Отримайте консультацію з інтеграції. Замовте аудит поточної синхронізації — це займе не більше двох днів.

Інтеграція сайту з 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 кроків

  1. Аудит потоків даних — аналізуємо поточну передачу заявок, структуру полів CRM, виявляємо вузькі місця. На виході — схема «як є» і «як буде». Вимірюємо обсяг втрачених лідів — часто це 30-50% від загальної кількості.
  2. Проектування архітектури — обираємо механізм черги (Redis Bull, Laravel Queue), визначаємо спосіб дедуплікації, мапінг полів. Готуємо специфікацію endpoint з ідемпотентними ключами.
  3. Реалізація на staging — пишемо код на Laravel або Node.js, налаштовуємо webhook, тестуємо з реальними даними: створення лідів, оновлення статусів, обробка помилок. Додаємо логування з кодом помилки для швидкого налагодження.
  4. Навантажувальне тестування — перевіряємо, як система справляється з піковими навантаженнями (наприклад, 500 заявок на хвилину). Виправляємо таймінги та retry-політики. Симулюємо відмову CRM — перевіряємо, що черга не переповнюється.
  5. Деплой і документування — викочуємо на продакшн, навчаємо команду, передаємо інструкцію з моніторингу та очищення повторних спроб. Налаштовуємо алерти при помилках доставки.

Що входить в роботу (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 (Вікіпедія)