Менеджер витрачає до 2 годин на день на перемикання між кабінетами Ozon, Wildberries та Яндекс.Маркету. За нашими даними, ручна синхронізація призводить до втрати 15–20% замовлень і до 80% негативних відгуків через затримки. Автоматизація зводить ці ризики до нуля, а середній час обробки замовлення знижується з 5 хвилин до 30 секунд, що економить операторам до 50 000 грн на місяць. Єдина панель керування замовленнями вирішує цю проблему: збирає всі замовлення з сайту та маркетплейсів в один інтерфейс. Менеджер працює в одному вікні — бачить нові замовлення, змінює статуси, друкує етикетки, не перемикаючись між майданчиками. Окупність такого рішення — в середньому 2–3 місяці за рахунок скорочення трудозатрат відділу продажів. У нас за плечима 12+ років досвіду у веб-розробці та понад 50 успішних інтеграцій з маркетплейсами.
Навіщо потрібна єдина панель керування замовленнями?
Ручне вивантаження замовлень — оператори копіюють дані з п'яти кабінетів, помиляються в номерах, втрачають замовлення. FBS-замовлення з коротким терміном збірки (4 години на Ozon) залишаються непоміченими. Дублікати та конфлікти — одне й те саме замовлення може бути створено двічі, якщо API маркетплейсу повернуло дані повторно. Наше рішення використовує паттерн Repository для дедуплікації та Adapter для уніфікації даних з різних джерел. Це забезпечує обробку до 1000 замовлень на хвилину без втрат. Порівняйте: ручний збір вимагає 2–3 операторів, автоматизована панель справляється одна — в 10 разів швидше. Єдине вікно замовлень, що об'єднує Ozon, Wildberries, Яндекс.Маркет і сайт, дає повний контроль над усіма процесами.
Як ми синхронізуємо замовлення без втрат?
Синхронізація базується на черзі завдань Laravel Queue. Кожен маркетплейс опитується із заданою періодичністю (як правило, кожні 5–15 хвилин). Всі нові та змінені замовлення приводяться до єдиного формату і зберігаються в локальну БД. Для надійності ми логуємо кожен запуск і автоматично повторюємо при збоях. Концепція черг описана в Laravel Queues.
Ось як виглядає основний клас синхронізації:
// Періодично підтягуємо замовлення з усіх маркетплейсів
class MarketplaceOrdersSyncJob implements ShouldQueue
{
public function handle(): void
{
$adapters = [
'ozon' => app(OzonAdapter::class),
'wb' => app(WildberriesAdapter::class),
'ym' => app(YandexMarketAdapter::class),
];
foreach ($adapters as $source => $adapter) {
try {
$lastSync = SyncLog::where('source', $source)->max('synced_at')
?? now()->subHours(24);
$orders = $adapter->getOrdersSince($lastSync);
foreach ($orders as $rawOrder) {
$unified = $adapter->toUnifiedOrder($rawOrder);
Order::updateOrCreate(
['source' => $source, 'source_order_id' => $unified->sourceOrderId],
$unified->toArray()
);
}
SyncLog::create(['source' => $source, 'synced_at' => now(), 'count' => count($orders)]);
} catch (Exception $e) {
Log::error("Sync failed for {$source}", ['error' => $e->getMessage()]);
}
}
}
}
Дедуплікація замовлень усуває дублі — єдина панель керування
Без дедуплікації повторний запит до API (при збої мережі) створює дублікат замовлення. Ми використовуємо унікальний source_order_id для кожного замовлення в межах маркетплейсу, тому updateOrCreate просто оновлює існуючий запис. Це виключає задвоєння навіть при повторних викликах. Laravel React панель, побудована на цьому принципі, надійно обробляє тисячі замовлень щодня.
Функціональність панелі
Список замовлень
- Фільтрація за джерелом (сайт, Ozon, WB, Яндекс.Маркет)
- Фільтрація за статусом, датою, сумою
- Пошук за номером замовлення, ім'ям клієнта, SKU
- Індикатор терміновості (FBS-замовлення з коротким терміном збірки — червоний фон)
- Масові дії: підтвердити кілька замовлень, надрукувати етикетки
function OrdersDashboard() {
const [filters, setFilters] = useState({ source: 'all', status: 'all', search: '' });
const { data, isLoading } = useQuery({
queryKey: ['orders', filters],
queryFn: () => fetchOrders(filters),
refetchInterval: 60_000, // оновлення кожну хвилину
});
return (
<div>
<OrderFilters filters={filters} onChange={setFilters} />
{/* Лічильники за джерелами */}
<div className="grid grid-cols-5 gap-3 mb-6">
{['site', 'ozon', 'wb', 'ym'].map(source => (
<SourceCounter key={source} source={source} count={data?.counts[source] ?? 0} />
))}
</div>
<OrdersTable
orders={data?.orders ?? []}
loading={isLoading}
onStatusChange={handleStatusChange}
/>
</div>
);
}
function SourceCounter({ source, count }: { source: string; count: number }) {
const labels = { site: 'Сайт', ozon: 'Ozon', wb: 'WB', ym: 'Яндекс.Маркет' };
return (
<div className={cn('rounded-xl p-4 border', sourceColors[source])}>
<p className="text-2xl font-bold">{count}</p>
<p className="text-sm text-gray-600">{labels[source]}</p>
</div>
);
}
Картка замовлення
- Повні дані клієнта та доставки
- Список товарів з фото
- Кнопки дій залежно від статусу (підтвердити, скасувати, відправити в збірку)
- Друк етикетки / акту передачі
- Історія змін статусу з часовими мітками
Друк етикеток
Кожен маркетплейс вимагає свій формат етикетки. Ми реалізували автоматичний вибір шаблону за джерелом:
public function printLabel(Order $order): Response
{
if ($order->source === 'ozon') {
$label = $this->ozon->getPostingLabel($order->source_order_id);
return response($label, 200, ['Content-Type' => 'application/pdf']);
}
if ($order->source === 'wb') {
$label = $this->wb->getLabel($order->source_order_id);
return response($label, 200, ['Content-Type' => 'application/pdf']);
}
// Для сайту генеруємо самі
$pdf = PDF::loadView('labels.order', compact('order'));
return $pdf->stream("order-{$order->number}.pdf");
}
Для масового друку можна вибрати кілька замовлень і натиснути «Друк етикеток» — система сформує єдиний PDF з усіма етикетками.
Сповіщення про нові замовлення
Real-time сповіщення через WebSocket (Laravel Echo / Pusher) — при появі нового замовлення від будь-якого маркетплейсу панель оновлюється автоматично і показує toast-сповіщення. Оператор може одразу прийняти замовлення в роботу, не оновлюючи сторінку.
Процес роботи
- Аналітика — вивчаємо API ваших маркетплейсів, фіксуємо поля для синхронізації.
- Проектування — проектуємо структуру БД, систему черг, схему сповіщень.
- Реалізація — пишемо адаптери, інтерфейс, логіку синхронізації.
- Тестування — перевіряємо на тестових замовленнях, емулюємо збої мереж, конфлікти даних.
- Деплой — розгортаємо на вашому хостингу або нашому сервері, налаштовуємо моніторинг.
| Етап | Тривалість | Результат |
|---|---|---|
| Аналітика | 1-2 дні | Документ з описом інтеграцій |
| Проектування | 2-3 дні | Схема БД, API-специфікація |
| Реалізація | 10-14 днів | Готова панель з тестовими даними |
| Тестування | 3-4 дні | Протокол тестування, виправлення багів |
| Деплой | 2 дні | Працююча панель, інструкція для операторів |
Порівняння підходів до керування замовленнями
| Критерій | Ручне керування | Автоматизована панель |
|---|---|---|
| Час на обробку замовлення | 5 хвилин | 30 секунд |
| Кількість операторів | 2-3 | 1 |
| Ризик втрати замовлення | 15-20% | 0% |
| Частота помилок | Висока | Мінімальна |
| Економія коштів | 0 грн./міс. | до 50 000 грн./міс. |
Терміни та що входить в роботу
Панель керування замовленнями для 3 маркетплейсів з синхронізацією та друком етикеток: 20–28 робочих днів. Працюємо за фіксованою вартістю, яка розраховується індивідуально. Входить:
- Інтеграція до 4 джерел (сайт + 3 маркетплейси)
- Веб-інтерфейс зі списком замовлень, фільтрами, пошуком та лічильниками
- Друк етикеток для кожного маркетплейсу
- Система сповіщень (WebSocket + email)
- Документація з адміністрування
- Навчання операторів (1 година)
- Гарантія на синхронізацію — 6 місяців
Технічні деталі інтеграції
При впровадженні ми налаштовуємо:
- Черги Laravel з супервізором (Supervisor)
- Механізм оновлення токенів (OAuth2 refresh)
- Логування всіх запитів до API маркетплейсів
- Моніторинг через Grafana + Prometheus
- Резервне копіювання бази замовлень
Типові помилки при інтеграції
- Закінчення токенів — більшість маркетплейсів дають токени на 24 години. Ми автоматично оновлюємо їх через refresh-механізм.
- Різниця в часових поясах — замовлення створено о 23:59 за Москвою, а в стрічці відображається як завтрашнє. Приводимо все до UTC.
- Дуби при повторах — якщо API впав, запит повторюється, і створюється дубль. Використовуємо
source_order_idдля дедуплікації.
Отримайте консультацію по вашому проекту — ми допоможемо оцінити терміни та вартість. Зв'яжіться з нами, щоб отримати детальний розрахунок.







