Loading...
Loading...
Handle cross-border orders with customs form generation, duties and taxes estimation, HS code assignment, and restricted items blocking
npx skill4agent add finsilabs/awesome-ecommerce-skills international-shipping| Platform | Recommended Tool | Why |
|---|---|---|
| Shopify | Shopify Markets + Zonos Duty & Tax or Global-e | Shopify Markets handles multi-currency and localized checkout; Zonos/Global-e add accurate DDP landed cost |
| WooCommerce | WooCommerce Shipping + Easyship plugin or Zonos for WooCommerce | Easyship provides multi-carrier rates including international; Zonos handles duties/taxes |
| BigCommerce | BigCommerce Multi-Currency + Easyship or Avalara AvaTax Cross-Border | Built-in multi-currency handles pricing; Easyship/Avalara add duties estimation |
| Custom / Headless | EasyPost or Shippo for labels + Zonos or Avalara for duties estimation | Use carrier aggregators for labels; use a landed-cost API for duties/taxes |
Variant HS CodeVariant Origin Country6109.106109.906404.118471.309503.003304.99_hs_code_country_of_origin// Screen cart for restricted items before allowing checkout to proceed
async function screenForRestrictions(params: {
orderLines: { productId: string; hsCode?: string }[];
destinationCountry: string;
}): Promise<{ allowed: boolean; blockedItems: string[] }> {
const blockedItems: string[] = [];
// Common restrictions — seed these from a country-restrictions database
const RESTRICTIONS: Record<string, string[]> = {
AU: ['9305'], // Firearm parts
IN: ['2207'], // Alcohol (requires import licence)
CN: ['8517'], // Consumer electronics require CCC certification
};
const countryRestrictions = RESTRICTIONS[params.destinationCountry] ?? [];
for (const line of params.orderLines) {
if (!line.hsCode) continue;
const hsPrefixBlocked = countryRestrictions.some(prefix => line.hsCode!.startsWith(prefix));
if (hsPrefixBlocked) {
blockedItems.push(line.productId);
}
}
return { allowed: blockedItems.length === 0, blockedItems };
}| Problem | Solution |
|---|---|
| Customs form not generated for international order | Ensure your shipping app has HS codes and country of origin on all product records; missing fields are the most common cause |
| Duties estimated at checkout differ from actual duties assessed | Use a DDP provider (Zonos, Global-e) for guaranteed accuracy; label estimates as "estimated" when using DDU |
| Prohibited item detected after label is created and package is in transit | Screen for restrictions at checkout, not at fulfillment; block checkout for restricted country/product combinations |
| Package returned for "customs information required" | All international shipments need customs forms — even low-value ones; configure your shipping app to always include customs data for non-domestic destinations |