What each licence includes
| Feature | Free | Pro |
|---|---|---|
| Shipping rate is calculated by the boxes the order actually fits into | ✔ | ✔ |
| Checked against all three sides, not just volume | ✔ | ✔ |
| Order splits across several boxes when it doesn't fit one | ✔ | ✔ |
| Own box catalogue: dimensions, max weight, price, per-kg surcharge | ✔ | ✔ |
| Handling surcharge — once per shipment, not per box | ✔ | ✔ |
| Free shipping above an order total | ✔ | ✔ |
| Item rotation can be switched off for "one way up only" products | ✔ | ✔ |
| By default does NOT calculate a cart with a product without dimensions | ✔ | ✔ |
| Names of such products are logged under WooCommerce → Status → Logs | ✔ | ✔ |
| Separate screen listing products with empty dimensions | ✔ | ✔ |
| Fixed oversize rate or hiding the method — your choice | ✔ | ✔ |
| Dimensions in your store's own units, no hidden conversions | ✔ | ✔ |
WooCommerce calculates shipping by weight and shipping class. The courier charges for the box the parcel actually fits in. For anything bulky, those two numbers aren’t even close, and the gap eats into your margin on every order.
Three T-shirts and one kettle weigh the same, but they travel in completely different boxes. A pillow, a dog bed, a lampshade: light, but they take up as much room as a 150 UAH box.
This module closes exactly that gap. You describe the boxes you actually ship in, and the checkout shows the cost of the boxes the order genuinely fits into.
Live demo
Test site: test.catcode.com.ua (WordPress 7.1 + WooCommerce 10.7). In the admin — the Box rate section: a table of boxes, rules, and diagnostics for products without dimensions.
How it calculates in real examples (boxes Small 20×15×10 / 50 UAH, Medium 40×30×20 / 90 UAH, Large 60×40×40 / 150 UAH + 5 UAH per kg):
- 1 mug → Small, 50 UAH.
- 4 mugs → two Smalls, 100 UAH: by volume they would fit in one, but the box’s weight limit kicked in.
- A 35-inch-long poster → Medium, 90 UAH: it doesn’t fit in a Small along one side, no matter how much free volume is left.
- Mug + armchair → Large, 213 UAH (150 for the box + 5 × 12.6 kg).
- A 90×50×45 sofa → doesn’t fit any box: either the rate isn’t shown at all, or a fixed oversize rate applies — your choice.
What the buyer sees
An ordinary shipping method in the cart and at checkout, with whatever name you gave it. No extra fields, popups, or steps. The order details show which boxes made up the price — for example “Small × 2”.
If a product lands in the cart that can’t be honestly calculated, the method simply isn’t shown — instead of showing a confidently wrong amount.
What the admin gets

Box table: name, length, width, height, maximum weight, cost, and a per-kilogram surcharge. Dimensions in whatever units your WooCommerce uses — nothing is converted behind your back.
Rules: what to do with a product without dimensions, what to do with an oversized item, a handling surcharge (once per shipment, not per box), free shipping above a threshold, permission to rotate items when packing.
Separately — diagnostics: a list of published products with an empty length, width, or height, with edit links. On our own test site, 39 out of 40 turned out to be like that.
How it works, step by step

- The cart is broken down into individual physical items: three identical products are three items, each needing its own space, not one object with a quantity of 3.
- Items are sorted from largest by volume.
- Each item is first tried against already-open boxes — starting with the one with the least free space left, so boxes fill up instead of multiplying.
- If it doesn’t fit any open box, the smallest box it physically fits into is opened.
- Price = sum of the costs of the boxes used, plus weight surcharges, plus a one-off handling surcharge.
The “fits” check is not by volume. A 90 cm-long item won’t go into a 40 cm box, however much free volume is left, so every candidate is checked against all three sides. Rotating the item is optional — for products that must only travel one way up, it can be switched off.
What’s included in each licence
Free — the three smallest box formats. For a store shipping in two or three sizes, that’s full coverage: all the packing logic, side-by-side checks, splitting across several boxes, surcharges, free shipping above a threshold, and dimension diagnostics all work without limits.
Pro — removes the limit on the number of box formats. That’s what a fulfilment operation with a dozen sizes needs.
Pricing
The base version is free. Pro is 990 UAH per year per domain. Trial period — 7 days.
Technical requirements
- WordPress 6.2+ (tested on 7.1).
- WooCommerce 6.0+ (tested on 10.7).
- PHP 7.4+.
- Product dimensions and weight filled in — no module of this kind can calculate honestly without them.
- Compatibility with HPOS and the block cart/checkout is explicitly declared.
Under the hood


The algorithm is first-fit-decreasing: largest items first, the smallest box they fit into. It’s not perfect three-dimensional packing — the perfect version is an NP-hard problem, and no checkout should be solving it. But it never claims a packing that’s physically impossible, and that property is what keeps the calculation honest.
The rotation check is done cheaply and correctly: both triples of sides are sorted and compared member by member — this covers all six orientations without enumerating them. Plus a small tolerance so a 30.0 cm item is treated as fitting a 30.0 cm box, as it would be in any warehouse.
🔴 The main decision is what to do with a product without dimensions. The most common reason a box-rate calculation produces nonsense has nothing to do with the maths: the store imported a feed that left the dimension fields empty, and half the catalogue officially has a zero size. Most modules happily treat such products as flat, and the seller finds out from the courier’s invoice.
Here, by default, the module refuses to calculate a cart containing a product without dimensions, logs the names of those products under WooCommerce → Status → Logs, and lists them on its own settings screen. Two other policies (treat as the largest box, or pack by weight only) are available — but that’s a decision you make deliberately, not a default behaviour you never saw.
Installation
- Plugins → Add New → Upload Plugin → zip → activate. WooCommerce must be active.
- Open Box rate in the admin menu and describe your boxes.
- Check the warning about products without dimensions — if there is one, fix the import first.
- Add the “Box rate” method to the relevant shipping zone: WooCommerce → Shipping.
Version history
1.0.0 — first release: box catalogue, first-fit-decreasing packing with a three-side check, splitting an order across multiple boxes, per-kilogram and handling surcharges, free shipping above a threshold, policies for products without dimensions and for oversized items, catalogue diagnostics for empty dimensions.
Frequently asked questions
Is this a real 3D packer?
No. It's first-fit-decreasing with a genuine per-side check: it may open one box more than the perfect algorithm, but it will never promise an impossible packing.
What units do I enter boxes in?
Your own, from WooCommerce → Products → Dimensions. Nothing is converted.
What happens with an oversized product?
Your choice: don't show the method, or take a fixed oversize rate.
Does it work with variable products?
Yes, it takes the dimensions of the specific variation.
Why did the method suddenly disappear from checkout?
Most likely there's a product without dimensions in the cart. The module logs the reason and product names under WooCommerce → Status → Logs.
Questions about the module?
Message us on Telegram — we reply within the working day. We will help with setup, compatibility and key activation.
No reviews yet. Be the first — right below.
Leave a review
Reviews are moderated before publication, which usually takes up to 24 hours.
No questions yet. Ask one — we answer within 24 hours.
Ask a question
We usually reply within 24 hours during working hours.
Buying the module
—