Weight for Craft CMS

FAQ

What does it cost?

$59, once, with a $49/year renewal for updates. One edition, no free tier, no trial, and nothing withheld for a higher tier — box packing, dimensional weight, per-category charges, condition-builder rules, the carrier presets and the Postie integration are all in it.

The renewal buys updates rather than the right to keep running it. If you let it lapse, the version you have keeps working.

How is this different from Commerce's own shipping rules?

Commerce prices a shipping rule per line item. Weight prices a package, which is what a carrier actually charges for, and lets several rules contribute to one price rather than picking a winner. A handling fee, a weight band and a free-shipping threshold are three rules that all apply to the same order — expressing that in per-line-item rules means duplicating the handling fee across every product in the cart.

Weight also has the parts Commerce leaves to you: a free allowance before the per-kilo charge starts, whole-step rounding, postal-code wildcards and ranges, box packing and dimensional weight.

The two coexist. Weight's methods appear alongside Commerce's own, and you can run both.

Do rules OR or AND?

Neither, quite. Every rule that matches contributes to the price — they accumulate. A rule can opt out of that by being a free, disable or stop rule, or by carrying stop, which ends evaluation once it matches.

This is the single most important thing to know about the plugin, and it is what WooCommerce's plugin does too — it is just not what its documentation implies.

I came from WooCommerce's Weight Based Shipping. Will my rates port?

The rule model is the same one, taken from that plugin's source rather than its marketing, so the concepts map one to one: ordered rules, accumulating charges, weight and subtotal conditions, free / disable / stop. There is no importer — you retype the table — but you will not have to rethink it, and the simulator will tell you immediately if a band came across wrong.

Does it work with multiple stores?

Yes. Methods, rules and boxes belong to a store, and a method can additionally be restricted to particular sites.

What weight is actually charged for?

The billable weight: the packed weight, including each box's own tare weight, and after any dimensional-weight uplift. Line items that are not shippable, or that already carry free shipping, are excluded before packing starts.

Weight conditions on rules are judged against that same billable weight, so a rule that says "over 30 kg" means over 30 kg of parcel, not 30 kg of product.

Can I see how a price was calculated?

That is what the simulator is for. It shows the packing, every rule in order, whether each matched or which condition it failed, and every component of every charge including the clamps. Turn on Log quotes and the same detail is written to the log for every real checkout.

Will the preview ever disagree with checkout?

No, structurally. Rater::quote() is the only place in the plugin a price is computed, and the Commerce shipping method, the simulator, the Twig variable, the JSON endpoint and the console all read the Quote it returns. The simulator's made-up packages go through the same rating and clamping code as a real cart.

How good is the box packer?

Honest rather than optimal. Three-dimensional bin packing is NP-hard and nobody solves it exactly inside a checkout request. Weight uses first-fit-decreasing with a volume-and-dimension fit test, and does not model the geometry of what is already in a box — so it errs towards more boxes rather than fewer, which is the direction that overcharges no carrier. Every decision it makes is visible in the simulator.

Are the rates in project config?

No — they are in the database, which is the same call Commerce makes for its own shipping methods. A store owner changing a rate should not need a deploy. Moving rates between environments is an explicit weight/methods/export and weight/methods/import, matching on handle.

Can shipping be free over a threshold?

Yes — a rule with a subtotal condition and the make shipping free action. craft.weight.progress() then tells a template how far the cart is from it, in money, items or weight, using the message templates in the plugin settings.

Is the JSON endpoint safe to call anonymously?

Yes. /actions/weight/cart/quote only ever describes the requester's own cart, resolved from their own session, and returns prices they are about to be shown at checkout anyway.

Does it work with Postie?

Yes, and it improves on running either alone. Where both are installed, Weight's box library drives Postie's packing, so the simulator and the carrier request cannot disagree about how many parcels there are — and a rule can ask what the carriers said, which lets a table rate be a backstop for an API outage rather than a permanent competitor to a live rate. Neither needs switching on. Detail in Carriers & Postie.

Weight never edits Postie's prices. Exactly one plugin computes any given total.

Do you ship the carriers' actual rates?

No, and deliberately. The presets encode each service's structure — where the bands fall, whether it bills continuously or in whole steps, what the dimensional divisor is — with placeholder amounts. Republishing a carrier's rate card would be someone else's copyright, and it would be stale within a quarter; a stale table undercharges at checkout, which costs you real money on every order. The structure is the tedious part and it rarely changes. The numbers are the part you already have, on your contract.

Which versions are supported?

Craft CMS 5.3+, Craft Commerce 5.0+, PHP 8.2+.