Delhivery says 'Manifested', Xpressbees says 'Picked', Porter says 'live', your store says 'shipped' — the same event in four dialects. Status normalisation is the unglamorous layer that makes tracking actually readable.
The canonical eight
Every status in the wild maps to: created → pickup scheduled → picked up → in transit → reached destination city → out for delivery → delivered → exception/RTO. Twenty-odd carrier codes collapse onto these eight; the customer sees one clean timeline.
Why mapping matters
A customer seeing 'in transit' for five days thinks it's stuck; the carrier's 'linehaul_arrived' + 'sorting' + 'bag_scan' noise means it's moving through the network normally. Normalisation filters noise into the states the customer actually cares about.
Store the raw too
Map for display, store raw for debugging — when a shipment's story needs reconstructing, the carrier's exact codes carry meaning your canonical version drops. Every status event: raw code, canonical state, timestamp, location.
The edge cases
NDR is a state with a remark (capture it), RTO is a direction not a place (track it separately), 'delivered' can be wrong (POD verification exists for a reason). The map handles the happy path; the exceptions need their own handling.
Pure Parcel automates exactly this — the pipeline from order to AWB without the manual steps.
See how →The playbook
Define your canonical set
Eight states cover every carrier's vocabulary.
Map each carrier's codes
Code-by-code, once, documented.
Store raw + canonical together
Display the clean, debug the raw.
Handle NDR/RTO separately
The exceptions aren't statuses, they're workflows.
