Worked example: 4,000 boxed units from China

July 30, 2026 · View on GitHub

A single product in a 390 x 290 x 265 mm shipping carton at 7.4 kg gross, 4,000 units on order, supplier in China, forwarder has quoted both a 40 ft HC rate and a groupage rate. Output below is verbatim from the commands shown, run 2026-07-30.

1. Which pallet standard suits the carton

python3 scripts/freight.py pallet --dims 390x290x265 --weight 7.4 \
  --pallet eur1,cn,gma,asia
390 x 290 x 265 mm, 7.4 kg  ->  0.0300 m3 each
max build height 1800 mm gross, including the deck

pallet    per layer  layers  per pallet   build    gross  deck  limited by
cn               10       6          60   1735   459.0   94%  build height
gma              10       6          60   1730   461.0   91%  build height
asia              9       6          54   1735   419.6   84%  build height  [pinwheel]
eur1              8       6          48   1734   380.2   94%  build height

Best: CN 1200 x 1000 - 10 per layer x 6 layers = 60 units, 1735 mm gross, 2.08 m3 of pallet space.

The Chinese 1200 x 1000 is both what the supplier will build to by default and the best fit here — 60 per pallet against 48 on a EUR-1, a 25% difference from the deck alone. Note the 459 kg gross build: fine for a forklift, over most hand pallet-truck limits.

2. What a container holds, and how many the order needs

python3 scripts/freight.py container --dims 390x290x265 --weight 7.4 \
  --pallet cn --container 20gp,40hc --quantity 4000
container   method        units   cube  payload  layout
20gp        palletised      540    56%      15%  9 pallets on the floor x 1 tier x 60 per pallet
                                                 ! a mixed / offset floor plan fits 10 pallets rather than 9 (+60 units per tier) - valid geometry, but it has to be loaded off a placement diagram in the right order
20gp        loose          1026    93%      27%  120 per floor layer (lanes) x 9 high = 1080, 390 x 290 x 265 mm placement, 2385 mm stack
                                                 ! geometric fit 1080, derated 5% to 1026
40hc        palletised     1200    55%      35%  20 pallets on the floor x 1 tier x 60 per pallet
40hc        loose          2337    92%      65%  246 per floor layer (lanes) x 10 high = 2460, 390 x 290 x 265 mm placement, 2650 mm stack

For an order of 4,000 units:
  20gp        palletised    7.41 x container - 8 containers, the last one 41% full
  20gp        loose         3.90 x container - 4 containers, the last one 90% full
  40hc        palletised    3.33 x container - 4 containers, the last one 33% full
  40hc        loose         1.71 x container - 2 containers, the last one 71% full

This is the decision. Palletised, the order needs four 40 ft HCs. Floor loaded, it needs two. The pallets cost 55% cube utilisation against 92%: the deck takes 145 mm of every 1735 mm build, and the last layer stops 700 mm short of the ceiling because a seventh layer will not fit.

Neither figure is weight-limited — payload peaks at 65% — so volume is the whole constraint and floor loading is worth the extra labour at both ends. The mixed floor-plan note on the 20 ft is real but not worth chasing here.

3. Money

python3 scripts/freight.py cost --dims 390x290x265 --weight 7.4 \
  --container 40hc --method loose --units 4000 \
  --per-container 3400 --per-cbm 88 --min-cbm 2 \
  --unit-price 11.50 --price-for 2000@10.90,5000@10.20 \
  --duty-pct 8 --other 620 --currency USD
4,000 units at USD 10.90 each = USD 43,600.00 goods value
volume 119.89 m3 - 4,000 cartons at 0.0300 m3
weight 29,600 kg actual, 119,886 kg volumetric at 1000 kg/m3
load    2,337 units per 40hc (loose: 246 per floor layer (lanes) x 10 high = 2460, ...)

basis                                           freight   per unit  % goods  landed/unit
2 x 40hc at 3,400.00                       USD  6,800.00      1.700      16%       13.763
88.00 per m3                               USD 10,549.97      2.637      24%       14.775

Cheapest row includes duty USD 4,032.00 (8% on cif) and other charges USD 620.00.

Crossover: past ~1,290 units the container beats USD 88.00/m3 groupage, and it holds 2,337. This order is above that line.

Two containers at USD 1.70 per unit of freight, against USD 2.64 on groupage — the order is three times past the crossover, so FCL is clear. Landed cost is USD 13.76 per unit against a USD 10.90 purchase price; freight is 16% of goods value, which is high enough to keep watching but not high enough to be driving the decision.

The 2,000-unit price break was reached, so the quantity is priced at USD 10.90 rather than 11.50. The next break at 5,000 units would take USD 0.70 per unit off the goods — worth a separate run before settling the order quantity, since 5,000 units still fits in three 40 ft HCs.

4. If the carton were not yet fixed

Same product at 180 x 130 x 120 mm loose, carton undecided:

python3 scripts/freight.py options --dims 180x130x120 --weight 1.6 \
  --pallet cn --container 40hc --per-carton 4,6,8,12,16,24 --top 6
per ctn arrangement  carton ext (mm)          kg ctn/plt units/plt  deck  build   units/40hc
     12 1x3x4        190x400x490           19.70      45       540   95%   1615        10800
      6 1x3x2        190x400x250           10.10      90       540   95%   1645        10800
     12 1x2x6        190x270x730           19.70      44       528   94%   1605        10560
      8 1x2x4        190x270x490           13.30      66       528   94%   1615        10560

The top two rows carry the same 10,800 units per 40 ft HC. The 12-pack is 19.7 kg — right at the handling limit — while the 6-pack at 10.1 kg ships exactly as many units and is half the lift. On a tie, take the one the warehouse will thank you for.