The thing that will bite first is that a product can only sit in one shipping profile at a time. Shopify’s docs are explicit about it, adding a product to a second profile automatically removes it from the first. So 13 profiles for your 13 non-mainland zones can’t each hold the catalogue. You’d need 13 disjoint product sets, which isn’t what you’re describing.
Zones are the geography axis and they live inside a profile. Profiles are the product axis. One profile can hold all 14 zones quite happily. You only want extra profiles when a specific set of products needs different rates from everything else, which sounds like your pallet goods rather than your regions.
That matters beyond tidiness. When a cart pulls products from more than one profile, Shopify combines the rates. Rates with the same name across profiles get added together. If all the names differ it takes the cheapest from each profile, adds those, and shows the customer one line called “Shipping”. With pallet pricing that produces a number nobody designed, and it only appears on mixed carts so it survives most testing.
Second problem. Highlands and Islands cannot be a zone. The UK splits into England, Scotland, Wales, Northern Ireland and British Forces, which has been there since 2021, but nothing below that. Zones have no postcode granularity at all. So IV, HS, KW, PA20-49, PH17-50, ZE and friends have to be handled outside the zone system entirely.
Worth auditing your excluded list too. GY and JE aren’t UK postcodes you need to block. Guernsey and Jersey are separate countries in Shopify’s country list, same as Isle of Man. Never add them to a zone and they’re already unshippable with no logic required. That leaves only the genuine in-GB Highland and Island postcodes as the hard part.
For that hard part, two different functions do the two halves and they’re easy to conflate. Excluding certain products from certain postcodes is a Cart and Checkout Validation function. It can read cart.deliveryGroups[0].deliveryAddress.zip and block with your own message, and since you already run a validator for stale dates it’s another rule rather than a new build. Limit is 25 active validation functions per store.
The second pallet charge is the one that catches people out. A delivery customization function cannot change a price. It only hides, renames and reorders delivery options. So the surcharge has to come from the rate card itself, weight or item count tiers, or from a carrier service returning computed rates. If the plan was to bolt the pallet charge on with a function, better to find that out now than after ShipTheory is wired in.
What are you keying the pallet charge off, weight or line item quantity? That decides which of those two routes is actually open.