Why states matter
Air cargo handling is, at its core, a state machine. A shipment is always in exactly one state. Every operational action — acceptance, screening, build-up, loading, departure — transitions the shipment from one state to the next. The carrier’s ops desk, the forwarder’s tracking system, customs authorities, and the handler’s billing engine all read the same state stream.
IATA standardised that state stream in Cargo-IMP via the FSU (Freight Status Update) message. A handler emits an FSU on every transition; everyone downstream consumes it.
If your operation has a “Status” field that anyone can free-text into, you don’t have a state machine — you have a notebook. Real handling needs the discipline of explicit states.
The states themselves
There isn’t a single canonical “21” — the count varies depending on which sub-states you include — but the core sequence every air cargo handler operates against:
Export (origin handler)
| State | Code | Meaning |
|---|---|---|
| Booking received | internal | Forwarder reservation acknowledged |
| Freight on hand | FOH | Cargo physically arrived at handler |
| Received from shipper | RCS | Cargo accepted into the warehouse, security declaration signed |
| Freight pre-screened | FPS | Security screening completed (X-ray, EDS, etc.) |
| Booked | BKD | Assigned to a specific flight |
| Manifested | MAN | On the FFM emitted to the destination station |
| Prepared for loading | PRE | Built up into a ULD |
| Loaded on flight | LDN | Physically in the aircraft hold |
| Departed on flight | DEP | Aircraft is wheels-up |
Transit (intermediate stations)
| State | Code | Meaning |
|---|---|---|
| Transit arrived | ARR | Flight landed at intermediate station |
| Transit transferred | TRM | Cargo transferred to onward flight |
Import (destination handler)
| State | Code | Meaning |
|---|---|---|
| Arrived | ARR | Flight landed at destination |
| Received from flight | RCF | Cargo offloaded and received into the warehouse |
| Notified for delivery | NFD | Consignee notified that cargo is ready |
| Awaiting customs | AWD | Customs clearance pending |
| Delivered | DLV | Cargo released to consignee |
Exception states
| State | Code | Meaning |
|---|---|---|
| Discrepancy | DIS | Pieces, weight, or condition doesn’t match expected |
| Cancelled | CCD | Booking cancelled before manifesting |
| Returned | RET | Cargo returned to shipper |
Transitions, not statuses
The single most important thing about the 21-state model: states are not labels you set. They are transitions you make. Each transition has rules about what state you can come from, who is allowed to make it, what message goes out as a result, and what data is captured.
Examples:
- You cannot go from
FOHdirectly toBKD. You must pass throughRCS(acceptance) andFPS(screening) first — otherwise security has been bypassed. - Only an operator with appropriate role can transition
RCS— in Skidd, that’s a warehouse op or a station manager, never a customer service rep. - Every transition emits an FSU to the airline (and to subscribed forwarders); the FSU body carries operator id, timestamp, and the new state.
A handler that lets transitions happen out of sequence is a handler that ships discrepancies it doesn’t know it’s shipping.
What an FSU looks like on the wire
FSU/16
LH123/24APR/FRA
180-12345678LHRJFK/T2K12
RCS/24APR0812LHRT2/12K240/M.BERG
Decoded:
FSU/16— FSU message version 16LH123/24APR/FRA— flight, date, origin180-12345678LHRJFK/T2K12— AWB, routing, station codeRCS/24APR0812LHRT2/12K240/M.BERG— new state, timestamp, location, pieces, weight, operator
That single line tells the airline’s ops desk that 12 pieces totalling 240kg were accepted at LHR Terminal 2 at 0812 UTC on 24 April by operator M. Berg. Replay-able, auditable, dispute-resolvable.
How Skidd implements the 21 states
Three implementation choices that matter:
-
The state machine is explicit and enforced at the API layer. Invalid transitions are rejected with a structured error before they reach the database. There is no free-text status field, no “other” option, no escape hatch.
-
Every transition emits the right FSU automatically. You don’t choose what message to send — the state determines it. RCS emits FSU/RCS, MAN emits FFM-and-FSU/MAN, DEP emits FSU/DEP. Operators do operations; the system does protocol.
-
The full event log is queryable and replayable. Every transition stamped with operator, timestamp, second-precision sequence number, and a cryptographic hash. You can replay any shipment’s entire history for audit, dispute, or just curiosity.
Where this fits with everything else
The 21 states are the spine. The other pieces hang off them:
- The FWB that arrives at the start populates the canonical model the state machine operates on
- The FFM at MAN is the per-flight roll-up of every BKD shipment on a given flight
- Storage clocks start at FOH/RCS and stop at DEP — they drive overstay billing
- Rate cards match charges based on the transitions (acceptance handling, screening, build-up, loading)
- e-CSD signs the security declaration as part of the RCS transition
Get the state machine right and everything else falls into place. Get it wrong and you spend every shift reconciling things that should have reconciled themselves.