Offering "free shipping" is one of the most effective ways to boost sales, but unmanaged delivery costs on heavy or distant orders can quickly gut your profit margins. Navigating this challenge requires setting strategic boundaries so you incentivize buyers without taking a financial loss.
By implementing smart minimum order thresholds, geographic restrictions, and carrier rules, you can protect your bottom line while still keeping customers happy. Here is how to structure your shipping strategy to maintain profitability on every package you send.
What You'll Need
- Access level: an employee account with permission to install modules and edit shipping, carriers and zones.
- Platform: a working PrestaShop store with your products already published and weighed.
- Module (Method 1): the PrestaShop Free Shipping Manager - Free Delivery Module, priced at $49.00.
- PrestaShop version: a current supported release, since shipping and carrier screens move between major versions.
- Cost data: your real per-parcel courier rates and weight bands, plus your blended shipping spend across a representative batch of orders.
- Time estimate: roughly 45 to 90 minutes for a first-time setup, plus a short testing pass.
- Difficulty: moderate. No coding is required on either route.
Prerequisites
- Product Weight fields filled in for every item, because a blank weight counts as zero and breaks weight-based rules.
- Your zones decided in advance, for example Mainland, Highlands and Islands, EU and Rest of World.
- At least one paid fallback carrier planned, so no basket is ever left without a delivery option.
- A test customer account with a saved address in each zone you ship to.
- A full database and file backup if you intend to change carrier behaviour on a live store.
- A staging copy of the store if you can, so testing never touches live orders.
A single blanket rule treats every parcel as if it costs the same to send, but your courier certainly doesn't. A light phone case going to a customer nearby and a heavy dumbbell set crossing several zones are not the same transaction, yet a flat "free delivery on everything" promise prices them identically.
Carriers price on two axes: weight and distance. Add dimensional weight for bulky-but-light items, and the curve steepens again. Model it honestly by working out your average shipping spend across a representative batch of real orders, not your cheapest or your heaviest one.
- Light, nearby orders cost you a little, and free shipping on them is affordable.
- Heavy, distant orders cost you a lot, and free shipping on them is a discount you didn't plan to give.
- Mixed baskets mix both, which is exactly why an average hides the damage.
The decision framework that follows uses three levers rather than one. A cart threshold decides how much a customer spends to qualify. A weight ceiling decides which baskets can ever qualify. A zone rule decides where free delivery applies. Set all three and the subsidy lands on the orders you can afford to carry.
Blanket free shipping doesn't reward your best customers; it recruits your most expensive parcels. Encoding that model as PrestaShop rules keeps the promise honest for shoppers in your favourable weight and distance bands, while heavy or far-flung baskets simply see a priced carrier at checkout.
How to Set Up Conditional Free Shipping in PrestaShop?
Both routes share the same logic: decide your threshold, weight ceiling and eligible zones first, then encode them. Method 1 does it with rules that combine all three; Method 2 does what native carriers and zones allow.
Method 1: Use the PrestaShop Free Shipping & Delivery Manager Module
The PrestaShop Free Shipping Manager - Free Delivery Module lets you write your blended cost-per-parcel model directly into PrestaShop as shipping rules. At $49.00, it is the difference between guessing which carts deserve free delivery and knowing, because each rule only fires when the numbers in the cart justify it. Install the module, then build your rules in the order you would price a parcel: value first, weight second, destination last.
Step 1: Install and open the module
Nothing else matters until the module is active, because PrestaShop will keep charging full carriage on every order until your first rule exists.
Navigate to Modules -> Module Managersearch for "Free Shipping", click Install and then Configure. Once inside, work through these areas:
- Free Shipping Rules: the list where every rule you create lives, with its status and conditions.
- Add New Rule: the form where you set the threshold, weight limit or zone that triggers free delivery.
- Shipping Report: the summary of which orders qualified and what each one cost you in carriage.
You should now see the module's configuration screen with an empty rules list, ready for your first entry.
Step 2: Create a cart-value threshold rule
A value threshold filters out the small, light orders that cost you money to ship, the single most common source of free shipping losses for heavy-goods stores.
Navigate to the module's Free Shipping Rules area and click Add New Rule. Configure it as follows:
- Rule Name: use something you will recognise months later, such as "Free delivery over a set basket total, mainland only".
- Condition Type: choose the cart total option so the rule checks order value rather than weight or quantity.
- Minimum Amount: set this above your blended cost per parcel, not at a round number you like the look of.
- Customer Groups: restrict the rule to the groups you actually want to reward, and leave guest or wholesale groups out if their baskets behave differently.
- Status: enable the rule only once the values are correct.
You should now see the rule listed with its threshold and an active status.
For a store selling furniture or garden equipment, a threshold of roughly three to four times your average parcel cost works better than a token figure. Set the number from your own cost data, then adjust after a month of the Shipping Report.
Step 3: Add a weight-based free shipping rule
Weight is where heavy-goods stores lose money, because a value threshold alone cannot tell the difference between a light necklace and a heavy flat-pack wardrobe at the same price.
Return to Add New Rule and build a second rule that caps free delivery by weight:
- Rule Name: for example, "Free delivery under a set weight ceiling".
- Condition Type: select the weight option so the rule assesses the total basket weight.
- Maximum Weight: enter the ceiling your carrier pricing still tolerates.
- Carriers: apply the rule only to the carriers whose rates you have priced for that weight band.
- Status: enable it once tested.
You should now see both rules listed, one governing order value and one governing parcel weight.
Step 4: Restrict rules by zone and carrier eligibility
Free shipping to a remote island costs several times what it costs to a mainland city, so zone restrictions are what stop a national offer from becoming a regional subsidy.
Open your existing rules and set their geographic and carrier scope:
- Zones: select only the delivery zones where your blended parcel cost stays inside the threshold you set in Step 2.
- Countries: narrow further within a zone if one country's rates behave differently.
- Carriers: pair each rule with carriers that can actually deliver that weight and destination at a rate you have priced.
You should now see each rule carrying its own zone, country and carrier restrictions rather than applying store-wide.
Step 5: Combine rules with AND logic
Individual rules leak money on their own. A high-value basket containing a heavy load of tiles passes the value test in Step 2 and fails nothing, unless a weight rule is also watching that cart.
When more than one rule is active, the module evaluates the conditions together, so a cart must satisfy each applicable condition before free delivery is granted. The practical pattern for a heavy-goods store looks like this:
- Value threshold clears the minimum contribution to overheads.
- Weight ceiling keeps the parcel inside a carrier band you can afford.
- Zone and carrier eligibility confirm the destination is one you have priced.
You should now see free delivery appearing only on carts that pass all three conditions at once, which is exactly the behaviour a blanket offer can never give you.
Step 6: Test with a real cart and read the Shipping Report
Rules that look correct on a settings screen often behave differently once a genuine basket is priced, so test before you promote the offer.
Build a test order that mirrors your worst case: a heavy item, a mid-range value, and a destination at the edge of your zone. Add each to the cart in turn and check whether free delivery appears when it should, and stays hidden when it should not. Then open the Shipping Report and review which orders qualified.
Watch for a cluster of qualifying orders sitting just above your threshold with unusually high weights. That pattern usually means your weight ceiling is too generous for the carrier band beneath it. If your goal is to lift average basket value before the threshold bites, a PrestaShop welcome popup module can nudge new visitors towards the free delivery figure as soon as they land.
Method 2: Manual Setup with Native PrestaShop Carriers and Zones
You can get part of the way to conditional free delivery without adding a module. PrestaShop ships with everything you need to build zones, weight ranges and carriers, and for a small catalogue of uniformly light products that is genuinely enough. The catch is that the native tools give you or logic, not and logic, and the blended cost model from the previous section usually needs both.
Here is the honest map of what the native route can and cannot do.
| Capability | Native PrestaShop | What it means for heavy orders |
|---|---|---|
| Shop organised into geographic zones | Supported | Lets you isolate costly delivery areas such as the Highlands and Islands |
| Carrier restricted by zone | Supported | Free delivery can be offered in one region and charged elsewhere |
| Carrier restricted by weight range | Supported | Stops a very heavy parcel travelling on the same terms as a light one |
| Free delivery triggered by cart value | Not supported | You cannot say "free over a set basket total" as a native rule |
| Combined weight AND zone AND price conditions | Not supported | Native carriers cannot evaluate three conditions at once |
If your catalogue is heavy, mixed or sold across several regions, that last row is the one that catches you. The sections below still get you a working setup, and they are worth configuring even if you later switch to the PrestaShop Free Shipping Manager - Free Delivery Module because module rules sit on top of the same carrier and zone structure.
Step 1: Turn On the Shipping and Stock Preferences
These preferences control whether PrestaShop is allowed to manage carriers and stock at all, so nothing you build later will appear on the front office without them.
Navigate to Shop Parameters -> Shipping and open the Shipping settings tab.
- Enable the carrier and shipping configuration, which unlocks the Carriers and Zones screens you need for the next steps.
- Enable shipping management so the shop applies your carrier rules at checkout rather than a flat default charge.
- Enable stock management so product weights are read from the catalogue instead of being ignored.
- Maximum package weight: the ceiling a single parcel may reach before PrestaShop refuses the shipment. Set it to your courier's real limit.
- Enable the option to keep out-of-stock products in the cart if you sell bulky items where a partial order still makes sense.
Then open the Product page for any heavy item and confirm the Weight field under Shipping is filled in. A product with no weight counts as zero, which quietly breaks every weight-based carrier rule you create.
You should now see the Carriers tab become available in the Localisation menu, with shipping management active.
Step 2: Create Your Shipping Zones in Localisation
Zones are how you separate a low-cost mainland delivery from an expensive sea crossing, and they are the foundation of every carrier restriction that follows.
Go to International -> Locations -> Zones and click Add new zone.
- Name: the label you will choose when building carriers. Create Mainland, Highlands and Islands, EU, and Rest of World as four separate zones.
- Status: must be enabled, or the zone will not appear in the carrier form.
Add each zone, then open the Countries tab and assign every country on your list to the correct zone using Edit. A country can belong to only one zone, so decide deliberately whether the Republic of Ireland sits with Mainland or EU.
You should now see four enabled zones, each with the countries you assigned listed against it.
Step 3: Build a Free Shipping Carrier Limited to the Mainland
This is the carrier that makes delivery free, and its restriction is the whole point. Navigate to Shipping -> Carriers and click Add new carrier.
- Name: for example, Free Shipping Mainland. This name is visible to customers at checkout, so keep it plain and honest.
- Transit time: the delivery estimate shown alongside the carrier name.
- Speed grade: an internal ordering value that decides where the carrier sits in the checkout list.
- Customer groups: who may select this carrier. Leave every group selected unless you run a wholesale tier.
- Zones: select Mainland only. This single choice is what stops the offer leaking to Highlands and Islands or EU addresses.
- Billing and Delivery: choose According to total weight so you can create weight ranges next.
After saving, open the Shipping fees tab of the new carrier and click Add new range. Create ranges such as 0 to 2 kg, 2 to 5 kg and 5 to 10 kg, and set the price field to zero on each one. Switch back to the Carriers list and set the carrier's Status to enabled.
You should now see the free carrier offered at checkout only for addresses inside Mainland, and only within the weight ranges you created.
Step 4: Add a Paid Fallback Carrier for Everything Else
Without a fallback, a customer outside Mainland or above your top weight range sees no shipping option at all and abandons the cart. Go to Shipping -> Carriers and click Add new carrier again.
- Name: for example, Standard Delivery. Keep it neutral so it still reads correctly in every region.
- Zones: select Highlands and Islands, EU and Rest of World. Deliberately leave Mainland out so the paid option does not compete with the free one at home.
- Billing and Delivery: again choose According to total weight.
- Out-of-range behaviour: in the Shipping fees tab, use the option to disable the carrier outside its weight ranges, or add explicitly priced extra ranges. This decision controls what a very heavy order is charged.
Save the carrier, add priced ranges that reflect your real per-parcel courier cost, and enable it. Then test a Mainland basket, a Highlands basket and an EU basket with the same product to confirm each one sees the right offer.
You should now see every shipping address present a carrier, with free delivery limited to the Mainland weight bands you defined.
Troubleshooting: Why Your Free Shipping Rules Aren't Firing
Most free shipping problems in PrestaShop are not bugs. They are rule conflicts: two carrier configurations overlapping, a cart rule fighting a price rule, or a range boundary that your product weights never actually reach. The table below maps the five failures merchants report most often to their real cause and the fix.
| Symptom | Likely cause | Fix |
|---|---|---|
| Free carrier appears for customers you excluded | Carrier is assigned to a zone wider than your rule, or the destination falls in a zone you never restricted | Narrow the carrier's zone assignment under Shipping, then re-test from a delivery address inside the restricted zone |
| Weight-based rule never triggers | Carrier set to use volumetric weight, so billed weight is higher than the product's actual weight | Check the billing basis on the carrier's Shipping tab and adjust your weight range to the billed figure instead |
| Threshold ignores discounted lines | Cart rule's free shipping action applied before, or instead of, the price rule that reduces the cart | Reorder rule priority so the discount applies first, then verify the total the threshold is measured against |
| Free shipping at cart, charged at checkout | Customer account, guest checkout, and carrier selection each run the rules at a different moment | Test as a logged-in customer with a saved address, since guest carts can resolve zones differently |
| Order completes with no carrier chosen | Carrier name hidden under Shipping preferences, or no valid carrier exists for that combination | Disable carrier-name hiding and confirm at least one carrier matches every zone and weight bracket you sell into |
The volumetric weight problem deserves a closer look, because it is the one merchants rarely see coming. A box of cushions can weigh almost nothing on the scale yet bill at several times that figure once dimensions are applied. If your free shipping rule is written around a modest weight boundary and PrestaShop is billing that parcel well above it, the rule is not broken. It is working exactly as configured, against a number you did not expect. If your catalogue mixes light bulky goods with dense heavy ones, build your ranges around billed weight, or use the PrestaShop Free Shipping Manager - Free Delivery Module to test the same basket under several rule sets before you commit to a threshold.
Threshold conflicts with sale items are the second common trap. A cart rule granting free delivery and a catalogue price rule reducing a product both touch the order total, and the order in which PrestaShop evaluates them decides whether your threshold is met. On a store running a permanent clearance on one category, a customer can sit just under your free delivery threshold after the discount applies, lose the free carrier, and abandon. The fix is rarely a bigger discount. It is deciding whether the threshold measures the pre-discount or post-discount subtotal, and configuring every rule to agree.
If a rule fires in one zone and silently fails in the next, the problem is almost always the carrier's zone assignment, not the rule itself.
The disappearing-at-checkout case follows a similar logic. PrestaShop resolves available carriers against the delivery address on record, so a guest entering a postcode at the final step can land in a different zone than the one shown in the estimate. Set up a test customer account with a saved address in each zone you ship to, and run a real order through to the carrier selection page.
Orders completing with no carrier at all usually trace back to a preference rather than a rule. Once carrier names are hidden at checkout, an order can be submitted against a carrier the customer never consciously picked, which makes the resulting shipping cost look random in your back office. Pairing your shipping setup with a free PrestaShop welcome popup module that states your delivery terms up front reduces these support tickets, because customers know what to expect before they reach the carrier step.