Розроблення трекингу заказу для інтернет-магазину
Трекинг заказу зменшує навантаження на службу поддержки та повишує довіру покупця: замість дзвінків «де мій заказ?» користувач видит актуальний статус у особистому кабінеті чи по прямій ссилці. Розроблення системи відслідковування займає 4–6 робочих днів.
Статусна машина заказу
Заказ проходить через строго визначені стани. Переходи контролюються state machine:
pending → confirmed → processing → shipped → delivered → completed
↓
failed
↓
cancelled
class Order extends Model {
use HasStates;
protected function registerStates(): void {
$this->addState('status', OrderStatus::class)
->allowTransition(Pending::class, Confirmed::class)
->allowTransition(Confirmed::class, [Processing::class, Cancelled::class])
->allowTransition(Processing::class, [Shipped::class, Cancelled::class])
->allowTransition(Shipped::class, [Delivered::class, Failed::class])
->allowTransition(Delivered::class, Completed::class);
}
}
При кожному переходе srабатує event, який записує запис у order_status_history, відправляє сповіщення покупцю та оновлює timestamp у заказі.
Історія статусів
CREATE TABLE order_status_history (
id BIGSERIAL PRIMARY KEY,
order_id BIGINT REFERENCES orders(id) ON DELETE CASCADE,
status VARCHAR(30) NOT NULL,
comment TEXT,
changed_by BIGINT REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW()
);
Ця таблиця формує timeline на сторінці трекингу.
Трекинг через API перевізників
Після відправлення посилці заказу присвоюється трекинг-номер. Система автоматично запитує обновлення статусу:
СДЭК:
$cdek = new \CdekSDK2\Client($clientId, $clientSecret);
$info = $cdek->orders()->get($order->cdek_uuid);
Почта России:
$russianPost = new \RussianPost\TrackingClient($login, $password);
$operations = $russianPost->getOperationHistory($order->tracking_number);
Polling через Laravel Scheduler кожні 2 години:
$schedule->command('orders:sync-tracking')->everyTwoHours();
При змені статусу у перевізника — автоматичне оновлення статусу заказу в системі та сповіщення покупцю.
Публічна сторінка трекингу
Доступна без логіну по ссилці з токеном — для гостьских заказів та для прямої ссилки з письма:
/orders/track?token=abc123xyz
Компонент сторінки відображає:
- Резюме заказу
- Історію статусів
- Інформацію про доставку з ссилкою на сайт перевізника
- Опцію контакту з поддержкою
Компонент StatusTimeline
Візуальний прогрес-бар з кроками — стандартний паттерн:
const steps = ['Прийнято', 'Підтверджено', 'В обробці', 'Відправлено', 'Доставлено'];
const currentIndex = steps.indexOf(statusLabel[order.status]);
steps.map((step, i) => (
<div key={step} className={cn('step', {
'step-complete': i < currentIndex,
'step-active': i === currentIndex,
'step-pending': i > currentIndex,
})}>
{step}
</div>
))
Сповіщення по Email та SMS
При кожній зміні статусу уходит письмо з актуальним станом та ссилкою на трекинг. Для критичних подій (відправлення, доставка) — додатково SMS:
class OrderShipped extends Notification {
public function via($notifiable): array {
return ['mail', SmsSenderChannel::class];
}
public function toMail($notifiable): MailMessage {
return (new MailMessage)
->subject("Заказ #{$this->order->number} відправлений")
->line("Трекинг: {$this->order->tracking_number}")
->action('Відстежити заказ', route('orders.track', $this->order->guest_token));
}
public function toSms($notifiable): string {
return "Заказ #{$this->order->number} відправлений. Трекинг: {$this->order->tracking_number}";
}
}
Карта доставки
Для курйерської доставки можна показувати текущее положення курйера через API сервісу доставки. Вимагає WebSocket чи SSE для обновлення в реальному часі.
Інтеграція з маркетплейсами
Якщо магазин продає також через Wildberries чи Ozon, трекинг їх заказів подтягується через відповідні API та відображається в єдиному особистому кабінеті — покупець видит всі свої закази в одному місце незалежно від каналу покупки.







