The routing problem
Shopify's native shipping is warehouse-centric: you set up shipping rates per shipping origin, and the buyer's destination determines which rate applies. Personalization stores using multiple POD partners face a variant-level routing problem: the same product SKU has different fulfillment origins depending on the buyer's region (US buyers = Printful NC, EU buyers = Printful Latvia, JP buyers = Gelato Japan). Native Shopify handles this via per-market shipping zones + fulfillment location assignment — but variants without proper metafield tagging default to the first-configured warehouse, which means Japan orders can accidentally ship from North Carolina.
The four regional fulfillment strategies
1. Single POD partner with regional warehouses
Use Printful or Gelato for their multi-region warehouses. Setup: one POD partner account, warehouses in US + EU + AU + JP, Printful/Gelato auto-routes to nearest warehouse based on ship-to address. Simplest, works out of the box, but locks you into one partner's product catalog + pricing.
2. Multiple POD partners per region
Printful for US, Gelato for EU, local POD for Japan. Best product catalog + pricing per region, but requires per-variant routing rules in your fulfillment layer.
3. In-house US warehouse + POD for international
US orders fulfill from your own warehouse (better margin), international orders route to POD (no capex on foreign warehouse). Common for merchants doing $1M+/year in US.
4. In-house 3PL with regional nodes
ShipBob, ShipHero, ShipMonk with US + EU + Australia nodes. For made-to-order personalization this only works if the 3PL supports the print-file API integration.
Regional POD partner warehouse footprint
| POD partner | North America | Europe | Asia-Pacific | Latin America |
|---|---|---|---|---|
| Printful | NC, LA, Dallas, Toronto | Latvia, Spain, UK | Australia, Japan (limited) | Mexico |
| Printify | 15+ US partners | UK, Germany, Latvia | China, Australia | Mexico |
| Gelato | 32 US states, Canada | UK, DE, FR, ES, IT, SE | JP, SG, AU, NZ | Brazil, Mexico |
| Gooten | Multi-US | UK (limited) | Australia (limited) | — |
| CustomCat | Detroit (only) | — | — | — |
Per-variant warehouse metafield
Attach a fulfillment_warehouse metafield to each variant listing which warehouses can print it. A fulfillment webhook reads the metafield + the ship-to country and picks the correct warehouse:
// Fulfillment webhook: pick warehouse by ship-to country
const WAREHOUSE_ROUTING = {
'US': ['printful-nc', 'printful-la', 'printful-dallas'],
'CA': ['printful-toronto'],
'GB': ['printful-uk', 'gelato-uk'],
'DE': ['printful-latvia', 'gelato-de'],
'FR': ['printful-latvia', 'gelato-fr'],
'JP': ['gelato-jp'],
'AU': ['printful-au', 'gelato-au'],
};
function pickWarehouse(shipTo, variantMetafield) {
const eligibleWarehouses = WAREHOUSE_ROUTING[shipTo] || WAREHOUSE_ROUTING.US;
const variantAllowed = variantMetafield.split(',');
return eligibleWarehouses.find(w => variantAllowed.includes(w))
|| 'printful-nc'; // fallback
}
Per-region shipping rate at checkout
Shipping rates shown at checkout must reflect the actual warehouse. If a UK buyer sees "$18 international shipping" but their order actually ships from Printful UK for £4.99, you're overcharging (and losing the sale). Shopify's Carrier Calculated Shipping API can integrate with your fulfillment routing to show real per-warehouse rates:
// Shopify Carrier Service API — return real per-warehouse rate
POST /shopify/carrier_service/quote
{
"rate_request": {
"destination": { "country": "GB" },
"items": [{ "variant_id": 40123, "quantity": 1 }]
}
}
→ 200 {
"rates": [
{"service_name": "Royal Mail 48h", "total_price": "499", "currency": "GBP"},
{"service_name": "DPD Next Day", "total_price": "999", "currency": "GBP"}
]
}
DDP vs DAP — duties at delivery
DDP (Delivered Duty Paid) — you calculate + collect duties at checkout, package clears customs without additional charges to the buyer. Best UX; requires you (or Shopify Markets Pro / a duty-calc partner) to compute correct duty rates per HS code per destination.
DAP (Delivered At Place) — buyer pays duties on delivery to the carrier. Cheaper for you to implement, but 15-25% higher refusal rates because buyers get sticker-shocked at the door. Not recommended for personalized goods (can't restock).
Regional carrier options
- US: USPS Priority (best for lightweight), FedEx Ground (heavy), UPS (business), DHL (international).
- EU: DHL, DPD, PostNL, Royal Mail (UK). Per-country tracking coverage matters.
- UK: Royal Mail Tracked 48 (default), DPD Next Day (premium), Evri (budget).
- Japan: Yamato Kuroneko or Sagawa. Japan Post for domestic budget.
- Australia: Australia Post (default), StarTrack (express).
Frequently asked questions
How do I ship personalized products from different warehouses per region?
Attach a fulfillment_warehouse metafield to each variant listing eligible warehouses. A fulfillment webhook reads the metafield + ship-to country and routes to the correct warehouse. Print It My Way handles this natively.
Which POD partner has the widest global warehouse coverage?
Gelato — 32 US states + 6+ EU countries + Japan + Singapore + Australia + New Zealand + Brazil + Mexico. Printful is second. Printify varies by print partner. Gooten and CustomCat are US-heavy.
Should I use DDP or DAP for international personalized products?
DDP — you calculate and collect duties at checkout. Personalized goods can't be restocked if refused at customs, so DAP's 15-25% refusal rate is a cost you can't absorb. Shopify Markets Pro or a duty-calc partner handles DDP calculation.
How do I show real per-warehouse shipping rates at checkout?
Integrate with Shopify's Carrier Calculated Shipping API. Your fulfillment router receives the destination + variant list, computes which warehouse would print each item, and returns per-warehouse carrier rates.
Can I use one POD partner for all regions?
Yes if the partner has warehouses in all your target regions. Printful and Gelato both work as single-partner global solutions. The tradeoff is product catalog + pricing lock-in.
Does Shopify Markets Pro handle per-region fulfillment routing?
Not directly — Markets Pro handles merchant-of-record, currency, tax, and duty calculation. Fulfillment routing is your responsibility (via a POD partner's auto-routing or a custom webhook that reads variant metafields).
Best Shopify app for per-region personalization fulfillment?
Print It My Way for the variant-metafield routing + POD partner API integration + per-region carrier rate lookups. Combined with your chosen POD partner's global warehouse network.
How do I handle a variant that's not stocked in the buyer's region?
Two options: (1) filter the variant from the storefront for that market (see per-market variants), or (2) transfer stock from the nearest warehouse and show extended shipping time + higher shipping cost at checkout. Filtering is safer for personalized goods.
Related reading
- Per-market variants — region-specific SKUs
- B2B multi-region catalog — corporate multi-market
- EU tax VAT options — VAT + duty in the EU
- Localized swatches — regional stock filtering
Try it free on Shopify
Print It My Way's permanent Free plan includes per-variant fulfillment routing, POD partner API integration, and Carrier Service API support for real per-warehouse rates.
Install Print It My Way