<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[24hTrack Blog]]></title><description><![CDATA[Practical notes from the 24hTrack team on package tracking: carrier detection, tracking statuses, cross-border shipping, and building with tracking APIs.]]></description><link>https://24htrack.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6aad6b4faf78e531937ecf8f/76b6feb1-1143-48cb-8567-7d07ae50e720.png</url><title>24hTrack Blog</title><link>https://24htrack.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 23:33:46 GMT</lastBuildDate><atom:link href="https://24htrack.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[One status list for every carrier: a practical taxonomy for shipping events]]></title><description><![CDATA[Disclosure: I work on 24hTrack, a multi-carrier package tracker. This post was written with AI assistance and checked by our team. The approach works whatever tracker or carrier API you use.
If you pu]]></description><link>https://24htrack.hashnode.dev/one-status-list-for-every-carrier-a-practical-taxonomy-for-shipping-events</link><guid isPermaLink="true">https://24htrack.hashnode.dev/one-status-list-for-every-carrier-a-practical-taxonomy-for-shipping-events</guid><category><![CDATA[ecommerce]]></category><category><![CDATA[api]]></category><category><![CDATA[logistics]]></category><dc:creator><![CDATA[support 24htrack]]></dc:creator><pubDate>Fri, 18 Sep 2026 17:25:31 GMT</pubDate><content:encoded><![CDATA[<p><em>Disclosure: I work on 24hTrack, a multi-carrier package tracker. This post was written with AI assistance and checked by our team. The approach works whatever tracker or carrier API you use.</em></p>
<p>If you pull tracking data from more than one carrier, you soon have hundreds of different event strings: "Processed through facility", "Arrived at sort center", "Shipment picked up", "Out for delivery today", "Delivered, front door", plus the same things in Chinese, Spanish or German. Your UI, filters, notifications and reports need a small, stable set of states. Here is the set we use and the rules that keep it honest.</p>
<h2>The seven states</h2>
<table>
<thead>
<tr>
<th>State</th>
<th>Meaning</th>
</tr>
</thead>
<tbody><tr>
<td>Info Received</td>
<td>A label exists; the carrier has not scanned the parcel yet</td>
</tr>
<tr>
<td>In Transit</td>
<td>Moving between facilities, flights or countries</td>
</tr>
<tr>
<td>Out for Delivery</td>
<td>On the vehicle for the final attempt</td>
</tr>
<tr>
<td>Available for Pickup</td>
<td>Waiting at a post office, locker or pickup point</td>
</tr>
<tr>
<td>Delivered</td>
<td>Handed to the recipient, mailbox, locker or neighbour</td>
</tr>
<tr>
<td>Exception</td>
<td>Needs attention: failed attempt, address problem, customs hold, damage</td>
</tr>
<tr>
<td>Returned</td>
<td>Going or gone back to the sender</td>
</tr>
</tbody></table>
<p>Seven is enough to answer the two questions customers actually ask: <em>where is it?</em> and <em>do I need to do anything?</em></p>
<h2>Rule 1: normalize on display, keep the raw text</h2>
<p>Store the carrier's original wording and map it to a state when you show it. Mappings get fixed over time; if you only stored the normalized state, every old record keeps the old mistake. The raw text also matters in support conversations: "Delivered, parcel locker" and "Delivered" are the same state but not the same answer.</p>
<h2>Rule 2: tense and negation beat keywords</h2>
<p>The most expensive bug in a status mapper is calling something Delivered when it is not. Keyword matching on "delivered" gets all of these wrong:</p>
<ul>
<li>"Your parcel is being delivered" (Out for Delivery)</li>
<li>"Will be delivered tomorrow" (In Transit)</li>
<li>"Could not be delivered, recipient absent" (Exception)</li>
<li>"Delivered to airline" / "Entregado a transportista" (a hand-off between carriers, still In Transit)</li>
</ul>
<p>Check negation and hand-off phrases before the Delivered rule, and check tense ("being", "will be", "to be"). A false Delivered is worse than a false In Transit: customers stop looking for a parcel that never arrived.</p>
<h2>Rule 3: never invent a delivery time</h2>
<p>If the carrier did not publish a readable date for the delivery scan, record "delivered, time unknown". Do not fall back to the time your system noticed it. People use that timestamp to argue with couriers and sellers.</p>
<h2>Rule 4: one parcel, several carriers</h2>
<p>Cross-border parcels change hands: a Chinese forwarder, a flight, customs, then USPS or Royal Mail, sometimes with a new number. Merge the legs into one timeline ordered by event time, and treat "handed over to last-mile carrier" as In Transit, not as a new parcel.</p>
<h2>Rule 5: silence is not a state</h2>
<p>"No updates for 6 days" is normal on international routes (flights and customs produce no scans). Show the last real event and its date instead of inventing "Delayed". Reserve Exception for things the carrier actually reported.</p>
<h2>Where the mapping lives</h2>
<p>We keep one exact-match table (carrier text to state) that admins can edit, with keyword rules as a fallback for text nobody has seen before. New strings are reviewed before they become permanent rules. That keeps the fallback from quietly teaching itself mistakes.</p>
<hr />
<p>If you would rather not maintain this yourself: <a href="https://www.24htrack.com">24hTrack</a> does carrier detection and status normalization for 3,200+ carriers, free on the web, with free Google Sheets sync, a REST API and an MCP server (<code>npm i 24htrack-mcp</code>) for AI assistants. Guides and open transit-time data: <a href="https://github.com/doanhnd9989/package-tracking-guide">github.com/doanhnd9989/package-tracking-guide</a>.</p>
]]></content:encoded></item></channel></rss>