A particular kind of receipt arrives in a Shopify inbox week after week and looks like every other receipt. The customer’s address is in Aberdeenshire. They paid £4.99 for standard UK shipping. The order has been fulfilled, the goods are with DPD, everyone is content.
What the receipt doesn’t mention is that DPD charged the store £14.99 to deliver that parcel, because Aberdeenshire postcodes starting with AB31 sit in the Highland surcharge zone. Ten pounds gone on a single order, and nothing flagged anywhere. The store owner is having a good day. The accountant, whenever the accountant gets the view, sees the margin a quarter later and wonders where it went.
The cause is rarely that the owner doesn’t know the Highland surcharge exists. They’ve ticked the option, set up a surcharged rate, watched it appear in the admin, and assumed the work is done. The leak happens at the layer below — the one the admin will not show you.
What the Admin Hides
A Shopify shipping admin tells you what rates are configured. A Shopify checkout tells you what a customer actually picks. Those are two different things, and the gap between them is where the margin goes.
Here’s the mechanic. You set up a £4.99 mainland UK rate restricted to the postcode prefix “AB”. That covers Aberdeen. You set up a £14.99 Highland rate restricted to “AB31” for Aberdeenshire. Both rates are now in the same delivery zone. A customer in AB31 1AA arrives at checkout, and Shopify’s rate engine asks of each rate: does this postcode match? The mainland AB rate matches, because AB31 starts with AB. The Highland AB31 rate also matches. Two rates fire. The checkout shows both, sorted cheapest first. The customer clicks £4.99.
The store owner never sees this happen. The admin lists both rates as present and the checkout lists both rates as available. Everything that’s supposed to exist exists. The customer made a rational choice. Money still left the room.
The admin tells you what’s configured. The checkout tells you what customers see. Those are not the same thing.
Why the Native Rule Engine Can’t Save You
Shopify’s built-in shipping rules don’t understand that “AB31” is more specific than “AB”. They use literal prefix matching — does this postcode string start with that pattern, yes or no. Once that question is asked of both rates, both pass, and both fire.
The fix, in the rule-engine sense, is to make sure no two rates ever match the same postcode. Either every mainland prefix has to be enumerated as an explicit list with the Highland outward codes carved out, or the postcode lists have to be precise enough that AB matches mainland Aberdeen but not AB31. Shopify’s native settings don’t give you the surface to write that kind of precision. You need an app that does — Parcelify being the one I reach for, because it’s the one that handles real UK postcode logic well — and you need to write the lists by hand. There’s no automatic version of this.
The architecture that closes the leak is the four-zone template I use on every UK install: England and Wales, Scottish Mainland, Scottish Highlands and Islands, and Northern Ireland with the Isle of Man and the Scillies. Each zone has its own rate. Each rate’s postcode list is written so no two zones ever match the same postcode. The customer in AB31 sees one rate. The customer in M1 sees a different rate. Neither sees both.
The Three-Postcode Test
Most of this is invisible by construction, which means the diagnostic has to be the cheapest one you can run. Mine takes about five minutes.
Open a private browser window. Add a real product to your cart. Walk through to the shipping step. Run three postcodes through.
The three postcodes that tell you the truth
M1 1AA (Manchester). Should produce only your mainland rate. If anything else appears, your zones overlap somewhere you didn’t intend.
IV1 1AA (Inverness). Should produce only your Highland rate, at the higher price. If a cheaper rate appears alongside, the Highland surcharge is leaking.
AB31 1AA (Highland Aberdeenshire). The overlap test. If you see only the Highland-priced rate, the postcode logic is precise. If you see a cheaper rate too, you have the AB-versus-AB31 problem and the surcharge has been theatre for however long the store has been live.
If those three return what you’d expect, the system is healthy. If any of them return something surprising, the troubleshooting guide covers the five common causes and the sequence I follow to find which one applies.
The Wider Pattern
A few weeks ago in this newsletter I wrote about a title sitting at position eight, earning nine hundred impressions, and producing one click. The page was fine. The fifty-eight characters above the page were the problem. Before that it was a canonical tag pointing at a domain that didn’t exist. Before that, a Google Ads account double-counting conversions and making the cost-per-lead look half what it really was.
Each story has the same shape. There’s a layer above what the owner sees. The owner inspects the layer they can see and concludes the system is working. The layer above is quietly extracting cost.
Shopping cart shipping is one more case of it. The order is fulfilled, the customer is happy, the bank statement balances. The receipt the owner reads each morning shows everything is fine. The cost is one layer up, in the rate the customer never picked consciously, on the choice that was always going to go the same way because rules sort cheapest first.
What to Do With This
If you run a Shopify store that ships to the UK and you’ve never run the three-postcode test on your live checkout, run it this week. Five minutes. If everything looks right, you’ve saved yourself the worry. If anything looks wrong, you’ve found a specific problem with a specific shape, and the fix is mechanical from there.
If the surcharge is leaking and you’d rather not work through the postcode lists yourself — which is a fair preference, because the lists are long — send me the URL of your store and I’ll run the test for you and tell you exactly what’s leaking. No charge for the diagnostic. The fix takes about an hour of careful list-writing once the problem is named.
The full architecture, with every postcode in every zone, is in the foundation piece. The five symptoms and five causes, with the diagnostic sequence I follow, are in the troubleshooting walkthrough. The production setup, with every Parcelify option that matters, is in the Parcelify piece.
Tony Cooper
We Build Stores
tony.cooper@webuildstores.co.uk
07963 242210
P.S. The receipt that looks fine and isn’t fine is the most common pattern I see across small business websites this year. The same shape catches titles, canonical tags, conversion pixels, and shipping rates. Different surfaces, same physics — the visible layer reads clean and the invisible one is doing the work. If there’s a layer of your own site you’re least confident about, reply with the URL and I’ll send you a one-page note on what I find.