How many pallets, against the fewest possible.
A density figure for one pallet is not what a freight bill depends on. This is: pallets used divided by the lower bound, over 8 generated orders of 240 cases in each of 6 profiles, packed by engine 0.5.0. Including the profile this engine is worst at.
| Order profile | Median | p90 | Worst | Density | Every pallet admissible |
|---|---|---|---|---|---|
long_tail A few large cases and a long tail of small ones, with dimension jitter. | 2.67× | 2.67× | 2.67× | 41.6% | yes |
beverage Few SKUs, similar heights, heavy — the easy case, and the common one. | 1.33× | 1.33× | 1.33× | 80.0% | yes |
mixed_heights The adversarial case: heights that do not divide into layers. | 1.33× | 1.33× | 1.33× | 79.8% | yes |
ecomm Many small SKUs, wide spread of shapes: high mix, low volume per line. | 1.00× | 1.50× | 1.50× | 73.9% | yes |
heavy Dense goods: the mass budget binds before the height does. | 1.00× | 1.14× | 1.14× | 87.0% | yes |
fragile A fragile third that may not be built on, which costs layers. | 1.00× | 1.33× | 1.33× | 81.4% | yes |
What the ratio means
The bound is total volume and total mass over one pallet’s capacity, each rounded up. It assumes cases behave like a liquid, so no real plan can reach it — 1.00 is not a target, and a profile sitting at 1.00 means its bound was loose rather than that the packing was perfect. What the table is for is the spread: which kinds of order this engine handles tightly and which it does not.
The number we are worst at
long_tail — a few large cases and a long tail of small ones, with a few per cent of dimension jitter, so almost every case is a unique size. A layer packer is at its worst there: a layer is as tall as its tallest case, and with no two heights alike the waste compounds down the stack. It is on this page because leaving it off would make the other five numbers worthless.
What this does not measure
Any other software. This project has no access to a competitor’s results and will not invent them; the comparison is against the bound, which cannot be chosen to flatter anybody. Nor does it measure anything physical — no pallet in this benchmark has been built, wrapped, driven anywhere or lifted by a robot.
Run it yourself
pip install palletizer-full-stack palletizer benchmark orders # this table palletizer benchmark orders --format json # every order, individually
The orders come from a seeded generator that uses only random.random(), so the same seed produces the same order anywhere. The published figures, the generator and the test that keeps them honest are all in the repository. Seeds: 11, 23, 37, 41, 59, 67, 73, 89.
The profiles are ours; your orders are not. Run one of your real ones and see which column you are in.
The engine is Apache-2.0 and unmetered on your own machines — what the hosted plans add is a signature only this service can make, state it keeps for you, and compute on its hardware.
Related: how the packers and the split work · what else is still wrong with this software