A customer lands on the order page and sees only 'Processing' — day after day. The result: a flood of support calls asking about order status. With 5+ years on the market and over 50 successful tracking projects, our team of 10 engineers solves this: we implement an order tracking system that automatically updates statuses, sends notifications, and provides a transparent delivery picture. Our experience shows tracking reduces support load by 60% compared to manual updates — a 3x improvement in inquiry reduction. One client cut inquiries from 200 to 80 per day after implementation, saving $10,000 annually in support costs. Other clients save $8,000–$15,000 per year. Another boosted NPS by 20 points. Many stores limit themselves to simple statuses, manually updating them in the admin panel. This leads to delays and errors. Our solution fully automates this process, integrating with your system and carrier APIs. Backed by 5+ years of experience and 50+ projects, we deliver robust solutions.
Order state machine mechanics
Our order tracking system leverages an order state machine, carrier API integration, and a public tracking page to ensure transparent package tracking. The order passes through several strict states: from awaiting payment to completion. Each transition is controlled by an order state machine based on Spatie Model States for Laravel. This ensures no invalid transition occurs. The order state machine approach is 3x more reliable than manual status updates.
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); } } At each transition, the system records an entry in order_status_history, updates the timestamp, and sends a notification to the buyer. Below are typical statuses and their descriptions:
| Status | Description |
|---|---|
| Pending | Awaiting payment / confirmation |
| Confirmed | Order confirmed |
| Processing | Being packed in warehouse |
| Shipped | Handed to delivery, tracking number assigned |
| Delivered | Delivered to buyer |
| Completed | Closed (returns possible) |
| Cancelled / Failed | Cancelled or delivery error |
Status history: the backbone of tracking
All changes are stored in a table:
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() ); From this table, a timeline is built on the public page — the buyer sees when and which status was assigned. Without history, delays or errors cannot be traced. Over 10,000 orders have been tracked with this system, achieving 99.9% status accuracy and uptime.
Carrier tracking integration benefits
After shipment, the order gets a tracking number. The system queries the carrier via API every 2 hours. Automated carrier tracking is 5x faster than manual checks. Example for CDEK:
$cdek = new \CdekSDK2\Client($clientId, $clientSecret); $info = $cdek->orders()->get($order->cdek_uuid); $cdekStatus = $info->getStatuses()[0]->getName(); Our solution integrates with 6+ carriers: CDEK, Russian Post, Boxberry, DPD, Dostavista, Yandex Go. We use custom adapters for each carrier, handling authentication, rate limits, and error logging. For last-mile delivery, we integrate real-time courier location on a map. Comparison of approaches:
| Carrier | Integration type | Update frequency | Complexity |
|---|---|---|---|
| CDEK | REST API | 2 hours | Medium |
| Russian Post | SOAP | 2 hours | High |
| Boxberry | JSON API | 1 hour | Low |
| Dostavista | Webhook | Real-time | Medium |
When the carrier status changes, the system automatically updates the order status and sends a notification. This is more convenient than manual checking — it saves your managers' time, reducing manual effort by 80%.
How does public tracking page work?
The page is accessible without login via a token link — for guest orders and from emails. Example React component:
const OrderTrackingPage = ({ order }: { order: OrderTrackingData }) => ( <div className="max-w-2xl mx-auto py-8 space-y-6"> <OrderSummaryCard order={order} /> <div> <h2 className="font-semibold mb-3">Status History</h2> <StatusTimeline steps={order.status_history} currentStatus={order.status} /> </div> {order.tracking_number && ( <div> <h2 className="font-semibold mb-3">Delivery</h2> <ShippingTracker carrier={order.carrier} trackingNumber={order.tracking_number} events={order.carrier_events} /> <a href={order.carrier_tracking_url} target="_blank" className="text-blue-600 text-sm mt-2 inline-block"> Track on {order.carrier} site → </a> </div> )} </div> ); Visually, the timeline is a progress bar with steps: 'Accepted', 'Confirmed', 'Processing', 'Shipped', 'Delivered'. The current status is highlighted. The page loads in under 2 seconds.
Notifications: email and SMS
On each status change, the buyer receives an email with current state and a link to tracking. For key events (shipment, delivery) we additionally send SMS. We use Laravel Notification channels — easily extensible. Templates are customizable to your brand. Over 95% of buyers find the notifications helpful.
What's included in the work
- Development of the order state machine with transition history
- Integration with 2–3 carriers (list agreed upon)
- Public tracking page with responsive design and token access
- Notification system (email + SMS/messengers optional)
- API documentation and status schema
- Training your team on the system
- 6-month code warranty, post-launch support
Our process
- Analysis — we study your current order logic, carrier list, and notification requirements.
- Design — we describe the order state machine, database schema, and integrations.
- Implementation — we write code on Laravel (backend) + React (frontend).
- Testing — we check all status transitions, notification delivery, and real tracking numbers.
- Deployment — we deploy on your server, configure cron tasks.
Timelines and pricing
Base implementation takes 4–6 working days. Typical investment ranges from $2,000 to $5,000, depending on complexity. Contact us — we'll estimate your project in 1 day. Our team has experience in e-commerce development and over 50 successful tracking implementations.
Results you will get
Beyond reducing support load by 60%, you gain increased loyalty: buyers see real-time status and ask fewer questions. Additionally, we help set up CRM and analytics integration. Get a free consultation right now — we'll tell you how to improve your service.







