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.

Pakka Parcel automates exactly this — the pipeline from order to AWB without the manual steps.

See how →

The playbook

1

Define your canonical set

Eight states cover every carrier's vocabulary.

2

Map each carrier's codes

Code-by-code, once, documented.

3

Store raw + canonical together

Display the clean, debug the raw.

4

Handle NDR/RTO separately

The exceptions aren't statuses, they're workflows.