Shopify international shipping runs through Settings > Markets: you group destination countries into markets, set country of origin and an HS code on every product that ships internationally, choose whether each market collects duties at checkout (DDP) or leaves them for delivery (DDU), then build shipping zones and rates inside each market the same way you would domestically. A $3M–$30M brand adding new countries usually gets the zones and rates right, because that part looks like the domestic setup they already know. What breaks the first international order is the part that looks optional and isn’t: product-level customs data that has to exist before duty collection is turned on, not after.
What Do You Need Before You Set Up Shopify International Shipping?
Three things have to be true before opening Markets, because getting them wrong doesn’t produce an error — it produces a checkout that looks correct and a shipment that isn’t.
First, a real list of destination countries with actual demand, not every country Shopify permits. Markets scales with the number of distinct duty and pricing decisions you have to make and keep current; adding a market for a country with no orders is a maintenance cost with no offsetting benefit.
Second, complete customs data on the products that will actually ship internationally — country of origin and an HS code for each distinct product. This is catalogue work, not a Markets setting, and it’s the one prerequisite most teams underestimate, because nothing in the admin blocks you from skipping it.
Third, a duty-collection decision per market: whether the store or the customer effectively carries the risk of an inaccurate estimate. DDP puts that risk on the store’s landed-cost calculation; DDU puts it on the customer’s experience at delivery. Decide this before building zones, since it changes what “done” looks like for each market.
How Do You Set Up Shopify International Shipping, Step by Step?
Seven steps, in this order. The sequence matters because Step 3 has to be finished before Step 4 is turned on — reversing them is the mistake this article exists to prevent.
Step 1: Turn On Shopify Markets and Add Your Target Regions
Open Settings > Markets. Shopify starts a store with a default market — usually the store’s home country — and Add market creates additional ones. Add a market only for a country or region group you’re prepared to actually configure: currency, pricing behaviour, duty treatment and shipping zones all get set per market, so each one added is a small ongoing commitment, not a free toggle.
Step 2: Group Countries Into Markets That Share a Pricing and Duty Strategy
A market can hold more than one country, but only group countries that should share the same currency, pricing and duty handling. The European Union countries sharing customs treatment is a reasonable single market; the United Kingdom sitting outside that customs union since Brexit usually isn’t, even though both are “Europe” by geography. Split a market the moment two countries inside it need genuinely different duty or pricing treatment — the grouping decision here is the same discipline as building shipping zones for domestic rates, just applied one level up.
Step 3: Set Country of Origin and HS Codes on Every Product Before Enabling Duty Collection
On each product’s edit page, in the Shipping section alongside the weight and package dimension fields, fill in the country or region of origin and the Harmonized System (HS) code. The HS code is an internationally standardised classification number that customs authorities use to determine the duty rate for a product category; country of origin is where the item was manufactured, not where it ships from. Both exist at the product level and can be overridden per variant where variants genuinely differ — a product sourced from two different factories depending on colour or size is the common case.
Do this for the full set of products that will ship internationally before moving to Step 4. A catalogue with customs data on ninety percent of its SKUs is not ninety percent ready — it’s a store where one in ten international orders produces an inaccurate duty quote, and nothing in the checkout flags which ten.
Step 4: Decide DDP or DDU for Each Market and Turn On Duty Collection Accordingly
Inside a market’s Duties and import taxes settings, choose whether that market collects estimated duties and import taxes at checkout — Delivered Duty Paid, DDP — or leaves them to be collected by the carrier or customs authority on delivery — Delivered Duty Unpaid, DDU, sometimes labelled Delivered At Place. This is a per-market decision: a store can run DDP into one region and DDU into another, based on where it trusts the estimate and where managed duty handling is available.
Turning on duty collection in a market before Step 3 is complete is the failure mode this whole setup exists to avoid. Shopify does not refuse to enable duty collection because a product lacks an HS code — the checkout still completes, with a duty figure calculated from whatever data exists. On a product missing a code, that figure is less reliable than one built from real classification data, and the shortfall doesn’t surface as an error to anyone in the moment it happens.
Step 5: Build International Shipping Zones and Rates Inside Each Market
Inside each market, create shipping zones and attach rates the same way domestic shipping profiles work — flat, weight-based, price-based, or carrier-calculated, covered in full in Shopify shipping rates. The mechanics don’t change for international; what changes is the input. International transit time, carrier options and real shipping cost per market are usually different enough from domestic that copying a domestic rate table into an international zone underprices the actual cost of getting a parcel there.
Step 6: Set Market-Specific Pricing and Checkout Currency
Decide, per market, whether customers see prices in local currency with pricing set specifically for that market, or an automatic conversion from your store’s default currency. Automatic conversion is faster to launch with; market-specific pricing lets you round prices sensibly for the local currency and adjust for margin differences that come from duty exposure or shipping cost in that market. Review pricing for at least your highest-volume products in each market rather than assuming the automatic conversion produced sensible numbers everywhere — a converted price that lands on an odd fraction reads as a mistake to the customer even when the math is technically correct.
Step 7: Test a Checkout and a Real Shipment Into Each Market Before Going Live
Run a test checkout from an address inside each market and confirm three things line up: the shipping rate shown matches the zone you built in Step 5, the duty estimate shown looks consistent with the HS code and origin on that specific product, and the currency and total shown match what Step 6 was supposed to produce. Then send at least one real parcel into each market before calling it live, and confirm it clears customs without being held for missing or inconsistent documentation and without the carrier billing the recipient a second time for duty already collected at checkout.
What’s the Step Most Teams Get Wrong Setting Up Shopify International Shipping?
Enabling duty collection — DDP — before every product that ships internationally carries a country of origin and an HS code is the mistake that recurs most, because nothing about it fails loudly. Shopify does not require complete customs data before you can turn on Duties and import taxes for a market; it calculates and displays a duty estimate regardless, and an incomplete or missing code produces a less accurate number rather than a blocked checkout.
The consequence shows up downstream, in one of two places. Either the estimate undercharges the customer, and the carrier collects a further duty payment on delivery — the exact DDU experience the store thought it had avoided by turning DDP on — or the parcel is held at customs pending the documentation a proper HS code and origin declaration would have supplied automatically. Neither failure names itself as a Shopify settings problem when it happens; it reads as a shipping delay or a customer complaint about being billed twice, and it can take several international orders before anyone traces it back to a handful of products missing customs data.
The fix is sequencing, not a different setting: finish HS codes and country of origin across the catalogue, spot-check a sample against the product’s real classification, and only then turn on duty collection in a market. For a catalogue that adds new products regularly, this is a recurring check rather than a one-time task — a new SKU with no customs data entered is invisible in the admin the same way a shipping-profile omission is, until an order for it ships internationally.
How Do You Verify Shopify International Shipping Is Actually Working?
Verification means checking more than the one test order most teams run at launch. Four checks catch what a single spot-check misses. First, pull the full product list and confirm HS code and country of origin are set on every SKU that ships internationally, not just the ones tested — cross-referenced against the catalogue export, not memory. Second, test a checkout from an address in every market, not just the largest one, since a duty-collection setting or a zone gap in a smaller market goes unnoticed longest precisely because it gets the least order volume to surface it. Third, where DDP is active, compare the duty estimate shown at checkout against what the product’s HS code should actually produce for that destination, using the classification data itself rather than trusting the number Shopify displays. Fourth, track whether any parcel gets held at customs or any customer reports being billed duty a second time after delivery, and treat either as a signal to re-check the specific product’s customs data rather than a one-off shipping problem.
International shipping accuracy is not a one-time setup task any more than domestic rates are. A catalogue that adds SKUs, a market added after initial launch, or a change in which countries a store actually ships into all change what “correct” looks like, and none of them trigger a review on their own. A product missing an HS code sits invisible in the catalogue the same way a shipping-profile omission does — until an order for it ships internationally and the gap becomes a customs hold or a customer’s second bill. Treating customs data completeness as an ops automation problem — a scheduled check against the product catalogue before any new market goes live, rather than a settings screen configured once and left — is what keeps the gap caught before a shipment does.
Sources
No external figures are quoted; this article is written from how Shopify Markets, duty collection and product-level customs data are configured and operated, without a duty rate, threshold or plan price stated for any country.