All segments

Shopify International Shipping: A Practical Setup Guide

How to set up Shopify international shipping: Markets, zones, HS codes, country of origin, DDP vs DDU duty collection, and the step most teams get wrong.

  • Published
  • Reading time 9 min read
  • Author Nafiul Hasan
Shopify International Shipping: A Practical Setup Guide. Diagram: the stage nobody automated. RUN Shopify International Shipping: APractical Setup Guide BY HAND pointerflow.com

Short answer

Shopify international shipping is configured through Settings > Markets: group destination countries into markets, set country of origin and HS codes on every product before turning on duty collection, choose DDP or DDU per market, then build shipping zones and rates inside each market. Skipping the HS code and origin step is what most teams get wrong — it produces an inaccurate duty quote instead of an obvious error.

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.

Frequently asked

What is Shopify Markets, and is it different from setting up international shipping zones?

Shopify Markets is the admin area, under Settings > Markets, where you group destination countries, set currency and pricing behaviour, and configure duty collection per group. Shipping zones and rates for each market are configured inside that market's settings, so Markets is the container and zones are one of the things you configure within it, not a separate system.

Do I need a Shopify Plus plan to sell internationally with Shopify Markets?

Core Markets functionality — multiple markets, market-specific domains or subfolders, and basic duty display — is available on standard Shopify plans, with the deeper managed-markets and duty-remittance features gated to higher plans. Plan-by-plan availability changes; check it against Shopify's current Markets documentation before assuming a given plan qualifies for a feature you're planning around.

What's the actual difference between DDP and DDU for a customer buying internationally?

DDP (Delivered Duty Paid) means the customer pays estimated duties and import taxes at checkout, alongside the product and shipping cost, so nothing further is owed on delivery. DDU (Delivered Duty Unpaid, sometimes called DAP) means the customer pays only the product and shipping at checkout, then owes duties to the carrier or customs authority before the parcel is released — a cost and a delay the customer did not see coming until it arrives.

Why would a store choose DDU when DDP sounds better for the customer?

DDP requires an accurate landed-cost calculation, which depends on HS codes and country of origin being correct on every product, and it can involve the merchant remitting duties to the destination country rather than the carrier handling it. A store not confident in its product data, or shipping into a market where managed duty remittance isn't available, may run DDU deliberately rather than quote a duty figure it cannot stand behind.

What happens at checkout if a product has no HS code set when duty collection is turned on?

Shopify does not block the checkout. It produces a duty estimate from whatever data is available, which without an HS code is typically less accurate than one built from real classification data, and in some cases can understate or omit duty entirely. The checkout completes normally, which is exactly why the gap goes unnoticed until a shipment is held or a customer is billed again on delivery.

Where do I actually enter a product's HS code and country of origin in Shopify admin?

On each product's edit page, in the Shipping section, next to the weight and package fields. Both fields exist at the product level and can also be set per variant where variants genuinely differ in origin or classification, such as a product manufactured in different countries depending on the variant.

Can I set one HS code for a whole product category instead of every individual SKU?

Not directly — HS classification depends on what the specific product is, not the category it's merchandised under, so two products in the same collection can carry different correct codes. In practice, most catalogues have a manageable number of distinct product types even with many SKUs, so the real work is classifying each distinct product once and applying that code consistently to every SKU of the same physical item.

Does Shopify Markets handle customs paperwork and commercial invoices automatically?

Shipping labels generated through Shopify Shipping for an international order can pull the product, value, HS code and origin data already on file to populate a customs declaration, which is another reason that data has to be correct before it's relied on. Carriers and label providers outside Shopify Shipping handle this differently — check how your specific carrier integration sources its customs data rather than assuming it inherits Shopify's product fields automatically.

How is international shipping different from setting up domestic Shopify shipping rates?

The rate mechanics — flat, weight-based, price-based, carrier-calculated — work the same way and are covered in [Shopify shipping rates](/blog/shopify-shipping-rates/). International shipping adds three things domestic doesn't need: a market to group countries under, a duty-collection decision (DDP or DDU) per market, and accurate HS code and country-of-origin data on every product feeding that duty decision.

Can different markets use different duty-collection settings for the same product catalogue?

Yes, and this is normal rather than an edge case. A store might run DDP into markets where managed duty remittance is available and reliable, and DDU into markets where it isn't, or where local customs treatment makes an accurate estimate harder to guarantee — the decision is made per market, not once for the whole store.

What happens to an order already placed if I change a product's HS code afterward?

The change applies going forward, to checkouts and labels created after the correction is saved. It does not retroactively recalculate duty on an order already placed or reprint a label already generated, so a wrong classification found after the fact needs a manual fix on any affected order still in transit or awaiting fulfilment, not just a product edit.

Do I need a customs broker to sell internationally through Shopify, or does Markets replace that?

Markets handles the duty estimate, collection and, where available, remittance mechanics inside Shopify — it doesn't replace a customs broker for shipments with commercial complexity, denied-party screening needs, or destination-specific import licensing. Most direct-to-consumer parcels clear without a broker involved; higher-value shipments or regulated product categories are where that judgement call gets made separately from the Shopify setup.

Next step

Is this your ops automation problem, or a symptom of another one?

Bring your numbers — the churn split, the decline rate, whatever your flows are earning — and we will tell you which of them is the expensive one.

Book a call →