Gxo Order Tracking
Technical Implementation Details
Tracking Search Implementation
The tracking search on the web platform allows users to look up their order status using a unique tracking ID. It provides a simple form UI, fetches real-time tracking data from the backend, and renders the order status timeline in the UI.
🧩 UI Behavior
- Users input a tracking ID in a search form.
- On submission, a search request is triggered.
- The latest tracking event is displayed as the current status.
- A progress bar and tracking event timelines are rendered.
🧾 HTML Template
<template>
<form @submit.prevent="searchOrder(trackingIdQuery)">
<TsInputGroup>
<TsInput
type="search"
v-model="trackingIdQuery"
placeholder="Paste your tracking ID here"
with-clear
/>
<TsButton type="submit" :is-loading="searchStatus.status === 'loading'">
Search
</TsButton>
</TsInputGroup>
</form>
<div v-if="searchStatus.status === 'success' && orderData">
<section>
<h2>Order Details</h2>
<p>Order ID: {{ orderData.order.id }}</p>
<p>Placed on: {{ orderData.order.order_date }}</p>
<p>Status: {{ latestEvent.carrier_description }}</p>
</section>
<section>
<h3>Order Status</h3>
<TsProgress :value="progressValue" />
<div>
<TsStepItem
v-for="(stage, index) in orderStages"
:key="index"
:label="stage.label"
:date="stage.date"
:isActive="stage.isActive"
:icon="stage.icon"
/>
</div>
</section>
</div>
</template>
🧠 Logic
<script setup lang="ts">
const trackingIdQuery = ref(route.query.id || ""); // For ease of access and create a shareable URL (e.g https://tracking.toolstation.nl/?id=12345)
const orderData = ref(null);
const searchStatus = ref({ status: "idle", message: "" });
async function searchOrder(trackingId: string) {
searchStatus.value = { status: "loading" };
try {
const res = await $fetch(`/orders/tracking/{trackingId}`);
orderData.value = res.data;
searchStatus.value = { status: "success" };
} catch {
searchStatus.value = {
status: "failed",
message: "No Such Order Found With This Tracking ID",
};
}
}
const orderStages = computed(() => {
if (!orderData.value) return [];
const orderPlaceStage = {
label: "Order Placed",
date: orderData.value.order.order_date,
isActive: true,
icon: "bx:cart",
};
const trackingStages = orderData.value.tracking_data.events.map(event => ({
label: event.carrier_description,
date: event.dateUTC,
isActive: new Date(event.dateUTC) <= new Date(),
}));
return [orderPlaceStage, ...trackingStages];
});
const latestEvent = computed(() =>
orderData.value?.tracking_data.events.slice(-1)[0]
);
const progressValue = computed(() => {
const activeStages = orderStages.value.filter(s => s.isActive).length;
return (activeStages / orderStages.value.length) * 100;
});
</script>
✅ Summary
- Simple input form triggers a tracking request.
- Data is fetched from the backend via tracking ID.
- Tracking events are mapped to steps to show a timeline view.
🛠️ Examples
- Not Found
![]()
- Successfully Delivered
![]()