Chargeable weight & ULD build-up

Which shipments to put in a widebody's lower deck, and why loading the best-paying cargo first can leave weight or space unused.

Cargo pays on its chargeable weight, actual or volumetric, whichever is higher, but the hold fills with real kilos and cubic metres in containers and pallets (ULDs). Load 40 shipments into an A350-900 lower deck by hand, or with best rate first or mix dense and light. It goes with Cargo 101, chapter 03.

The shipments, their rates, tonight's weight allowance, the positions' distances from the reference point and the centre-of-gravity window are all illustrative. The sizes and weights of the containers and pallets, and the number of each that fit in the hold, come from the manufacturers' sources listed at the bottom.

Hold layout
Weight available
Shipments

Loading the shipments…

How it works

Background

Air cargo pays on its chargeable weight: the actual weight, or its volume counted at 166.67 kg per cubic metre, whichever is higher. But the hold fills with real kilos and real cubic metres, packed into containers and onto pallets of fixed sizes, called unit load devices (ULDs). 40 generated shipments, some dense, some standard, some light, compete for a lower deck laid out like an A350-900's. Load them by hand, or let one of two simple rules do it: best rate first, or mix dense and light so that the weight and the space run out together. The cargo revenue management page makes the same trade-off booking by booking, with bid prices.

Chargeable weight

IATA's general rule is to divide a shipment's volume in cm³ by 6,000 to get its volume weight, and to charge on whichever is higher, the volume weight or the actual weight. For a shipment of w kg and v m³: cw = max(w, 166.67 v), and revenue = rate × cw. Cargo denser than 166.67 kg per m³ pays on its weight; lighter cargo pays on its volume. No rounding is applied (in practice, carriers round chargeable weight up to the next half kilo or kilo).

The 40 shipments

Every list has 12 dense, 16 standard and 12 light shipments, in a random order, drawn from a seeded generator (mulberry32) so the page opens on the same list every time; "New list of 40" moves to the next seed. A shipment is n identical pieces. For each profile (all in uldbuild.json, all illustrative):

Each piece's three sides are the profile's typical sides times a lognormal factor (20% spread), kept between 20 and 300 cm; 30% of dense shipments have one long side of 175 to 290 cm, too long for an LD3. The shipment's total volume is drawn around the profile's typical volume (lognormal), and the number of pieces is that volume divided by one piece's, rounded, between 1 and 80. The density (lognormal around the profile's) sets the weight of a piece, to the half kilo. The rate is lognormal around the profile's rate with an 8% spread.

The hold

The layout is that of an A350-900's lower deck in Airbus's aircraft characteristics document: the forward hold takes 20 LD3 containers or 6 pallets of 96 × 125 in, the aft hold 16 LD3s or 5 pallets, over 16.2 m and 13.6 m. The page offers the four combinations of those standard loads. Mixed loads within one compartment are possible on real aircraft but aren't modelled. The bulk hold at the back, where loose bags and small pieces go, is left out.

Two figures are assumptions rather than published numbers: a pallet in the lower deck is built to about 160 cm, the height of the hold under the contour (an LD3, built for the same hold, is 161.6 cm tall), and its usable volume is taken as 11.5 m³, less than its 7.74 m² base times that height because the lower deck's contour cuts the corners. Boxes never fill a container exactly, so only 85% of each ULD's internal volume can hold cargo (the stowage factor, an assumption).

The weight available is what the flight can take tonight in the lower deck, cargo plus the ULDs' own weight. It depends on the passengers, their bags and the fuel, and the three settings are illustrative.

Build-up

A piece fits in an LD3 if, with its sides sorted from longest to shortest, they are at most 150, 135 and 135 cm, so that it passes the 139 × 155 cm door with some clearance; on a pallet, at most 310, 238 and 155 cm (both limits are assumptions). Loading a shipment goes piece by piece: first into containers and pallets already started (the tightest one that can take all the pieces left, otherwise the one with the most room, so a shipment is spread over as few as possible), as long as the ULD's net weight (maximum gross weight minus tare), its stowable volume and the flight's weight allowance allow; then into new ones, an LD3 if the pieces fit in one and an LD3 position is free, otherwise a pallet. Starting a ULD adds its tare to the flight's weight. If a piece can't be placed, the whole shipment is taken off again and marked as left behind, with the reason.

Best rate first tries the shipments in order of rate per chargeable kilo, highest first. Mix dense and light repeatedly picks, among the shipments not yet tried, the one with the highest revenue per share of what is left: R / (w / Wleft + v / Vleft), where Wleft is the weight allowance not yet used and Vleft is the stowable volume still free, in started ULDs and free positions. A dense shipment uses a large share of the weight and a small share of the space, a light one the opposite, so as soon as one resource gets scarcer than the other, the shipments that lean on the other one rise to the top. It is the same idea as the two bid prices on the cargo revenue management page, without solving a linear program. Your pick starts from the load on screen and loads the ticked shipments with the same build-up rules, in the order they were loaded, then each new tick in the order it was added.

Neither rule is optimal. The best load is a two-dimensional bin-packing problem with a knapsack on top, and with some lists and a tight allowance, best rate first comes out a little ahead.

Positions and centre of gravity

Each position has an arm, its distance in metres from a reference point near the wing (negative forward). The forward hold is placed from −18.5 m to −2.3 m and the aft hold from +3.2 m to +16.8 m, and positions are evenly spaced in each. These arms are illustrative, not the A350's. Balanced takes the built ULDs from heaviest to lightest and puts each in the free position that keeps the cargo's total moment (weight × arm) closest to zero. Front to back puts them in the order they were built, from the nose backwards. The cargo's centre of gravity is Σ weight × arm / Σ weight, and the check passes if it lies within ±2.5 m of the reference, an illustrative window.

Section 4 is precomputed by scripts/uldbuild/precompute.js with the same code as this page, on lists 1 to 1,000, for every hold layout and weight allowance, and stored in uldbuild-batch.json. The script also checks every load: no ULD over its maximum gross weight or stowable volume, no flight over its allowance, every piece in a ULD it fits in, and no position used twice. Sections 1 to 3 run live in your browser.

Sources

Limitations

This is a personal project and isn't affiliated with any airline.