Setting up shipping
A new install comes with a zone for the shop's country, but no rate at all.
Panel → Shipping. Where you deliver, what you charge to get there and when each option is offered. What the customer sees at checkout comes from here.
Start here, or nobody can buy
With no rates, checkout says there is no way to deliver and the order cannot go through. It is not a warning you can skip: without a shipping option, nothing that ships can be bought.
A new install comes with a zone for the shop's country, but no rate at all. The panel says so on the zone itself ("nobody can buy from these places"), and the first thing to do is give it one.
Things that are not shipped do not need it: a downloadable product, a key or a gift card is bought with no shipping and no address.
The pieces
- Zone: where you deliver. Its rates go inside it.
- Rate: what shipping to that zone costs, and when it is offered.
- Shipping class: a group of products that costs a different amount to send (fragile, bulky, chilled). Optional.
Zones
A zone is defined by countries, and can be narrowed down:
| Field | How to write it | Example |
|---|---|---|
| Countries | codes separated by commas | es, pt |
| Provinces or states | country and province | es-b |
| Cities | country and city | es:Terrassa |
| Postcodes | country and an expression | es:^08 |
The postcode is a regular expression: es:^08|^17 covers Barcelona and Girona.
It is written like that, and not as a list of codes, because a Spanish province
is hundreds of codes that all start the same way.
An address can fall into several zones at once — its country and its city, for instance. The customer then sees the rates of all of them. That way you can have your usual rate for the whole of Spain and, on top, your own delivery just in your city.
The zone is decided by the delivery address. Until the customer types it in, there are no rates to show them.
Rates
Every rate has a type:
- Flat rate: a price you set.
- Local pickup: the same as a flat rate (it can be 0), but marked as pickup so the theme shows it that way. Checkout still asks for an address, because that is what decides the zone.
- Live carrier: the price is asked of the carrier. Read what you need to know first.
And, besides the price:
- Extra per unit: added for each unit that ships. With €5 and €1.50 per unit, two units pay €8.
- Delivery time: a text the customer sees, such as "24-48 h". It calculates nothing; it is what you promise.
- Active: switched off, it stops appearing at checkout, but it is not deleted.
At checkout they appear by their position, and then in alphabetical order of
their name. The position is the rate's orden field in the API
(/gestion/envios/tarifas), 0 by default; the panel does not show it, so rates
made there come out alphabetically. If you want one first, let its name say so.
The price is in the shop's currency. A cart in another currency does not see flat rates, because they have no price in it.
When it is offered: conditions
Leave them empty and the rate always appears. With them, only when all of them are met:
| Condition | What it looks at |
|---|---|
| Minimum and maximum amount | the sum of the products that ship |
| Minimum and maximum weight | the variants' weight times their units, in the store's weight unit |
| Minimum and maximum items | the units that ship |
That covers almost everything people usually ask for:
- Free over €60: a rate at 0 with a minimum amount of 60, and the normal one with a maximum amount of 59.99. Without that maximum, above 60 the customer would see both and could choose to pay.
- Weight bands: one rate per band, each with its minimum and maximum weight.
- Small orders by letter post only: a rate with a maximum of 2 items.
Three things worth knowing:
- The amount does not take coupons off, nor does it include shipping: it is the sum of the prices of what ships. A "free over 60" with a 10 % coupon is still free from 60 before the coupon.
- Weight is in your store's weight unit, the one you choose in Settings > General > Weight unit. The panel prints it next to every weight field, on the variant and on the bands here, so that both are written in the same unit. Nothing is converted: if you set the bands in kilograms and the variants in grams, no error appears — the rate simply never shows up. A product with no weight counts as zero, so if you set no weights, a weight-based rate always sees the lowest band.
- What does not ship does not count: not in the amount, the weight or the items.
Shipping classes
They are for when some products cost more to send. You create the class, put its products in it, and on each rate you say how much is added when one of that class ships.
- A product is in one class only. Putting it in another takes it out of the first.
- Products with no class: on each rate you can also say how much the ones with no class add.
- How it adds up, chosen on each rate:
- Once for each class: if a fragile item and a bulky one ship, both extras are added.
- Only the most expensive class: the larger of the two is added. It is what you usually want if everything goes in the same box.
The extra is added once per class, not per unit: three fragile items pay the fragile extra once. To charge per unit, there is the rate's extra per unit.
The final price is: price + extra per unit × units + class extras. For example, €5 + €1.50 × 2 units + €3 for one class: €11.
Without classes, every product pays the same shipping.
🔴 The shipping profile trap
Every rate carries a shipping profile inside it, and so does every product. The engine silently hides any rate whose profile does not match that of the products in the cart. It gives no error: the rate simply does not show.
The panel does not make you manage profiles, precisely because of this. When a rate is saved it gets the profile most of your products use, and it is corrected again when you edit it.
If a rate exists, is active, meets its conditions and still does not show at checkout, open it and save it without changing anything. That is what gives it the right profile. It happens above all with rates that were not created on this screen: those from a WooCommerce migration or from an earlier version.
Live carriers: the truth
The Live carrier type exists, and the engine knows how to ask a carrier for a price: with a 2-second timeout, and keeping the answer for 60 minutes so it does not ask the same thing on every checkout load.
But today there is no carrier registered that calculates live. The only one the shop ships with is manual shipping, and there is not yet a way for a plugin to add one. There is no Sendcloud integration either: it only receives their notifications (see configuration).
So a live-carrier rate always charges its fallback price, and if it has none, its normal price. In other words, today it works like a flat rate. If you use it, set a fallback price you can stand by.
The fallback is there for when there is a carrier: if it is slow or does not answer, checkout does not sit waiting and charges that instead.
With several sellers
If you use the marketplace, each seller can have their own rates and each parcel is quoted separately. It is explained there.
What does not go here
The cash-on-delivery surcharge is not a shipping rate: it is set under Settings → Payments, next to each payment method.