Shopify shipping rates are set in Settings > Shipping and delivery, where a shipping profile groups the products that ship the same way, each profile holds one or more zones for the destinations it covers, and each zone carries the actual rates — flat, weight-based, price-based or carrier-calculated — that a customer sees at checkout. Most setup guides stop at “add a flat rate to a zone.” A $3M–$30M brand running more than one product type, more than one fulfilment location, or shipping into more than one country needs the profile structure right first, because that decision is what silently breaks checkout when it’s wrong — not the rate math inside a single zone.
What Do You Need Before You Set Up Shopify Shipping Rates?
Three decisions have to be made before opening the settings screen, because each one changes how many profiles, zones and rates you build.
First, decide whether every product in the catalogue genuinely ships the same way. A store selling only small, uniformly-packaged goods from one warehouse can run entirely on the General profile. A store with an oversized-furniture line, a chilled or frozen SKU, or a dropship supplier fulfilling from a separate address needs at least one custom profile per group that ships differently — because a single set of zones and rates sized to fit every product either overcharges the light items or undercharges the heavy ones.
Second, decide the zone groupings you actually need, separately for domestic and international. A US-based brand typically needs at minimum a domestic US zone and one or more international groupings; a UK-based brand typically needs a UK domestic zone plus a separate European Union or rest-of-world zone, since post-Brexit customs and delivery cost differ enough between the two that one shared rate rarely reflects either accurately. Group destination countries by what they actually cost to ship to, not by continent or alphabetically.
Third, decide the rate logic before building it: flat rate, weight-based bands, price-based bands, or a live carrier-calculated quote. Each has a different failure mode if left incomplete, covered in Step 4, so the decision belongs up front rather than discovered after the first customer hits a gap.
How Do You Set Up Shopify Shipping Rates, Step by Step?
Seven steps, in this order, because the profile and zone structure in Steps 1 through 3 has to exist before a rate in Step 4 has anywhere correct to attach to.
Step 1: Decide How Many Shipping Profiles You Actually Need
Open Settings > Shipping and delivery. Shopify starts every store with one General profile, which is where every product lives until it’s explicitly moved. Create a custom profile only for a product group that genuinely needs different zones, rates or an origin location than the General profile — oversized items that can’t use a small-parcel carrier rate, a chilled line needing expedited shipping only, or a supplier drop-shipping from a second location. A store that creates a custom profile for every minor product variation ends up maintaining rate tables in three or four places that all needed the same answer; keep the General profile as the default and add custom profiles sparingly.
Step 2: Assign Every Product to the Right Profile
Inside a custom profile, use Add products or Add collection to move the specific SKUs that belong there. Then go back to the General profile and check its product count against what you expect — this is the check most setup guides skip. A product with no explicit assignment stays in the General profile by default, with no flag, no warning and no error anywhere in the admin. If the oversized-furniture custom profile is missing three SKUs because they were added to the catalogue after the profile was built, those three SKUs quote General’s rates at checkout, which for furniture is usually too low to cover the real freight cost.
Step 3: Build a Zone for Every Destination Group You Ship To
Within a profile, select Create zone and add the countries or regions that should share one rate structure. Split domestic from international at minimum. Within international, split further by real cost tier — a zone covering Canada and Mexico rarely belongs with a zone covering Australia and New Zealand, even though both are “international” — rather than one broad rest-of-world zone that averages a cheap destination against an expensive one.
| Zone example | Countries grouped | Why they’re grouped together |
|---|---|---|
| US Domestic | United States | Shared carrier network, shared delivery-time expectation |
| UK Domestic | United Kingdom | No customs, fastest and cheapest tier for a UK-based store |
| Near International | Canada, Mexico (from a US store) | Land-adjacent, comparable transit time and cost |
| EU | European Union member states | Shared customs treatment distinct from UK or rest-of-world |
| Rest of World | Everywhere else | Highest cost tier, longest transit, usually fewest orders |
A zone with countries assigned but no rate attached is not a harmless placeholder — it’s a dead end. A customer shipping to a country sitting in an empty zone sees no shipping method at checkout and cannot complete the order, with nothing in the storefront telling them why.
Step 4: Add Rates to Each Zone
Inside a zone, select Add rate and choose the type: a flat rate charges one price regardless of cart size; a weight-based rate charges according to bands of total cart weight; a price-based rate charges according to bands of cart subtotal; a carrier-calculated rate (Step 5) pulls a live quote. Name each rate the way a customer reads it — “Standard Shipping (5–7 business days)” rather than an internal label like “Zone 2 Tier B” — since the rate name is what renders at checkout.
For weight-based and price-based rates, the bands must cover the entire possible range with no gap between them. A weight-based rate with bands of 0–2kg and 2–5kg but nothing above 5kg leaves any cart over 5kg with no matching rate in that zone — functionally identical to the empty-zone failure in Step 3, just one level deeper in the configuration.
Step 5: Turn On Carrier-Calculated Rates Where the Plan and Carrier Account Allow It
Carrier-calculated rates quote a live price from a connected carrier account — through Shopify Shipping or a third-party carrier integration — at the moment of checkout, based on the cart’s actual weight and dimensions and the customer’s address. Availability depends on the store’s plan tier and region; a store not natively eligible can add the capability through an app from the Shopify App Store. Confirm eligibility against Shopify’s own current plan documentation rather than assuming a given plan qualifies, since plan-by-plan availability is exactly the kind of detail that changes over time.
Where calculated rates are available, set the handling fee in the dedicated field — as a flat amount, a percentage of the carrier’s quote, or both — rather than editing the returned quote directly. The handling fee is what actually funds packaging materials and the labour of picking and boxing an order; a store that runs carrier rates with no handling fee is passing through the carrier’s raw cost and eating those costs itself.
Step 6: Set a Free-Shipping Rate With a Minimum Order Value
Add a new rate, name it in customer-facing language (“Free Shipping”), set its price to zero, and apply a minimum order value condition under the rate’s advanced options so it only appears once a cart clears the threshold. This rate has to be added separately to every zone where it should show — setting it on the domestic zone doesn’t extend it to an international zone in the same profile, and an international zone can legitimately carry a higher threshold than domestic, since the real delivery cost that the free rate is absorbing is higher there too.
Step 7: Test Every Zone and Profile With a Real Cart Before Going Live
Before publishing a rate change, run a real or draft checkout for a product from each profile, shipping to an address in each zone. Confirm the rate name, price and delivery estimate shown match what was configured — not just that a rate appeared. The two failure modes described in Steps 3 and 4, an empty zone and a gapped weight band, both produce the same symptom: a checkout with no shipping method offered, and neither shows up as an error anywhere in the admin. The only reliable way to catch them is testing every combination, not reviewing the settings screen a second time.
What’s the Step Most Teams Get Wrong Setting Up Shopify Shipping Rates?
Leaving a product out of the custom profile it’s supposed to belong to is the mistake that recurs most, because Shopify never flags it. A product added to the catalogue after a custom profile was built — a new SKU in the oversized-furniture line, a new supplier added to a dropship profile — defaults into the General profile with no notice, no validation error and no checkout warning. The first sign is usually a customer complaint about a shipping charge that’s clearly wrong, or a fulfilment team quietly absorbing the difference between what was charged and what the carrier actually billed, for weeks before anyone traces it back to a product sitting in the wrong profile.
The fix is a recurring check, not a one-time audit: after adding any new product, confirm it landed in the profile it belongs to before the listing goes live, and periodically cross-check the General profile’s product count against what should be there. A catalogue that adds SKUs faster than someone remembers to check shipping-profile assignment is exactly the kind of gap that stays invisible until a customer or a margin report surfaces it.
How Do You Verify Shopify Shipping Rates Are Actually Working?
Verification means checking more than the handful of products someone happened to test at launch. Four checks catch what a narrow spot-check misses. First, pull the full product list for each custom profile and confirm every SKU that’s supposed to be there is there, cross-referenced against the catalogue rather than memory. Second, test a cart at the top and bottom edge of every weight-based or price-based band, not just the middle of the range, since a gap sits exactly at a boundary. Third, if carrier-calculated rates are active, test a cart heavy or large enough to sit near the carrier’s own quoting limits, and confirm a fallback rate exists in that zone in case the live quote doesn’t return. Fourth, test the free-shipping threshold from just under and just over the minimum order value, in every zone it’s supposed to apply to, since a threshold set correctly on the domestic zone tells you nothing about whether it was also set on the international one. Testing every profile-and-zone combination at the edges of each rate band is the only reliable way to catch a gap; reading the settings screen a second time does not surface one.
Shipping-rate accuracy is not a one-time setup task. A catalogue that adds products, a carrier that changes its rate card, or a new market a store starts shipping into all change what “correct” looks like, and none of them trigger a review on their own. A setting that was right when it was built drifts wrong as the business changes around it, with nobody assigned to notice — the same pattern behind most of the manual checks a growing Shopify operation quietly accumulates. Treating shipping-rate accuracy as an ops automation problem — a scheduled check against the product catalogue and the zone-and-rate table, rather than a settings screen nobody revisits — is what keeps it caught before a customer or a margin report catches it first.
Sources
No external figures are quoted; this article is written from how Shopify’s shipping profiles, zones and rate types are configured and operated, without a dollar figure for any Shopify plan or carrier rate.